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,193
    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(
            
    => array("pipe""r"),
            
    => array("pipe""w"),
            
    => 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($mon2);
        
    $request    .= space($mday2).space($hour2);
        
    $request    .= space($min2).space($sec2).space($sec2);

        
    $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($handlefilesize($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,193
    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,193
    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,193
    Reputations:
    252
    Но все мой мой скрипт работает
    За знания ловите плюс )