+7 495 008 8452
  • Загрузка
Выберите ваш цвет
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Источник: http://dev.1c-bitrix.ru/community/webdev/user/16899/blog/2448/

Как написать свой обработчик платёжной системы

Привет,

Данный пост не будет содержать какого-либо готового решения, я лишь попытаюсь рассказать, как написать свой обработчик(или хотя бы дать малейшее представление), т.к. уж очень много спрашивают об этом службу ТП :) Не все в курсе какие файлы нужны в папке обработчика или если и знаю, то не в курсе зачем каждый из них существует.

Обработчики платёжных систем хранятся в папке /bitrix/modules/sale/payment и /bitrix/modules/sale/ru/payment.
Пользовательские обработчики помещаются в папку /bitrix/php_interface/include/sale_payment/
Обработчик представляется из себя папку с набором файлов.
В папке обработчика должны быть следующие файлы:

.description.php - файл содержит определение переменных описание ПС, названия и здесь же определяется массив свойств, которые можно получить в файле payment.php методом CSalePaySystemAction::GetParamValue(), входящим метода параметром является код свойства обработчика. Пример определения массива свойств обработчика платёжной системы деньги@mail.ru. Каждый ключ массива - код свойства обработчика, значение - массив описания свойства: название, описание, значение по умолчанию и тип. Тип может быть например ORDER(данные заказа) или PROPERTY(свойства заказа, которые пользователь ввёл при оформлении), это определяет выпадающий список значений свойств.

$arPSCorrespondence = array(
      "KEY" => array(
            "NAME" =>GetMessage("MM_KEY"),
            "DESCR" => GetMessage("MM_KEY_DESC"),
            "VALUE" => "",
            "TYPE" => ""
         ),
      "BUYER_EMAIL" => array(
            "NAME" => GetMessage("MM_EMAIL"),
            "DESCR" => GetMessage("MM_EMAIL_DESC"),
            "VALUE" => "EMAIL",
            "TYPE" => "PROPERTY"
         ),
      "SHOULD_PAY" => array(
            "NAME" => GetMessage("MM_SHOULD_PAY"),
            "DESCR" => GetMessage("MM_SHOULD_PAY_DESC"),
            "VALUE" => "PRICE",
            "TYPE" => "ORDER"
         ),
      "CURRENCY" => array(
            "NAME" => GetMessage("MM_CURRENCY"),
            "DESCR" => GetMessage("MM_CURRENCY_DESC"),
            "VALUE" => "CURRENCY",
            "TYPE" => "ORDER"
         ),
      "ORDER_ID" => array(
            "NAME" => GetMessage("MM_ORDER_ID"),
            "DESCR" => "",
            "VALUE" => "ID",
            "TYPE" => "ORDER"
         ),
      "DATE_INSERT" => array(
            "NAME" => GetMessage("MM_DATE_INSERT"),
            "DESCR" => GetMessage("MM_DATE_INSERT_DESC"),
            "VALUE" => "DATE_INSERT",
            "TYPE" => "ORDER"
         ),
);


После определения этого массива в административной части сайта свойства выглядят так:



Назначение свойств обработчика: хранение нужных данных для проведения платежа или иных запросов к серверу ПС. Свойствах будут храниться секретные ключи, идентификаторы магазинов (присваиваются платёжными системами), суммы даты и другие данные, использование которых требует документация той или иной платёжной системы.


payment.php - файл, который подключается на последнем шаге оформления заказа, в нём доступны данные заказа и свойства самого обработчика(CSalePaySystemAction::GetParamValue()). Обычно в данном файле осуществляется вывод квитанции на экран или форма, которая отправляется на сайт платёжной системы нужные для оплаты данные. Тут могут подготавливаться данные и осуществляться запросы на сервер платёжной системы в соответствие с её документацией. Тут им могут понадобиться данные, которые сохранены в свойствах обработчика. Пример. Подготовка данных для запрос на деньги@mail.ru:

$SITE_NAME = COption::GetOptionString("main", "server_name", "");
   $dateInsert = (strlen(CSalePaySystemAction::GetParamValue("DATE_INSERT")) > 0) ? CSalePaySystemAction::GetParamValue("DATE_INSERT") : $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DATE_INSERT"];
   $arParams['issuer_id'] = $ORDER_ID;
   $arParams['access_key'] = (strlen(CSalePaySystemAction::GetParamValue("KEY")) > 0) ? CSalePaySystemAction::GetParamValue("KEY") : $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["KEY"];
   $arParams['shouldPay'] = (strlen(CSalePaySystemAction::GetParamValue("SHOULD_PAY")) > 0) ? CSalePaySystemAction::GetParamValue("SHOULD_PAY") : $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["SHOULD_PAY"];
   $arParams['buyer_email'] = (strlen(CSalePaySystemAction::GetParamValue("BUYER_EMAIL")) > 0) ? CSalePaySystemAction::GetParamValue("BUYER_EMAIL") : $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["SHOULD_PAY"];
   $arParams['currency'] = (strlen(CSalePaySystemAction::GetParamValue("CURRENCY")) > 0) ? CSalePaySystemAction::GetParamValue("CURRENCY") : $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["CURRENCY"];
   $arParams['buyer_ip'] = $_SERVER['REMOTE_ADDR'];
    $arParams['description'] = base64_encode((ToUpper(SITE_CHARSET) != ToUpper('windows-1251')) ? $APPLICATION->ConvertCharset(GetMessage("MM_DESC",Array('#ORDER_ID#' => $ORDER_ID, '#DATE#' => $dateInsert, '#SITE_NAME#' => $SITE_NAME)), SITE_CHARSET, 'windows-1251') : GetMessage("MM_DESC", Array('#ORDER_ID#' => $orderID, '#DATE#' => $dateInsert, '#SITE_NAME#' => $SITE_NAME)));


Формирование URL с параметрами запроса подготовленных данных:

$sHost = "merchant.money.mail.ru";
   $sUrl = "/api/invoice/make";
   $sVars ="key=".$arParams['access_key']."&buyer_email=".$arParams['buyer_email']."&sum=".(str_replace(",", ".", $arParams['shouldPay']))."¤cy=".$arParams['currency']."&description=".$arParams['description']."&buyer_ip=".$arParams['buyer_ip']."&issuer_id=".$arParams['issuer_id'];
   $invoice_number = QueryGetData($sHost, 443, $sUrl, $sVars, $errno, $errstr, "GET", "ssl://");


Получаем номер платёжки ($invoice_number), что означает выставление счёта пользователю в платёжной системе деньги@mail.ru. Фиксируем номер платёжки в заказ:

if (is_numeric($invoice_number)) 
      CSaleOrder::Update($ORDER_ID, Array('PAY_VOUCHER_NUM' => $invoice_number, 'PAY_VOUCHER_DATE' => $dateInsert));   


Файл payment.php сделал своё дело.
Теперь пользователь в любое время может оплатить заказ на сайте money.mail.ru. Тут и встаёт задача, как узнать оплатил ли пользователь заказ или нет.

Для решения этой задачи в папке обработчика создаются файлы result.php или result_rec.php.

result.php - файл, в котором осуществляется запрос к серверу платёжной системы с нужными параметрами в соответствие с документацией платёжной системы. Если данный файл существует в папке обработчика, то в административной части сайта при просмотре заказа появляется кнопка "запросить" - нажимаем и исполняется файл result.php. В нём аналогично payment.php получить нужные данные, подготовить, сформировать запрос, отправить и получить ответ о сервера платёжной системы в документированном формате.
В зависимости от ответа сервера производить манипуляции с заказом используя API Битрикса. Пример такой схемы тут:
\bitrix\modules\sale\payment\money.mail\result.php

result_rec.php - обработчик результата оплаты в публичной части.
В настройках ПС нужно указать кодировку, поместить компонент bitrix:sale.order.payment.receive и настроить его на платёжную систему.
Путь к странице с компонентом обычно указывается в настройках магазина, зарегистрированного на стороне платёжной системы. Сервер платёжной системы сам будет делать запрос на указанную вами страницу и передавать данные об оплате, который обрабатываются в файле result_rec.php.

Также в папке обработчика создаются папки с идентификаторами языков для подключения соответствующих языковых файлов в файлах обработчика.
Более подробно вы можете посмотреть упомянутые файлы в папках обработчиков, которые находятся сами теперь знаете где =)
Выглядит всё примерно так:



Если всё сделать правильно, то при создании платёжной системы в списке обработчиков вы сможете увидеть свой.



Конец.

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...