Несколько изменений статуса заказов и онлайн оплата

Есть большой косяк со сменой статусов заказов. Причем, усугубляется он тем что формирование чеков коробочным модулем Атол Онлайн не предполагает никаких проверок. И изредка происходят вот такие сюрпризы:

Что было? Заказ оплачен с помощью эквайринга Сбербанк Онлайн. На этапе после оплаты там бывает всякое - распространенная проблема - пользователь закрывает страницу эквайринга не дожидаясь и оплаченный заказ остается в статусе Незавершенный(и как следствие не формируются кассовые чеки, не отрабатывают автоматически другие процессы для оплаченных заказов - нет никакой проверки на оплаты, не смотря на то что у Сбербанка есть весьма достойный API с документацией и примерами). А бывает вот ситуация как тут. Благо, я знаю что произошло т.к. знаком с этим покупателем. В этот момент сайт тормозил(это тема для отдельного баг-трекера, операция приведшая к тормозам была рядовой). Клиент вернувшийся со страницы Сбербанка видел пустую страницу и несколько раз её обновил. Как следствие - ему отправлена куча писем, а в онлайн-кассу ушли лишние 4 чека.

Баг первый - во-первых, не должны статусы меняться два раза - это просто не должно быть возможно(на статусы много что завязано в движке).

Баг второй - модуль эквайринга Сбербанка реализован криво, в следствии чего действия пользователей(всякие блокировщики скриптов и рекламы установленные в браузере, закрытие вкладки оплаты и т.д.) приводят к не корректной обработке/не обработке заказов, в следствии чего часто не пробиваются кассовые чеки обязательные по закону.

Баг третий - модуль Атол Онлайн вообще не стесняется отправлять 5 чеков идентичных друг за другом и его ничего вообще в этом не смущает.

Уверен, что проблема не только в этих модулях - такие логические ошибки надо и в других модулях оплаты-чеков проверить и устранить. Это ведь довольно очевидные логические ошибки. Тут же вопрос про деньги и отчетность. Да и не сказать что это какая-то удивительно редкая проблема - возникает периодически, хоть и не каждый день.

2 лайка

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

ну раз поднимать этот вопрос, прицеплюсь Сбербанк (SberPay, Apple Pay и все остальные Pay) так как по факту это и есть api
Ну и там осталось 2,5 недели до момента когда надо будет многим в Сбер передавать товары.

Ошибка продолжается, а меня уже откровенно задолбали бухгалтера. Это же в налоговую уходит… Подскажите, возможно ли как-то по-простому заблокировать двойную одинаковую смену статуса заказа?

1 лайк

можно попробовать в fn_change_order_status в app/functions/fn.cart.php

if (empty($status_from)) {
    $status_from = $order_info['status'];
}

заменить на

   $status_from = $order_info['status'];
1 лайк

Благодарю, а могли бы пояснить, в чем идея? Не очень понимаю, почему такое изменение должно препятствовать повторной смене статуса. Специально воспроизвести чтобы проверить крайне затруднительно.

$status_from это статус с которого нужно произвести замену , и он передается в функцию 3 параметром, но он не обязателен , и если его не передать то выполниться код

if (empty($status_from)) {
    $status_from = $order_info['status'];
}

в $order_info[‘status’] лежит актуальный статус

так же в функции , есть проверка

if (empty($order_info) || empty($status_to) || $status_from == $status_to) {
    return false;
}

и если текущий статус совпадает со статусом который пытаются присвоить заказу, то происходит выход из функции

видимо скрип платежного модуля при каждом выполнении в $status_from пишет один и тот же статус не проверяя изменился ли он, и если убрать проверку на пустоту, то при любом изменении статуса в $status_from всегда будет актуальный статус.

НО есть вероятность ,что где-то в системе заложена логика повторения действий при смене статуса без изменения статуса и такая правка ее убьет

1 лайк

Кстати, заметил что в модуле Атол Онлайн исправить косяк наоформляв чеков возврата переводами статусов туда-обратно нельзя - повторно не создается чек. Т.е. в одном месте проверку встроили(срабатывает в админке), а там где пользователи могут просто несколько раз F5 нажать - нет.

В качестве временного решения, чтобы бухгалтерия спала спокойно, можно перевести оплаты на платежный сервис с фискализацией. Например, Робокасса. Чтобы платежный сервис сам выбивал чек после успешной оплаты, а не CS-Cart. Да, это дороже по комиссиям. Но зато снимает риск получить штраф от налоговой.

Это замена одной периодически возникающей известной проблемы на набор неизвестных. Во-первых, дороже, во-вторых, процесс перехода займет время-деньги, в-третьих - на стороне 1С есть написанная интеграция со Сбером для минимизации ручного труда. И при этом сама проблема то останется, просто в менее критичном виде.

Проблема исчезнет, так как CS-Cart вообще не будет принимать участия в процессе формирования чека. Чек формирует не модуль Робокассы из CS-Cart, а сама Робокасса у себя на сервере на своей кассе. И не важно, закрыл вкладку покупатель или нет, нажал “Вернуться в магазин” или нет, медленное у него соединение или быстрое. Прошла оплата - есть один чек, не прошла оплата - нет чека. Это временно избавит вас от головной боли с формированием нескольких чеков, с множественным изменением статусов заказов. Перед налоговой вы будете чисты. Я и не писал, что это будет вам дешевле и не потребует никаких усилий.

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

2 лайка

Привет автор, как решил проблему? Хотим подключить эквайринг от сбера

1 лайк

У Сбера обнаружился свой собственный модуль для CS-Cart(не тот что в коробке), который умеет передавать список товаров в эквайринг. А онлайн-кассу Атол.Онлайн получилось интегрировать на стороне эквайринга. И проблема решилась - ни одной проблемы. В общем, не используйте коробочный модуль Сбербанка и не используйте отправку чеков на стороне сайта - лучше интеграцию настроить на стороне эквайринга, там проблем нет. Результат - товары в чеке есть, чеки формируются автоматически. Из дополнительных плюшек после интеграции онлайн-кассы с эквайрингом в случае возврата денег клиенту через эквайринг чек возврата формируется автоматически.

5 лайков

Где его взять, подскажите, пожалуйста :slight_smile:

Я уже не помню точно. Я его запрашивал у тех. поддержки эквайринга Сбербанка.

PS нашел ответ поддержки:

Здравствуйте.
Плагин для CS-Cart досутупен по ссылке: https://securepayments.sberbank.ru/wiki/doku.php/integration:cms:cs_cart:start
Чтобы в чек передавалось наименование товарных позиций, необходимо в настройках плагина выставить “Отправка корзины на шлюз”.

Документация по подключению Атол: https://securepayments.sberbank.ru/wiki/doku.php/other:54_fz:atol:checklist

2 лайка