Перейти к содержимому

Оплата прошла, а заказ не оплачен - разбор причин

Покупатель заплатил, деньги в личном кабинете платёжной системы видны, а заказ на сайте остаётся неоплаченным. Разбираем причины по убыванию частоты.

С чего начать

Смотрим, что записано об оплате в самом заказе:

\Bitrix\Main\Loader::includeModule('sale');
$rows = \Bitrix\Sale\Internals\PaymentTable::getList(['filter' => ['=ORDER_ID' => $orderId],
'select' => ['ID', 'PAID', 'SUM', 'PAY_SYSTEM_ID', 'DATE_PAID', 'PS_STATUS']])->fetchAll();
print_r($rows);
// признак оплаты и ответ платёжной системы лежат прямо здесь

Заполненный ответ платёжной системы при непроставленной оплате означает, что уведомление дошло и было отклонено. Пустой ответ означает обратное: до сайта уведомление не добралось вовсе.

Проверяем, доступен ли адрес уведомления снаружи:

Окно терминала
curl -sI 'https://example.com/bitrix/tools/sale_ps_result.php' | head -3
curl -sI 'https://example.com/local/pay/result.php' | head -3
# код 200 или 405 - адрес жив; 301, 403 и 404 означают, что уведомление не дойдёт

Читаем журнал обращений платёжной системы:

Окно терминала
grep -iE 'sale_ps_result|/pay/' /var/log/nginx/access.log | tail -20
grep -i 'pay' /home/bitrix/www/bitrix/modules/error.log | tail -10
# отсутствие строк за время оплаты означает, что запроса не было

Журнал веб-сервера отвечает на главный вопрос разбора. Запрос от платёжной системы либо есть в нём с кодом ответа, либо его нет совсем, и это два совершенно разных разбора.

Повторяем обработку уведомления руками:

$payment = \Bitrix\Sale\Payment::load($paymentId);
$service = \Bitrix\Sale\PaySystem\Manager::getObjectById($payment->getPaymentSystemId());
$result = $service->processRequest($payment, \Bitrix\Main\Context::getCurrent()->getRequest());
print_r($result->getErrorMessages()); // причина отказа обработчика словами

Причины

  1. Уведомление от платёжной системы не доходит до сайта примерно 30% случаев

    ПризнакВ журнале веб-сервера нет ни одного запроса от платёжной системы за время оплаты.

    ПроверкаПроверяем адрес уведомления обычным запросом снаружи и смотрим код ответа.

    Что делатьОткрываем адрес уведомления: снимаем переадресацию, фильтр по адресам и защиту от нагрузки.

  2. Подпись уведомления не совпала с ожидаемой примерно 25% случаев

    ПризнакЗапрос в журнале есть, ответ платёжной системы записан, а признак оплаты не выставлен.

    ПроверкаПовторяем обработку уведомления вручную и читаем сообщение об ошибке обработчика.

    Что делатьСверяем секретный ключ в настройках платёжной системы с ключом из личного кабинета.

  3. Сумма или валюта платежа не сходится с заказом примерно 20% случаев

    ПризнакОплата частичная или отличается на копейки, обработчик отклоняет такой платёж.

    ПроверкаСравниваем сумму в уведомлении с суммой платежа заказа до копейки.

    Что делатьПриводим округление и валюту к настройкам сайта либо разрешаем частичную оплату явно.

  4. Уведомление относится к другому заказу примерно 15% случаев

    ПризнакОплаченным оказывается посторонний заказ или уведомление не находит ни одного.

    ПроверкаСмотрим, какой идентификатор пришёл в уведомлении: заказа, платежа или счёта.

    Что делатьПриводим сопоставление к идентификатору платежа, а не к номеру заказа для покупателя.

  5. Тестовые ключи вместо боевых после выкладки примерно 10% случаев

    ПризнакНа стенде оплата отмечается, а на боевом сайте перестаёт после первого же платежа.

    ПроверкаСверяем режим работы платёжной системы и пару ключей на боевом сайте и на стенде.

    Что делатьПрописываем боевые ключи и выключаем тестовый режим в настройках платёжной системы.

Частые вопросы

Чем возврат покупателя отличается от уведомления?

Возврат - это переход браузера покупателя на страницу сайта, уведомление - отдельный запрос сервера платёжной системы. Оплату отмечает именно уведомление: браузер до сайта может и не дойти.

Можно ли отметить оплату вручную?

Можно из карточки заказа, и это правильное действие для разового сбоя. Но причину всё равно ищут: следующий платёж повторит ту же историю.

Почему на стенде работает, а на бою нет?

Чаще всего из-за тестовых ключей и закрытого адреса уведомления. На боевом сайте перед подключением проверяют оба пункта отдельно.

Что делать, если платёжная система шлёт уведомление повторно?

Обработчик обязан быть устойчив к повторам: второй раз он ничего не меняет. Признак уже обработанного платежа хранят в самом платеже.

Как проверить связку до первого покупателя?

Провести тестовую оплату минимальной суммой на боевом сайте и вернуть её. Это дешевле, чем разбирать первый настоящий платёж.

Смежное

Первоисточник