PDA

Просмотр полной версии : WMSigner PHP


Isis
19.12.2007, 21:22
Тут вот хотел сделать себе WMSigner, а он только на C++ и .Net есть...
На PHP тоже есть, но им уже больше года...не фурычат..

WMSigner можно сделать по статье: http://www.opennet.ru/base/dev/webmoney_pay.txt.html
Нету перла?

Переписал перл скрипт на PHP определение SignStr...:

<?php
$path = "/home/www/wm/";
$sign = "/home/www/wm/wmsigner";
$wmid = ""; #wmid
$kwy = "": #key for wmid
$base64 = ""; #base64 вашего ключа kwm..Чтобы узнать его запустите скрипт convert.php и запишите выведенные символы в эту строку...

function space($str, $len)
{
$sum = $len - strlen($str);
$hwost = '';
for ($i = 0; $i < $sum; $i++)
{
$hwost = $hwost.'0';
}
$string = $hwost.$str;
return $string;
}

function GetSign($inStr)
{
global $path, $sign, $key, $wmid, $base64;
chdir($path);
$desc = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "r") );
$process = proc_open($sign." -w ".$wmid." -p ".$key." -K64 ".$base64, $desc, $ech);
fwrite($ech[0], "$inStr\004\r\n");
fclose($ech[0]);
$SignStr = fgets($ech[1], 133);
fclose($ech[1]);
$return_value = proc_close($process);
return $SignStr;
}

$OrderID = '999'; # номер счета на Вашем сайте
$PurseOfStores ='Z348176092735'; # кошелек сайта
$LoginOfStores = '521142404582'; # WMID сайта
$LoginOfCust = ''; # WMID покупателя, зададим как константу
$InvAddress = 'INVADDRESS'; # адрес, после оплаты юзер придет сюда..
$Amount = '10'; #сумма счета, которую должен оплатить покупатель
$Desc = 'DESC'; # описание
$Period = '0'; #Срок протекции сделки
$Experation = '3'; #Срок действия счета - 3 дня

list($sec,$min,$hour,$mday,$mon,$year,$wday,$yday, $isdst) = localtime(time());
$request = (1900 + $year).space($mon, 2);
$request .= space($mday, 2).space($hour, 2);
$request .= space($min, 2).space($sec, 2).space($sec, 2);

$PlanStr = $OrderID.$LoginOfCust.$PurseOfStores.$Amount;
$PlanStr .= $Desc.$InvAddress.$Period.$Experation.$request;

echo "Строка подписи \$PlanStr: ".$PlanStr."<br/><br/><br/>";

$SignStr = GetSign($PlanStr);
print "Цифровая подпись (возвращена WMSigner'ом): ".$SignStr."<br><br><br>";

$url = "https://w3s.webmoney.ru/asp/Invoice.asp?SL=".$LoginOfStores."&";
$url .= "SP=".$PurseOfStores."&CL=".$LoginOfCust."&IN=".$OrderID."&D=".$Desc."&";
$url .= "AD=".$InvAddress."&A=".$Amount."&E=".$Experation."&P=".$Period."&";
$url .= "RN=".$request."&SS=".$SignStr;

echo "HTTPS запрос к системе:<br/>".$url."<br/><br/><br/>";
?>


convert.php

<?php
$fn = "key.kwm"; #.kwm key file from your wmid
$handle = fopen($fn,"r");
$contents = fread($handle, filesize($fn));
fclose($handle);
echo base64_encode($contents);
?>


Вообщем переписал и увидел ошибку...
Пошел в гугль и увидел что WMSigner с недавнего времени сделали с минимальным персональным аттестатом...
Мда

Обновление 1.02.2008

Isis
01.02.2008, 07:12
Обновление.....все через 1 функцию..безопасное хранение пароля

dkameleon
27.02.2008, 05:13
На PHP тоже есть, но им уже больше года...не фурычат..
Что значит больше года и не фурычат?

Вообще последнее обновление было как раз за две недели до твоего поста и ПХП версия отлично "фурычит".

Может быть не там и не то искали? ;)
http://my-tools.net/wmxi/

Isis
27.02.2008, 07:30
Хм, допустим...
Посмотри сколько файлов требует их скрипт и сколько строк мой :)

+ в моем скрипте посл.апдейта не надо пихать файлы кипера на сервак...
Так что хек

dkameleon
27.02.2008, 11:45
Хм, допустим...
Посмотри сколько файлов требует их скрипт и сколько строк мой :)

+ в моем скрипте посл.апдейта не надо пихать файлы кипера на сервак...
Так что хек

Все аргументы притянуты за уши :))
Количество файлов - не проблема пересобрать в один файл.
Файлы на сервак - ключ точно так же легко помещается в переменную. Достаточно было изучить функцию инициализации класса :)

Но есть существенное преимущество:
модуль Сигнера реализован на пхп, а это не требует компиляции и запуска бинарника на сервере, из-за чего либа может работать даже в сейфмоде и с кучей прочих жёстких ограничений. ;)

есть только неудобное требование - необходим bcmath, не всегда всюду устанавливаемый.

а так же вроде бы ещё не до конца отловлены ньюансы с 64-разряными платформами (в частноти правильнось мд4 хэшей).

Isis
27.02.2008, 14:58
Но все мой мой скрипт работает
За знания ловите плюс )