1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Webmoney Merchant и хеш в PHP

Тема в разделе 'PHP', создана пользователем wsok, 7 авг 2013.

  1. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    В общем, суть проблемы в том, что хеши md5 не хотят совпадать, хоть тресни... Хоть и все настроено как положено...

    Форма запроса платежа как и положено отправляет данные...

    PHP:
      $output .= "<div class=w1 align=center>Пополнение баланса
      <img src='' border=0>
    <div class=multiple3>
    <form method='POST' action='https://merchant.webmoney.ru/lmi/payment.asp'>
            <input style=\"width: 15%; height: 35px; font-size:20px;\" type='text' name='LMI_PAYMENT_AMOUNT' value=''>
            <input type='hidden' name='LMI_PAYMENT_DESC_BASE64' value='"
    .base64_encode("Пополнение баланса для ".$mkportals->member['name'])."'>
            <input type='hidden' name='LMI_PAYMENT_NO' value='
    {$mkportals->member['id']}'>
            <input type='hidden' name='LMI_PAYEE_PURSE' value='R850275512100'>"
    ;
    $output .= "</select><input style=\"width: 20%; height: 35px; font-size:20px;\" type=submit value='Пополнить'>
    </form></div></div>"
    ;
    Все данные проходят и успешно оплата производится (с кошелька покупателя списывается, продавцу зачисляется), но вот хеши не совпадают.

    Собственно использую такой код для результ обработчика:

    PHP:
    <?php
    //кошелек на который будут перечислены средства
    $wm_purce "R850275512100";
     
    if( isset(
    $_POST['LMI_PREREQUEST']) && $_POST['LMI_PREREQUEST'] == 1) {
        
    $sql "SELECT id,price FROM orders WHERE id=".$_POST['LMI_PAYMENT_NO'];
        
    $result mysql_query($sql);
        
    $rows mysql_num_rows($result);
     
        if ( 
    $rows != ) {
          exit(
    'Order not faund');
        }
        else {
            
    $row mysql_fetch_array($result);
       
            if(
    $_POST['LMI_PAYMENT_NO'] == $row['id']
                && 
    $_POST['LMI_PAYEE_PURSE'] == $wm_purce
                
    && $_POST['LMI_PAYMENT_AMOUNT'] == $row['price']) {
           
                echo 
    'YES';
           
            }
            else {
                exit();
            }
        }
    }
    else {
     
        
    $LMI_SECRET_KEY "Тут мой секретный ключ, идентичный тому что установил в настройках кошелька";
     
        
    $sql "SELECT id,price FROM orders WHERE id=".$_POST['LMI_PAYMENT_NO'];
        
    $result mysql_query($sql);
        
    $rows mysql_num_rows($result);
     
        if ( 
    $rows != ) {
          exit(
    'Order not faund');
        }
        else {
            
    $row mysql_fetch_array($result);
            
    $str_hash $wm_purce.
                    
    $row['price'].
                    
    $row['id'].
                    
    $_POST['LMI_MODE'].
                    
    $_POST['LMI_SYS_INVS_NO'].
                    
    $_POST['LMI_SYS_TRANS_NO'].
                    
    $_POST['LMI_SYS_TRANS_DATE'].
                    
    $LMI_SECRET_KEY.
                    
    $_POST['LMI_PAYER_PURSE'].
                    
    $_POST['LMI_PAYER_WM'];
            
    $str_hash strtoupper(md5($str_hash));   
       
            if(
    $str_hash == $_POST['LMI_HASH']) {
                
    //обновляем статус заказа - оплачен и
                //отправляем пользователю письмо о том что его оплата прошла.
            
    }
            else {
                exit();
            }   
       
        }
    }
                   
                   
    ?>
    Решил в код добавить запись в файл, чтобы понять, что действительно хеши разные

    PHP:
        $str_hash $_POST['LMI_PAYEE_PURSE'].$_POST['LMI_PAYMENT_AMOUNT'].$_POST['LMI_PAYMENT_NO'].$_POST['LMI_MODE'].$_POST['LMI_SYS_INVS_NO'].$_POST['LMI_SYS_TRANS_NO'].$_POST['LMI_SYS_TRANS_DATE'].$LMI_SECRET_KEY.$_POST['LMI_PAYER_PURSE'].$_POST['LMI_PAYER_WM'];
       
     
     
               
            
    $str_hash strtoupper(md5($str_hash));
       
    $fp fopen("t.txt""a");
    $mytext $str_hash." - ".$_POST['LMI_HASH']."\r\n";
    fwrite($fp$mytext);
    fclose($fp);
     
            if(
    $str_hash == $_POST['LMI_HASH']) {
                
    //обновляем статус заказа - оплачен и
                //отправляем пользователю письмо о том что его оплата прошла.
     
            
    }
    как видно из кода, весь порядок генерации хеша мною соблюден, но хеши получаются разные, это видно из файла

    Слева от дефиса хеш сгенерирован согласно тому порядку, что взят из официального источника, слева хеш, который присылает система, и как видно он совсем другой. В чем дело?
    Код:
    F815E4EBB45A559431983B4E9DA1F60F - F38F2CFEC237D2E5C4CEE4B4A6E116C1
    5298C17D649459D7310CDC3A7AE2E34A - 8917A7F68F92042C5163CF2B24258A49
    398643F6AA5DCDB5428C3E5A8D3F16F0 - 4BC6C192CEAE2E3188C170DE0A5DEA98
    197FA3A4061B44FA67268387ADB21FBC - 437169ED3EE0BB1BBB83A0AE4FB60E2F
    183674E7ECB524C4B1420B6EEB69739F - 87572CF7BF952F383EF31669F63BF074
    9393573DEAD6C63AD1B2FCB563BE8D32 - 898EC43A5857E35A626E7767058A2592
  2. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    сорь слегка разделом промахнулся, перенесите в веб программирование )
  3. Gibat Команда форума Администратор Программист Пользователи

    Сообщения:
    135
    Лайки:
    163
    Пол:
    Мужской
    Репутация:
    0
    До формирования хэша отобрази все данные которые его формируют и сравни
  4. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    До формирования? т.е. до того, как система вернет данные в результ? Хеш по идее и подавно не совпадет, ведь данные о времени будут другими, а они тоже участвуют в создании хеша.

    Я вот как раз спецом в строку объеденил все ПОСТ данные, которые вернул сервис мерчанта

    PHP:
        $str_hash $_POST['LMI_PAYEE_PURSE'].$_POST['LMI_PAYMENT_AMOUNT'].$_POST['LMI_PAYMENT_NO'].$_POST['LMI_MODE'].$_POST['LMI_SYS_INVS_NO'].$_POST['LMI_SYS_TRANS_NO'].$_POST['LMI_SYS_TRANS_DATE'].$LMI_SECRET_KEY.$_POST['LMI_PAYER_PURSE'].$_POST['LMI_PAYER_WM'];
     
     
     
             
            
    $str_hash strtoupper(md5($str_hash));
    т.е. 1 в 1 но с присланным хешем от системы хеш полученный из склееных строк не совпадает...
  5. Gibat Команда форума Администратор Программист Пользователи

    Сообщения:
    135
    Лайки:
    163
    Пол:
    Мужской
    Репутация:
    0
    Я ступил немного в том посте =)

    Сверил твои скрипты с докой вебманек, ошибок не нашел. LMI_MODE ведь устанавливается в настройках аккаунта?
  6. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3


    Мистика оО Создал новый кошель, настроил по аналогии с первым и... заработало! А старый кошель так и не хочет отдавать нормальный хеш... Странно...
Черновик сохранён Черновик удалён

Поделиться этой страницей