мета-данные страницы
  •  

Это старая версия документа!


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

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

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

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

Наша сервисная служба (агент) примерно раз в 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:

<sxh xml>
<?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>
</sxh>

где
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:

<HTML><ol style="list-style-type: decimal;"></HTML>
<HTML><li></HTML><HTML><p></HTML><?xml version="**1.0**" encoding="**utf-8**"?><HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML><Agbis><HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML>> <HTML><p></HTML><Error>**0**</Error><HTML></p></HTML>
<HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML></Agbis><HTML></p></HTML><HTML></li></HTML><HTML></ol></HTML>

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

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

<HTML><ol style="list-style-type: decimal;"></HTML>
<HTML><li></HTML>> <HTML><p></HTML><?php<HTML></p></HTML>
<HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>ini_set('display_errors', 0);<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>error_reporting(E_ALL);<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>header('Content-type: text/html; charset=UTF-8');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**include**('_class/mysql.php');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**include**('_class/GenerateXML.php');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**if** (count($_GET) == 0) %%//%%если ни каких параметров в строке нет, то убиваем выполнение скрипта<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**die**('Ошибка');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$DB = **new** DB;<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>if (!$DB->link)<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**die**('Ошибка базы данных!');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>if (**isset**($_GET['Lg']) && !**empty**($_GET['Lg']) && **isset**($_GET['Pd']) && !**empty**($_GET['Pd'])){<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>%%//%% проверка логина пароля<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$lg = substr($_GET['Lg'], 0, 50);<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$pd = substr($_GET['Pd'], 0, 50);<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>%%//%% тут проверка на правильность $lg и $pd<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>}<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>else<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**die**('Ошибка'); %%//%% не позволяем работать дальше<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>if (**isset**($_GET['guid']) && !**empty**($_GET['guid']))<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$guid = $_GET['guid'];<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>else<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**die**('Ошибка');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$TABLE_PAY = ''; %%//%% имя таблицы<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>if (**isset**($_GET['Load'])){ %%//%% Загружаем оплаты<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$sql = "select<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>id,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>dor_id,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>contr_id,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>amount,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>datetime_load_server,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>datetime_load,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>datetime_unloading,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>token,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>card_last_four,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>card_type,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>user_name,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>ip_address,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>transaction_id,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>email,<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>is_loaded<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>from $TABLE_PAY<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>where is_loaded = 0";<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$result = $DB->query($sql) or die('Ошибка');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml = **new** GenerateXML();<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**while** ($product=$DB->fetch_array($result, MYSQL_BOTH)){<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$a = $xml->addEl('Pay');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('mysql_id', $product['id'], $a); %%//%% ID записи из mysql<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('dor_id', $product['dor_id'], $a); %%//%% dоr_id - id заказа<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('contr_id', $product['contr_id'], $a); %%//%% contr_id - id клиента<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('amount', $product['amount'], $a); %%//%% сумма оплаты<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('card_last_four', $product['card_last_four'], $a); %%//%% неполный номер карты<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('card_type', $product['card_type'], $a); %%//%% тип карты Visa, Mastercard/краткое имя банка<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$sql2 = "update ".$TABLE_PAY." set guid='".$DB->real_escape_string($guid)."' where id = ".$product['id']; %%//%% помечаем оплаты тек выгрузкой<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$result2 = $DB->query($sql2) **or** **die**('Ошибка');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>}<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**echo** $xml->saveXML();<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>}<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**else**<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**if** (**isset**($_GET['SavePay'])){ %%//%% сохранение оплаты<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$sql2 = "update ".$TABLE_PAY." set is_loaded=1, token=null, datetime_unloading = CURRENT_TIMESTAMP() where guid = '".$DB->real_escape_string($guid)."'"; %%//%% помечает что оплаты выгрузились успешно<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$result2 = $DB->query($sql2) **or** **die**('Ошибка');<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml = new GenerateXML();<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>$xml->addEl('Error', 0);<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>**echo** $xml->saveXML();<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML><HTML><p></HTML>}<HTML></p></HTML><HTML></li></HTML>
<HTML><li></HTML>> <HTML><p></HTML>?><HTML></p></HTML>
<HTML></li></HTML><HTML></ol></HTML>

Пример скрипта таблицы хранения информации об оплаченных заказов в 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**