Как подтвердить платёж в Telegram.Bots?

Пытаюсь настроить в телеграм-боте оплаты. После отправки SendInvoiceAsync появляется форма для заполнения данных карты. Но после ее ввода ничего не происходит, то есть телеграм не оправляет мне апдейт с PrecheckooutQuery и по итогу оплата отваливается по таймауту. ИИспользую стандартную библиотеку C# Telegram.Bots .

Вот так создаю инвойс:

            await _telegramBotClient.SendInvoiceAsync(chatId: user.ChatId,
                                                  title: "Product",
                                                  description: description,
                                                  payload: "somePayload",
                                                  providerToken: _configuration["ProviderToken"],
                                                  currency: "RUB",
                                                  prices: price,
                                                  needEmail: true,
                                                  startParameter: "exapmle",
                                                  isFlexible:false
                                                  );

Вот так пытаюсь отловить подтверждение оплаты:

            if (update.Type==UpdateType.PreCheckoutQuery)
        {
            Console.WriteLine("Precheckout");
            await ExecuteCommand(CommandNames.CheckPay, update);
            return;
        }

Подскажите, что делаю не так?


Ответы (1 шт):

Автор решения: Artyom

PreCheckoutQuery отвечает за обработку и утверждение платежа перед тем, как пользователь его совершит. Далее после утверждения, отправляем ответ серверу телеграма. Ответ серверу телеграма вы должны дать в течении 10 секунд, иначе платеж не пройдет. После того, как сервер телеграм получат ваш ответ, сервер тг в update вернет SuccessfulPayment. SuccessfulPayment отвечает за обработку успешно проведенного платежа.

Итого:

PreCheckoutQuery preCheckout = update.PreCheckoutQuery;
if (preCheckout != null)
{
    await telegramBotClient.AnswerPreCheckoutQueryAsync(update.PreCheckoutQuery.Id, CancellationToken);
    SuccessfulPayment successfulPayment = update.Message.SuccessfulPayment;

    if (successfulPayment != null)
    {
        //Ваша логика
    }
}

В примере использован положительный ответ, но вы можете использовать ответ отрицательный используя следующую конструкцию:

await telegramBotClient.AnswerPreCheckoutQueryAsync(update.PreCheckoutQuery.Id, "ErrorMessage", CancellationToken);

Надеюсь помог, удачи в последующей разработке.

P.S На тесте без SuccessfulPayment.

→ Ссылка