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

Мы интегрируемся с SagePay методом серверной интеграции.

POST-уведомление от SagePay вызывает PHP-скрипт на нашей стороне.

Сам наш обратный вызов PHP должен вызывать несколько методов внешнего веб-сервиса.

Иногда из-за сетевой задержки выполнение нашего сценария обратного вызова занимает более 20 секунд. SagePay это не нравится, и он повторно отправляет новое уведомление POST. Это приводит к тому, что наш обратный вызов в конечном итоге выполняется дважды или более, что далеко от идеала (отправляет несколько электронных писем с завершением платежа и т. д.). По сути, SagePay продолжает выдавать уведомления, пока не получит ответ менее чем за 20 секунд.

Мы не можем просто игнорировать последний запрос POST от SagePay, поскольку они «забывают» о любых предыдущих уведомлениях и ищут ответ от самого последнего. Мы также ничего не можем сделать с сетевой задержкой.

Кто-нибудь может дать совет, что делать в такой ситуации?


person CJD    schedule 27.03.2016    source источник


Ответы (1)


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

Однако вы все равно должны стремиться ускорить его. Подумайте о том, как вы можете отправлять свои электронные письма в cron/запланированном задании каждую минуту, чтобы ваши клиенты не задерживались в ожидании ответа от третьих лиц. Вместо того, чтобы отправлять электронные письма в обратном вызове уведомлений, вы можете просто добавить строки в таблицу email_queue для последующей обработки заданием cron.

person IanMcL    schedule 12.04.2016
comment
Спасибо, Ян, сохранить сообщение и продолжить обработку не получится. На веб-сайте SagePay указано: «Если ваш сервер не отвечает на уведомление, мы отправим еще одну попытку. Ваш сервер должен отвечать на последнее уведомление, отправленное Sage Pay. Любые ответы на более старые сообщения с уведомлениями Sage Pay будут игнорироваться». В конце концов нам удалось несколько ускорить звонки, что помогло. Нам нужно дождаться запуска вызовов веб-службы, чтобы узнать, следует ли возвращать SagePay «ok» или нет. - person CJD; 12.04.2016