Установка и настройка плагина, а также его удаление полностью зависимы от используемой CMS. А вот инициализация платежа, проверка статуса платежа и инициализация возврата платежа идентичны, в результате чего само собой напрашивалось решение создания SDK, который можно (и нужно) использовать повторно при разработке решения для следующих платформ.
Так и сделали. Реализовали класс cdekpayPaymentSDK
, в котором инкапсулировали весь опыт взаимодействия с платежным сервером, не зависящий от CMS. Класс cdekpayPaymentSDK
очень прост и имеет три основных публичных метода:
initPayment()
— инициализация платежа;
getPayments()
— проверка статуса платежа или платежей;
initRefundPayment()
— инициализация возврата платежа.
Большую часть времени разработчики занимаются исследованиями CMS и ее особенностей, о которых упоминалось ранее. Остальное дело техники: реализуем, тестируем и запускаем в продакшен.
Подключение CDEK Pay
API платежной системы устроен просто. Доступность описания всех эндпоинтов в Swagger по адресу https://api.cdekfin.ru
сильно ускорила разработку. Благодарим разработчиков платежной системы за это.
Для оформления заказа первым делом формируется массив с данными по заказу, включающий номер заказа на стороне интеграции (например, сгенерированный CMS), e-mail пользователя, логин учетной записи магазина, зарегистрированного на стороне CDEK Pay, сумма заказа, перечень товаров, а также 2 ссылки на страницы, куда переводить пользователя в случаях успешной и неуспешной оплаты. По данным полученного массива формируется по определенным правилам строка. На основе полученной строки и секретного ключа, полученного от CDEK Pay, формируется электронная сигнатура по алгоритму SHA256. Сигнатура включается в массив данных, сформированных выше, и этот массив передается POST-запросом на эндпоинт /merchant_api/payment_orders
для платежей в боевом режиме, или на /test_merchant_api/payment_orders
для платежей в тестовом режиме.
Если верно указан логин магазина, и правильно подписан массив данных, пользователю возвращается код 200 OK
и JSON, содержащий номер заказа на стороне СДЭК Pay вместе со ссылкой на оплату заказа. Далее номер заказа CDEK Pay сохраняется в базе данных на стороне интеграции (например, в CMS) и пользователь направляется на страницу оплаты заказа. Нужно включить ссылку на оплату в информацию по заказу на случай, если оплата не пройдет, и пользователь решит попробовать оплатить еще раз. Платежную ссылку возможно отправить пользователю на e-mail. Таким образом, данные по заказу на стороне интеграции сохраняются еще до фактической оплаты заказа: заказ формируется и ему присваивается статус «В ожидании».
Затем, если оплата прошла, покупатель попадает на страницу успешной оплаты, ссылка на которую передана ранее в массив данных по заказу. Соответственно, в случае неуспешной оплаты пользователь переводится на страницу неуспешной оплаты.
Cо стороны СДЭК Pay нам приходит информация заказа по вебхуку. Вебхук — это URL, который указывается в личном кабинете CDEK Pay для интернет-магазина, и на который приходят данные. Обработка вебхука на стороне интеграции происходит достаточно просто: определяется эндпоинт на стороне интеграции, на который могут прийти данные.
$data = json_decode(html_entity_decode(file_get_contents("php://input")), true);
Одна строка кода формирует массив $data
с параметрами оплаченного заказа, которые можно проверить на валидность и обновить статус заказа в базе данных интернет-магазина. Данные подписаны секретным ключом, подобным образом, как в случае передачи данных по заказу на сторону CDEK Pay.
Данные при возврате средств тоже приходят по вебхуку. Статус заказа меняется на «Возмещен», и сумма возврата сохраняется в базе данных. Но что делать, если пользователь решил оплатить заказ по ссылке, пришедшей, например, ему на e-mail в тот момент, когда интернет-магазин обновляется, и сайт висит в нерабочем режиме обслуживания? В этот момент магазин не может принять данные по вебхуку. Конечно, CDEK Pay будет продолжать попытки отправить данные заказа торговцу. В отдельном случае данные магазином так и не будут получены.
Тяжелый случай помогает победить эндпоинт информации о заказе, где данные приходят не по вебхуку, а в ответ на запрос СДЭК Pay на проверку статуса заказа, благо номер заказа сохранен в базе данных. Эндпоинт (GET-запрос) для получения информации по платежу в боевом режиме — /merchant_api/payments
, а в тестовом — /test_merchant_api/payments
. Вызов контрольных эндпоинтов можно организовать на периодической основе, например, через планировщика задач cron.
Основная информация, передаваемая на указанные эндпоинты, — логин магазина, номер заказа CDEK Pay и сигнатура SHA256. В ответ появляется список заявок заказа cо статусами и суммами, которых достаточно для обновления базы мерчанта.