Перейти к содержимому


Фотография

Не совпадают хеши

php хеш

  • Пожалуйста, авторизуйтесь для ответа.
5 ответов в данной теме

#1 Участник Vologda Host (WMID 198080720861 )

  • Группа: Пользователи
  • сообщений 11
  • Регистрация: 15-марта 11
  • МестоположениеРоссия
  • Webmoney BL

Отправлено 26 июня 2016 - 13:02

Здравствуйте  помогите разобраться в коде, почему не совпадают хеши.
	
	public function StartTransferIn($transfer)
		{
			global $SITE_URL;
			
			$purse = $this->purses[$transfer->transfer_curr_code];
			
			$action = "https://merchant.webmoney.ru/lmi/payment.asp";

			$form  = '<form method="POST" action="'.$action.'">'."\n";
			$form .= '<input type="hidden" name="LMI_PAYMENT_AMOUNT" value="'.round($transfer->transfer_amount,2).'">'."\n";
			$form .= '<input type="hidden" name="LMI_PAYMENT_DESC" value="'.htmlspecialchars(PS::MkTransferDescr($transfer)).'">'."\n";
			$form .= '<input type="hidden" name="LMI_PAYMENT_NO" value="'.$transfer->transfer_id.'">'."\n";
			$form .= '<input type="hidden" name="LMI_PAYEE_PURSE" value="'.$purse.'">'."\n";
			$form .= '<input type="hidden" name="LMI_SIM_MODE" value="0">'."\n";
			$form .= '<input type="hidden" name="LMI_RESULT_URL" value="'.$SITE_URL.'/scripts/wm.php'.'">'."\n";
			$form .= '<input type="hidden" name="LMI_RESULT_METHOD" value="POST">'."\n";
			$form .= '<input type="hidden" name="LMI_SUCCESS_URL" value="'.$SITE_URL.'/success.php'.'">'."\n";
			$form .= '<input type="hidden" name="LMI_SUCCESS_METHOD" value="POST">'."\n";
			$form .= '<input type="hidden" name="LMI_FAIL_URL" value="'.$SITE_URL.'/fail.php'.'">'."\n";
			$form .= '<input type="hidden" name="LMI_FAIL_METHOD" value="POST">'."\n";
			$form .= '</form>'."\n";
			return $form;
			
		}

		public function CheckTransferIn($params, $LOG)
		{
		
			$LOG = $this->LogInstance($LOG);

			$SECRET_KEY = $this->config['secret_key'];
			
			$sign  = $_POST['LMI_PAYEE_PURSE'];
			$sign .= $_POST['LMI_PAYMENT_AMOUNT'];
			$sign .= $_POST['LMI_PAYMENT_NO'];
			$sign .= $_POST['LMI_MODE'];
			$sign .= $_POST['LMI_SYS_INVS_NO'];
			$sign .= $_POST['LMI_SYS_TRANS_NO'];
			$sign .= $_POST['LMI_SYS_TRANS_DATE'];
			$sign .= $SECRET_KEY;
			$sign .= $_POST['LMI_PAYER_PURSE'];
			$sign .= $_POST['LMI_PAYER_WM'];

                        $n_sign = str_replace(" ","",$sign);
			$hash = strtoupper(hash('sha256',($n_sign)));
			$signature = $_POST['LMI_HASH'];

			 file_put_contents('/home/admin/web/localhost.ltd/logs/webmoney_signature_log.txt', print_r($hash."\n".$signature, 1), FILE_APPEND);
			
		 	/* if($hash != $signature){
				exit;
			} */
			
			$transfer = exTransfer::loadArray($params['LMI_PAYMENT_NO']);
			
			if ($params['LMI_PAYMENT_AMOUNT'] != $transfer['transfer_amount'])
            return $this->_LogError($LOG, "Суммы не совпали: {$transfer['transfer_amount']} != {$params['LMI_PAYMENT_AMOUNT']}");    
            
			if ($params['LMI_PAYEE_PURSE'] != $transfer['payee_purse'])
            return $this->_LogError($LOG, "Валюты не совпали: {$transfer['payee_purse']} != {$params['LMI_PAYEE_PURSE']}");    

			return true;
		}

В логах
ADB8B5635D816B436FCBB462CB37161D313A63C0C9E2D5B139E6A4287547E3E8
B7E3CB45CBCBE2B3A26EE9F6D95F2570E657A3E4E9D756DCD4F3CE0B01C2E43C

Сообщение отредактировал Vologda Host: 26 июня 2016 - 13:30

    • 0
  • Наверх

#2 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 26 июня 2016 - 13:21

Здравствуйте, а что это

webmoney.$zone

? Есть такой сайт webmoney.com? Он точно WebMoney?

Вот это не может влиять?

$n_sign = str_replace(" ","",$sign);

Может лучше через trim сделать?


Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#3 Участник Vologda Host (WMID 198080720861 )

  • Группа: Пользователи
  • сообщений 11
  • Регистрация: 15-марта 11
  • МестоположениеРоссия
  • Webmoney BL

Отправлено 26 июня 2016 - 13:47

Здравствуйте, а что это

webmoney.$zone

? Есть такой сайт webmoney.com? Он точно WebMoney?

Вот это не может влиять?

$n_sign = str_replace(" ","",$sign);

Может лучше через trim сделать?

 

 
$zone исправил
 
trim удаляет  ASCII-символы с начала и конца их и так нет

пробел был один убрал str_replace

хеши все равно разные


    • 0
  • Наверх

#4 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 26 июня 2016 - 14:09

trim пробелы с начала и конца строки удаляет.

Насколько я понял, Вы вместо того, чтоб удалять пробелы сначала и конца строки, удаляете их из всей строки. Но это не выход.

Если вообще убрать

$n_sign = str_replace(" ","",$sign);

или заменить на

$n_sign = $sign;

Данные, которые в результате дают хэш на сервере webmoney и данные, в которых Вы удаляете проблемы не смгут дать один хеш.

Скорее всего из-за

$n_sign = str_replace(" ","",$sign);

страдает дата

$_POST['LMI_SYS_TRANS_DATE'];

, формат которой должен быть

YYYYMMDD HH:MM:SS

, но после Вашего

str_replace(" ","",$sign)

становится

YYYYMMDDHH:MM:SS

. Отсюда и несовпадение хэша.


Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#5 Участник Vologda Host (WMID 198080720861 )

  • Группа: Пользователи
  • сообщений 11
  • Регистрация: 15-марта 11
  • МестоположениеРоссия
  • Webmoney BL

Отправлено 26 июня 2016 - 14:12

public function CheckTransferIn($params, $LOG)
		{
		
			$LOG = $this->LogInstance($LOG);

			$SECRET_KEY = $this->config['secret_key'];
			
			$sign  = $_POST['LMI_PAYEE_PURSE'];
			$sign .= $_POST['LMI_PAYMENT_AMOUNT'];
			$sign .= $_POST['LMI_PAYMENT_NO'];
			$sign .= $_POST['LMI_MODE'];
			$sign .= $_POST['LMI_SYS_INVS_NO'];
			$sign .= $_POST['LMI_SYS_TRANS_NO'];
			$sign .= $_POST['LMI_SYS_TRANS_DATE'];
			$sign .= $SECRET_KEY;
			$sign .= $_POST['LMI_PAYER_PURSE'];
			$sign .= $_POST['LMI_PAYER_WM'];
			
			$hash = strtoupper(hash('sha256',($sign)));
			$signature = $_POST['LMI_HASH'];

			 file_put_contents('/home/admin/web/localhost.ltd/logs/webmoney_signature_log.txt', print_r($sign."\n".$hash."\n".$signature, 1), FILE_APPEND);
			
		 	/* if($hash != $signature){
				exit;
			} */
			
			$transfer = exTransfer::loadArray($params['LMI_PAYMENT_NO']);
			
			if ($params['LMI_PAYMENT_AMOUNT'] != $transfer['transfer_amount'])
            return $this->_LogError($LOG, "Суммы не совпали: {$transfer['transfer_amount']} != {$params['LMI_PAYMENT_AMOUNT']}");    
            
			if ($params['LMI_PAYEE_PURSE'] != $transfer['payee_purse'])
            return $this->_LogError($LOG, "Валюты не совпали: {$transfer['payee_purse']} != {$params['LMI_PAYEE_PURSE']}");    

			return true;
		}

Без str_replace

 

R23370376704710.0043153039320160626 14:09:55123456789R355907570914198080720861

908268767789EE552BD8D4DA640AA9C3AAEEA71A751158FD49509400782A4D68
C7D17F223181F2FA6DC9BC0C6FEA1E615DB7EC2EF649086D5C6D5A83C7AA6195


Сообщение отредактировал Vologda Host: 26 июня 2016 - 14:14

    • 0
  • Наверх

#6 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 26 июня 2016 - 14:52

А что дают скобки

$hash = strtoupper(hash('sha256',($sign)));

а именно

($sign)

?

 

А SECRET_KEY одинаковый в мерчант и на сайте?

 

И почему $_POST['LMI_PAYMENT_AMOUNT'] = 10.00? Это точно те данные, которые возвращает мерчант? Знаю, что мерчант возвращает данные вида

10.00 заменяет на 10

10.10 заменят на 10.1

Там или floatval сделайте. Что-то не то Вы получаете.


Сообщение отредактировал ^-^: 26 июня 2016 - 14:56

Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 1
  • Наверх





Еще теги с одним или более ключевыми словами: php, хеш