Криптопротокол S-HTTP
my $Experation = "2"; # Час дії рахунка
# Формування монотонно зростаючого номера запита
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
my $RequestN = sprintf("%04d%02d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
# Формування підписа
my $PlanStr = "$OrderID$LoginOfCust$PurseOfStores$Amount".
"$Desc$InvAddress$Period$Experation$RequestN";
my $pid = open2(*Reader, *Writer, "./WMSigner");
Writer->autoflush();
print Writer "$PlanStr04rn";
my $SignStr =
# Формування URL і https-виклик
my $W3sUrl="/asp/Invoice.asp?SL=$LoginOfStores&SP=$PurseOfStores &CL=$LoginOfCust&IN=$OrderID&D=$Desc&AD=$InvAddress&A=$Amount &E=$Experation&P=$Period&RN=$RequestN&SS=$SignStr";
my ($page, $result, %headers) =
&Net::SSLeay::get_https("w3s.webmoney.ru", 443, $W3sUrl);
# виведення результата
print "Content-type: text/htmlnn";
print "Result: n";
print $page;
Розберемо кожний блок більш докладно.
1. Підключення необхідних бібліотек
Скрипт використовує модуль FileHandle и IPC::Open2 для виконання WMSigner-а, передачі йому рядка для підписа і отримання підпису. Модуль Net::SSLeay використовується для формування https-запита до сертифікаційного сервера.2. Ініціалізація змінних
Включає в себе установку необхідних параметрів запита.
3. Формування монотонно зростаючого номера запита
Крім того кожен виклик будь-якого https-інтерфейса потребує наявності параметра RN=RequestN. Цей параметр повинен бути унікальним, не повторюватися від виклика до виклика зростаючим цілим числом. Параметр необхідний для того, щоб уникнути повторного виконання одного і того ж самого виклика інтерфейса. Даний параметр рекомендується формувати з поточної дати і часу комп’ютера, з якого виконується виклик інтерфейса. В цьому прикладі число формується з точністю до секунди. Такої точності достатньо для безлічі чисел систем. На даний час нема можливості скинути Дане значення, тому потрібно старатися не робити запити з необгрунтовано завищеними значеннями RequestN.