Ballly
@Ballly

Как сделать проверку статуса платежа и дальнейшее выполнение функций?

Имеется мобильная версия сайта с возможностью проведения оплаты услуги через ЮКассу, форма оплаты загружается на самом сайте, варианты оплаты предлагаются следующие - ввод банковской карты, либо по СБП. При оплате по банковской карте проблем не возникает и после успешной оплаты пользователь перенаправляется на страницу result с получением информации, а вот при оплате по СБП, бывает две ситуации - первая, когда пользователь возвращается в мобильный браузер из приложения банка после проведения оплаты, его также редиректит на страницу result, вторая ситуация, пользователь проводит операцию в приложении банка, деньги списываются, но возвращаясь в браузер у него страница перезагружается и возвращается на главную страницу с выбором услуги, при этом деньги списаны, а нужной информации он не видит. На странице result при этом реализована функция отправки смс и email клиенту, но они отрабатывают на странице result только если платеж перешел в статус success. Я же хочу в данном случае, в независимости от того, что пользователь вернулся из приложения банка в браузер или нет, чтобы при успешном проведении платежа на странице продолжили выполняться функции и если будет событие success, то стразу же отправлять смс и емайл. На текущей странице формирования платежа payment, есть функция Юкассы для получения статуса - $paymentStatus, но при переходе на страницу она имеет статус pending, что в принципе правильно, так как платеж еще не проведен, но я бы хотел, чтобы именно после формирования и оплаты платежа выполнялась функция по проверке статуса success и выполнялись определенные действия в независимости от того, вернулся пользователь на страницу или нет.
Route::get('payment.json',
    ['before' => 'json_referer', 'main' => function () use ($kassa) {
        extract(filter_var_array(
            Input::get(['amount', 'type_id', 'phone', 'email']), [
                'amount' => FILTER_VALIDATE_INT,
                'type_id' => [
                    'filter' => FILTER_VALIDATE_INT,
                    'options' => ['default' => 0]
                ],
                'phone' => FILTER_VALIDATE_INT,
                'email' => FILTER_VALIDATE_EMAIL,
            ]
        ));

        $kassa->oauth($kassa::OAUTH_TOKEN);

        //http-уведомления Юкассы об изменении статуса платежа
        $kassa->addWebhooks();

        // формирование объекта платежа Юкассы - createPayment
        $embedded = $kassa->embedded($amount, [
            'type_id' => $type_id,
            'phone' => $phone,
            'email' => $email
        ], 'ru_RU');
        if ( ! $embedded) return Response::create('#404:Error', 404);

        $payment = $kassa->payment_info($embedded->getId());
        if (!$payment) return Response::redirect('/');

        $paymentStatus = $payment->getStatus();

        return Response::json([
            'token' => $embedded->getConfirmation()->getConfirmationToken(),
            'return_url' => Uri::full('/result?paymentId=' . $embedded->getId())
        ], 200);
    }]
);
  • Вопрос задан
  • 964 просмотра
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Страница result не имеет вообще никакого отношения к успешности платежа. На неё любой придурок и так может перейти, руками, без всякой оплаты.
Успешность оплаты подтверждается либо колбеком банка, либо отдельным запросом в банк. После которых полученная информация записывается в базу данных, а затем "выполнение кода продолжается" и код начинает отправлять всякие СМС и емейлы. После получения подтверждения, а не на странице result.

Соответственно, на любой странице, куда попадает пользователь, будь это страница result, или "на главную страницу с выбором услуги" код должен проверять состояние платежа по базе данных. Если заказ оплачен успешно, то так и писать. Если колбек ещё не пришел, то можно самостоятельно запросить информацию о статусе платежа.
Ответ написан
Комментировать
YooMoneyHelp
@YooMoneyHelp
Здравствуйте. Рекомендуем ориентироваться на уведомление об успехе платежа payment.succeeded: https://yookassa.ru/developers/using-api/webhooks#...
Также, можете использовать запрос get_payment: https://yookassa.ru/developers/api#get_payment
Периодичность запросов определяется вами самостоятельно.
Если варианты выше по каким-то причинам вам не подходят, напишите на почту технических специалистов ЮKassa: b2b_support@yoomoney.ru Коллеги разберут ваш сценарий более детально и все расскажут.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
link_web
@link_web
Magento, Laravel, Zend, Shopify, Prestashop, WP
я бы на вашем месте сделал проверку платежей тогда еще и через очереди(message queue). делать проверку в очереди было ли отправлено email/смс, хранить информацию по заказу в таблице и уже проверять заказ через api яндекса.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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