Интерфейс создания обработчиков платежных систем в d7 претерпел значительные изменения. В этой статье я расскажу, как создать такой обработчик.
[spoiler]
Пользовательские обработчики платежных систем в d7 могут находится в папке /bitrix/php_interface/include/sale_payment/ или /local/php_interface/include/sale_payment/. В ней нужно создать папку обработчика, которая имеет следующую структуру:
Далее создаем файл handler.php и класс обработчика, который в общих случаях должен наследоваться от класса Bitrix\Sale\PaySystem\ServiceHandler. ВАЖНО: название класса до Handler должно совпадать с именем папки обработчика, иначе обработчик будет работать в режиме совместимости, т.е. не восприниматься битриксом как обработчик на d7!
Далее пройдемся по самым важным функциям обработчика, а именно для чего они нужны, не вдаваясь в детали, которые вы можете самостоятельно изучить по исходным кодам системных обработчиков (а они находятся в папке /bitrix/modules/sale/handlers/paysystem/). Итак:
Функция initiatePay
Это самая главная функция в обработчике, в ней можно, например, добавить к параметрам обработчика, которые задаются в административной части, какие-то дополнительные, и вызвать шаблон, который должен находится в подпапке template (перечень параметров обработчика платежей, задаваемых в админке, задается в файле .description.php, его структуру вы можете также изучить по исходным кодам системных обработчиков). Сам шаблон можно скопировать в шаблон сайта в подпапку payment/название_папки_обработчика/template/.
Функция getPaymentIdFromRequest
Назначение данной функции - вернуть идентификатор оплаты (не заказа!) из $request при возврате информации ПС на сайт
Функция getCurrencyList
Данная функция должна вернуть массив со списком валют.
Функции, связанные с возвратом информации платежной системой
Обычно платежные системы устроены таким образом, что после успешного или неуспешного прохождения платежа, платежная система уведомляет сайт по определенному адресу. Раньше для принятия таких уведомлений существовал отдельный компонент "bitrix:sale.order.payment.receive", в d7 все устроено иначе - вы можете указывать банку стандартный адрес для уведомлений от пс - /bitrix/tools/sale_ps_result.php, а то, что данные предназначаются одному из обработчиков позволено решать самим обработчикам, и для этого существуют функции getIndicativeFields и isMyResponseExtended.
Функция getIndicativeFields должна вернуть массив полей, по которым проверяется принадлежность информации при возврате к данному обработчику, при этом функция может вернуть как ассоциативный массив (т.е. с символьными ключами), при этом проверка будет производится по значениям полей, так и неассоциативный - при этом проверка будет производится только по наличию полей в $request.
Функция isMyResponseExtended осуществляет дополнительную проверку на принадлежность результат пс к обработчику, и она вызывается после getIndicativeFields. Если дополнительные проверки не требуются, вы можете просто вернуть true.
Функция processRequest выполняет именно обработку результата от платежной системы, и вызов ее произойдет только в том случае, если вы правильно написали предыдущие две функции. В самом упрощенном виде эта функция может выглядеть как-то так:
Кроме указанных функций, могут быть еще и другие, здесь я только описал обязательные и самые необходимые. Также вы можете добавить любые свои вспомогательные функции, например, по аналогии с системными обработчиками.
Лог ошибок платежной системы
Еще дополнение. Обычно все сообщения об ошибках при неуспешной оплате и т.д. пишутся в лог (в функции processRequestмы добавляем их через PaySystem\ErrorLog::add, но они могут добавляться и без нашего участия в ядре системы). Саму страницу, где этот лог выводится, лично я не нашел (если вы знаете, напишите в комментариях), но его можно увидеть с помощью следующего кода, например, через командную php строку:
[spoiler]
Пользовательские обработчики платежных систем в d7 могут находится в папке /bitrix/php_interface/include/sale_payment/ или /local/php_interface/include/sale_payment/. В ней нужно создать папку обработчика, которая имеет следующую структуру:
Далее создаем файл handler.php и класс обработчика, который в общих случаях должен наследоваться от класса Bitrix\Sale\PaySystem\ServiceHandler. ВАЖНО: название класса до Handler должно совпадать с именем папки обработчика, иначе обработчик будет работать в режиме совместимости, т.е. не восприниматься битриксом как обработчик на d7!
|
Далее пройдемся по самым важным функциям обработчика, а именно для чего они нужны, не вдаваясь в детали, которые вы можете самостоятельно изучить по исходным кодам системных обработчиков (а они находятся в папке /bitrix/modules/sale/handlers/paysystem/). Итак:
Функция initiatePay
Это самая главная функция в обработчике, в ней можно, например, добавить к параметрам обработчика, которые задаются в административной части, какие-то дополнительные, и вызвать шаблон, который должен находится в подпапке template (перечень параметров обработчика платежей, задаваемых в админке, задается в файле .description.php, его структуру вы можете также изучить по исходным кодам системных обработчиков). Сам шаблон можно скопировать в шаблон сайта в подпапку payment/название_папки_обработчика/template/.
|
Функция getPaymentIdFromRequest
Назначение данной функции - вернуть идентификатор оплаты (не заказа!) из $request при возврате информации ПС на сайт
|
Функция getCurrencyList
Данная функция должна вернуть массив со списком валют.
|
Функции, связанные с возвратом информации платежной системой
Обычно платежные системы устроены таким образом, что после успешного или неуспешного прохождения платежа, платежная система уведомляет сайт по определенному адресу. Раньше для принятия таких уведомлений существовал отдельный компонент "bitrix:sale.order.payment.receive", в d7 все устроено иначе - вы можете указывать банку стандартный адрес для уведомлений от пс - /bitrix/tools/sale_ps_result.php, а то, что данные предназначаются одному из обработчиков позволено решать самим обработчикам, и для этого существуют функции getIndicativeFields и isMyResponseExtended.
Функция getIndicativeFields должна вернуть массив полей, по которым проверяется принадлежность информации при возврате к данному обработчику, при этом функция может вернуть как ассоциативный массив (т.е. с символьными ключами), при этом проверка будет производится по значениям полей, так и неассоциативный - при этом проверка будет производится только по наличию полей в $request.
|
Функция isMyResponseExtended осуществляет дополнительную проверку на принадлежность результат пс к обработчику, и она вызывается после getIndicativeFields. Если дополнительные проверки не требуются, вы можете просто вернуть true.
|
Функция processRequest выполняет именно обработку результата от платежной системы, и вызов ее произойдет только в том случае, если вы правильно написали предыдущие две функции. В самом упрощенном виде эта функция может выглядеть как-то так:
|
Кроме указанных функций, могут быть еще и другие, здесь я только описал обязательные и самые необходимые. Также вы можете добавить любые свои вспомогательные функции, например, по аналогии с системными обработчиками.
Лог ошибок платежной системы
Еще дополнение. Обычно все сообщения об ошибках при неуспешной оплате и т.д. пишутся в лог (в функции processRequestмы добавляем их через PaySystem\ErrorLog::add, но они могут добавляться и без нашего участия в ядре системы). Саму страницу, где этот лог выводится, лично я не нашел (если вы знаете, напишите в комментариях), но его можно увидеть с помощью следующего кода, например, через командную php строку:
|
18.08.201714:3218.08.2017 14:32:03
Посмотреть лог ошибок можно тут http://<your_site_name>/bitrix/admin/perfmon_table.php?lang=ru&table_name=b_sale_pay_system_err_log
2) регистр класса должен совпадать с регистром названия папки с обработчиком