Описание стандарта ExDK

 

Стандарт
обмена данными Агента с платежной системой Дельта Кей
(Exchange Delta Key)


Глоссарий
История версий
Общая информация
Идентификация и безопасность
Формат запросов
Формат ответов
Спецификации протоколов
    DKCP-User
    DKCP-Uni Transfer
    DKCP-Point
    DKCP-POSTerminal
Приложение 1. Коды статусов и результатов
Приложение 2. Примеры реализации
    Выполнение команд с использованием Internet Explorer
    Выполнение команд с использованием Borland Delphi
    Выполнение команд из скриптов на языке PHP с использованием расширения CURL

Глоссарий

 

  Система - платежная система, совокупность аппаратных и программных средств ООО "Дельта Кей", предназначенных для организации приема платежей в адрес зарегистрированных поставщиков услуг, организации переводов между пользователями и выполнения иных финансовых операций, реализованных в качестве сервисов платежной системы.
  Сервер - интернет-сервер системы с установленным программным комплексом для обеспечения процессинга операций.
  Агент - пользователь системы, имеющий право на осуществление определенных пользовательских операций. Список разрешений определяется
  Пользователь - юридическое либо физическое лицо, зарегистрированное в Системе и пользующееся ее сервисами.
  Точка - зарегистрированный в Системе объект, поддерживающий работу с Системой в том либо ином виде, в зависимости от типа этого объекта. Точкой может являться дилерский пункт приема платежей, терминал моментальной оплаты, интернет-сайт и другие объекты, имеющие возможность организации приема платежей через Систему и зарегистрированные должным образом в Системе.
  Терминал - разновидность точки, программно-аппаратный комплекс, предназначенный для организации приема платежей в режиме самообслуживания.
  Поставщик услуг - Пользователь, зарегистрированный в Системе в качестве получателя платежей за предоставляемые им Плательщику услуги либо реализуемые товары.
  Плательщик - юридическое или физическое лицо, производящее оплату в пользу Поставщика услуг через Систему.
  Договор - юридический документ, оформленный на бумажном носителе, либо в соответствии с действующим законодательством, в виде публичной оферты, регламентирующий отношения между Пользователем и Системой, и содержащий существенные условия взаимодействия сторон, включая юридические, технические и финансовые условия сотрудничества.
  Дилер - коммерческий представитель Системы, уполномоченный представлять ее интересы в части прием платежей в адрес поставщиков услуг.

 

История версий

 

Версия Дата Изменения, дополнения
1.0 05.12.2004 Создание протокола
2.0 07.02.2005 Изменены параметры авторизации
2.1 17.05.2006 Добавлена мультитабличность ответов
2.5 16.11.2006 Добавлен пример реализации на Borland Delphi
3.0 18.12.2006 Добавлены спецификации протоколов
3.2 13.06.2007 Добавлен пример подписи на языке Perl

 

Общая информация


Стандарт ExDK определяет взаимодействие Агентов с платежной системой Дельта Кей путем передачи запросов на командный сервер.

Стандарт предусматривает передачу данных от Агента методами POST или GET и получение результирующей XML в определенном данным стандартом формате.

Инициализация взаимодействия всегда исходит от Агента.

Идентификация и безопасность


Обмен данными происходит по закрытому SSL-соединению с использованием сертификата Агента, выданного Агенту Сервером в момент регистрации. В зависимости от спецификации сообщение также может подписываться электронной цифровой подписью (ЭЦП).

Логин и пароль Агента передаются с каждой командой. При этом пароль передается не в открытом виде, а захешированным по алгоритму md5. Хешируемая строка представляет собой конкатенацию самого пароля, а также номера внешней транзакции (транзакции, передаваемой пользователем, не путать с транзакцией, присваиваемой системой). Таким образом, при уникальности внешней транзакции обеспечивается защита пароля от перехвата, так как обратной операции дехеширования не существует, а строка хеша является уникальной для каждой операции пользователя. Следует отметить, что уникальность внешней транзакции для финансовых операций является строго обязательной; при попытке произвести финансовую операцию с применением использованного ранее номера будет выдана ошибка 7012 - Некорректный номер внешней транзакции. (Коды всех ошибок см. в приложениях).

В зависимости от спецификации протокола базовая идентификация может быть изменена либо дополнена.

Формат запросов


Обмен данными происходит при помощи протокола HTTPS. Сервер предоставляет клиенту исполняемый сценарий, доступный для клиента через сеть Интернет. Клиент запрашивает сценарий HTTPS методом GET или POST с передачей текста команды и ее параметров в виде строки запроса.

Формат команды представлен следующим образом:

https://<server_name>/<script_name>?cmd=<cmd>&ext_transact=<ext_transact>

&login=<login>&password=<password>
[&<param_name1>=<param_value1>]...[&<param_nameN>=<param_valueN>]


где:

  <server_name> - имя сервера, зависит от того, какие из серверов системы поддерживают пользовательский сертификат;
  <script_name> - название скрипта на сервере;
  <cmd> - название команды;
  <ext_transact> - номер внешней транзакции;
  <login> - логин отправителя команды;
  <password> - пароль отправителя команды, склеенный (сконкатенированный) с номером внешней транзакции, захешированный по алгоритму md5;
  <param_name1>, <param_nameN> - названия параметров;
  <param_value1>, <param_valueN> - значения параметров.


К примеру, смена логина может быть выполнена следующей командой:

https://deltakey.net/dkcp/security.py?cmd=change_login&ext_transact=1254&login=ms&password=867c4bc5f2010a95f9971b91ddaa8f47 &program=1250&new_login=test

Здесь новым логином текущего пользователя становится .

При необходимости в качестве значений параметров передать строку, содержащую кроме латинских букв и цифр буквы национальных кодировок и специальные символы, используется кодирование строки, применяемое в протоколе HTTP (входные данные в конце URL кодируются в спецификации CGI. Чтобы специальные символы интерпретировались обычным образом, используются их шестнадцатиричные коды, см. спецификацию протокола HTTP).

Спецификация протокола может определять и другие обязательные параметры. Дополнительные параметры определяются посылаемой командой.

Формат ответов


В качестве ответов возвращается XML вида:

<?xml version="1.0" encoding="UTF-8"?>
<response>
	<transact>...<transact>

	<ext_transact>...</ext_transact>
	<date>...</date>
	<status>...</status>
	<status_text>...</status_text>

	<result>...<result>
	<result_text>...</result_text>
	<advanced>
		[<param1>...</param1>

		...
		<paramN>...</paramN>] 
	</advanced>
	<table [name="table1"] row="..." col="...">
		[<colnames>
			<colname1>ruscolname1</colname1>

			...
			<colnameN>ruscolnameN</colnameN>
		</colnames>
		<colvalues>
			<colname1>colvalue1</colname1>

			...
			<colnameN>colvalueN</colnameN>
		</colvalues>
		...
		<colvalues>
			<colname1>colvalue1</colname1>

			...
			<colnameN>colvalueN</colnameN>
		</colvalues>]
	</table>
	...
	<table [name="tableN"] row="..." col="...">
		[<colnames>

			<colname1>ruscolname1</colname1>
			...
			<colnameN>ruscolnameN</colnameN>
		</colnames>
		<colvalues>

			<colname1>colvalue1</colname1>
			...
			<colnameN>colvalueN</colnameN>
		</colvalues>
		...
		<colvalues>

			<colname1>colvalue1</colname1>
			...
			<colnameN>colvalueN</colnameN>
		</colvalues>]
	</table>
</response>


Описание элементов:

  transact - номер транзакции сервера, созданная в результате команды, или обращение к которой выполнялось в процессе выполнения команды. Представлена длинным целым числом. Может быть равной 0 в случае, если команда не обращается к какой-либо транзакции и не создает ее (получение переменных сервера), либо задействует более одной транзакции (получение статистики операций);
  ext_transact - номер внешней транзакции;
  data - дата завершения выполнения команды сервером. Представлена в виде YYYYMMDDhhmmss (например, дата 20061127174403 может быть расшифрована как 27 ноября 2006 г. 17:44:03);
  status - статус выполнения команды. Представлен целым числом: 1 - в обработке, 2 - завершена. Необходимость введения данного элемента обусловлена тем фактом, что многие команды завершаются сразу (смена регистрационных данных, получение статистики), либо выполняют предварительную разноску по базе данных (к примеру, проведение платежа: посылаются данные поставщику, однако операция будет считаться окончательно завершенной в случае подтверждения поставщиком факта оплаты);
  result - результат выполнения команды. Представлен числом: 0 - успешное выполнение команды, любое другое число - код ошибки (см. приложение II);
  result_text - текстовая расшифровка результата;
  ветка advanced - дополнительные сведения, возвращаемые командой (к примеру, рассчитанные комиссии, статистика и прочее). Может быть пустой или содержать неограниченное количество строк
  табличная часть - в результирующей XML может содержаться одна или несколько таблиц; каждая таблица имеет следующую структуру:
  param1, paramN - дополнительные строковые параметры, возвращаемые командой;
  ветка colnames - в случае возвращения таблицы данных - полные заголовки столбцов (краткие заголовки с использованием только символов латинского алфавита могут быть получены из имен элементов). Количество элементов в ветке равно количеству столбцов;
  ветки colvalues - в случае возвращения таблицы данных - значения строк по столбцам. Количество этих веток равно количеству строк. Количество элементов в каждой ветке равно количеству столбцов.


Для корректной расшифровки ответов необходим Internet Explorer не ниже версии 6.

Спецификации протоколов


По стандарту ExDK реализовано несколько протоколов Системы, представляющие из себя спецификации данного стандарта. Ниже описаны отличия и дополнения спецификаций DKCP-user и DKCP-point.

Список команд, выполняемых по каждому протоколу, определяется протоколом, однако многие команды могут повторяться в различных спецификациях, но при этом могут отличаться количество дополнительных параметров, выполняющие скрипты и другие параметры команд.

DKCP-User


Спецификация DKCP-User определяет следующие дополнения стандарта ExDK:

1. Добавлен обязательный параметр, добавляемый при отправке запроса Агентом на Сервер. Данный параметр имеет наименование program, а в качестве значения передается код программы, из которой выполняется запрос. Код выдается при регистрации программы. Зарегистрировать программу может пользователь, дополнительно зарегистрированный в качестве разработчика.

2. В целях авторизации к SSL-соединению добавляется сертификат пользователя, высылаемый Агенту на почтовый адрес при регистрации в системе в качестве пользователя.

Для получения более подробной информации см. описание протокола DKCP-User.

DKCP-Point


Спецификация DKCP-Point определяет следующие дополнения стандарта ExDK:

1. Добавлен обязательный параметр, добавляемый при отправке запроса Агентом на Сервер. Данный параметр имеет наименование num_point, а в качестве значения передается номер точки, присвоенный ей в момент регистрации.

2. В целях авторизации к SSL-соединению добавляется сертификат точки, присылаемый Агенту при регистрации Точки в системе. Необходимо отметить, что не каждая точка предусматривает наличие сертификата. Данный сертификат предусмотрен только для Терминалов и Электронных магазинов.

3. Использование спецификации DKCP-point обязывает добавлять подпись к каждому сообщению. Подпись формируется путем хеширования контрольной строки методом hmac, в качестве ключа используется пароль точки (в открытом виде, а не хеш). Контрольная строка получается путем склейки параметров:

cmd+ext_transact+login+num_point+обязательные_параметры_команды

Все параметры должны склеиваться в строго указанном порядке. Обратите внимание, что необязательные параметры не используются при формировании подписи.

Для получения более подробной информации см. описание протокола DKCP-Point.

DKCP-Uni Transfer


Спецификация DKCP-Uni Transfer определяет следующие дополнения стандарта ExDK:

1. Запросы выполняются по открытому SSL-соединению.

2. Добавлен обязательный параметр, добавляемый при отправке запроса Агентом на Сервер. Данный параметр имеет наименование uin, а в качестве значения передается UIN или SN или JID пользователя (номер ICQ).

3. При выполнении финансовых операций изменяется алгоритм вычисления параметра password. Для получения этого параметра конкатенируются следующие параметры:
    пароль_пользователя + платежный_пароль_пользователя + ext_transact
Полученная строка хешируется методом MD5. Необходимо обратить внимание, что для НЕфинансовых операций получение параметра password выполняется в стандартном режиме, определенном стандартом ExDK (склеиваются для хеширования только пароль_пользователя и параметр ext_transact).

Для облегчения разработчикам использования протокола DKCP-Uni Transfer программистами системы реализована динамическая библиотека Unitransfer.DLL, которая предоставляет доступ ко всем функциям, выполняемым из плагинов IM-клиентов ICQ/Jabber по протоколу DKCP - Uni Transfer.

Для получения более подробной информации см. описание протокола DKCP - Uni Transfer.

DKCP-POSTerminal


Протокол DKCP-POSTerminal отнесен к стандарту ExDK весьма условно, так как учитывая скромные возможности POS-терминала сильно облегчены как запросы к командному серверу Delta Key, так и возвращаемые ответы.

Для получения более подробной информации см. описание протокола DKCP-POSTerminal.

Приложение 1. Коды статусов и результатов


В результате выполнения команды сервер возвращает статус и результат. В приведенной ниже таблице представлены коды статусов. Пояснения требует последний столбец - Прием платежа с терминала с этим статусом. При значении 1 платеж с терминала будет принят, несмотря на возникшую ошибку, и помещен в ошибочные платежи. Статус 7 и 3 имеют одинаковую расшифровку, однако для системы есть небольшая разница в необходимости возвращения того либо иного статуса.

Коды статусов

Код Расшифровка Прием платежа с терминала
1 В обработке 1
2 Команда выполнена 1
3 Отказ сервера от обработки 0
4 Принято на рассмотрение в администрацию системы 1
5 Операция не выполнена. Попробуйте повторить 0
6 Операция не выполнена. Повторите позднее 0
7 Отказ севера от обработки 0


В таблице ниже представлены коды результатов. Каждый из результатов может быть получен только с определенным статусом, т.о. статус дополняет результат признаком фатальности. Список результатов актуален 02.04.2008 и может быть в любое время дополнен новыми записями.

Коды результатов

Код Статус Текстовая расшифровка
0 2 Операция успешно завершена
100 1 В обработке
303 4 Ошибка отправки данных через шлюз (системная)
705 2 Операция перепроведена
710 2 Операция аннулирована
850 3 Отказ системы от обработки
1000 6 ОШИБКА ФИНАНСОВОГО КОНТРОЛЯ
1011 3 Вы не можете списать долг, так как сумма зачисления недостаточна для покрытия минусового баланса счета
1012 3 Вклад может быть открыт только на кредитный счет нулевого баланса
1013 3 На данный счет уже открыт вклад
1014 3 Неверный тип депозита
1015 3 Указанный тип депозита не активен
1016 3 Вклад с указанным номером не найден
1017 3 Вклад ранее уже был пополнен
1018 3 Невозможно распечатать договор на непополненный вклад
1019 3 Невозможно распечатать договор на досрочно прерванный вклад
1020 3 Вознаграждение не может быть начислено по депозиту, срок которого не истек
1021 3 По данному депозиту вознаграждение уже выплачено
1022 3 Вознаграждение не может быть начислено по депозиту, прерванному досрочно
1023 3 Вознаграждение не может быть начислено по депозиту, если договор не подписан КПК
1024 3 Баланс кредитного счета и сумма вклада не совпадают
1025 3 Счет является кредитным
1026 3 Недопустимая валюта счета для создания вклада
1030 7 У пользователя нет счета в юнитах
1062 4 Данному дилеру запрещен прием платежей в адрес данного оператора
1065 4 Данному плательщику платеж в адрес данного оператора запрещен
1072 6 Вам запрещены операции вывода средств
1073 6 С данного счета запрещены операции вывода средств
1074 7 Шлюз запрещен
1075 3 Недостаточно средств для проведения платежа
1076 6 Неверный номер счета
1077 6 Счет не соответствует ID
1078 3 Валюта счета плательщика отлична от валюты счета получателя
1079 3 Неверный номер счета получателя
1080 3 Неверный ID
1081 3 Неверный ID или он не зарегистрирован как дилер
1082 3 Неверный ID получателя
1083 3 Вы уже зарегистрированы ранее как дилер
1084 3 Вы не зарегистрированы как дилер
1124 3 Неверные параметры платежа
1130 3 Номер не принадлежит оператору
1400 3 Форма не акцептована
1401 3 Форма не активна
1402 3 Неверный номер формы
1403 6 Прием платежа запрещен оператором
1404 6 Поставщик услуг в данный момент запрещен
1405 6 Поставщик услуг в данный момент не активен
1409 3 Получателю запрещены операции приема средств
1411 3 Прием платежа запрещен системой
1417 3 Поставщику услуг запрещены операции с операционным счетом
1430 3 Процент комиссии больше максимально разрешенного системой
1432 7 Невозможно определить комиссию по операции
1449 3 Цена меньше минимального лимита
1450 3 Количество меньше минимального лимита
1451 3 Сумма платежа меньше минимального лимита
1452 3 Сумма платежа больше максимального лимита
1455 3 Некорректная сумма платежа
1456 3 Сумма платежа должна быть целым числом
1457 3 Сумма должна быть больше нуля
1502 3 Данная транзакция не может быть перепроведена (аннулирована)
1507 7 Незавершенная транзакция не может быть перепроведена
1513 7 Успешная транзакция не может быть перепроведена
1520 3 Невозможно перепровести ранее перепроведенную транзакцию
1521 3 За данную транзакцию средства уже возвращены плательщику, либо никогда не были блокированы на системном счету
1702 3 Неверный код валюты
1705 3 В выбранной валюте нельзя выводить средства на банк указанной страны
1722 3 Превышен лимит на ввод
1723 7 Превышен лимит на вывод
1724 7 Превышен суточный лимит на ввод
1725 7 Превышен суточный лимит на вывод
1730 3 Не прошел финансовый контроль
2000 3 ОТСУТСТВИЕ ПАРАМЕТРА
2002 3 Недостаточно параметров
2012 3 Отсутствует параметр ext_transact
2014 3 Отсутствует параметр cmd
2015 3 Отсутствует параметр program
2021 3 Отсутствует параметр login
2022 3 Отсутствует параметр password
2023 3 Отсутствует параметр summ
3000 3 НЕКОРРЕКТНОЕ ЗНАЧЕНИЕ ПАРАМЕТРА
3001 4 Неверный формат номера телефона
3002 4 Нет такого номера телефона
3003 3 Некорректный формат параметра
3004 3 Неверный uin
3005 3 Пользователь не зарегистрирован в Uni Transfer
3006 3 Вы не зарегистрированы в Uni Transfer
3007 3 Пользователь зарегистрирован в Uni Transfer, но регистрация не подтверждена
3011 4 Параметр не соответствует маске: допустимы только символы латинского алфавита и цифры
3014 3 Неверный код страны
3015 3 Неверный номер точки
3016 3 Неверный номер терминала
3029 3 Неверный тип счета
3032 3 Неверный код валюты
3035 6 Неверный код дилера
3040 3 Неверный признак плательщика НДС: 0-не плательщик, 1-плательщик
3042 3 Неверный код группы
3045 3 Неверный номер поля
3047 3 Неверный код эмитента
3049 3 Неверный код сервиса
3051 3 Неверный код номинала
3053 3 Неверный код магазина
3055 3 Неверный код шаблона
3056 3 Неверный код банка
3057 3 Неверный код профиля
3058 3 Неверный код тарифа
3060 3 Не найдена операция с указанным номером внешней транзакции
3128 7 Некорректная XML для настройки комиссии
3130 4 Некорректная XML
3205 3 Неверный код типа дилера
3301 3 Неверный номер электронного магазина
3302 3 Электронный магазин не активен
3303 3 Электронный магазин не акцептован
3304 3 Неверный код пользователя
4000 4 СПЕЦИФИЧЕСКАЯ ОШИБКА КОМАНДЫ
4110 3 Номер чека не уникален
4120 3 Нет данных по последней инкассации
4125 4 Ошибка генерации ключа
4126 4 Неверный номер сертификата или контрольный код
4206 3 Нет данных по данному ID
4208 3 Платеж не найден
4209 3 Платеж был запрещен ранее либо проведен
4210 3 Не уникальный номер операции
4215 4 Активной карты с такими параметрами в системе не зарегистрировано
4220 4 Карта заблокирована
4223 4 Срок активации истек
4231 3 Невозможно удалить пользователя - он рабочий
4232 3 Пользователя невозможно удалить - на него зарегистрированны рабочии транзакции (формы)
4250 4 Аннулировать чек может только его создатель
4251 4 В системе нет чека с указанным номером
4253 4 Данный чек заблокирован. Его невозможно активировать
4255 4 Данный чек уже активирован
4257 4 Код активации чека указан неверно
4259 4 Было выполнено более трех попыток активации чека. Чек заблокирован
4308 3 Не уникальный номер счета в учетной системе поставщика услуг
4311 4 Для выставления платежного требования не до востребования необходимо указать ID или счет плательщика
4314 4 Вы не можете оплатить это платежное требование, т.к. ID плательщика отличен от вашего
4315 4 Вы не можете оплатить это платежное требование, т.к. счет плательщика отличен от вашего
4320 4 Данная транзакция не является платежным требованием
4321 4 Неверный номер платежного требования
4323 4 Срок оплаты истек
4327 3 Невозможно отказаться от оплаты платежного требования, по которому была произведена оплата (в т.ч. частично), либо отказ уже выполнялся
4328 3 Ранее был выполнен отказ от оплаты платежного требования
4329 3 Платежное требование уже оплачено
4340 3 Данное предложение уже не активно
4341 3 Указанное количество отсутствует
4345 3 Вы не можете изменить статус этого пин-кода
4350 3 Плательщик отказался от оплаты
4360 3 Форма транзакции является рабочей
4450 1 Процессор и процессинг
4451 3 Процессором может быть только юридическое лицо
4453 3 Вы уже зарегистрированы как процессор
4454 3 Вы не являетесь процессором
4455 1 Партнер - разработчик ПО
4456 3 Вы не зарегистрированы как разработчик ПО
4457 3 Вы уже зарегистрированны как партнер - разработчик ПО
4458 3 Вы уже зарегистрированы в Uni Transfer
4470 3 Срок протекции истек
4471 3 Блокировка данной транзакции не предусматривает кода протекции
4472 3 Слишком много попыток ввода кода протекции
4473 3 Неверный код протекции
4474 3 Код протекции уже был принят ранее
4480 3 На указанном счету уже установлен данный тариф
4481 3 Ваш тариф не может быть сменен
4490 3 Данный шлюз уже настроен на данного оператора. Воспользуйтесь операцией изменения параметров шлюза на оператора
4491 3 Данный шлюз еще не настроен на данного оператора. Воспользуйтесь операцией добавления шлюза на оператора
4492 3 Невозможно удалить рекомендуемый шлюз
4493 3 Шлюз не найден
4510 3 Транзакции
4511 3 На данного поставщика услуг зарегистрированны транзакции
4512 3 У Вас нет поставщика с таким codes
4550 3 Настройка инкассации заблокированна.
4570 3 Терминал/дилерская точка не могут быть удалены в течение недели после последнего платежа
5000 4 ОШИБКА БАЗЫ ДАННЫХ
5216 4 Невозможно определить код операции
5217 4 Невозможно определить результат операции
5220 4 Невозможно определить код транзакции
5224 4 Невозможно определить параметры получателя
5227 4 Неправильный номер магазина
5230 4 Неправильный номер субъекта
5232 4 Невозможно определить статус операции
5308 4 Невозможно определить процент комиссии с получателя
5309 4 Невозможно определить процент комиссии с плательщика
5310 3 Невозможно определить вознаграждение процессора
5311 4 Невозможно определить процент комиссии системы
5313 4 Невозможно определить процент вознаграждения дилера
5432 4 Ошибка отправки данных через шлюз (2)
5435 4 Ошибка отправки данных через шлюз (5)
5436 4 Ошибка отправки данных через шлюз (6)
5437 4 Ошибка отправки данных через шлюз (7)
5438 4 Ошибка отправки данных через шлюз (8)
5439 4 Ошибка отправки данных через шлюз (9)
5441 4 Ошибка отправки данных через шлюз (11)
5442 4 Ошибка отправки данных через шлюз (12)
5444 4 Ошибка отправки данных через шлюз (14)
5463 3 Ошибка отправки данных через шлюз (33)
5530 4 Невозможно определить системный счет
5535 4 Ошибка получения данных о состоянии блокировки счета
5536 3 Невозможно определить текущий баланс счета
5537 4 Невозможно получить валюту счета
5538 4 Ошибка изменения баланса счета
5539 3 Нет поддержки кросс-курсов данных валют
5542 4 Невозможно определить обработчика транзакции
5543 4 Невозможно определить действительного обработчика транзакции
5546 4 Невозможно определить активность обработчика
5547 3 Обработчик транзакции не активен или не акцептован
5550 4 Невозможно определить название платежа
5552 4 Невозможно определить скрипт-обработчик
5553 4 Невозможно определить номер счета получателя
5570 4 Невозможно определить код владельца
5571 4 Невозможно определить код владельца
5601 4 Ошибка обновления записи
5602 4 Ошибка удаления записи
5603 4 Ошибка добавления записи
5620 4 Ошибка получения данных
5705 5 Нет данных о форме, на которую настраивается процент
5710 3 Невозможно отправить в архив НЕоплаченный реестр
5711 3 Невозможно удалить оплаченный реестр
5712 3 Реестр в архиве
6000 6 ОШИБКА БЕЗОПАСНОСТИ
6011 3 У вас нет прав на выполнение данной операции
6020 3 У Вас нет прав на удаление этого поля
6021 3 У Вас нет прав на редактирование этого поля
6022 3 У Вас нет прав на изменение этого сервиса
6023 3 У Вас нет прав на удаление этого сервиса
6025 3 У Вас нет прав на изменение этого эмитента
6026 3 У Вас нет прав на удаление этого эмитента
6028 3 У Вас нет прав на изменение этого номинала
6029 3 У Вас нет прав на удаление этого номинала
6060 3 В доступе отказано
6063 7 На указанный номер ICQ регистрация уже имеется
6082 3 Неверный логин
6083 4 Неверный пароль
6084 3 Неверный SIGN
6085 3 Неверный одноразовый ключ
6086 4 Было выполнено 10 попыток активации ключа. Вход в систему заблокирован.
6087 3 Вход в ПО системы заблокирован
6090 3 Файл сертификата не найден
6120 6 Точка не акцептована
6130 3 Точка не зарегистрирована или зарегистрирована на другого пользователя
6251 3 Изменение информации о пользователе запрещено
6257 4 Персона, которая пытается выполнить операцию, не имеет права на ее выполнение
6259 3 У Вас нет лицензии на выполнение данной операции
6261 3 Пользователь не является Вашим субдилером
6262 3 Отсутствует акцепт на администрирование субдилера
6263 3 Невозможно определить вышестоящего дилера
6271 3 Данные о юридическом лице отсутствуют, изменение невозможно
6273 3 Данные о физическом лице отсутствуют, изменение невозможно
6290 3 У получателя нет прав на прием средств через Internet
6322 4 Настройка комиссии на данные формы запрещена
6401 3 У Вас нет прав на администрирование пользователей чужой страны
6410 6 Выполнение команды временно запрещено
6411 4 Неверный код программы
6412 3 Ваше программное обеспечение устарело для выполнения данной операции
6413 3 Выполнение операций из Вашей программы временно запрещено
6415 3 Такого Ident'а не может быть в системе
6418 3 В качестве пайщика Startrek могут регистрироваться только физические лица
6419 3 Вы уже зарегистрированы в качестве пайщика Star Trek
6501 3 Вы не зарегистрированы в системе Uni Transfer
6502 3 Ваша регистрация не подтверждена
6503 3 Неверный серийный номер или контрольный код (некорректная строка подтверждения регистрации)
6512 3 Вы можете выполнить не более семи попыток активации за два часа
6513 3 Неверные параметры карты
6514 3 Было выполнено более трех попыток активации карты. Карта заблокирована
6515 3 Карта персонализирована и принадлежит другому пользователю
6516 3 Все карты дилера, продавшего данную карту, временно блокированы
6517 3 Серия не активна
6523 3 Неверный тип карты
6524 3 Данный тип карты временно не активен
6525 3 Неверный номер заказа карты
6526 3 Данная пластиковая карта сейчас не может быть активирована
6527 3 Данная пластиковая карта уже активирована
6528 3 Неверный CVC
6529 3 Неактивная пластиковая карта не может быть заблокирована
6530 3 Пластиковая карта уже была заблокирована ранее
6531 3 Разблокирована может быть только карта, заблокированная держателем
6532 3 Данная карта не заблокирована
6533 3 Неверный признак блокировки
6534 3 Операция разблокировки недоступна
6535 3 Вывод средств не может быть заказан на данную карту
6540 3 Неверный номер пластиковой карты
6550 3 Слишком большое количество запросов на регистрацию
6601 3 Логин дополнительного пользователя должен быть уникальным
7000 4 ОШИБКА СИСТЕМЫ
7010 4 Некорректный номер транзакции
7012 3 Некорректный номер внешней транзакции
7020 5 Ошибка выполнения команды
7023 4 Различный размеров массивов
7040 3 Невозможно обновить завершенную транзакцию
7051 4 Платеж не может быть отправлен по выбранному шлюзу
7119 4 Невозможно соединиться с сервером оператора
7212 3 Технические работы на сервере
7404 3 Команда не найдена
7701 4 Ошибка формирования XML
8000 4 ОШИБКА ОПЕРАТОРА
8001 4 Неизвестная ошибка оператора
8012 3 Номер телефона находится в неактивном состоянии
8032 3 Работа с данным оператором не реализована
8049 3 Оператор не может принять платеж
8050 7 Поставщик услуг не может принять платеж
8052 4 Ошибка в ответе оператора
8056 4 Оператор не идентифицировал платежную систему
8070 3 Истекло время ожидания обработки
9000 4 ВНЕКЛАССОВАЯ ОШИБКА

 

Приложение 2. Примеры реализации

 

Выполнение команд с использованием Internet Explorer


Для корректной расшифровки ответов необходим Internet Explorer не ниже версии 6. Рассмотрим действия, необходимые для отправки тестовой команды на сервер по спецификации DKCP-user.

Шаг 1. Установка сертификата.

Для возможности идентификации пользователя необходимо установить сертификат. Для этого можно использовать готовый файл pfx, сохраняемый в папке C:/Program files/Delta Key/users/ID_ПОЛЬЗОВАТЕЛЯ (при установке Системы Мониторинга и Статистики не в каталог по умолчанию путь может быть другим). Также файл сертификата можно получить средствами Open SSL из файла p12, присылаемом в письме при регистрации пользователя. Паролем на закрытый ключ является указанный при регистрации пользователя пароль.

Шаг 2. Выполнение запроса.

Сформированная строка запроса подставляется в адресную строку. После нажатия Enter будет выдан запрос на подстановку сертификата:



Из предложенного списка выбирается нужный сертификат.

Шаг 3. Просмотр результата.

Результирующая XML отображается в окне Internet Explorer:

Выполнение команд с использованием Borland Delphi


Для выполнения команд из среды Borland Delphi лучше всего подходит использование компонентов Indy 9.

На форму необходимо поместить компонент TIdSSLIOHandlerSocket, в настройках SSLOptions указать путь к файлам ключа и корневому сертификату сервера. Пример посылки команды и расшифровки ответа:

Листинг 1. Отправка команды на сервер.

function TCMD.SendCMD(Form: TIdMultiPartFormDataStream;
  const cmd_name: String; errorBreak: Boolean=true;
  PersentLast: Word=100; PersentFirst: Word=0): TResultCMD;
var
  s: String;
  ext_transact: String;
  code_password: String;
  idHTTP: TIdHTTP;
  script: String;
  LocalDB: TLocalDB;
  LoadKernel: TLoaderKernel;
begin
  ext_transact := dmApi.DateEncode(DateTimeToStr(Now()))+IntToStr(Random(1000));
  code_password := dmApi.md5(UserKey.Password + ext_transact);
  Form.AddFormField('cmd', cmd_name);
  Form.AddFormField('ext_transact', ext_transact);
  Form.AddFormField('program', pro);
  Form.AddFormField('login', UserKey.Login);
  Form.AddFormField('password', code_password);

  IdHTTP := TIdHTTP.Create(dmApi);
  idHTTP.IOHandler := dmApi.IdSSLIOHandlerSocket1;

  //определяем скрипт, на который посылать команду (получение вырезано)
  script := 'https://deltakey.net/dkcp/test.py';

  try
  s := idHTTP.Post(script, Form);
  except
    MessageDlg('Нет доступа к серверу. Попробуйте повторить', mtError, [mbOk], 0);
    Abort;
  end;
  Form.Free;

  Result := ParseXML(s, PersentLast);
  Result.All := s;

  if errorBreak then
    if (Result.status<>2) or (Result.result<>0) then
    begin
      MessageDlg(Result.result_text, mtError, [mbOk], 0);
      Abort;
    end;
end;


Листинг 2. Парсинг результата.

type
  TResultAnswer = record
    Name: String;
    Value: String;
  end;

  TResultFields = record
    Fields: array of array of String;
    ColName: array of String;
    ColRName: array of String;
    RowCount: Integer;
    ColCount: Integer;
  end;

  TResultCMD = class
    public
      transact: Int64;
      ext_transact: Int64;
      date: TDateTime;
      status: Smallint;
      result: Smallint;
      result_text: String;
      Answer: array of TResultAnswer;
      Fields: TResultFields;
      All: String;
      function GetAnswerValue(Const AName: String): String;
      function GetFieldValue(Const AField: String; Row: Integer=0): String;
      function GetFieldRName(Const AField: String): String;
  end;

function TCMD.ParseXML(xml: String; PersentLast: Word; errorBreak: Boolean=true): TResultCMD;
var
  res: TResultCMD;
  Doc: IXMLDOMDocument;
  el: IXMLDOMElement;
  tt: IXMLDOMNode;
  c, i, j, k, l: Integer;
  aar: array of String;
  param: String;
  ProgressPersent: Double;
  ProgressStepSize: Double;

begin
  try

    Doc:=CoDOMDocument.Create;
    Doc.loadXML(xml);
    el:=Doc.documentElement;
    c:=el.childNodes.length;
    Res := TResultCMD.Create;
    SetLength(Res.Answer, 0);

    for i:=0 to c-1 do
    begin
      param:=el.childNodes[i].nodeName;

      if param='transact' then
      begin
        Res.transact:=StrToInt64(el.childNodes[i].nodeTypedValue);
        Continue;
      end;
      if param='ext_transact' then
      begin
        Res.ext_transact:=el.childNodes[i].nodeTypedValue;
        Continue;
      end;
      if param='date' then
      begin
        Res.date := StrToDateTime(dmApi.DateDecode(el.childNodes[i].nodeTypedValue));
        Continue;
      end;
      if param='status' then
      begin
        Res.status:=el.childNodes[i].nodeTypedValue;
        Continue;
      end;
      if param='result' then
      begin
        Res.result:=el.childNodes[i].nodeTypedValue;
        Continue;
      end;
      if param='result_text' then
      begin
        Res.result_text:=Utf8ToAnsi(el.childNodes[i].nodeTypedValue);
        Continue;
      end;

      if param='advanced' then
      begin
        if el.childNodes[i].childNodes.length>=1 then
        begin
          SetLength(Res.Answer, el.childNodes[i].childNodes.length);
          for j:=0 to el.childNodes[i].childNodes.length-1 do
          begin
            Res.Answer[j].Name:=el.childNodes[i].childNodes[j].nodeName;
            Res.Answer[j].Value :=
              Utf8ToAnsi(el.childNodes[i].childNodes[j].nodeTypedValue);
          end;
        end;
      end;

      if param='table' then
      begin
        res.Fields.rowcount:=el.childNodes[i].childNodes.Length-1;
        for j:=0 to el.childNodes[i].childNodes.Length-1 do
        begin
          param:=el.childNodes[i].childNodes[j].nodeName;
          if param='colnames' then
          begin
            res.Fields.colcount:=el.childNodes[i].childNodes[j].childNodes.length;
            SetLength(res.Fields.colrname, res.Fields.colcount);
            SetLength(res.Fields.colname, res.Fields.colcount);
            SetLength(aar, res.Fields.colcount);
            for k:=0 to el.childNodes[i].childNodes[j].childNodes.length-1 do
            begin
              tt:=el.childNodes[i].childNodes[j].childNodes[k];
              aar[k]:=tt.nodeName;
              res.Fields.ColName[k]:=tt.nodeName;
              res.Fields.ColRName[k] :=
                Utf8ToAnsi(tt.nodeTypedValue);
            end;
          end;

          if param='colvalues' then
          begin
            tt:=el.childNodes[i].childNodes[j];
            SetLength(res.Fields.fields, res.Fields.rowcount, res.Fields.colcount);
            for k:=0 to tt.childNodes.length-1 do
            begin
              for l:=0 to res.Fields.colcount-1 do
              begin
                param:=tt.childNodes[k].nodeName;
                if aar[l]=param then
                begin
                  res.Fields.fields[j-1, l] :=
                    Utf8ToAnsi(tt.childNodes[k].nodeTypedValue);
                  Break;
                end;
              end;
            end;
          end;
        end;
      end;

    end;
    Result:=Res;
  except
    Result := nil;
    if errorBreak then
    begin
      MessageDlg('Ошибка расшифровки ответа', mtError, [mbOk], 0);
      Abort;
    end;
  end;
end;


Листинг 3. Пример посылки команды с использованием вышеприведенных функций.

procedure TfmMain.mAdmTestClick(Sender: TObject);
var
  Form: TMultipartForm;
  Res: TResultCMDApi;
begin
  Form := TMultipartForm.Create;
  Res := dmApi.CMD.SendCMD(Form, 'test');
  ShowMessage(Res.result_text);
end;

 

Выполнение команд из скриптов на языке PHP с использованием расширения CURL


Для того, чтобы иметь возможность выполнять команды к серверу из скриптов на языке PHP с использованием расширения CURL, необходимо иметь файл сертификата, который может быть получены из файла .pfx или .p12, присылаемого пользователю на почту при регистрации в системе. Для конвертации можно воспользоваться утилитой openssl из одноименного пакета:

$ openssl pkcs12 -in 112233.p12 -out 112233.cer -clcerts

Таким образом, получен файл .cer, который используется при запросе:

<?php
	curl_setopt ($ch, CURLOPT_CAPATH, 			DKCP_PATH_CERT);
	curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 	0);
	curl_setopt ($ch, CURLOPT_SSLCERT, 			DKCP_CERT);
	curl_setopt ($ch, CURLOPT_SSLCERTPASSWD, 	DKCP_CERT_PASSWORD);
?>


Листинг 4. api.php - модуль, реализующий отправку команды (транспорт).

<?php
// -------------------------------------------------------------------------------------------
// Модуль для реализации примера, выполняющего команды к серверу по протоколу DKCP-User
// Copyright by Delta Key (admin@deltakey.net), (c) 2007.
// -------------------------------------------------------------------------------------------


header('Content-Type: text/html; charset=windows-1251');

// настройки DKCP
define('SERVER_NAME', 'https://deltakey.net');
define('SERVER_CATALOG', '/dkcp');

define('DKCP_CERT', '/home/myserver/data/server_scripts/user.cer');
define('DKCP_PATH_CERT', '/home/myserver/data/server_scripts');
define('DKCP_CERT_PASSWORD', 'certpassword');  //password for certificate

define('DKCP_USER_LOGIN', 'mylogin');
define('DKCP_USER_PASSWORD', 'mypassword');

define('TEMP_DIR', '/home/myserver/data/tmp');
define('PROGRAM', '14001');


// -------------------------------------------------------------------------------------------
// _DateID - Возвращает уникальное 18-байтовое значение.
//           Внешний номер транзакции
//
// Возвращает :
//   Строку - уникальное значение

function _GetExtTransact()
{
    $tm = localtime(time(), 1);
    $r = rand(1111,9999);

    return sprintf( "%04d%02d%02d%02d%02d%02d%04d", $tm["tm_year"]+1900, $tm["tm_mon"]+1,
                  $tm["tm_mday"], $tm["tm_hour"], $tm["tm_min"], $tm["tm_sec"], $r
                  );
}


// -------------------------------------------------------------------------------------------
// Формирование строки запроса
// Добавление логина, пароля и номера трансакции
//
// Параметры :
//    $cmd - Название команды
//    $script - Исполняющий скрипт
//    $params  - Параметры запроса

function _CmdStr ($cmd, $script, $params) {

    $ext_transact = _GetExtTransact();

    $cabinet_ip = $_SERVER ['REMOTE_ADDR'];
    $cabinet_id = $_SESSION['idPHPSHOP'];
    $cabinet_login = $_SESSION['logPHPSHOP'];
    $cabinet_password = md5($_SESSION['pasPHPSHOP'].$ext_transact);

    $login = DKCP_USER_LOGIN;
    $password = md5(DKCP_USER_PASSWORD.$ext_transact);

    $URL = SERVER_NAME . SERVER_CATALOG . '/' . $script . "?cmd=$cmd&program=" . PROGRAM . 
            "&login=$login&password=$password&ext_transact=$ext_transact" . 
            "&cabinet_ip=$cabinet_ip&cabinet_id=$cabinet_id" . 
            "&cabinet_login=$cabinet_login&cabinet_password=$cabinet_password";

    if (is_array($params) ) {
        $keys = array_keys ($params);
        foreach ($params as $key => $value)
            $URL.= "&$key=".str_replace(' ', '+', $value);
    }
    return $URL;
 }


// -------------------------------------------------------------------------------------------
// _HttpsReq - реализация https-запроса к шлюзу Delta Key
//    Для внутреннего пользования функциями данного модуля
//
// Параметры :
//    $url  - Адрес скрипта
// Возвращает :
//    Результат вызова https-запроса (без заголовков) в виде XML

function _HttpsReq($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // CURLOPT_RETURNTRANSFER часто работает некорректно

    $tmp = tempnam (TEMP_DIR, "dk");
    $fp = fopen ($tmp, "w");
    curl_setopt ($ch, CURLOPT_FILE,              $fp);
    curl_setopt ($ch, CURLOPT_CAPATH,            DKCP_PATH_CERT);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER,    0);
    curl_setopt ($ch, CURLOPT_SSLCERT,           DKCP_CERT);
    curl_setopt ($ch, CURLOPT_SSLCERTPASSWD,     DKCP_CERT_PASSWORD);

    $res = curl_exec ($ch);
    
    if ($res) {
        // Запрос успешно выполнен. Возвращаем результат запроса

        curl_close($ch);
        fclose($fp);
        $fp = fopen ($tmp, "r");
        $result = "";
        while (!feof ($fp)) {
            $result.= fgets($fp, 4096);
        }
        
        fclose($fp);
        unlink($tmp);
        if (!$result) {
            $result = 'Сервер не вернул ответа';
            $res = False;
        }
        return array ($res, $result);
    } else {
        // Запрос выполнен с ошибкой. Возвращаем текст ошибки.

        return array (False, curl_error($ch));
    }
}

// -------------------------------------------------------------------------------------------
// _ParseRes - Преобразование результирующей XML в массив
//             Для внутреннего пользования функциями данного модуля
//
// Параметры :
//    $ResText - результат вызова функции _HttpsReq (XML ответа сервера)
// Возвращает : распарсированный массив
// Обязателен модуль MB

function _ParseRes($ResText)
{
    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING,0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,1);
    xml_parse_into_struct($parser, $ResText, $values, $tags);
    xml_parser_free($parser);
    
    $ind = 0;
    foreach ($tags as $key => $value) {
        if ($values[$value[0]]["level"]==2 and $values[$value[0]]["type"] == 'complete') {
            $res[$key] =  mb_convert_encoding (
                        $values[$value[0]]["value"], 'Windows-1251', 'UTF-8'

                        );
        }
        if ($key=='table') {
            $res["table"]["colcount"] = $values[$value[0]]["attributes"]["col"];
            $res["table"]["rowcount"] = $values[$value[0]]["attributes"]["row"];
        }
        
        // блок advanced

        if ($values[$value[0]]["level"] == 3 and $values[$value[0]]["type"] == 'complete') {
            $res["advanced"][$key] =  mb_convert_encoding (
                        $values[$value[0]]["value"], 'Windows-1251', 'UTF-8'

                        );
        }
        if ($values[$value[1]]["level"] == 3 and $values[$value[1]]["type"] == 'complete') {
            $res["advanced"][$key] =  mb_convert_encoding (
                        $values[$value[1]]["value"], 'Windows-1251', 'UTF-8'

                        );
        }
        
        // табличная часть
        if ($values[$value[0]]["level"] == 3 and $values[$value[0]]["type"] == 'open') {
            $keyname = $values[$value[0]]["tag"];
            
            $open = 1;
            $key2 = 0;
            while ($open) {
                $open = 0;
                foreach ($values as $key2 => $value2) {
                    if ($value2["tag"] == $keyname and $value2["type"] == 'open'

                                and $key2>$lastkey) {
                        $open = 1; $doit = 1;
                        $lastkey = $key2;
                        $ind++;
                    }
                    if ($value2["tag"] == $keyname and $value2["type"] == 'close') {
                        $doit=0;
                    }
                    if ($value2["level"] == 4 and $open and $doit) {
                        if ($keyname != 'colnames')
                            $res["table"][$keyname][$ind-2][$value2["tag"]] = 
                                    mb_convert_encoding (
                                                $value2["value"], 'Windows-1251', 'UTF-8'

                                    );
                        else
                            $res["table"][$keyname][$value2["tag"]] =     
                                    mb_convert_encoding (
                                                $value2["value"], 'Windows-1251', 'UTF-8'
                                                );
                    }
                }
            }
        }
    }
    return $res;
}


// -------------------------------------------------------------------------------------------
// DeltaCMD - Запрос к серверу
//            Для вызова из внешних модулей
//
// Параметры :
//    $cmd - название команды ( например, 'pay_momental' - моментальная оплата )
//    $script - путь к исплоняющему скрипту
//    $params - массив параметров команды ( сумма платежа, счет и пр. ) . Может быть пустым
// Возвращает :
//    Результат запроса (true / false)
//    Массив, содержащий ключи:
//        transact - номер транзакции
//        ext_transact - переданный при запросе номер внешней транзакции
//        date - дата завершения операции в формате YYYY-MM-DD hh:mm:ss
//        status - статус выполнения команды ( 2-операция завершена )
//        result - результат выполнения команды ( 0-успех, др. - код ошибки )
//        result_text - текстовая расшифровка результата
//        ТАБЛИЧНАЯ ЧАСТЬ, см. описание протокола DKCP

function DeltaCMD($cmd, $script, $params=array())
{
    $url = _CmdStr ($cmd, $script, $params);
    list($Result, $ResText) = _HttpsReq ($url);
    if (! $Result) {
        return array (False, 'CURL error: ' . $ResText);
    }
    $res = _ParseRes($ResText);
    return array (True, $res);
}

?>


Листинг 5. test.php - пример использования модуля api.php для отправки команд.

<?php

// -------------------------------------------------------------------------------------------
// Пример скрипта, реализующего выполнение команды к серверу по протоколу DKCP-User
// Copyright by Delta Key (admin@deltakey.net), (c) 2007.
// -------------------------------------------------------------------------------------------

include('api.php');

function echo_result($res, $answer) {
    if (!$res) // запрос не выполнен

        die("<center><font color=red>$answer</font></center>");
    print '<h3>Запрос к серверу выполнен успешно. </h3>';
    if ($answer['result'] != 0) // Сервер вернул ошибку

        die("<center><font color=red>$answer[result_text]</font></center>");
    print '<h3>Сервер не возвращал ошибок. </h3>';

    // Выводим ответ в виде массива

    print '<h3>Ответ сервера:</h3><pre>';
    print_r($answer);
    print '</pre>';

    // Выводим ответ в виде таблицы

    print '<h3>Альтернативное представление ответа:</h3>';
    print "
    <i>Транзакция сервера:</i> $answer[transact]<br>

    <i>Внешняя транзакция:</i> $answer[ext_transact]<br>
    <i>Дата завершения обработки сервером:</i> $answer[date]<br>
    <i>Статус выполенения операции:</i> $answer[status]<br>

    <i>Текстовая расшифровка статуса:</i> $answer[status_text]<br>
    <i>Результат выполнения операции:</i> $answer[result]<br>
    <i>Текстовая расшифровка результата:</i> $answer[result_text]<br>

    <i>Дополнительное пояснение к ошибке:</i> $answer[result_error]<br>
    <i>Дополнительные данные:</i><br>";
    
    
    print "
    <TABLE class='advanced'><TR><th>Параметр</th><th>Значение</th></TR>

    ";
    foreach ($answer['advanced'] as $key => $value) {
        print "<TR><td><i>$key</i></td><td>$value</td></TR>";
    }
    print "</TABLE><br>";
    print "<i>Табличная часть:</i> ";
    
    if ($answer['table']['colcount'] == 0)
        print '<Отсутствует>';
    else {
        print "<br><TABLE><TR>";
        foreach ($answer['table']['colnames'] as $key => $value) {
            print "<th>$key / $value</th>";
        }
        print "</TR>";
        foreach ($answer['table']['colvalues'] as $row) {
            print "<TR>";
            foreach ($row as $td) {
                print "<td>$td</td>";
            }
            print "</TR>";
        }
        print "</TABLE><br>";
    }
}


// ...........................................................................................
// Пример 1. Запрос балансов всех своих счетов
// Показывает пример возврата табличной части

print "
<HTML><HEAD><link rel='stylesheet' type='text/css' href='test.css'>
<h1>Пример 1. Запрос балансов всех своих счетов</h1>
";
list($res, $answer)= DeltaCMD('getlist_keyt', 'keyt.py');
echo_result($res, $answer);


// ...........................................................................................
// Пример 2. Проверка существования UIN
// Показывает пример посылки дополнительных параметров

print "
<h1>Пример 2. Проверка существования UIN</h1>
";
$params['uin'] = '362527';
list($res, $answer)= DeltaCMD('check_uin', 'notfin_service.py', $params);
echo_result($res, $answer);


?>



Вернуться назад