Sign In Создать аккаунт








Tariffs
Limits
Home

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


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


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

Глоссарий


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

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


    Версия Дата Изменения, дополнения
    1.005.12.2004Создание протокола
    2.007.02.2005Изменены параметры авторизации
    2.117.05.2006Добавлена мультитабличность ответов
    2.516.11.2006Добавлен пример реализации на Borland Delphi
    3.018.12.2006Добавлены спецификации протоколов
    3.213.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-ICQMoney


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

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

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

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

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

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

    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 и может быть в любое время дополнен новыми записями.

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

    Код Статус Текстовая расшифровка
    02Операция успешно завершена
    1001В обработке
    3034Ошибка отправки данных через шлюз (системная)
    7052Операция перепроведена
    7102Операция аннулирована
    8503Отказ системы от обработки
    10006ОШИБКА ФИНАНСОВОГО КОНТРОЛЯ
    10113Вы не можете списать долг, так как сумма зачисления недостаточна для покрытия минусового баланса счета
    10123Вклад может быть открыт только на кредитный счет нулевого баланса
    10133На данный счет уже открыт вклад
    10143Неверный тип депозита
    10153Указанный тип депозита не активен
    10163Вклад с указанным номером не найден
    10173Вклад ранее уже был пополнен
    10183Невозможно распечатать договор на непополненный вклад
    10193Невозможно распечатать договор на досрочно прерванный вклад
    10203Вознаграждение не может быть начислено по депозиту, срок которого не истек
    10213По данному депозиту вознаграждение уже выплачено
    10223Вознаграждение не может быть начислено по депозиту, прерванному досрочно
    10233Вознаграждение не может быть начислено по депозиту, если договор не подписан КПК
    10243Баланс кредитного счета и сумма вклада не совпадают
    10253Счет является кредитным
    10263Недопустимая валюта счета для создания вклада
    10307У пользователя нет счета в юнитах
    10624Данному дилеру запрещен прием платежей в адрес данного оператора
    10654Данному плательщику платеж в адрес данного оператора запрещен
    10726Вам запрещены операции вывода средств
    10736С данного счета запрещены операции вывода средств
    10747Шлюз запрещен
    10753Недостаточно средств для проведения платежа
    10766Неверный номер счета
    10776Счет не соответствует ID
    10783Валюта счета плательщика отлична от валюты счета получателя
    10793Неверный номер счета получателя
    10803Неверный ID
    10813Неверный ID или он не зарегистрирован как дилер
    10823Неверный ID получателя
    10833Вы уже зарегистрированы ранее как дилер
    10843Вы не зарегистрированы как дилер
    11243Неверные параметры платежа
    11303Номер не принадлежит оператору
    14003Форма не акцептована
    14013Форма не активна
    14023Неверный номер формы
    14036Прием платежа запрещен оператором
    14046Поставщик услуг в данный момент запрещен
    14056Поставщик услуг в данный момент не активен
    14093Получателю запрещены операции приема средств
    14113Прием платежа запрещен системой
    14173Поставщику услуг запрещены операции с операционным счетом
    14303Процент комиссии больше максимально разрешенного системой
    14327Невозможно определить комиссию по операции
    14493Цена меньше минимального лимита
    14503Количество меньше минимального лимита
    14513Сумма платежа меньше минимального лимита
    14523Сумма платежа больше максимального лимита
    14553Некорректная сумма платежа
    14563Сумма платежа должна быть целым числом
    14573Сумма должна быть больше нуля
    15023Данная транзакция не может быть перепроведена (аннулирована)
    15077Незавершенная транзакция не может быть перепроведена
    15137Успешная транзакция не может быть перепроведена
    15203Невозможно перепровести ранее перепроведенную транзакцию
    15213За данную транзакцию средства уже возвращены плательщику, либо никогда не были блокированы на системном счету
    17023Неверный код валюты
    17053В выбранной валюте нельзя выводить средства на банк указанной страны
    17223Превышен лимит на ввод
    17237Превышен лимит на вывод
    17247Превышен суточный лимит на ввод
    17257Превышен суточный лимит на вывод
    17303Не прошел финансовый контроль
    20003ОТСУТСТВИЕ ПАРАМЕТРА
    20023Недостаточно параметров
    20123Отсутствует параметр ext_transact
    20143Отсутствует параметр cmd
    20153Отсутствует параметр program
    20213Отсутствует параметр login
    20223Отсутствует параметр password
    20233Отсутствует параметр summ
    30003НЕКОРРЕКТНОЕ ЗНАЧЕНИЕ ПАРАМЕТРА
    30014Неверный формат номера телефона
    30024Нет такого номера телефона
    30033Некорректный формат параметра
    30043Неверный uin
    30053Пользователь не зарегистрирован в ICQMoney
    30063Вы не зарегистрированы в ICQMoney
    30073Пользователь зарегистрирован в ICQMoney, но регистрация не подтверждена
    30114Параметр не соответствует маске: допустимы только символы латинского алфавита и цифры
    30143Неверный код страны
    30153Неверный номер точки
    30163Неверный номер терминала
    30293Неверный тип счета
    30323Неверный код валюты
    30356Неверный код дилера
    30403Неверный признак плательщика НДС: 0-не плательщик, 1-плательщик
    30423Неверный код группы
    30453Неверный номер поля
    30473Неверный код эмитента
    30493Неверный код сервиса
    30513Неверный код номинала
    30533Неверный код магазина
    30553Неверный код шаблона
    30563Неверный код банка
    30573Неверный код профиля
    30583Неверный код тарифа
    30603Не найдена операция с указанным номером внешней транзакции
    31287Некорректная XML для настройки комиссии
    31304Некорректная XML
    32053Неверный код типа дилера
    33013Неверный номер электронного магазина
    33023Электронный магазин не активен
    33033Электронный магазин не акцептован
    33043Неверный код пользователя
    40004СПЕЦИФИЧЕСКАЯ ОШИБКА КОМАНДЫ
    41103Номер чека не уникален
    41203Нет данных по последней инкассации
    41254Ошибка генерации ключа
    41264Неверный номер сертификата или контрольный код
    42063Нет данных по данному ID
    42083Платеж не найден
    42093Платеж был запрещен ранее либо проведен
    42103Не уникальный номер операции
    42154Активной карты с такими параметрами в системе не зарегистрировано
    42204Карта заблокирована
    42234Срок активации истек
    42313Невозможно удалить пользователя - он рабочий
    42323Пользователя невозможно удалить - на него зарегистрированны рабочии транзакции (формы)
    42504Аннулировать чек может только его создатель
    42514В системе нет чека с указанным номером
    42534Данный чек заблокирован. Его невозможно активировать
    42554Данный чек уже активирован
    42574Код активации чека указан неверно
    42594Было выполнено более трех попыток активации чека. Чек заблокирован
    43083Не уникальный номер счета в учетной системе поставщика услуг
    43114Для выставления платежного требования не до востребования необходимо указать ID или счет плательщика
    43144Вы не можете оплатить это платежное требование, т.к. ID плательщика отличен от вашего
    43154Вы не можете оплатить это платежное требование, т.к. счет плательщика отличен от вашего
    43204Данная транзакция не является платежным требованием
    43214Неверный номер платежного требования
    43234Срок оплаты истек
    43273Невозможно отказаться от оплаты платежного требования, по которому была произведена оплата (в т.ч. частично), либо отказ уже выполнялся
    43283Ранее был выполнен отказ от оплаты платежного требования
    43293Платежное требование уже оплачено
    43403Данное предложение уже не активно
    43413Указанное количество отсутствует
    43453Вы не можете изменить статус этого пин-кода
    43503Плательщик отказался от оплаты
    43603Форма транзакции является рабочей
    44501Процессор и процессинг
    44513Процессором может быть только юридическое лицо
    44533Вы уже зарегистрированы как процессор
    44543Вы не являетесь процессором
    44551Партнер - разработчик ПО
    44563Вы не зарегистрированы как разработчик ПО
    44573Вы уже зарегистрированны как партнер - разработчик ПО
    44583Вы уже зарегистрированы в ICQMoney
    44703Срок протекции истек
    44713Блокировка данной транзакции не предусматривает кода протекции
    44723Слишком много попыток ввода кода протекции
    44733Неверный код протекции
    44743Код протекции уже был принят ранее
    44803На указанном счету уже установлен данный тариф
    44813Ваш тариф не может быть сменен
    44903Данный шлюз уже настроен на данного оператора. Воспользуйтесь операцией изменения параметров шлюза на оператора
    44913Данный шлюз еще не настроен на данного оператора. Воспользуйтесь операцией добавления шлюза на оператора
    44923Невозможно удалить рекомендуемый шлюз
    44933Шлюз не найден
    45103Транзакции
    45113На данного поставщика услуг зарегистрированны транзакции
    45123У Вас нет поставщика с таким codes
    45503Настройка инкассации заблокированна.
    45703Терминал/дилерская точка не могут быть удалены в течение недели после последнего платежа
    50004ОШИБКА БАЗЫ ДАННЫХ
    52164Невозможно определить код операции
    52174Невозможно определить результат операции
    52204Невозможно определить код транзакции
    52244Невозможно определить параметры получателя
    52274Неправильный номер магазина
    52304Неправильный номер субъекта
    52324Невозможно определить статус операции
    53084Невозможно определить процент комиссии с получателя
    53094Невозможно определить процент комиссии с плательщика
    53103Невозможно определить вознаграждение процессора
    53114Невозможно определить процент комиссии системы
    53134Невозможно определить процент вознаграждения дилера
    54324Ошибка отправки данных через шлюз (2)
    54354Ошибка отправки данных через шлюз (5)
    54364Ошибка отправки данных через шлюз (6)
    54374Ошибка отправки данных через шлюз (7)
    54384Ошибка отправки данных через шлюз (8)
    54394Ошибка отправки данных через шлюз (9)
    54414Ошибка отправки данных через шлюз (11)
    54424Ошибка отправки данных через шлюз (12)
    54444Ошибка отправки данных через шлюз (14)
    54633Ошибка отправки данных через шлюз (33)
    55304Невозможно определить системный счет
    55354Ошибка получения данных о состоянии блокировки счета
    55363Невозможно определить текущий баланс счета
    55374Невозможно получить валюту счета
    55384Ошибка изменения баланса счета
    55393Нет поддержки кросс-курсов данных валют
    55424Невозможно определить обработчика транзакции
    55434Невозможно определить действительного обработчика транзакции
    55464Невозможно определить активность обработчика
    55473Обработчик транзакции не активен или не акцептован
    55504Невозможно определить название платежа
    55524Невозможно определить скрипт-обработчик
    55534Невозможно определить номер счета получателя
    55704Невозможно определить код владельца
    55714Невозможно определить код владельца
    56014Ошибка обновления записи
    56024Ошибка удаления записи
    56034Ошибка добавления записи
    56204Ошибка получения данных
    57055Нет данных о форме, на которую настраивается процент
    57103Невозможно отправить в архив НЕоплаченный реестр
    57113Невозможно удалить оплаченный реестр
    57123Реестр в архиве
    60006ОШИБКА БЕЗОПАСНОСТИ
    60113У вас нет прав на выполнение данной операции
    60203У Вас нет прав на удаление этого поля
    60213У Вас нет прав на редактирование этого поля
    60223У Вас нет прав на изменение этого сервиса
    60233У Вас нет прав на удаление этого сервиса
    60253У Вас нет прав на изменение этого эмитента
    60263У Вас нет прав на удаление этого эмитента
    60283У Вас нет прав на изменение этого номинала
    60293У Вас нет прав на удаление этого номинала
    60603В доступе отказано
    60637На указанный номер ICQ регистрация уже имеется
    60823Неверный логин
    60834Неверный пароль
    60843Неверный SIGN
    60853Неверный одноразовый ключ
    60864Было выполнено 10 попыток активации ключа. Вход в систему заблокирован.
    60873Вход в ПО системы заблокирован
    60903Файл сертификата не найден
    61206Точка не акцептована
    61303Точка не зарегистрирована или зарегистрирована на другого пользователя
    62513Изменение информации о пользователе запрещено
    62574Персона, которая пытается выполнить операцию, не имеет права на ее выполнение
    62593У Вас нет лицензии на выполнение данной операции
    62613Пользователь не является Вашим субдилером
    62623Отсутствует акцепт на администрирование субдилера
    62633Невозможно определить вышестоящего дилера
    62713Данные о юридическом лице отсутствуют, изменение невозможно
    62733Данные о физическом лице отсутствуют, изменение невозможно
    62903У получателя нет прав на прием средств через Internet
    63224Настройка комиссии на данные формы запрещена
    64013У Вас нет прав на администрирование пользователей чужой страны
    64106Выполнение команды временно запрещено
    64114Неверный код программы
    64123Ваше программное обеспечение устарело для выполнения данной операции
    64133Выполнение операций из Вашей программы временно запрещено
    64153Такого Ident'а не может быть в системе
    64183В качестве пайщика Startrek могут регистрироваться только физические лица
    64193Вы уже зарегистрированы в качестве пайщика Star Trek
    65013Вы не зарегистрированы в системе ICQMoney
    65023Ваша регистрация не подтверждена
    65033Неверный серийный номер или контрольный код (некорректная строка подтверждения регистрации)
    65123Вы можете выполнить не более семи попыток активации за два часа
    65133Неверные параметры карты
    65143Было выполнено более трех попыток активации карты. Карта заблокирована
    65153Карта персонифицирована и принадлежит другому пользователю
    65163Все карты дилера, продавшего данную карту, временно блокированы
    65173Серия не активна
    65233Неверный тип карты
    65243Данный тип карты временно не активен
    65253Неверный номер заказа карты
    65263Данная пластиковая карта сейчас не может быть активирована
    65273Данная пластиковая карта уже активирована
    65283Неверный CVC
    65293Неактивная пластиковая карта не может быть заблокирована
    65303Пластиковая карта уже была заблокирована ранее
    65313Разблокирована может быть только карта, заблокированная держателем
    65323Данная карта не заблокирована
    65333Неверный признак блокировки
    65343Операция разблокировки недоступна
    65353Вывод средств не может быть заказан на данную карту
    65403Неверный номер пластиковой карты
    65503Слишком большое количество запросов на регистрацию
    66013Логин дополнительного пользователя должен быть уникальным
    70004ОШИБКА СИСТЕМЫ
    70104Некорректный номер транзакции
    70123Некорректный номер внешней транзакции
    70205Ошибка выполнения команды
    70234Различный размеров массивов
    70403Невозможно обновить завершенную транзакцию
    70514Платеж не может быть отправлен по выбранному шлюзу
    71194Невозможно соединиться с сервером оператора
    72123Технические работы на сервере
    74043Команда не найдена
    77014Ошибка формирования XML
    80004ОШИБКА ОПЕРАТОРА
    80014Неизвестная ошибка оператора
    80123Номер телефона находится в неактивном состоянии
    80323Работа с данным оператором не реализована
    80493Оператор не может принять платеж
    80507Поставщик услуг не может принять платеж
    80524Ошибка в ответе оператора
    80564Оператор не персонифицировал платежную систему
    80703Истекло время ожидания обработки
    90004ВНЕКЛАССОВАЯ ОШИБКА

    Приложение 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 ([email protected]), (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 ([email protected]), (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);
    
    ?>


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