forum.bitel.ru
http://forum.bitel.ru/

[6.0] Задвоение платежей
http://forum.bitel.ru/viewtopic.php?f=38&t=11871
Страница 1 из 1

Автор:  ЮжныйКраснодар [ 16 авг 2016, 14:03 ]
Заголовок сообщения:  [6.0] Задвоение платежей

Добрый день.
Если в момент бэкапа БД приходит Яндекс-платёж - он вносится дважды:
Код:
id   cid   tranz   sum   val   pc   purse   datetime
                     
2916   17795   2000466776173   650.00   RUB   EKOM   410011837201967   02.07.2016 07:03:15
2917   17795   2000466776173   650.00   RUB   EKOM   410011837201967   02.07.2016 07:03:15
                     
2964   18379   2000468855534   500.00   RUB   EKOM   410011837201967   06.07.2016 07:00:23
2965   18379   2000468855534   500.00   RUB   EKOM   410011837201967   06.07.2016 07:00:23


Видимо, не дождавшись ответа из-за нагрузки на БД при бэкапе, Яндекс перепосылает платеж - он падает в очередь и, после окончания бэкапа, проводится дважды - не отсекая повторный по номеру транзакции.

Автор:  Artur [ 16 авг 2016, 14:08 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

А вы бэкап делаете с основной БД? Обычно делают репликацию на слейв, а потом снимают бэкапы со слейва, который потом догонит мастер...

Автор:  ЮжныйКраснодар [ 16 авг 2016, 14:10 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

да - с основной

Автор:  stark [ 16 авг 2016, 14:30 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

Еще есть Percona XtraBackup.

Автор:  ЮжныйКраснодар [ 16 авг 2016, 14:40 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

это - понятно, но - в идеале - модуль должен отсекать повторяющиеся платежи с одинаковыми номерами транзакции, суммами и временем.

Автор:  Artur [ 16 авг 2016, 14:57 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

А с каким интервалом приходили платежи?

Автор:  dimOn [ 16 авг 2016, 16:41 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

Каким экзекутером/протоколом пользуетесь?
/yaexecuter/ или /yaexecuter3/

Автор:  dimOn [ 16 авг 2016, 16:46 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

проверки там все эти есть согласно протоколу (сверяется по InvoiceId):
1) на повторный checkOrder ошибка там вылезает (по протоколу не может прийти повторно), но это нормально т.к. запрос приходит в момент попытки платежа и всё равно там ничего не делается при этом, только договор пытается найтись
2) на повторный paymentAviso сразу отправляется корректный ответ (с текстовым комментарием OK (Re-send) ) и ничего не делается, как и положено по протоколу, т.к. там и написано что уведомление об оплате может приходить повторно

так что дело не в коде, а в том что в момент прихода второго запроса у вас в БД нет записи ещё о первом приходе, вот тут нужно подумать почему такое

Автор:  ЮжныйКраснодар [ 16 авг 2016, 18:05 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

dimOn писал(а):
Каким экзекутером/протоколом пользуетесь?
/yaexecuter/ или /yaexecuter3/


/yaexecuter3/

запросы
Код:
[02/Jul/2016:07:03:14 +0300] 0.019 200 171 "POST /bgbilling/yaexecuter3 HTTP/1.1"
и
[02/Jul/2016:07:10:35 +0300] 380.285 200 173 "POST /bgbilling/yaexecuter3 HTTP/1.1"

Автор:  dimOn [ 16 авг 2016, 18:18 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

Второй запрос висел 6.5 минут. Вероятно, он захватил себе коннекшен, в это время другой запрос сделал все дела, потом когда его отпустило - он в этом коннекшене и сделал всё что ему нужно, а в нём не было данных БД, потому что там транзакции.
Наверное, так. Хотя первый запрос был 7+ минут ранее, потому непонятно что произошло, нужно совместно подумать об этом. В коде как я сказал все проверки на дублирующийся запрос есть.

Автор:  ЮжныйКраснодар [ 16 авг 2016, 18:51 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

А если добавить на таблицу yamoney_transactions_Х ключ по связке (invoiceId + paymentDateTime)?
Тогда сама БД будет отбивать такие дубли, вываливая ошибку в логи

Автор:  dimOn [ 17 авг 2016, 11:36 ]
Заголовок сообщения:  Re: [6.0] Задвоение платежей

Ну почему тогда не по invoiceId просто. Ну так-то можно теоретически... но тогда яндексу вернётся ошибочный ответ что не очень-то по протоколу

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/