← Назад к решениям
ПлагинPHPПлатно

WP Remote Payment Client

Шлюз WooCommerce, принимающий оплату через шлюз, оформленный на другой сайт. Создаёт теневой заказ на той стороне, возвращает ссылку на оплату и переводит локальный заказ по колбэку с HMAC-подписью и токеном - с записью каждого обмена в таблицу лога.

WP Remote Payment Client

Стек

PHPWordPressWooCommerceREST APIJWTHMACMySQL

Проблема

Магазину нужно было принимать оплату через шлюз, оформленный на другой сайт. Покупателей приходилось отправлять платить на сторону, а всё, что происходило дальше, оставалось догадкой: магазин никак не узнавал результат, поэтому оператор вручную сверялся с чужой системой и двигал заказы. Оплаченные заказы висели невыполненными, а брошенные выглядели точно так же, как оплаченные.

Наивные версии такой интеграции ломаются двумя конкретными способами. Либо эндпоинт колбэка остаётся открытым - и любой, кто узнал адрес, помечает любой заказ оплаченным, а магазин этому верит. Либо две системы ведут отдельные записи о заказах, которые расходятся, и сверка превращается в еженедельную повинность.

До → После

ДоПосле
Покупатель уходит платить на сторону без пути обратно в заказШлюз в оформлении заказа возвращает ссылку на оплату и ведёт её до конца
Результат оплаты узнаёт человек, заглянув в другую системуПодписанный колбэк сам переводит заказ в реальный статус
Адрес колбэка, который мог дёрнуть кто угодноЭндпоинты за токеном и полезная нагрузка с HMAC-подписью
Две системы, две записи заказа, еженедельная сверкаТеневой заказ связан источником и исходным id: не сверка, а поиск
Сбои не видны, пока не пожалуется клиентКаждый обмен пишется в таблицу лога со статусом и телом запроса
Подключить новый сайт-партнёр - значит править кодЭндпоинты, секрет, токен и провайдер задаются в настройках шлюза

Как это работает

  1. Покупатель выбирает шлюз. Он регистрируется как обычный способ оплаты WooCommerce, поэтому появляется при оформлении рядом с остальными вариантами и не требует правок темы.
  2. Теневой заказ создаётся на той стороне. Заказ сериализуется и уходит на сайт-партнёр, тот создаёт свой соответствующий заказ и возвращает ссылку на оплату. Покупателя перенаправляют на неё.
  3. Обе стороны остаются адресуемыми. Теневой заказ несёт id исходного заказа и метку источника, поэтому любая из систем находит запись другой обычным мета-запросом. Отдельной таблицы соответствий, которой свойственно разъезжаться, просто нет.
  4. Результат оплаты возвращается подписанным. Эндпоинт колбэка требует токен, а тело запроса несёт HMAC-подпись, которая проверяется по общему секрету сравнением, устойчивым к атаке по времени. Только после этого меняется статус локального заказа.
  5. Каждый обмен логируется. Отдельная таблица пишет заказ, id удалённого заказа, источник, статус, адрес колбэка и сырое тело запроса - поэтому спорный платёж разбирается запросом, а не расследованием.
  6. Смены статуса распространяются. Обработчик следит за статусом локального заказа и держит удалённую сторону в курсе, чтобы отмена или возврат с одной стороны не оставляли другую с устаревшими данными.

Основные возможности

  • Платёжный шлюз WooCommerce - в оформлении заказа выглядит как любой другой способ
  • Создание теневого заказа на удалённом сайте с возвратом ссылки на оплату
  • Подпись запросов HMAC-SHA256 с проверкой, устойчивой к атаке по времени
  • REST-эндпоинты за токеном: ссылка, поиск заказа, колбэк
  • Сопоставление заказов по источнику и исходному id - без таблицы соответствий
  • Таблица лога удалённых обменов со статусом и телом запроса
  • Передача смены статуса заказа обратно на удалённую сторону
  • Эндпоинты, секрет, токен, провайдер и способ оплаты - всё в настройках шлюза

Установка

  1. Загрузите папку плагина в /wp-content/plugins/ и активируйте
  2. Прогоните встроенную миграцию, создающую таблицу лога удалённых заказов
  3. Откройте WooCommerce → Настройки → Платежи и включите шлюз внешнего сайта
  4. Заполните три удалённых эндпоинта, общий секрет, токен API и имя провайдера
  5. Проведите тестовый заказ и убедитесь, что колбэк переводит его в оплаченный статус

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок