Оплата в Telegram
Вы можете принимать платежи от пользователей Telegram за предоставляемые услуги или товары. Есть два способа настройки оплаты в сценарии JAICP:
- С помощью тега действия
TelegramPayment
. - С помощью ответа бота
telegramPayment
через объект$response
.
Тег действия — это готовое решение,
которое вы можете быстро встроить в сценарий, лишь указав необходимые параметры.
Использование ответа бота через $response
подходит для сценариев,
в которых нужно более гибко настроить проверку наличия товара.
В этой статье описан пример, как настроить оплату с помощью ответа бота telegramPayment
.
Подробное описание того, как использовать тег действия, вы можете найти в статье TelegramPayment
.
Пример использования
Рассмотрим следующий пример. Вы хотите, чтобы бот отправил пользователю форму на оплату билета.
Чтобы это сделать, необходимо:
- Создать бота в Telegram.
- Подключить платежную систему и получить ее уникальный токен.
- Использовать в сценарии ответ с типом
telegramPayment
state: TelegramPayment
intent!: /Payment
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "telegramPayment",
"providerToken": $injector.providerToken,
"startParameter": true,
"paymentTitle": "Она",
"description": "Кинотеатр «Аврора», 25 декабря, 12:00",
"imageUrl": "https://upload.wikimedia.org/wikipedia/en/4/44/Her2013Poster.jpg",
"amount": "400",
"currency": "RUB",
"invoicePayload": "197110, Санкт-Петербург, ул. Большая Зеленина, 24, стр. 1"
});
Статус товара
Перед тем как обработать платеж, Telegram отправляет в JAICP запрос на проверку наличия товара.
В сценарии на этот запрос срабатывает событие telegramPrecheckoutEvent
.
Добавьте в стейт TelegramPayment
два вложенных стейта: Precheckout
и PaymentFailed
.
telegramPaymentPrecheckout
, чтобы установить статус проверки.Для проверки наличия товара бот будет посылать запросы на URL-адрес сервиса,
который вы укажете в переменной precheckoutUrl
.
Если товара нет в наличии и сервис вернет ответ с HTTP-кодом, отличным от 2xx
, то бот перейдет в стейт PaymentFailed
.
В этом стейте будут обрабатываться ошибки, его реализация будет рассмотрена позже.
state: Precheckout
event: telegramPrecheckoutEvent
script:
// URL-адрес сервиса для проверки наличия товара.
var precheckoutUrl = "https://www.example.com/";
$response.replies = $response.replies || [];
var telegramPrecheckoutReply = {
type: "telegramPaymentPrecheckout",
precheckoutId: $request.query,
success: true
};
try {
var response = $http.query(precheckoutUrl);
if (!response.isOk) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
} catch (e) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
$response.replies.push(telegramPrecheckoutReply);
state: PaymentFailed
event: telegramPaymentFailedEvent
a: Возникли неполадки. Пожалуйста, напишите нам на client@just-ai.com, чтобы купить билет.
В сценарии нужно обязательно обрабатывать событие
telegramPrecheckoutEvent
.
Иначе платежи не будут проходить, а последующие сообщения пользователя будут обрабатываться в стейте CatchAll
.Если вам не нужно проверять наличие товара перед оплатой, то используйте в сценарии следующую запись:
state: Precheckout
event: telegramPrecheckoutEvent
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "telegramPaymentPrecheckout",
"precheckoutId": $request.query,
"success": true
});
В таком случае событие будет всегда успешно обрабатываться, а товар будет считаться всегда в наличии.
Статус оплаты
Для обработки статуса оплаты предусмотрены события:
telegramPaymentSuccessEvent
— оплата прошла успешно.telegramPaymentFailedEvent
— возникла ошибка, потому что товара нет в наличии или параметры ответа заполнены некорректно. Например, был указан невалидный токен или цена меньше минимального допустимого значения.noMatch
— оплата не прошла и пользователь отправил произвольное сообщение боту.
Создайте для telegramPaymentSuccessEvent
и noMatch
вложенные стейты PaymentSuccessful
и CatchAll
.
Для обработки события telegramPaymentFailedEvent
используйте написанный ранее стейт PaymentFailed
.
state: PaymentSuccessful
event: telegramPaymentSuccessEvent
a: Оплата прошла успешно. Мы выслали ваш билет на указанный email. До встречи в эфире!
go!: /SendTickets
state: CatchAll
event: noMatch
a: Платеж не прошел. Проверьте, пожалуйста, правильность введенных данных и повторите попытку.
go!: /TelegramPayment
Полный пример сценария
state: TelegramPayment
intent!: /Payment
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "telegramPayment",
"providerToken": $injector.providerToken,
"startParameter": true,
"paymentTitle": "Она",
"description": "Кинотеатр «Аврора», 25 декабря, 12:00",
"imageUrl": "https://upload.wikimedia.org/wikipedia/en/4/44/Her2013Poster.jpg",
"amount": "400",
"currency": "RUB",
"invoicePayload": "197110, Санкт-Петербург, ул. Большая Зеленина, 24, стр. 1"
});
state: Precheckout
event: telegramPrecheckoutEvent
script:
// URL-адрес сервиса для проверки наличия товара.
var precheckoutUrl = "https://www.example.com/";
$response.replies = $response.replies || [];
var telegramPrecheckoutReply = {
type: "telegramPaymentPrecheckout",
precheckoutId: $request.query,
success: true
};
try {
var response = $http.query(precheckoutUrl);
if (!response.isOk) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
} catch (e) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
$response.replies.push(telegramPrecheckoutReply);
state: PaymentFailed
event: telegramPaymentFailedEvent
a: Возникли неполадки. Пожалуйста, напишите нам на client@just-ai.com, чтобы купить билет.
state: PaymentSuccessful
event: telegramPaymentSuccessEvent
a: Оплата прошла успешно. Мы выслали ваш билет на указанный email. До встречи в эфире!
go!: /SendTickets
state: CatchAll
event: noMatch
a: Платеж не прошел. Проверьте, пожалуйста, правильность введенных данных и повторите попытку.
go!: /TelegramPayment