Пример интеграции платежей 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 - обработка ответа
<?php
if (!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>';
}
Код протестировал, работает. Если что - пишите