PHP. Подключение оплаты Direct Pay Online (DPO)

PHP. Подключение оплаты Direct Pay Online (DPO)

Пример интеграции платежей 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>';
}

Код протестировал, работает. Если что - пишите

Сказать $пасибо

Комментарии ()