Данный пример иллюстрирует формирование синхронного запроса в простом текстовом формате, отправку на сервер через HTTPS-соединение с аутентификацией по карте e-port, и разбор ответа сервера.
Для того чтобы запустить приложение, Вам предварительно необходимо:
perl test.pl
Файл Test.java
use strict;
use Net::SSLeay qw(post_https make_headers);
##### параметры подключения #####
# номер точки e-port
my $point = 123;
# номер карты e-port
my $card = "249000-00000";
# пин-код карты e-port
my $pin = "1234567890";
##### исходные данные запроса операции #####
# тип запроса (OPERATION/CONFIRM/CANCEL)
my $req_type = "OPERATION";
# идентификатор операции
my $req_id = "12345";
# номер чека
my $req_checkid = "12345";
# артикул товара из справочника(в данном случае - МТС ESPP)
my $req_product = 4420;
# объем сделки (в данном случае - 100 рублей)
my $req_value = "100.00RUR";
# реквизиты л/с клиента, объединенные точкой с запятой
# в данном случае ракуизит один - номер телефона
my $req_account = "9161234567";
# тайм-аут запроса в синхронном режиме
my $req_timeout = 15;
# режим транзакции (0 - однофазный, 1 - двухфазный)
my $req_cnfmode = 1;
##### Формирование запроса text/plain#####
my $CRLF = "\r\n";
my $request = $req_type . $CRLF .
"id=" . $req_id . $CRLF .
"checkid=" . $req_checkid . $CRLF .
"product=" . $req_product . $CRLF .
"value=" . $req_value . $CRLF .
"account=" . $req_account . $CRLF .
"timeout=" . $req_timeout . $CRLF .
"cnfmode=" . $req_cnfmode . $CRLF;
print "=== Operation Request ===\n";
print $request;
##### формируем http-заголовки запроса #####
my $reqHeaders;
# добавляем заголовок аутентификации
$reqHeaders .= make_headers("X-Eport-Auth"=>"point=$point; card=$card; pin=$pin");
# добавляем признак синхронного режима
$reqHeaders .= make_headers("X-Eport-Mode"=>"1");
# указываем кодировку сообщения и формат данных
$reqHeaders .= make_headers("Content-Type"=>"text/plain; charset=koi8-r");
##### обмениваемся данными с сервером #####
my $host = "dealer.e-port.ru";
my $port = "443";
my $uri = "/cp/fe";
my ($body, $status, %resHeaders) = post_https($host,$port,$uri,$reqHeaders,$request);
# http-код ответа указывает на ошибку
if($status ne 'HTTP/1.1 200 OK'){
print "HTTP ERROR: $status\n";
print "$body\n";
# http-код ответа 200 (успешно)
}else{
# разбираем построчно
my @lines = split(/\r\n/, $body);
my $i = 0;
# ответ по операции должен начинаться с ключевого слова "RESULT"
die "Response: Bad format, RESULT required\n" unless $lines[$i++] eq 'RESULT';
# затем следуют обязательные параметры ответа в определенном порядке
# идентификатор операции
die "Response: Bad format, id required\n" unless $lines[$i++] =~ /^id=(.*)$/;
my $res_id = $1;
# код ответа
die "Response: Bad format, code required\n" unless $lines[$i++] =~ /^code=(.*)$/;
my $res_code = $1;
# сообщение для разработчика/оператора системы
die "Response: Bad format, omsg required\n" unless $lines[$i++] =~ /^omsg=(.*)$/;
my $res_omsg = $1;
# сообщение для клиента
die "Response: Bad format, cmsg required\n" unless $lines[$i++] =~ /^cmsg=(.*)$/;
my $res_cmsg = $1;
# далее следуют необязательные параметры операции
my ($res_time, $res_pmsg, $res_card, $res_pin);
while( my $line = $lines[$i++]){
# дата/время операции на сервере
if($line=~ /^time=(.*)$/){
$res_time = $1
# сообщение для печати
}elsif($line=~ /^pmsg=(.*)$/){
$res_pmsg = $1
# номер карты e-port клиента
}elsif($line=~ /^card=(.*)$/){
$res_card = $1
# пин-код карты e-port клиента
}elsif($line=~ /^pin=(.*)$/){
$res_pin = $1
}else{
die "Response: Bad format\n";
}
}
# обрабатываем полученные данные
print "=== Operation result ===\n";
print "id :" . $res_id . "\n";
print "code :" . $res_code . "\n";
print "omsg :" . $res_omsg . "\n";
print "cmsg :" . $res_cmsg . "\n";
print "time :" . $res_time . "\n";
print "pmsg :" . $res_pmsg . "\n";
print "card :" . $res_card . "\n";
print "pin :" . $res_pin . "\n";
}