Войти в систему Создать аккаунт








Тарифы
Лимиты
Главная

Протокол приема платежей "Delta Key SA-1"


  • Общая информация о порядке информационного обмена
  •     Передача запросов, получение ответов
        Обеспечение целостности данных запросов и ответов

  • Параметры запросов:
  •     Запрос на проверку возможности проведения платежа
        Запрос на проведение платежа
        Запрос на проверку статуса платежа

  • Коды результатов ответа
  • Электронная цифровая подпись
  • Контрольный пример
  • Пример реализации протокола на языке Perl

  • Общая информация о порядке информационного обмена


    Платежная система взаимодействует с поставщиком услуг по протоколу HTTP или HTTPS, передавая запросы используя метод GET либо метод POST.

    Для использования протокола "Delta Key SA-1" необходимо быть оператором, зарегистрированном в системе в качестве Поставщика услуг. (см. Регистрация в системе в качестве поставщика услуг). Получить статус поставщика услуг можно автоматически, скачав и установив программу "Система управления транзакциями" и зарегистрировавшись в системе в качестве Поставщика услуг (Пункт "Меню", далее "Регистрация", далее "Поставщик услуг".)

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

    Передача запроса осуществляется после поступления в платежную систему запроса на проведение платежа от плательщика. Прием платежей в терминалах моментальной оплаты работает в двух режимах: ON-LINE и OFF-LINE.

    ON-LINE режим позволяет провести предварительный запрос на возможность проведения платежа. В этом случае сначала следует запрос на возможность проведения платежа, а затем, в случае положительного ответа оператора - запрос на сам платеж.

    OFF-LINE режим не позволяет это сделать, так как он работает в режиме накопления, и лишь затем передает пакеты на сервер.

    Помимо этого, даже терминалы, работающие в режиме ON-LINE, в целях сокращения очередей у автомата, могут переключиться на работу с платежами без отправки предварительного запроса.

    Протокол "Delta Key SA-1" работает с терминалами моментальной оплаты и дилерскими точками как в режиме "С предварительным запросом". (Режим ON-LINE), так и в режиме "Без предварительного запроса", напрямую обеспечивая проведение платежа. (Режим OFF-LINE).

    Однако поставщик услуг при настройке протокола может запретить использование режима "OFF-LINE", если считает недопустимым его использование в случае приема платежей в свой адрес.

    При регистрации платежной формы необходимо в качестве протокола обмена данными указать "Дельта Кей SA-1".

    Передача запросов, получение ответов


    Платежная система взаимодействует с поставщиком услуг по протоколу HTTP или HTTPS, передавая запросы, используя метод GET либо метод POST.

    Интерфейс поставщика услуг должен принимать запросы со следующих IP-адресов:

    188.120.246.108
    188.120.239.25

    Обеспечение целостности данных запросов и ответов


    Протокол Delta Key SA-1 в качестве способа авторизации использует электронную подпись по алгоритму MD5 HMAC (RFC 2104).

    При необходимости Вы можете выбрать другой протокол с другим методом авторизации, например, Delta Key + OSMP использует авторизацию по электронному цифровому сертификату.

    Параметры запросов


    Запрос на проверку возможности проведения платежа


    Запрос системы содержит несколько обязательных параметров, а также дополнительные данные, указанные при регистрации платежной формы.

    Обязательные параметры перечислены в таблице 1.

    Таблица 1. Параметры запроса на возможность проведения платежа

    № п/п Название параметра Описание Формат значения
    1. command Команда. При проверке возможности проведения платежа имеет значение "check" Строка "check"
    2. transact Номер транзакции платежной системы Длинное целое число
    3. form Номер платежной формы, выданной при регистрации Целое число
    4. summ Сумма платежа Число с плавающей точкой. Точность - 2 знака, разделитель - точка.
    5. sign Цифровая подпись сообщения Строка произвольной длины


    Также в сообщении передаются дополнительные параметры, заданные при регистрации формы. Дополнительные параметры передаются в формате <Параметр=Значение, Параметр представляет собой код дополнительного параметра, а Значение указывается плательщиком при выполнении платежа.

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

    Строка для вычисления секретного ключа получается путем склейки следующих параметров:

    command + transact + form + sum + дополнительные_параметры

    Если дополнительных полей несколько, то очень важно при вычислении сигнатуры соблюсти правильный порядок следования полей. Рассмотрим пример:

    На шлюз поступает следующий запрос: command=check&transact=18661485&form=5100&summ=1.00&2534=112&2510=testtrest&sign=3b33a7ef6b338a8fd7fd9c47fc845503

    В форме транзакции 5100 определен следующий порядок следования полей:

        1. Поле номер 2534 (логин пользователя)
        2. Поле номер 2510 (контрольный код)

    Таким образом при использовании ключа wceO9d6Mb6FnNLCvuNxaClUCPYEvy9wLhikh сигнатура будет следующей: 3b33a7ef6b338a8fd7fd9c47fc845503, так как подписывается строка check1866148551001.00112testtrest

    Однако, если порядок следования полей изменен, то может быть допущена следующая ошибка: подписываемая строка - check1866148551001.00testtrest112, соответственно ее сигнатура - 1cd49d3d1523eae8afc0fa71e32476e6.

    Ответ присылается в формате XML и должен быть следующего вида:

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>transact_number</transact>
        <result>result_code</result>
        <comment>comment</comment>
        </response>

    Параметр transact_number должен содержать номер транзакции, посланной в запросе. Параметр result_code содержит код результата проверки (см. таблицу 3). Параметр comment содержит комментарий, характеризующий текстовой строкой возможность проведения платежа.

    Кодировка результирующей XML может быть UTF-8, windows-1251 или любой другой, при этом в заголовке документа должна быть верно указана кодировка.

    Запрос на проведение платежа.


    Запрос системы содержит несколько обязательных параметров, а также дополнительные данные, указанные при регистрации платежной формы.

    Обязательные параметры перечислены в таблице 2.

    Таблица 2. Параметры запроса на возможность проведения платежа

    № п/п Название параметра Описание Формат значения
    1. command Команда. При проверке возможности проведения платежа имеет значение "pay" Строка "pay"
    2. transact Номер транзакции платежной системы Длинное целое число
    3. form Номер платежной формы, выданной при регистрации Целое число
    4. out_date Дата платежа Дата в формате YYYYMMDDhhmmss
    . summ Сумма платежа Число с плавающей точкой. Точность - 2 знака, разделитель - точка.
    6. sign Цифровая подпись сообщения Строка произвольной длины

    Также в сообщении передаются дополнительные параметры, заданные при регистрации формы. Дополнительные параметры передаются в формате <Параметр=Значение>, Параметр представляет собой код дополнительного параметра, а Значение указывается плательщиком при выполнении платежа.

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

    Строка для вычисления секретного ключа получается путем склейки следующих параметров:

    command + transact + form + out_date + sum + дополнительные_параметры

    Ответ присылается в формате XML и должен быть следующего вида:

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>transact_number</transact>
        <summ>summ</summ>
        <result>result_code</result>
        <comment>comment</comment>
        </response>
    

    Параметр transact_number должен содержать номер транзакции, посланной в запросе. В случае, если по какой-либо причине поставщик услуг получал ранее запрос с данным номером транзакции (т.е. платеж дублируется сервером), поставщику услуг надлежит повторить ответ, данный на предыдущий запрос. Например, если поставщик услуг получает запрос с транзакцией 101, а такой платеж был уже успешно зачислен на счет абонента, то поставщик услуг должен вернуть серверу успешный результат проведения платежа.

    Параметр summ содержит сумму платежа, также присланную в запросе на проводку, где разделитель целой и дробной части - символ точки. Параметр result_code содержит код результата проверки (см. таблицу 3). Параметр comment содержит комментарий, характеризующий текстовой строкой возможность проведения платежа.

    Кодировка результирующей XML может быть UTF-8, windows-1251 или любой другой, при этом в заголовке документа должна быть верно указана кодировка.

    Запрос на проверку статуса платежа


    Запрос на проверку статуса платежа посылается в случае, если ответ на проведение платежа был некорректным, не был получен, либо ответ не подлежал корректной расшифровке. В этом случае посылается запрос на проверку статуса.

    В ответ на запрос о статусе присылается результат, с которым была обработана операция, т.е. если платеж успешно до этого прошел, то необходимо прислать 0 в поле результата, если прошел с ошибкой, то возвращается код ошибки. Если платеж не проходил, то в поле результата необходимо прислать 66, в этом случае система повторит запрос на платеж еще раз.

    Формат запроса на проверку статуса платежа и формат ответа на данный запрос в точности соответствует запросу на проведение платежа с единственным отличием в поле command. В случае запроса статуса этот параметр будет иметь значение "status".

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


    Таблица 3. Коды результатов
    Код результата Расшифровка результата
    0 ОК, платеж возможен (операция выполнена)
    18 Отказ от оператора. (прием данного платежа запрещен оператором)
    19 Не прошел фин.контроль (слишком мала или велика сумма платежа)
    22 Неверные параметры платежа
    30 Неизвестная (другая) ошибка оператора
    66 Платеж не проводился (только для запроса на статус платежа)
    73 - Временные технические проблемы, повторите позже

    Успешным считается ответ 0. При результате 73 запрос будет повторен. При результате 66 будет заново выполнена команда проведения платежа. Обратите внимание, что результат 66 присылается только в ответ на команду проверки статуса платежа (в случае, если платеж не обнаружен в базе данных поставщика услуг).

    Электронная цифровая подпись


    Электронная цифровая подпись формируется путем склейки обязательных и дополнительных параметров запроса и хеширует их методом hmac с использованием секретной фразы, генерируемой при регистрации формы.

    Описание метода HMAC

    Пример вычисления подписи и полной реализации протокола на языке Perl см. ниже.

    Контрольный пример


    Предположим, поставщик услуг зарегистрировал платежную форму "Оплата связи". Системой данной платежной форме был присвоен номер 3993. В настройке уведомления были заданы следующие параметры:



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



    В данном случае дополнительными параметрами будут 18,36 и 35.

    В случае выбора метода POST запрос на проверку возможности проведения платежа может быть таким:

        <input type="hidden" name="command" value="check">
        <input type="hidden" name="transact" value="999999999">
        <input type="hidden" name="form" value="3993">
        <input type="hidden" name="summ" value="100.00">
        <input type="hidden" name="18" value="Андрей Иванов">
        <input type="hidden" name="36" value=info@site.ru>
        <input type="hidden" name="35" value="3356">
        <input type="hidden" name="sign" value="f45ad15ed2bf7cb8250658098cab41e1">
    

    Данный запрос будет отправлен на адрес http://test.ru/check.php

    Тот же запрос при выбранном методе GET будет выглядеть следующим образом:

    http://test.ru/check.php?command=check&transact=999999999&form=3993&summ=100.00&18=Андрей+Иванов&36=info@site.ru &35=3356&sign=f45ad15ed2bf7cb8250658098cab41e1

    Ответ на данный запрос может быть таким:

        <?xml version="1.0" encoding="UTF-8"?>
        <response>                                          
        <transact>999999999</transact>
        <result>0</result>
        <comment>Платеж может быть проведен</comment>
        </response>
    

    или

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>1234567</transact>
        <result>18</result>
        <comment>Прием платежа в адрес данного абонента запрещен</comment>
        </response>
    

    В первом случае оператор разрешает проведение платежа, во втором - нет.

    Запрос на проведение платежа для метода POST выглядит следующим образом:

        <input type="hidden" name="command" value="pay">
        <input type="hidden" name="transact" value="999999999">
        <input type="hidden" name="form" value="3993">
        <input type="hidden" name="out_date" value="20070613110006">
        <input type="hidden" name="summ" value="100.00">
        <input type="hidden" name="18" value="Андрей Иванов">
        <input type="hidden" name="36" value=info@site.ru>
        <input type="hidden" name="35" value="3356">
        <input type="hidden" name="sign" value="f45ad15ed2bf7cb8250658098cab41e1">
    

    Данный запрос будет отправлен на адрес http://test.ru/pay.php

    Тот же запрос при выбранном методе GET будет выглядеть следующим образом:

    http://test.ru/check.php?command=pay&transact=999999999&form=3993&out_date=20070613110006&summ=100.00 &18=Андрей+Иванов&36=info@site.ru&35=3356&sign=f45ad15ed2bf7cb8250658098cab41e1

    Ответ на данный запрос может быть таким:

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>999999999</transact>
        <sum>110.15</sum>
        <result>0</result>
        <comment>Платеж успешно проведен</comment>
        </response>
    

    или

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>1234567</transact>
        <sum>110.15</sum>
        <result>18</result>
        <comment>Прием платежа в адрес данного абонента запрещен</comment>
        </response>
    

    Запрос на статус платежа для метода POST выглядит следующим образом:

        <input type="hidden" name="command" value="status">
        <input type="hidden" name="transact" value="999999999">
        <input type="hidden" name="form" value="3993">
        <input type="hidden" name="out_date" value="20070613110006">
        <input type="hidden" name="summ" value="100.00">
        <input type="hidden" name="18" value="Андрей Иванов">
        <input type="hidden" name="36" value=info@site.ru>
        <input type="hidden" name="35" value="3356">
        <input type="hidden" name="sign" value="f45ad15ed2bf7cb8250658098cab41e1">
    

    Данный запрос будет отправлен на адрес http://test.ru/status.php

    Тот же запрос при выбранном методе GET будет выглядеть следующим образом:

    http://test.ru/check.php?command=status&transact=999999999&form=3993&out_date=20070613110006&summ=100.00 &18=Андрей+Иванов&36=info@site.ru&35=3356&sign=f45ad15ed2bf7cb8250658098cab41e1

    Ответ на данный запрос может быть таким:

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>999999999</transact>
        <sum>110.15</sum>
        <result>0</result>
        <comment>Платеж успешно проведен
        </response>
    

    или

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
        <transact>1234567</transact>
        <sum>110.15</sum>
        <result>18</result>
        <comment>Прием платежа в адрес данного абонента запрещен</comment>
        </response>
    

    Пример реализации протокола на языке Perl


    Реализация протокола включает в себя следующие файлы, расположенные в одном каталоге:

  • create_tables.sql - дамп базы данных MySQL
  • delta-key.conf - конфигурационный файл
  • delta-key.cgi - скрипт протокола
  • delta-key.log - файл логов


  • Листинг 3-1. create_tables.sql

    CREATE TABLE `pay_deltakey` (
      `id` bigint(20) unsigned NOT NULL auto_increment,
      `transact` varchar(100) NOT NULL default '',
      `summ` varchar(100) NOT NULL default '',
    
      `date` varchar(100) NOT NULL default '',
      `kod` int(11) NOT NULL default '0',
      `lc` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM; 
    
    CREATE TABLE `accounts` (
      `lc` int(10) unsigned NOT NULL auto_increment,
      `short_name` varchar(255) default 'Test',
      `money` varchar(255) default '0',
      PRIMARY KEY  (`lc`)
    ) TYPE=MyISAM; 
    
    CREATE TABLE `money_logs` (
      `Id` int(6) unsigned NOT NULL auto_increment,
      `lc` varchar(255) default NULL,
      `operator` varchar(10) default NULL,
      `money` varchar(255) default NULL,
      `comments` varchar(255) default NULL,
      `old_money` varchar(255) default NULL,
      `data` datetime default NULL,
      PRIMARY KEY  (`Id`)
    ) TYPE=MyISAM; 
    


    Листинг 3-2. delta-key.conf

    # Ключ шифрования данных для цифровой подписи (Сгенерируйте сами)
    # Пример: $key = 'agj34kjfkJGKLFJdbkjfgskj43JKfjkd5KJas';
    $key = '';
    
    # Путь к файлу логов
    $patch_logfile = 'delta-key.log';
    
    # Параметры доступа к базе данных MySql
    
    $db_host = '127.0.0.1';
    $db_login = 'login';
    $db_pass = 'password';
    $db_name = 'billing';
    


    Листинг 3-3. delta-key.cgi

    #!/usr/bin/perl
    
    ############################################################
    #                                                          #
    #   Perl Script for Online Pay System 'Delta-Key' v1.0     #
    #                                                          #
    #         author: Andrey Neasov company: RamNet.ru         #
    #                                                          #
    #           icq: 674522  e-mail: andrey@neasov.ru          #
    #                                                          #
    ############################################################
    
    # Преобразуем вредоносные символы
    sub urldecode{
        local($val)=@_;
        $val=~tr/+/ /;
    
        $val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
        $val=~s/%00//g;
        $val=~s/</&lt;/g;
        $val=~s/>/&gt;/g;  
        $val=~s/"/&quot;/g;  
    
        $val=~s/~!/ ~!/g;  
        $val=~s/\r//g;  
        $val=~s/\n//g;  
        $val=~s/ +/ /g;
        return $val;
    }
    
    # Получаем данные любым методом
    if ($ENV{'REQUEST_METHOD'} eq 'POST') {
        read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
    } elsif ($ENV{'REQUEST_METHOD'} eq 'GET') {
        $buffer=$ENV{'QUERY_STRING'};
    }
    
    # Поиск конкретных параметров и передача данных переменным
    @formfields=split(/&/,$buffer);
    
    foreach(@formfields){
        # обработка данных первоначальный авторизации
        if(/^command=(.*)/) {$command=urldecode($1);}
        if(/^transact=(.*)/) {$transact=urldecode($1);}
        if(/^form=(.*)/) {$form=urldecode($1);}
        if(/^identified=(.*)/) {$identified=urldecode($1);}
    
        if(/^summ=(.*)/) {$summ=urldecode($1);}
        if(/^curr=(.*)/) {$curr=urldecode($1);}
        if(/^out_date=(.*)/) {$out_date=urldecode($1);}
        if(/^keyt=(.*)/) {$keyt=urldecode($1);}
        if(/^18=(.*)/) {$pay_fio=urldecode($1);}
        if(/^198=(.*)/) {$pay_lc=urldecode($1);}
        if(/^36=(.*)/) {$pay_email=urldecode($1);}
        if(/^sign=(.*)/) {$sign=urldecode($1);}
    }
    
    # Подгружаем конфигурационный файл
    require "delta-key.conf";
    
    # Разбиваем полученное время по переменным
    $year = substr($out_date,0,4);
    $mon = substr($out_date,4,2);
    $mday = substr($out_date,6,2);
    $hour = substr($out_date,8,2);
    $min = substr($out_date,10,2);
    $sec = substr($out_date,12,2);
    
    # Подгружаем нужные модули для PERL
    use DBI; 
    use Digest::HMAC_MD5 qw(hmac_md5 hmac_md5_hex);
    
    # Соединяемся в базу данных MYSQL
    my $dbh = DBI->connect("DBI:mysql:database=$db_name;host=$db_host", "$db_login", "$db_pass"); # Коннектимся
    
    # Записываем в лог полученный буфер данных от платёжной системы
    open(FILE, ">>$patch_logfile");
    print FILE $ENV{'REMOTE_ADDR'}." -> ".$buffer."\n";
    close(FILE);
    
    # Передаём тип документа браузеру (XML документ)
    print "content-type: text/xml\n\n";
    
    # Условие обработки проверки ЛС абонента в системе
    if ($command eq "check") {
    
        # Склеиваем полученные данные для проверки sign подписи
        $data = $command.$transact.$summ.$pay_lc;
    
        # Генерируем подпись с ключём
        $digest = hmac_md5_hex($data, $key);
    
        # Проверяем созданную нами и полученную подписи SIGN
        if ($digest eq $sign) {
            $varify="yes";
            
            # Проверяем в базе данных полученный номер аккаунта
            my $result = $dbh->prepare("SELECT * FROM accounts WHERE lc = '$pay_lc'"); #
            $result->execute(); # выполнение подготовленного запроса
            
            while (my $ln = $result->fetchrow_hashref()) {
                $searchaccount="yes";
            }
    
            # Условие найден ли номер аккаунта в базе данных
            if ($searchaccount eq "yes") {
                # Выводим ответ на страницу при удачном поиске
                print ('<?xml version="1.0" encoding="UTF-8"?>
                <response>
                <transact>'.$transact.'</transact>
                <result>0</result>
                <comment>Seaching Account Complite!</comment>
    
                </response>');
            } else {
    
                # Выводим ответ на страницу при не удачном поиске
                print ('<?xml version="1.0" encoding="UTF-8"?>
                <response>
    
                <transact>'.$transact.'</transact>
                <result>18</result>
                <comment>No search account number!</comment>
                </response>');
            }
    
        } else {
    
            # Выводим ответ на страницу при не удачной проверке подписи SIGN
            print ('<?xml version="1.0" encoding="UTF-8"?>
            <response>
    
            <transact>'.$transact.'</transact>
            <result>18</result>
            <comment>Bad Sign!</comment>
            </response>');
    
        }
    }
    
    # Условие проводка платежа
    elsif ($command eq "pay") {
    
        $data = $command.$transact.$out_date.$summ.$pay_lc;
        $digest = hmac_md5_hex($data, $key);
    
        if ($digest eq $sign) {
    
            $varify="yes";
    
            # Проверка в базе данных на существование дублирующего платежа
            my $result = $dbh->prepare("SELECT * FROM pay_deltakey WHERE transact = '$transact'"); #
            $result->execute(); # выполнение подготовленного запроса
    
            while (my $ln = $result->fetchrow_hashref()) {
    
                # Присваиваем переменным параметры уже проведённого платежа
                # если таковой уже имеется (тоесть платёж уже проводился)
    
                $search2pay = "yes";
                # Внутренная транзакция оператора
    
                $idpay=$ln->{'id'};
                # Код ответа платёжной системе
                $kod=$ln->{'kod'};
    
            }
    
            # Условие: Дубликат платежа не найден приступаем к проводке
            if ($search2pay ne "yes") {
    
                # Поиск аккаунта в базе
                my $result = $dbh->prepare("SELECT * FROM accounts WHERE lc = '$pay_lc'"); #
                $result->execute(); # выполнение подготовленного запроса
    
    
                while (my $ln = $result->fetchrow_hashref()) {
                    $searchaccount="yes";
    
                    # Получаем денежные средства на счету пользователя
                    $money=$ln->{'money'};
                }
    
                # Условие: найден ли номер аккаунта
                if ($searchaccount eq "yes") {
    
                    # Записываем в базу данных парраметры проводки платежа
                    my $result = $dbh->prepare("INSERT pay_deltakey SET transact = '$transact', lc = '$pay_lc', 
    					summ = '$summ', date = '$year-$mon$mday $hour:$min:$sec', kod = '0'"); #
                    $result->execute(); # выполнение подготовленного запроса
    
                    # Запрашиваем внутренний номер проводки оператором
                    my $result = $dbh->prepare("SELECT * FROM pay_deltakey LIMIT TO 0,1"); #
    
                    $result->execute(); # выполнение подготовленного запроса
    
                    while (my $ln = $result->fetchrow_hashref()) {
                        # Получаем из базы номер проводки
                        $idpay = $ln->{'id'};
                    }
    
                    # Суммируем денежные средства имеющиеся и полученные
                    $newmoney = $money + $summ;
    
                    # Обновляем в базе показание поля денежных средств на новое значение
    
                    my $result = $dbh->prepare("UPDATE accounts SET money = '$newmoney' WHERE lc = '$AccountNr'"); #
                    $result->execute(); # выполнение подготовленного запроса
    
                    # Записывае в финансовую историю пользователя строчку о платеже
                    my $result = $dbh->prepare("INSERT money_logs SET lc = '$pay_lc', money = '+$summ', 
    					old_money = '".$money."', data = '$year-$mon$mday $hour:$min:$sec', 
    					comments = 'Оплата через терминал<br>Delta Key<br>$transact'"); #
    
                    $result->execute(); # выполнение подготовленного запроса
    
                    # Выводим ответ системе платежей с параметрами удачного платежа
                    print ('<?xml version="1.0" encoding="UTF-8"?>
                    <response>
                    <command>pay</command>
    
                    <transact>'.$transact.'</transact>
                    <ext_transact>'.$idpay.'</ext_transact>
                    <summ>'.$summ.'</summ>
                    <status>2</status>
                    <result>0</result>
    
                    <comment>Pay Complite!</comment>
                    </response>');
    
                } else {
    
                    # Записываем в базу данных парраметры проводки платежа
                    
                    my $result = $dbh->prepare("INSERT pay_deltakey SET transact = '$transact', 
    					lc = '$pay_lc', summ = '$summ', 
    					date = '$year-$mon$mday $hour:$min:$sec', kod = '22'"); #
                    $result->execute(); # выполнение подготовленного запроса
                    
                    # Выводим ответ системе платежей с параметрами не удачного платежа
                    # так как номер аккаунта не найден
                    print ('<?xml version="1.0" encoding="UTF-8"?>
                    
                    <response>
                    <command>pay</command>
                    <transact>'.$transact.'</transact>
                    <ext_transact>'.$idpay.'</ext_transact>
                    <summ>'.$summ.'</summ>
                    
                    <status>2</status>
                    <result>22</result>
                    <comment>Bad Account Number!</comment>
                    </response>');
                }
    
            } else {
    
                # Выводим ответ системе платежей с параметрами не удачного платежа
                # так как платёж уже проводился
                print ('<?xml version="1.0" encoding="UTF-8"?>
                
                <response>
                <command>pay</command>
                <transact>'.$transact.'</transact>
                <ext_transact>'.$idpay.'</ext_transact>
                <summ>'.$summ.'</summ>
                
                <status>2</status>
                <result>'.$kod.'</result>
                <comment>Dublicate Transact Number!</comment>
                </response>');
                
            }
    
        } else {
    
            # Выводим ответ системе платежей с параметрами не удачного платежа
            # неверная подпись данных SIGN
            print ('<?xml version="1.0" encoding="UTF-8"?>
            <response>
    
            <command>pay</command>
            <transact>'.$transact.'</transact>
            <ext_transact>'.$idpay.'</ext_transact>
            <summ>'.$summ.'</summ>
            <status>2</status>
    
            <result>22</result>
            <comment>Bad Sign!</comment>
            </response>');
        }
    
    } elsif ($command eq "status") {
    
        $data = $command.$transact.$out_date.$summ.$pay_lc;
        $digest = hmac_md5_hex($data, $key);
    
        if ($digest eq $sign) {
        
            $varify="yes";
            
            my $result = $dbh->prepare("SELECT * FROM pay_deltakey WHERE transact = '$transact'"); #
            $result->execute(); # выполнение подготовленного запроса
            
            while (my $ln = $result->fetchrow_hashref()) {
                $search2pay = "yes";
                $idpay=$ln->{'id'};
                $kod=$ln->{'kod'};
            }
            
            if ($search2pay eq "yes") {
            
                # Выводим ответ системе платежей с параметрами платежа
                # возвращаем код операции
                print ('<?xml version="1.0" encoding="UTF-8"?>
                <response>
                <command>status</command>
                <transact>'.$transact.'</transact>
                
                <ext_transact>'.$idpay.'</ext_transact>
                <summ>'.$summ.'</summ>
                <status>2</status>
                <result>'.$kod.'</result>
                <comment></comment>
                
                </response>');
            
            } else {
    
                # Выводим ответ системе платежей с параметрами платежа
                # платёж не проводился
                print ('<?xml version="1.0" encoding="UTF-8"?>
                <response>
                <command>status</command>
    
                <transact>'.$transact.'</transact>
                <ext_transact>'.$idpay.'</ext_transact>
                <summ>'.$summ.'</summ>
                <status>2</status>
                <result>66</result>
    
                <comment></comment>
                </response>');
            }
    
        } else {
    
            # Выводим ответ системе платежей с параметрами не удачного платежа
    
            # неверная подпись данных SIGN
            print ('<?xml version="1.0" encoding="UTF-8"?>
            <response>
            <command>pay</command>
            <transact>'.$transact.'</transact>
            <ext_transact>'.$idpay.'</ext_transact>
    
            <summ>'.$summ.'</summ>
            <status>2</status>
            <result>22</result>
            <comment>Bad Sign!</comment>
            </response>');
    
        }
    }
    exit;