| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Никита Козин 08.08.2005 11:20 / 08.08.2005 11:24
Может быть кто-нибудь сталкивался с таким продуктом как «e-port дилер»?..Группа e-port представляет универсальное решение, разработанное специально для крупных предприятий, занимающих солидные позиции на рынке. Данный продукт будет полезен организациям, которые желают включить в перечень своих услуг прием платежей за услуги различных операторов мобильной связи, Интернет-провайдеров, операторов спутникового телевидения, а также продажу PIN-кодов или расчеты за услуги предприятий электронной коммерции.Сейчас уже есть чужой написанный механизм, который заносит всю информацию о пользователе и операции в базу данных. Мне нужно написать механизм, который будет по cron-у доставать данные из базы и передавать их e-port-у... Передача может происходить только методом POST и только через SSL.
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 :(