Почти все платежные системы устроены одинаково. Ты отправляешь своего пользователя на страницу платежки, там происходит магия, затем она редиректит пользователя на спасибо-страничку, а сама тихонечко постит тебе подтверждение платежа (IPN) на твой URL.
Давай поговорим о том, как правильно принимать эти IPN.
Это должен быть отдельный http сервер (или отдельный .php), со своим конфигом, не использующий общий код проекта. Все, что должен делать этот скрипт — записать сырые данные платежного уведомления в базу и сказать HTTP 200 OK. И все, и ни в коем случае ничего больше!
Структура таблички должна быть примерно такой:
CREATE TABLE IPN (
data TEXT,
isProcessed TINYINT(1) DEFAULT 0
);
(createdAt
и NOT NULL
добавь по вкусу)
Цель простая: как можно атомарнее и проще принять уведомление, надежно его записать и подтвердить платежке. Вокруг платежа может быть очень много разной логики, и она может ломаться в самых разных местах. Не надо так! Прими уведомление, потом разбирайся.
Не надо пытаться парсить эти данные. Ты можешь сломаться в миллионе мест. Более того, очень часто тебе нужно будет повторно парсить эти уведомления, а иной раз и задним числом.
Нельзя использовать ни строчки общего кода. Даже конфиг. Там может быть ошибка, и у тебя сломается прием платежей. Больно.
Исключительно отдельный код на полстранички без зависимостей! Так тебе не придется его рестартить почти никогда.
А вот парсер у тебя пусть работает отдельно, регулярно забирает новые уведомляшки с помощью SELECT FOR UPDATE и вот он уже является частью твоего кода.
Сломался? Ничего страшного. Ведь isProcessed
он поставит =1
только в самом конце, после успешного завершения всей бизнес-логики.