Top.Mail.Ru

Подключение внешнего способа оплаты

В InSales есть возможность сделать интеграцию с платежной системы, создав "прокси" из формата передачи данных InSales в формат платежной системы. После создания заказа в браузере пользователя делаем post-запрос на урл из настроек, передавая в форме все необходимые данные о заказе. В ответ ожидаем редирект пользователя назад или бэкенд-запрос о результатах платежа. Также есть возможность сделать оплату прямо в магазине через js-виджет.

  1. Настройки на стороне Insales
  2. Отправка post-запроса в платежную систему
  3. Редирект пользователя назад после успешной/неуспешной оплаты
  4. Отправка результатовоплаты с бэкенда
  5. Конвертация суммы заказа при использовании поля convert_currency
  6. Оплата через виджет на сайте

Настройки на стороне InSales

Специальный способ оплаты создается в разделе Настройки → Оплата. Далее небходимо добавить новый вариант "Внешний способ оплаты". Интеграция для Appstore должна создавать этот способ оплаты по API https://api.insales.ru/?doc_format=JSON#paymentgateway-create-external-payment-gateway-json .    

  • shop_id - идентификатор магазина в вашей системе.
  • password - пароль для генерации подписи.
  • url - адрес внешнего сервиса, куда будет отправлен покупатель.
  • send_order  - передавать ли order_json с детальной информацией о заказе.
  • convert_currency - использовать ли конвертацию в валюту отличную от валюты сайта,  нужно задать iso code валюты и валюта должна быть добавлена в магазине  (чтобы было понятно по какому курсу делать конвертацию)
  • wigdet_mode - оплата происходит прямо на сайте магазина через js-виджет.
  • widget_html_code - код виджета, может содержать html и javascript.

Отправка post-запроса в платежную систему

На последнем шаге заказа система InSales отправляет на внешний URL (задается в настройках внешнего способа оплаты в InSales) POST запросом следующие параметры:

  • shop_id - идентификатор магазина в вашей системе
  • amount - сумма
  • transaction_id - id транзакции
  • key - ключ заказа
  • description - описание заказа
  • order_id - id заказа
  • phone - телефон клиента,
  • email - email клиента,
  • order_json - полная информация по заказу в json-формате (если стоит флаг send_order)
  • original_currency -  iso code основной валюты сайта (если стоит флаг convert_currency)
  • convert_currency - iso code валюты, в которую выполнена конвертация (если стоит флаг convert_currency)
  • conversion_rate - курс пересчета
  • original_amount - стоимость заказа в основной валюте сайта (если стоит флаг convert_currency)
  • signature - подпись. Формируется как MD5 от  "shop_id;amount;transaction_id;key;description;order_id;phone;email;original_currency;convert_currency;original_amount;conversion_rate;order_json;password"

После обработки платежа внешний сервис возвращает на success_url или fail_url c параметрами.

Редирект пользователя назад на сайт после успешной/неуспешной оплаты

В случае успешной оплаты нужно отправить пользователя POST-запросом на http://shop.myinsales.ru/payments/external/#%7Bpayment_gateway_id%7D/success , этот урл отдается в ответе при создании внешнего способа оплаты.

В post-запросе необходимо передать следующие поля:

  • paid - Оплачен или нет. "1" или "0".
  • amount - Сумма платежа. Например, "87.10", или "1200.00".
  • key - Ключ идентификации заказа. Изначально был отправлен InSales.
  • transaction_id - id транзакции. Изначально был отправлен InSales.
  • signature - Подпись. Формируется как MD5 от "shop_id;amount;transaction_id;key;paid;password".
  • shop_id - Идентификатор магазина.

Сохраняет данные, проверяет подпись, сумму, параметр paid и shop_id. Дальше помечает заказ как успешный.

В случае неуспешной оплаты нужно отправить пользователя POST-запросом на http://shop.myinsales.ru/payments/external/#%7Bpayment_gateway_id%7D/fail . Поля для post-запроса такие же как и для success-запроса.

Отправка результатов оплаты с бэкенда

В случае когда есть задержа между подтверждением оплаты и редиректом пользователя назад или есть соображения безопасности, то можно передать данные по платежку запросом с сервера.

Урл для отправки запроса вида http://shop.myinsales.ru/payments/external/server , для конкретного магазина отдается в ответе по API. В POST-запросе мы ожидаем следующие поля:

  • paid - Оплачен или нет. "1" или "0".
  • amount - Сумма платежа. Например, "87.10", или "1200.00".
  • key - Ключ идентификации заказа. Изначально был отправлен InSales.
  • transaction_id  - id транзакции. Изначально был отправлен InSales.
  • signature - Подпись. Формируется как MD5 от "shop_id;amount;transaction_id;key;paid;password".
  • shop_id - Идентификатор магазина.

Если все хорошо мы проверяем подпись, сумму, параметр paid и shop_id. Дальше помечаем заказ как успешный. В ответ возвращаем json:

'status' => 'ok' в случае подтверждения 'status' => 'error', 'errors' => Одну или несколько ошибок из списка

'transaction not found'
'data is empty'
'data is not a hash'
'signature is not valid'
'paid params is not valid'
'shop id is not valid' 
'amount is not valid'

Конвертация суммы заказа при использовании поля convert_currency

Если для способа оплаты указана валюта конвертации, то при переходе в платежную систему передается сумма заказа (amount), уже сконвертированная в указанную валюту, и справочно передаются три дополнительных поля - original_currency, convert_currency и original_amount.

Важно: если передается order_json или при запросы заказа по API через /admin/orders/ID.json, то все суммы будут в оригинальной валюте сайта и конвертация не произойдет.

Оплата через виджет на сайте

  1. Если для способа оплата включен widget_mode, то после создания заказа идет редирект на страницу у нас вида /payments/external/16173/payment_page?key=0477bd091e1e2047790e32b3a42db7a5 .

  2. В момент запроса этой страницы мы отправляем запрос на внешний урл из настроек способа оплаты в json-формате передавая все данные формы, как и при редиректе в обычной форме (shop_id, amount, transaction_id, … signature ).

  3. В ответе мы ожидаем 200-й код и json вида { widget_payment_data: … } .

  4. Содержимое ключа widget_payment_data мы подставляем в js-переменную на странице: var widget_payment_data = '{}';

  5. Так же на странице подставляем html-код из настроек способа оплаты (поле widget_html_code).

  6. Для подтверждения способа оплаты никаких новых урлов нет, ожидаем такие же запросы, как и при обычной внешней оплате.

Оставить оценку

Оценка успешно отправлена.
Она будет проверена администратором перед публикацией.
Перед публикацией все оценки проходят модерацию

Оценки: 0

Остались вопросы?
Отправь тикет в техподдержку!
Еще нет своего магазина?
Создайте интернет-магазин на платформе InSales
Всё для продаж уже внутри!
Недавно просмотренные статьи