Передача информации по оплате заказа в АГБИС

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

Весь механизм оплат и все оплаты реализуется и хранится на стороне клиента.

Наша сервисная служба (агент) примерно раз в 30 секунд посылает GET запрос на определенный скрипт (по адресу предоставленный клиентом), который отвечает за выгрузку оплат, и передает в него параметры.
В ответ скрипт будет сообщать нам данные (xml) об оплаченных заказах, после чего агент пометит заказы как оплаченные.

Путь до скрипта должен быть для всех запросов один, например, https://www.example.ru/api/pay.php

После разработки скрипта, передать этот путь до скрипта, а также значения для параметров Ld и Pd, в АГБИС для дальнейшей настройки агента и тестирования работы выгрузки оплат.

Запрос выгрузки оплат

Пример запроса агента на адрес: https://www.example.ru/api/pay.php?Load&guid=guid&Lg=login&Pd=pwd

где guid - GUID текущей выгрузки (формируется агентом),

login и pwd - авторизационные параметры (предоставляются клиентом клиентом).

Скрипт должен проверять login и pwd на правильность, если совпадают, то продолжает дальше работать.

Параметр Load сообщает скрипту, что нужно найти все не выгруженные записи оплат, и пометить найденные оплаты в БД mysql переданным guid, формируя XML и возвращает в ответе на запрос.

Пример XML ответа на запрос параметром Load:

<?xml version="1.0" encoding="utf-8"?>
<Agbis>
  <Pay>
    <mysql_id>57</mysql_id>
    <dor_id>158671</dor_id>
    <contr_id>44708</contr_id>
    <amount>31.88</amount>
    <token/>
    <card_last_four>4242</card_last_four>
    <card_type>Visa</card_type>
  </Pay>
  <Pay>
    <mysql_id>59</mysql_id>
    <dor_id>159060</dor_id>
    <contr_id>44708</contr_id>
    <amount>2125</amount>
    <token/>
    <card_last_four>4242</card_last_four>
    <card_type>Visa</card_type>
  </Pay>
  ...
</Agbis>

где
mysql_id – ID строки из БД mysql на стороне клиента;
dor_id – ID заказа;
contr_id – ID клиента химчистки;
amount – сумма оплаты заказа;
card_last_four – последние 4 цифры карты оплаты;
card_type – тип карты/банка оплаты.

После обработки XML ответа, агент сохраняет в АГБИС все оплаты заказов.

Запрос успешного сохранения оплат

Для определения успешной выгрузки оплат в АГБИС, агент отправляет GET запрос в скрипт.

Пример запроса агента на адрес: https://www.example.ru/api/pay.php?SavePay&guid=guid&Lg=login&Pd=pwd

где
guid - GUID текущей выгрузки, сформированный агентом, еще при отправке запроса Load;
login и pwd - авторизационные параметры (предоставляются клиентом).

Скрипт должен проверять login и pwd на правильность, если совпадают, то продолжает дальше работать.

Если передан параметр SavePay, тогда скрипт находит в БД mysql все оплаты помеченные guid (GUID прошлой выгрузки), и делает отметку, что эти оплаты выгружены в химчистку успешно и возвращает XML об успешном выполнении.

Пример XML ответа на запрос параметром SavePay:

<?xml version="1.0" encoding="utf-8"?>
<Agbis>
  <Error>0</Error>
</Agbis>

На этом выгрузка заканчивается и оплаты появляются в программе АГБИС химчистка и ЛК.

Пример скрипта php обрабатывающий Load и SavePay запросы от агента

<?php
  ini_set('display_errors', 0);
  error_reporting(E_ALL);

  header('Content-type: text/html; charset=UTF-8');

  include('_class/mysql.php');
  include('_class/GenerateXML.php');

  if (count($_GET) == 0) //если ни каких параметров в строке нет, то убиваем выполнение скрипта
    die('Ошибка');
  $DB = new DB;
  if (!$DB->link)
    die('Ошибка базы данных!');

  if (isset($_GET['Lg']) && !empty($_GET['Lg']) && isset($_GET['Pd']) && !empty($_GET['Pd'])){
    // проверка логина пароля
    $lg = substr($_GET['Lg'], 0, 50);
    $pd = substr($_GET['Pd'], 0, 50);
    // тут проверка на правильность $lg и $pd
  }
  else
    die('Ошибка'); // не позволяем работать дальше

  if (isset($_GET['guid']) && !empty($_GET['guid']))
    $guid = $_GET['guid'];
  else
    die('Ошибка');

  $TABLE_PAY = ''; // имя таблицы

  if (isset($_GET['Load'])){ // Загружаем оплаты
    $sql = "select
              id,
              dor_id,
              contr_id,
              amount,
              datetime_load_server,
              datetime_load,
              datetime_unloading,
              token,
              card_last_four,
              card_type,
              user_name,
              ip_address,
              transaction_id,
              email,
              is_loaded
            from $TABLE_PAY
            where is_loaded = 0";
    $result = $DB->query($sql) or die('Ошибка');

    $xml = new GenerateXML();
    while ($product=$DB->fetch_array($result, MYSQL_BOTH)){
      $a = $xml->addEl('Pay');
      $xml->addEl('mysql_id', $product['id'], $a); // ID записи из mysql
      $xml->addEl('dor_id', $product['dor_id'], $a); // dоr_id - id заказа
      $xml->addEl('contr_id', $product['contr_id'], $a); // contr_id - id клиента
      $xml->addEl('amount', $product['amount'], $a); // сумма оплаты
      $xml->addEl('card_last_four', $product['card_last_four'], $a); // неполный номер карты
      $xml->addEl('card_type', $product['card_type'], $a); // тип карты Visa, Mastercard/краткое имя банка

      $sql2 = "update ".$TABLE_PAY." set guid='".$DB->real_escape_string($guid)."' where id = ".$product['id']; // помечаем оплаты тек выгрузкой
      $result2 = $DB->query($sql2) or die('Ошибка');
    }

    echo $xml->saveXML();
  }
  else
  if (isset($_GET['SavePay'])){ // сохранение оплаты
    $sql2 = "update ".$TABLE_PAY." set is_loaded=1, token=null, datetime_unloading = CURRENT_TIMESTAMP() where guid = '".$DB->real_escape_string($guid)."'"; // помечает что оплаты выгрузились успешно
    $result2 = $DB->query($sql2) or die('Ошибка');

    $xml = new GenerateXML();
    $xml->addEl('Error', 0);
    echo $xml->saveXML();
  }
?>

Пример скрипта таблицы хранения информации об оплаченных заказов в MYSQL

CREATE TABLE `payment_orders ` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`guid` VARCHAR(50) NULL DEFAULT NULL COMMENT 'GUID выгрузки',
`contr_id` BIGINT(20) NOT NULL COMMENT 'контрагент в БД',
`dor_id` BIGINT(20) NULL DEFAULT NULL COMMENT 'заказ в БД',
`amount` DOUBLE NOT NULL COMMENT 'сумма оплаты',
`datetime_load_server` TIMESTAMP NULL DEFAULT NULL COMMENT 'Дата создания по времени сервера',
`datetime_load` TIMESTAMP NULL DEFAULT NULL COMMENT 'Дата создания по времени сервера оплаты',
`datetime_unloading` TIMESTAMP NULL DEFAULT NULL COMMENT 'Дата выгрузки в БД агбис',
`card_last_four` VARCHAR(4) NULL DEFAULT NULL COMMENT 'последние 4 цифры',
`card_type` VARCHAR(50) NULL DEFAULT NULL COMMENT 'тип кары',
`user_name` VARCHAR(500) NULL DEFAULT NULL COMMENT 'Имя пользователя карты',
`ip_address` VARCHAR(500) NULL DEFAULT NULL COMMENT 'ip клиента',
`transaction_id` VARCHAR(500) NULL DEFAULT NULL COMMENT 'номер транзакции',
`email` VARCHAR(250) NULL DEFAULT NULL COMMENT 'email адрес плательщика',
`is_loaded` TINYINT(4) NOT NULL DEFAULT '0' COMMENT 'Признак успешной выгрузки True/False',
`waiting` TINYINT(4) NULL DEFAULT NULL COMMENT 'Ожидание подтверждения от системы оплаты. 1 ожидание, 0 - уже оплачено',
`com` VARCHAR(500) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COMMENT='Оплаты заказов из ЛК'
COLLATE='utf8_general_ci'
ENGINE=MyISAM