Пример интеграции платежей Direct Pay Online (DPO) - получение токена через AJAX используя API и перенаправление пользователя на страницу оплаты. Код мой, взят рабочий вариант с одного сайта, для публикации особо не переделывал. Если где то есть вариант сделать лучше - пишите.
Direct Pay - африканская платежная система, примеров по интеграции в сети не то что бы много (почти ничего), может кому то пригодится. К томуже процесс оплаты достаточно универсален, так что надеюсь не зря выложил.
Для начала - HTML код (форма с полями), затем JS - ajax отправка данных контроллеру, далее PHP - получение токена, снова JS - перенаправление на страницу оплаты
Данные, структура. Начало
Что касается структуры, то будет она такой (это все можно скачать здесь. Рекомендую скачать):
- pay.html - форма, HTML, CSS, JS
- payonline.php - контроллер. PHP
- payonlinesuc.php - ппринимает ответ от DPO, выводит сообщение об успешной оплате, отправляет письмо на почту. PHP, HTML
- loading.gif - немного анимации для кнопки, пока ждем получения токена. Иногда это долго
Данные для оплаты, включая сумму, будут браться из произвольно заполняемой формы, без предварительного создания заказа и т.п..
HTML. Форма для заполнения
<div class="pay-form" id="payform"><form action="" method="post" class="pay-form"><div class="form-group"><div class="controls"><input type="text" name="f_name" value="" placeholder="First Name" class="form-control"/></div></div><div class="form-group"><div class="controls"><input type="text" name="l_name" value="" placeholder="Last Name" class="form-control"/></div></div><div class="form-group"><div class="controls"><input type="text" name="phone" value="" placeholder="Phone" class="form-control"/></div></div><div class="form-group"><div class="controls"><input type="email" name="email" value="" placeholder="Email" class="form-control"/></div></div><div class="form-group price-input"><input type="text" name="price" value="" placeholder="Price" class="form-control col-xs-7" /><select name="currency" class="form-control col-xs-5"><option value="NAD">NAD</option><option value="USD">USD</option><option value="EUR">EUR</option></select></div><div class="form-group text-center"><div class="controls"><input type="hidden" name="page" value="" /><button type="submit" class="btn btn-g1 btn-lg">Отправить</button></div></div></form></div>
JS (jQuery)
$(document).ready(function() {$('#payform .btn').click(function() {/*Получим адрес текущей страницы в input*/$('#payform input[name=\'page\']').val($(location).attr('href'));/*Убираем ошибки*/$('#payform input').removeClass('error');$('#payform .err').remove();$.ajax({url: '/payonline.php',type: 'post',data: $('#payform input[type=\'text\'], #payform input[type=\'hidden\'], #payform input[type=\'email\'], #payform textarea, #payform select'),dataType: 'json',beforeSend: function() {console.log('0');$('#payform .btn').html('Loading <img src="/loading.gif" alt="" />');},complete: function() {console.log('1');$('#payform .btn').text('Submit');},success: function(json) {console.log('2');if (json['Result'] == '000') {$('#payform').html('Go to payment page...<img src="/loading.gif" alt="" />');/*Если все хорошо отправляем на оплату*/window.location.href = 'https://secure1.sandbox.directpay.online/payv2.php?ID='+json['TransToken'];} else {if (json['Result'] == '002') {/*Если не заполнено некое поле*/$('#payform').append('<span class="err">'+json['ResultExplanation']+'</span>');$('#payform input[name=\''+json['inp']+'\']').addClass('error');} else {/*Неизвестные ошибки*/$('#payform').html(json['ResultExplanation']+'Please contact');}}}});return false;});});
Контроллер payonline.php
<?php$token = "ВАШ_ТОКЕН"; //Company Token//Проверим для начала пару полей на заполненность (как защита от спама)if (!empty(strip_tags($_POST['page'])) && !empty(strip_tags($_POST['currency']))) {//Получаем поля. Что касается безопасности - делаю вот так вот..$page = htmlspecialchars(strip_tags($_POST['page']));$total = htmlspecialchars(strip_tags($_POST['price']));$currency = htmlspecialchars(strip_tags($_POST['currency']));$first_name = htmlspecialchars(strip_tags($_POST['f_name']));$last_name = htmlspecialchars(strip_tags($_POST['l_name']));$phone = htmlspecialchars(strip_tags($_POST['phone']));$customer_email = htmlspecialchars(strip_tags($_POST['email']));//Укажем страницу возврата, куда добавим некоторые данные$returnURL = 'http://ВАШ_САЙТ/payonlinesuc.php?p='.$phone.'&t='.$total.'&u='.$page.'&c='.$currency;$cancelURL = $page;$serv_type = '5525';//Services types:3854-Test Product, 5525-Test Service --- это есть в письме//Проверим пару полей - заполнены ли, если нет попросим заполнить.if ($total && $phone && $customer_email) {$param = array('order_id' => 1, //В данном случае есть просто форма, без заказов как в интернет магазине. Если нужно указать номер - это здесь'amount' => '<PaymentAmount>'.$total.'</PaymentAmount>','first_name' => '<customerFirstName>'.$first_name.'</customerFirstName>','last_name' => '<customerLastName>'.$last_name.'</customerLastName>','phone' => '<customerPhone>'.$phone.'</customerPhone>','email' => '<customerEmail>'.$customer_email.'</customerEmail>','currency' => $currency);$service = '<Service><ServiceType>'.$serv_type.'</ServiceType><ServiceDescription>Escape to Africa</ServiceDescription><ServiceDate>'.date('Y/m/d H:i') .'</ServiceDate></Service>';$input_xml = '<?xml version="1.0" encoding="utf-8"?><API3G><CompanyToken>'.$token.'</CompanyToken><Request>createToken</Request><Transaction>'.$param["first_name"].$param["last_name"].$param["phone"].$param["email"].$param["amount"].'<PaymentCurrency>'.$param["currency"].'</PaymentCurrency><CompanyRef>'.$param["order_id"].'</CompanyRef><RedirectURL>'.htmlspecialchars ($returnURL).'</RedirectURL><BackURL>'.htmlspecialchars ($cancelURL).'</BackURL><CompanyRefUnique>0</CompanyRefUnique></Transaction><Services>'.$service.'</Services></API3G>';$url = "https://secure1.sandbox.directpay.online/API/v6/";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSLVERSION,6);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));curl_setopt($ch, CURLOPT_POSTFIELDS, $input_xml);$response = curl_exec($ch);curl_close($ch);$response = simplexml_load_string($response);} else if (!$phone) {$response = array('Result' => '002','ResultExplanation' => 'Please enter your phone','inp' => 'phone',);} else if (!$price) {$response = array('Result' => '002','ResultExplanation' => 'Please enter Price','inp' => 'price',);} else if (!$customer_email) {$response = array('Result' => '002','ResultExplanation' => 'Please enter your email','inp' => 'email',);} else {$response = array('Result' => '002','ResultExplanation' => 'Unknown error. Please contact us','inp' => '',);}echo json_encode($response);} else {echo json_encode(array('Result' => '001','ResultExplanation' => 'Unknown Error',));}
payonlinesuc.php - обработка ответа
<?phpif (!empty(strip_tags($_GET['t']))) {$phone = strip_tags(html_entity_decode($_GET['p']));$total = strip_tags(html_entity_decode($_GET['t']));$page = strip_tags(html_entity_decode($_GET['u']));$currency = strip_tags(html_entity_decode($_GET['c']));//Здесь адреса email для отправки данных$to = 'm1@ma.il,m2@ma.il';$to = explode(',',$to);$subject = 'Success payment';//$message - будет выведено на экран и отправлено на почту$message = '<table><tr><td>Date:</td><td>'.date('Y-m-d H:i:s').'</td></tr><tr><td>Phone:</td><td>'.$phone.'</td></tr><tr><td>TOTAL:</td><td>'.$total.''.$currency.'</td></tr><table><p><a href="'.$page.'">Page</a></p>';//$admessage - будет только отправлено на почту$admessage = '<table>';if (!empty(strip_tags($_GET['TransID']))) $admessage .= '<tr><td>ID Transaction:</td><td>'.strip_tags(html_entity_decode($_GET['TransID'])).'</td></tr>';if (!empty(strip_tags($_GET['CCDapproval']))) $admessage .= '<tr><td>CCDapproval:</td><td>'.strip_tags(html_entity_decode($_GET['CCDapproval'])).'</td></tr>';if (!empty(strip_tags($_GET['TransactionToken']))) $admessage .= '<tr><td>Transaction Token:</td><td>'.strip_tags(html_entity_decode($_GET['TransactionToken'])).'</td></tr>';$admessage .= '</table>';//Здесь укажите свой заголовок$headers = "From: Site <nomail@si.te>\r\n";$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";foreach ($to as $key => $value) {mail($value, $subject, $message.$admessage, $headers);}echo $message;} else {echo '<p>Please contact us</p>';}
Код протестировал, работает. Если что - пишите






