Прием платежей на сайте. Подключение Z-Payment

Процесс регистрации в системе Z-Payment рассматривать не будем, если возникнут вопросы, то опишу в отдельной статье. В ходе работы мы будем придерживаться алгоритма, составленного ранее.

Итак, первое, что нам нужно сделать, это создать новый магазин для нашего сайта. Для этого авторизуемся в платежной системе, переходим по ссылке “Мои магазины” и нажимаем на кнопку “Создать магазин“, после мы попадаем на такую форму:

Создание магазина в Z-Payment, шаг 1

Поля “Название сайта“, “URL сайта” и “Краткое описание” являются обязательными до заполнения, причем первые два из них изменить в последующем можно будет только через службу технической поддержки, поэтому проверяйте правильность заполнения. Заполнив все поля переходим “Далее“.

Создание магазина в Z-Payment, шаг 2

На втором этапе нам необходимо заполнить всю техническую информацию, это указать адреса уведомлений Result URL и перенаправления Success URL и Fail URL, также необходимо указать метод передачи данных на эти адреса POST/GET, указать секретный ключ и пароль, которые будут использовать при проверке подлинности передаваемых данных. После того как все заполнили и проверили нажимаем кнопку “Далее“.

Создание магазина в Z-Payment, шаг 3

На третьем этапе платежная система предлагает нам заново проверить все заполненные данные и в случае ошибки, вернутся назад на нужный шаг. Если все хорошо и ошибок нету, нажимаем “Добавить магазин“.

Создание магазина в Z-Payment, шаг 4

На четвертом этапе добавления нам необходимо провести активацию нашего магазина. Для этого размещаем указанный код у себя на сайте и подтверждаем активацию. После нас перекидывает на настройку способов оплаты и комиссий.

Создание магазина в Z-Payment, шаг 5

Сразу после создания, магазин имеет ранг 1, поэтому большинство платежных сервисов нам недоступны для приема оплаты. Чтобы повысить ранг, нам необходимо на нашем сайте создать раздел контакты и указать туда наши контакты, в том числе и физический адрес, после этого менеджеры системы выдадут магазину ранг 3, что откроет доступ ко всем способам оплаты.

Магазин создан, то есть первый пункт нашего плана выполнен, переходим ко второму, а именно созданию формы оплаты заказа. В форме нам необходимо указать идентификатор нашего магазина в системе Z-Payment, идентификатор заказа на нашем сайте, сумма заказа, описание и клиентский электронный адрес на который будут приходить письмо об оплате. Пример формы ниже (файл form.php),

<?php 
$setting = [ 
 'zp_shop_id' => '00000', // идентификатор магазина в Z-Payment 
 'order_id' => '0000', // идентификатор заказа во внутренней системе 
 'order_price' => '500', // сумма заказа 
 'order_descr' => 'Тестовый платеж', // описание заказа 
 'client_mail' => 'mymail@mysite.com', // e-mail клиента (необязятельно) 
]; 
?>
<form action="https://z-payment.com/merchant.php" method="post">
 <input name="LMI_PAYEE_PURSE" type="hidden" value="<?=$setting['zp_shop_id'];?>">
 <input name="LMI_PAYMENT_AMOUNT" type="hidden" value="<?=$setting['order_price'];?>">
 <input name="LMI_PAYMENT_NO" type="hidden" value="<?=$setting['order_id'];?>">
 <input name="LMI_PAYMENT_DESC" type="hidden" value="<?=$setting['order_descr'];?>">
 <input name="CLIENT_MAIL" type="hidden" value="<?=$setting['client_mail'];?>">
 <input type="submit" value="Оплатить" /> 
</form>

После нажатия на кнопку “Оплатить” пользователь попадает уже на страницу платежной системы, где ему предлагается выбрать удобный способ оплаты с последующими инструкциями.

Теперь нам нужно подготовить страницы, которые будут проверять статус платежа и выводить соответствующее сообщение. После оплаты счета, Z-Payment пришлет нам уведомление по ссылке, которую мы указали в пункте Result URL, эта ссылка будет проверять подлинность полученных данных и в положительном случае менять статус заказа на оплаченный. Ключевым моментом в этой задаче является проверка подлинности передаваемых данных, для это нужно сгенерировать контрольную подпись и сравнить её с полученным хешем. Контрольная подпись в Z-Payment формируется следующим образом:

При формировании контрольной подписи сервис Z-Payment Merchant "склеивает" значения полей, передаваемых "Формой оповещения о платеже", в одну строку в следующем порядке:

- ID магазина (LMI_PAYEE_PURSE);
- Сумма платежа (LMI_PAYMENT_AMOUNT);
- Внутренний номер покупки продавца (LMI_PAYMENT_NO);
- Флаг тестового режима (LMI_MODE);
- Внутренний номер счета в системе Z-Payment (LMI_SYS_INVS_NO);
- Внутренний номер платежа в системе Z-Payment (LMI_SYS_TRANS_NO);
- Дата и время выполнения платежа (LMI_SYS_TRANS_DATE);
- Merchant Key (LMI_SECRET_KEY);
- Идентификатор магазина в системе Z-Payment Merchant на счет которого была проведена оплата (LMI_PAYER_PURSE);
- Кошелек покупателя в системе Z-Payment или его e-mail (LMI_PAYER_WM).

Формируется последовательность из 32-х шестнадцатеричных цифр в соответствии с широко распространенным алгоритмом Message Digest 5 (MD5) разработанным Ron Rivest из MIT Laboratory for Computer Science и RSA Data Security, Inc. Алгоритм был опубликован в интернете в апреле 1992 года (RFC 1321).

После проверки контрольной подписи, выполняем все необходимые операции с полученными данными. Примерный код файла result.php представлен ниже:

<?php

// подключение конфигов, дополнительных модулей и функций

define('LMI_SECRET_KEY','---------------'); // здесь указывается ваш Merchant Key
$data = $_POST; // или $_GET, смотря какой тип передачи мы указали в настройках магазина

if(!$order->checkShop($data['LMI_PAYEE_PURSE'])) { // проверяем идентификатор магазина
 die("Ошибка: идентификатор магазина отличается от настроек сайта");
}

if(!$order->checkPrice($data['LMI_PAYMENT_AMOUNT'])) { // проверяем сумму оплаты, совпадает ли с заказом
 die("Ошибка: сумма оплаты меньше чем выставлена в заказе");
}

// генерирует контрольную сумму
$_hash = md5(
 $data['LMI_PAYEE_PURSE'] . $data['LMI_PAYMENT_AMOUNT'] . $data['LMI_PAYMENT_NO'] . 
 $data['LMI_MODE'] . $data['LMI_SYS_INVS_NO'] . $data['LMI_SYS_TRANS_NO'] . 
 $data['LMI_SYS_TRANS_DATE'] . LMI_SECRET_KEY . $data['LMI_PAYER_PURSE'] . $data['LMI_PAYER_WM']
);

if($data['LMI_HASH'] == strtoupper($_hash)) { // сравниваем хеши
 $order->confirmOrder($data['LMI_PAYMENT_NO']); // меняем статус заказа на "оплаченный"
} else {
 die("Ошибка: контрольная сумма неправильная");
}

?>

Также нам остается создать два вспомогательных файла, это success.php и fail.php, на которые пользователя будет перенаправлять платежная система, в случае успешных действия и ошибки соответственно. Никаких сложных обработок в них делать не будем, просто вывод сообщений.

Файл success.php:

<?php

// подключение конфигов, дополнительных модулей и функций

$order_id = $_POST['LMI_PAYMENT_NO'] // или $_GET, смотря какой тип передачи мы указали в настройках магазина
$order_check = $order->checkOrder($order_id); // проверка, оплаченный ли текущий заказ 

if($order_check) { // в случае, если счет оплачен, выдаем информацию об успешной оплате счета
?>
 <p>
 Ваш счет успешно оплачен. На ваш e-mail отправлена вся необходимая информация.
 </p>
<?php 
} else { // если счет еще не оплачен, выдаем соответствующее сообщение
?>
 <p>
 Ваш счет принят в обработку системой.
 </p>
<?php } ?>

Файл fail.php:

<p>
 К сожалению, что-то пошло не так и вы не смогли закончить платеж. Повторите платеж заново.
</p>

Стоит отменить, что в файлах используется объект класса $order, этот класс вы пишите сами, здесь он указан в качестве примера. На этом с подключением системы Z-Payment мы закончили, осталось только совершить тестовый платеж и перевести магазин в рабочий режим.

Скачать исходники: GitHub