Perfecto CMS - Система управления контентом
  • Русский язык
  • English version
Вход на сайт
Регистрация
Online документация
Online документация
Вы можете найти лучшие практичные процедуры по настройки, которые помогут вам лучше спланировать свои сайты.

Универсальная система оплаты

7,921 просмотров / 16 Янв 2015 обновлено
UPG (Universal Payment Gateway) - модуль для организации приема платежей на сайте.
В данном документе приведена инструкция по использованию встроенного UPG модуля, для организации приема платежей на вашем сайте.

Предисловие

Суть модуля - иметь универсальный код, к которому можно подключать известные платежные системы с последующей интеграцией приема платежей через различные модули Perfecto CMS. Модуль идет в комплекте Perfecto CMS Basic и Perfecto CMS Maxi.

В стандартном пакете интегрированы платежные системы:
 
Robokassa
Interkassa
 
Владельцам сайтов
Данный модуль позволит вам заранее знать, что в вашей системе есть интегрированная универсальная система, которая позволяет с незначительными навыками PHP программирования, подключать дополнительные платежные системы.
Программистам
Мы уже имеем практически фундаментально состоявшийся API. Если вы заинтересованы в расширении списка приема платежей, либо у вас есть собственная процессинговая система оплат, которая отвечает всем стандартам популярных сервисов, пожалуйста свяжитесь с нами для сотрудничества.
 

API

Модуль состоит из 2х частей: часть функций, шаблонов и класс для модуля, который будет усовершенствоваться и дополнятся.
Модуль имеет зарезервированное кодовое значение: payment
Класс модуля также имеет кодовое значение: payment

Структура
# папка модуля - содержит сам модуль оплаты и модули процессинговых систем
./modules/frontend/payment/
# модуль UPG имеет стандартную структуру и функциональность, которая схожа с остальными модулями системы
./modules/frontend/payment/module.php
# настройки модуля, представляют из себя стандартный XML файл со структурой
При подключении нового модуля, в данном файле необходимо указать название идентификатора товара, который будет отправлять платежная система $_POST запросом.
# например при подключении WebMoney Merchant необходимо указать: < webmoney >LMI_PAYMENT_NO

./modules/frontend/payment/config.xml
# в данной папке находятся модули процессинговых центров.
# название файла настроек и файла модуля должны быть идентичны. Пример: paypal.xml и paypal.php

./modules/frontend/payment/method/
# иконки для платежных систем, которые будут отображаться при выборе метода оплаты.
# для связки иконки с модулем, необходимо указать его название в файле настроек данной системы оплаты

./modules/frontend/payment/method/icons/
# модуль Robokassa
./modules/frontend/payment/method/robokassa.php
# настройки модуля Robokassa
./modules/frontend/payment/method/robokassa.xml
# модуль Interkassa
./modules/frontend/payment/method/interkassa.php
# настройки модуля Interkassa
./modules/frontend/payment/method/interkassa.xml

На сколько легко подключить платежную систему?

Давайте рассмотрим структуру на примере процессингового центра Robokassa.
В данном модули создана функция getConfig($core); которая получает настройки модуля средствами парсинга XML файла.
Вы можете использовать идентичную функцию в ваших модулях для новых процессинговых центров.
	function getConfig($core) {

# Gateway file name and the config file name must be the same
$conf_file = str_replace(".php",".xml",__FILE__);

# Get configuration from XML
$gateway_config = $core->xml2array(file_get_contents($conf_file));

# Set `payment_config`
$payment_config = $gateway_config['gateway'];

# If test mode on, change payment URL
if ($payment_config['test_mode'] == 1) { $payment_config['url'] = $payment_config['testurl']; }

# Get user ID, for not logged ID = 0
$payment_config['payer_login'] = isset($_SESSION['logged_id']) ? $_SESSION['logged_id'] : 0;

return $payment_config;
}

Как видим, название настроек модуля образуется(предположительно) из названия модуля системы оплаты. После чего выполняется парсинг файла настроек.

Что из себя представляет сам модуль оплаты?
В модуле оплаты необходимо создать всего 4 основных функции, с названиями process(), success(), result(), fail()
UPG основан на приеме данных из этих 4х callback функций. Рассмотрим каждую функцию на примере модуля для Robokassa.

ФУНКЦИЯ: PROCESS()
Данная функция предназначена для формирования формы, которая будет отправлять данные на платежный шлюз и контролировать заказ на сайте.

Пример
	function process($core, $db, $payDate, $STATUS) {

# получение конфигураций
$config = getConfig($core);

# дополнительные данные
$config['out_summ'] = $payDate['sum'];
$config['desc'] = $payDate['description'];
$config['inv_id'] = $payDate['ID'];

# изменение суммы по курсу
$config['out_summ'] = $config['out_summ']*$config['rate'];

# формирование контрольной суммы
$config['crc'] = md5($config['login'].":".$config['out_summ'].":".$config['inv_id'].":".$config['mrh_pass1'].":Shp_item=".$config['shp_item']);

# генерация HTML формы оплаты
$result['form'] = '< form action='.$config['url'].' method='.$config['method'].'>
< input type=hidden name=MrchLogin value="'.$config['login'].'">
< input type=hidden name=OutSum value="'.$config['out_summ'].'">
< input type=hidden name=InvId value="'.$config['inv_id'].'">
< input type=hidden name=Desc value="'.$config['desc'].'">
< input type=hidden name=SignatureValue value="'.$config['crc'].'">
< input type=hidden name=Shp_item value="'.$config['shp_item'].'">
< input type=hidden name=IncCurrLabel value="'.$config['in_curr'].'">
< input type=hidden name=Culture value="'.$config['culture'].'">
< input type=submit value="'.$payDate['btn_value'].'" class="btn">
< /form>';

$result['desc'] = $config['desc'];
$result['sum'] = $config['out_summ']/$config['rate'];
$result['id'] = $config['inv_id'];

if (intval($config['inv_id']) > 0) {
return $result;
}
else {
$result['error'] = 2;
return $result;
}
}
  Входящие данные
Функция формируется со следующими входящими данными: process($core, $db, $payDate, $STATUS).
$core и $db используют стандартные классы CORE и MYSQL для работы с системными функциями и базой данных. Более подробнее о данных классах можете прочитать на странице «API документация»
$payDate - массив данных о плательщике и других настройках
[ID] => порядковый номер транзакции
[module] => название модуля в котором совершается транзакция
[item] => идентификатор товара
[service] => название платежной системы (пр: robokassa)
[user] => идентификатор пользователя
[sum] => сумма транзакции
[date_create] => дата создания транзакции
[description] => описание товара
[status] => статус товара
[currency] => валюта
[btn_value] => значение для кнопки в форме
$STATUS - массив данных со статусами
[PENDING] => платеж создан
[COMPLETED] => платеж завершен успешно
[FAILED] => ошибка
[DENIED] => платеж откланен
[REFUNDED] => деньги возвращены
[CANCELED] => платеж отменен
  Исходящие данные
на выход должен формироваться массив данных
[form] => HTML форма(POST) сервиса, через который будет проводится платеж
[desc] => описание платежа
[sum] => сумма платежа
[id] => идентификационный номер товара
[error] => номер ошибки, в том случае, если ошибка существует


ФУНКЦИЯ: SUCCESS()
Функция срабатывает при успешном платеже

Пример
	function success($core) {

$config = getConfig($core);
$crc = $_REQUEST["SignatureValue"];
$result['sum'] = number_format($_REQUEST["OutSum"], 2, '.', '');
$result['id'] = $_REQUEST["InvId"];

# формирование контрольной суммы
$crc = strtoupper($crc);
$my_crc = strtoupper(md5($_REQUEST["OutSum"] . ":" . $_REQUEST["InvId"] . ":" . $config['mrh_pass1'] . ":Shp_item=" .$_REQUEST["Shp_item"]));

# проверка контрольной суммы
# возвращаем модулю UPG статус 3 при неуспешной оплате или статус 1 при успешной оплате
if ($my_crc != $crc) {
$result['error'] = 3;
}
else {
$result['success'] = 1;
}
return $result;

}
  Входящие данные
Функция формируется со следующими входящими переменными success($core)
  Исходящие данные
На выход должен формироваться массив данных, содержащий:
[id] => идентификационный номер платежа (внутри магазина)
[sum] => сумма оплаты (если присутствует)
[error] => номер ошибки (если присутствует)
[success] =>со значением 1, если платеж завершен успешно


ФУНКЦИЯ: FAIL()
Функция срабатывает при ошибочном платеже

Пример
	function fail($core) {

# возврат статуса и id модулю UPG для вывода ошибки пользователю
$result['fail'] = 4;
$result['id'] = intval($_REQUEST["InvId"]);

return $result;

}
  Входящие данные
Функция формируется со следующими входящими переменными fail($core)
  Исходящие данные
На выход должен формироваться массив данных, содержащий:
[id] => идентификационный номер платежа (внутри магазина)
[fail] => номер ошибки (4 - отменен пользователем)


ФУНКЦИЯ: RESULT()
Функция срабатывает непосредственно при обращении процессингового сервиса

Пример
	function result($core, $db, $STATUS) {

$config = getConfig($core);

$result['success'] = 1;
$result['OutSum'] = $_REQUEST["OutSum"];
$result['id'] = intval($_REQUEST["InvId"]);
$result['Shp_item'] = $_REQUEST["Shp_item"];
$result['time'] = time();
$crc = strtoupper($_REQUEST["SignatureValue"]);

# формирование контрольной суммы
$my_crc = strtoupper(md5($result['OutSum'].":".$result['id'].":".$config['mrh_pass2'].":Shp_item=".$result['Shp_item']));

# проверка контрольной суммы
if ($crc != $my_crc) {
echo "bad signn";
exit();
}

/* выполнение вашего кода, после успешной оплаты */

return $result;
}
  Входящие данные
Функция формируется со следующими входящими переменными result($core, $db, $STATUS)
  Исходящие данные
На выход должен формироваться массив данных, содержащий:
[id] => идентификационный номер платежа (внутри магазина)
[success] => имеет значение 1, если платеж совершен успешно
[OutSum] => сумма платежа
[time] => время транзакции в секундах: time()
[fail] => номер ошибки
[fail] => номер ошибки


ПРОЦЕССИНГ
После успешной оплаты (при сверке MD5 хешей или других методов идентификации платежа) выполняются соответствующие действия, по записи(обновлению) таблицы транзакции в базе данных.

Структура XML файла конфигураций

Структура XML
Заказ дизайна
Уникальное предложение для клиентов Perfecto CMS. Если вы хотите оригинальный дизайн дайте нам знать и мы с вами свяжемся для обсуждения деталей.
Для минимизации времени на обсуждение и разработку, рекомендуем скачать бланк, заполнить его и отправить нам на электронный адрес: Our email
Приметная оценка проекта
600 USD

Ваш браузер устарел!

Пожалуйста, скачайте последнюю версию Internet Explorer
Кстати, мы рекомендуем использовать другой браузер ;)