#281

Как принимать платежные уведомления

Почти все платежные системы устроены одинаково. Ты отправляешь своего пользователя на страницу платежки, там происходит магия, затем она редиректит пользователя на спасибо-страничку, а сама тихонечко постит тебе подтверждение платежа (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 только в самом конце, после успешного завершения всей бизнес-логики.