@bamalt

Как получить PreCheckoutQuery в Botman внутри диалога?

Я делаю телеграмм-бота с платным доступом с помощью библиотеки 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

Буду очень благодарен за любую помощь!
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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