WMSigner PHP

Discussion in 'PHP' started by banned, 19 Dec 2007.

  1. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Тут вот хотел сделать себе WMSigner, а он только на C++ и .Net есть...
    На PHP тоже есть, но им уже больше года...не фурычат..

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

    Переписал перл скрипт на PHP определение SignStr...:
    PHP:
    <?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:
    <?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
     
    #1 banned, 19 Dec 2007
    Last edited: 1 Feb 2008
    2 people like this.
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Обновление.....все через 1 функцию..безопасное хранение пароля
     
  3. dkameleon

    dkameleon New Member

    Joined:
    24 Oct 2007
    Messages:
    2
    Likes Received:
    2
    Reputations:
    0
    Что значит больше года и не фурычат?

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

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

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Хм, допустим...
    Посмотри сколько файлов требует их скрипт и сколько строк мой :)

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

    dkameleon New Member

    Joined:
    24 Oct 2007
    Messages:
    2
    Likes Received:
    2
    Reputations:
    0
    Все аргументы притянуты за уши :))
    Количество файлов - не проблема пересобрать в один файл.
    Файлы на сервак - ключ точно так же легко помещается в переменную. Достаточно было изучить функцию инициализации класса :)

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

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

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

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Но все мой мой скрипт работает
    За знания ловите плюс )