Я делаю телеграмм-бота с платным доступом с помощью библиотеки botman.
Возникла проблема с получением ответа от телеграмм "PreCheckoutQuery".
Я пошел следующим путем:
1. Создал иерархию диалогов с помощью кнопок
*Главное меню (MainConversation)
** подменю
*** под-под-меню
*** и т.д
*Оплата (PaymentConversation)
*Помощь (ПомощьРазговор)
2. Перемещаюсь по разделам меню с помощью switch-case и метода ask:
$this->ask('some text', function (Answer $answer)
switch ($answer->getText()) {
case 'some function':
$this->bot->startConversation(new SomeConversation());
break;
case 'Payment':
$this->bot->startConversation(new PaymentConversation());
break;
case 'Help':
$this->bot->startConversation(new HelpConversation());
}
}, $this->keyboard());
3. Внутри PaymentConversation этот код:
public function invoice()
{
$invoice = [
'title' => 'asdf',
'description' => 'asdf',
'payload' => 'asdf',
'provider_token' => 'some token',
'currency' => 'USD',
'prices' => json_encode(array(array(
'label' => 'asdf',
'amount' => 100000
)))
];
$this->bot->sendRequest('sendInvoice', $invoice);
}
После sendRequest бот отправляет invoice, на который пользователь должен ответить. После заполнения платежной информации телеграм отправляет update "pre_checkout_query", на который я должен ответить методом answerPreCheckoutQuery (
подробнее) Я не понимаю, как правильно заставить botman слушать update внутри диалога.
Сначала у меня была идея просто сделать middleware, который бы отслеживал PreCheckoutQuery в IncomingMessage, но я столкнулся с тем, что бот не понимает этот запрос и тогда я создал отдельный TelegramPreCheckoutQueryDriver, который обрабатывает такие сообщения. Теперь я могу подтвердить оплату в посреднике, но это сильно ограничивает мои действия. Я хотел бы сделать это в рамках диалога.
Я вижу такой алгоритм:
Пользователь нажал кнопку «Платежи».
Запускается PaymentConversation
Invoice отправлен пользователю
Пользователь заполняет данные платежа и нажимает оплатить
Бот получает сообщение с PreCheckoutQuery
Бот возвращает значение pre_checkout_query_id
Бот отправляет answerPreCheckoutQuery
Бот получает подтверждение платежа и записывает информацию об этом в базу данных
Бот запускает диалог MainConversation
Буду очень благодарен за любую помощь!