Оплата прошла, а заказ не оплачен - разбор причин
Покупатель заплатил, деньги в личном кабинете платёжной системы видны, а заказ на сайте остаётся неоплаченным. Разбираем причины по убыванию частоты.
С чего начать
Смотрим, что записано об оплате в самом заказе:
\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 -3curl -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 -20grep -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()); // причина отказа обработчика словамиПричины
-
Уведомление от платёжной системы не доходит до сайта примерно 30% случаев
ПризнакВ журнале веб-сервера нет ни одного запроса от платёжной системы за время оплаты.
ПроверкаПроверяем адрес уведомления обычным запросом снаружи и смотрим код ответа.
Что делатьОткрываем адрес уведомления: снимаем переадресацию, фильтр по адресам и защиту от нагрузки.
-
Подпись уведомления не совпала с ожидаемой примерно 25% случаев
ПризнакЗапрос в журнале есть, ответ платёжной системы записан, а признак оплаты не выставлен.
ПроверкаПовторяем обработку уведомления вручную и читаем сообщение об ошибке обработчика.
Что делатьСверяем секретный ключ в настройках платёжной системы с ключом из личного кабинета.
-
Сумма или валюта платежа не сходится с заказом примерно 20% случаев
ПризнакОплата частичная или отличается на копейки, обработчик отклоняет такой платёж.
ПроверкаСравниваем сумму в уведомлении с суммой платежа заказа до копейки.
Что делатьПриводим округление и валюту к настройкам сайта либо разрешаем частичную оплату явно.
-
Уведомление относится к другому заказу примерно 15% случаев
ПризнакОплаченным оказывается посторонний заказ или уведомление не находит ни одного.
ПроверкаСмотрим, какой идентификатор пришёл в уведомлении: заказа, платежа или счёта.
Что делатьПриводим сопоставление к идентификатору платежа, а не к номеру заказа для покупателя.
-
Тестовые ключи вместо боевых после выкладки примерно 10% случаев
ПризнакНа стенде оплата отмечается, а на боевом сайте перестаёт после первого же платежа.
ПроверкаСверяем режим работы платёжной системы и пару ключей на боевом сайте и на стенде.
Что делатьПрописываем боевые ключи и выключаем тестовый режим в настройках платёжной системы.
Частые вопросы
Чем возврат покупателя отличается от уведомления?
Возврат - это переход браузера покупателя на страницу сайта, уведомление - отдельный запрос сервера платёжной системы. Оплату отмечает именно уведомление: браузер до сайта может и не дойти.
Можно ли отметить оплату вручную?
Можно из карточки заказа, и это правильное действие для разового сбоя. Но причину всё равно ищут: следующий платёж повторит ту же историю.
Почему на стенде работает, а на бою нет?
Чаще всего из-за тестовых ключей и закрытого адреса уведомления. На боевом сайте перед подключением проверяют оба пункта отдельно.
Что делать, если платёжная система шлёт уведомление повторно?
Обработчик обязан быть устойчив к повторам: второй раз он ничего не меняет. Признак уже обработанного платежа хранят в самом платеже.
Как проверить связку до первого покупателя?
Провести тестовую оплату минимальной суммой на боевом сайте и вернуть её. Это дешевле, чем разбирать первый настоящий платёж.
Смежное
- Доставка и оплата - оглавление подтемы
- Свой обработчик оплаты: форма, уведомление, отметка платежа - как устроена отметка оплаты
- Оплаты и отгрузки заказа: объекты, признаки, частичные операции - что означает признак оплаты
- Чек не уходит в кассу: разбор причин - соседний разбор после оплаты
- Приём вебхука от внешнего сервиса: точка входа, подпись, повторы - устройство приёма уведомлений
- Статусы заказов: смена из кода, события и сопоставление с 1С - что меняется после оплаты
- Каталог и продажи - устройство продаж целиком