Здравствуйте, разрабатываю телеграм бота и столкнулся с такой проблемой что после оплаты звездами не отрабатывает эвент "message:successful_payment". Вернее он отрабатывает, но как-то через раз, на видео это четко видно что из 3 платежей только один вызвал эвент. Использую библиотеку GrammyJS.
видео демонстрация
StoreModule:
@Module({
imports: [ProductModule, PaymentModule, GatewayModule],
providers: [StoreService],
controllers: [StoreController],
})
export class StoreModule implements OnModuleInit {
constructor(
@Inject(PROVIDERS.TG_PROVIDER) private readonly tgProvider: TgProvider,
private readonly storeService: StoreService,
) {}
private onTgBotInit() {
this.tgProvider.bot.on('pre_checkout_query', this.storeService.handlePreCheckoutQuery.bind(this.storeService));
this.tgProvider.bot.on(
'message:successful_payment',
this.storeService.handleSuccessfulPayment.bind(this.storeService),
);
}
onModuleInit() {
this.tgProvider.subscribe(this.onTgBotInit.bind(this));
}
}
Сами обработчики:
public handleSuccessfulPayment = async (ctx: Context, next: NextFunction) => {
console.log(ctx.message.successful_payment);
const payload: InvoicePayload = JSON.parse(ctx.message.successful_payment.invoice_payload);
const payedAt = new Date().toISOString();
console.log(payload);
// await this.paymentService.findOneAndUpdate(
// { requestId: payload.requestId },
// {
// payedAt,
// status: PAYMENT_STATUS.PAID,
// telegramPaymentChargeId: ctx.message.successful_payment.telegram_payment_charge_id
// },
// );
// this.gatewayService.sockets.get(payload.userId)?.forEach((socket) => {
// socket.emit(STORE_EVENTS.PRODUCT_BUY, payedAt);
// });
};
public handlePreCheckoutQuery = async (ctx: Context) => {
const { requestId }: InvoicePayload = JSON.parse(ctx.preCheckoutQuery.invoice_payload);
return ctx.answerPreCheckoutQuery(!(await this.paymentService.exists({ requestId, status: PAYMENT_STATUS.PAID })));
};