parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Связка с e-port

Никита Козин 08.08.2005 11:20 / 08.08.2005 11:24

Может быть кто-нибудь сталкивался с таким продуктом как «e-port дилер»?..

Из документации:
Группа e-port представляет универсальное решение, разработанное специально для крупных предприятий, занимающих солидные позиции на рынке. Данный продукт будет полезен организациям, которые желают включить в перечень своих услуг прием платежей за услуги различных операторов мобильной связи, Интернет-провайдеров, операторов спутникового телевидения, а также продажу PIN-кодов или расчеты за услуги предприятий электронной коммерции.
Сейчас уже есть чужой написанный механизм, который заносит всю информацию о пользователе и операции в базу данных. Мне нужно написать механизм, который будет по cron-у доставать данные из базы и передавать их e-port-у... Передача может происходить только методом POST и только через SSL.

Вот пример на Perl с сайта e-port:
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;   
# режим транзакции (1 - однофазный, 2 - двухфазный)
my $req_cnfmode = 2;   


#####  Формирование запроса 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";
}
Я хочу Парсером доставать все данные в табличку из базы, им же генерировать весь запрос, а потом сократить немного прведенный пример на Perl, чтобы он только отправлял бы подготовленные данные и возвращал бы результат, который опять же обрабатывался бы Парсером. Приходится все это делать через Perl-овую связку, потому что Парсер не умеет работать с SSL :(

Может быть кто-то сталкивался с этой системой? Поделитесь практическими идеями? :)