Задать вопрос
@FIain

GrammyJS | Почему после оплаты не отрабатывает эвент message:successful_payment?

Здравствуйте, разрабатываю телеграм бота и столкнулся с такой проблемой что после оплаты звездами не отрабатывает эвент "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 })));
    };
  • Вопрос задан
  • 9 просмотров
Подписаться 1 Сложный Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы