За последние 24 часа нас посетили 21764 программиста и 1021 робот. Сейчас ищут 705 программистов ...

Почему осуществляется повторная проверка хэш, что не так с php кодом?

Тема в разделе "PHP для новичков", создана пользователем Andreeshe, 7 апр 2020.

  1. Andreeshe

    Andreeshe Новичок

    С нами с:
    7 апр 2020
    Сообщения:
    4
    Симпатии:
    0
    Добрый день.
    Помогите пожалуйста разобраться с кодом, битый день сижу - никак не получается.
    На обработчике payment_post.php получаю хэш sha1_hash от яндекс деньги, собираю собственный хэш hash_gen на основе полученных данных от яндекс деньги.
    Проверяю - хэши совпадают.
    Данные вносятся в БД корректно.
    Но когда хочу вывести сообщение "Успешно, далее"- выводит "Не совпадает хэш!". В моем понимании срабатывает повторная проверка хэшей, и яндекс деньги данные повторно не приходят.
    Если закомментировать строки с проверкой хэш if($hash_gen!=$hash) {….}, то Сообщение "Успешно, далее" выводится, но в ссылке отсутствует значение $lable, в то время как значение $gen_symbol проходит. А вот в строку браузера самовольно выводится адрес: payment_post.php?numberuser=47&&gen_symbol=L27OMekuBW1nd47 (то есть и $lable, и $gen_symbol прикрепляются, хотя команды такой нигде не давал). При этом в БД в таблице users в столбце date_pay отображается 0000-00-00, а не дата оплаты.

    Как добиться, чтобы и проверка выполнялась, и ссылка "Успешно, далее" отобразилась правильно?

    Вот код обработчика payment_post.php:
    Код (Text):
    1. <?
    2. $datetimePP=$_POST['datetime'];
    3. $type    =trim($_POST['notification_type']);
    4. $order   =trim($_POST['operation_id']);
    5. $amount  =trim($_POST['amount']);
    6. $cur     =trim($_POST['currency']);
    7. $datetime   =trim($_POST['datetime']);
    8. $payer   =trim($_POST['sender']);
    9. $code    =trim($_POST['codepro']);
    10. $key = '8UyTgAccUi8XRkEAqOfbtgeh';
    11. $label = trim($_POST['label']);
    12.  
    13. $wamount =trim($_POST['withdraw_amount']);  
    14.      
    15. $hash    =trim($_POST['sha1_hash']);  
    16.  
    17.  
    18. $hash_gen = hash("sha1",$type.'&'.$order.'&'.$amount.'&'.$cur.'&'.$datetime.'&'.$payer.'&'.$code.'&'.$key.'&'.$label);
    19.  
    20.  
    21. if($hash_gen!=$hash) {
    22.    
    23.         file_put_contents('history.txt', 'ошибка! Проверить хэш', FILE_APPEND);
    24.     exit('Не совпадает хэш!');
    25.    
    26.    
    27. }
    28.  
    29. file_put_contents('history.php',$datetime.' Хэш: '.$hash.' И Хэш2: '.$hash_gen.' Через Яндекс.Деньги на сумму: '.$amount.' логин: '.$label.PHP_EOL, FILE_APPEND);
    30.  
    31. //обязательно подключаемся к базе
    32. include ("blocks/bd.php");
    33.  
    34. //преобразовываем формат даты из яндекса
    35. //$datetime = date('Y-m-d', strtotime(substr($datetimePP,0,10)));
    36.  
    37. //ВНИМАНИЕ: синтаксис при использовании переменных: '$..'
    38. $result1= mysql_query("UPDATE users SET amount ='$amount', date_pay='$datetime' WHERE id='$label'");
    39. $result2= mysql_query("UPDATE payment SET amount ='$amount', date_pay='$datetime', iduser='$label' WHERE id='1'");
    40. $result5= mysql_query("INSERT INTO payment SET amount ='$amount', iduser='$label', date_pay='$datetime' ");
    41.  
    42. $result33 = mysql_query("SELECT * FROM users WHERE id='$label'");
    43. $myrow33 = mysql_fetch_array($result33);
    44. $gen_symbol = $myrow33['gen_symbol'];
    45.  
    46. if (isset ($_GET['label'])) {$label = $_GET ['label']; }
    47. if (isset ($_GET['gen_symbol'])) {$gen_symbol = $_GET ['gen_symbol']; }
    48.  
    49. exit("Успешно!<a href='index.php?numberuser=$label&&gen_symbol=$gen_symbol'> ДАЛЕЕ</a>");
    50.  
    51.  
    52. //echo "<script language='JavaScript' type='text/javascript'>
    53. // window.location = 'index.php?numberuser=$label&&gen_symbol=$gen_symbol';
    54.  
    55. //</script>";  
    56.  
    57. //exit();
    58. ?>
     
  2. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    "Логика сломана."

    Вообще-то у тебя должны быть три файла
    1) Файл обработчик (который проверяет оплату, начисляет пользователям сумму)
    2) Файл об успешной оплате
    3) Об отмене оплаты или других ошибках

    и
    PHP:
    1. amount ='$amount'
    Наверняка должно быть
    PHP:
    1. `amount` = `amount` + '".(int)$_POST['amount']."'
    иначе повторная оплата обнулит сумму полученную ранее.
    ---------

    "mysql_" устарел. пора тебе обновляться. Используй pdo, mysqli

    --------

    могу за недорого переписать код на нормальный лад, если интересно - обращайся
     
  3. Andreeshe

    Andreeshe Новичок

    С нами с:
    7 апр 2020
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за ответ. Но проблема в том, чтобы перейти после обработчика, который начислил сумму, перейти дальше - на тот же файл об успешной оплате. В базу данные внеслись. Но ведь в обработчике нужно поставить код с редиректом на success.php, а он не срабатывает! Вместо этого, как я полагаю, идет повторная проверка хэш и выходит мое сообщение "ошибка! Проверить хэш". Почему? Неужели все дело в необходимости перейти с mysql на mysqli? Если проверку совпадения хэша убрать, то в базу вносятся данные, а на втором круге id обнуляется и в таблицу users значение date_pay вносится типа 0000-00-00, где id=0.
    Помогите пожалуйста разобраться, в каком направлении копать? Почему второй раз срабатывает проверка, откуда цикл?
    Вот код с редиректом:

    Код (Text):
    1. <?
    2. $datetimePP=$_POST['datetime'];
    3. $type    =trim($_POST['notification_type']);
    4. $order   =trim($_POST['operation_id']);
    5. $amount  =trim($_POST['amount']);
    6. $cur     =trim($_POST['currency']);
    7. $datetime   =trim($_POST['datetime']);
    8. $payer   =trim($_POST['sender']);
    9. $code    =trim($_POST['codepro']);
    10. $key = '8UyTgAccUi8XRkEAqOfbtgeh';
    11. $label = trim($_POST['label']);
    12.  
    13. $wamount =trim($_POST['withdraw_amount']);
    14.    
    15. $hash    =trim($_POST['sha1_hash']);
    16.  
    17.  
    18. $hash_gen = hash("sha1",$type.'&'.$order.'&'.$amount.'&'.$cur.'&'.$datetime.'&'.$payer.'&'.$code.'&'.$key.'&'.$label);
    19.  
    20.  
    21. if($hash_gen!=$hash) {
    22.  
    23.         file_put_contents('history.txt', 'ошибка! Проверить хэш', FILE_APPEND);
    24.     exit('Не совпадает хэш!');
    25.  
    26.  
    27. }
    28.  
    29. file_put_contents('history.php',$datetime.' Хэш: '.$hash.' И Хэш2: '.$hash_gen.' Через Яндекс.Деньги на сумму: '.$amount.' логин: '.$label.PHP_EOL, FILE_APPEND);
    30.  
    31. //обязательно подключаемся к базе
    32. include ("blocks/bd.php");
    33.  
    34. //преобразовываем формат даты из яндекса
    35. //$datetime = date('Y-m-d', strtotime(substr($datetimePP,0,10)));
    36.  
    37. //ВНИМАНИЕ: синтаксис при использовании переменных: '$..'
    38. $result1= mysql_query("UPDATE users SET amount ='$amount', date_pay='$datetime' WHERE id='$label'");
    39. $result2= mysql_query("UPDATE payment SET amount ='$amount', date_pay='$datetime', iduser='$label' WHERE id='1'");
    40. $result5= mysql_query("INSERT INTO payment SET amount ='$amount', iduser='$label', date_pay='$datetime' ");
    41.  
    42. //$result33 = mysql_query("SELECT * FROM users WHERE id='$label'");
    43. //$myrow33 = mysql_fetch_array($result33);
    44. //$gen_symbol = $myrow33['gen_symbol'];
    45.  
    46. //if (isset ($_GET['label'])) {$label = $_GET ['label']; }
    47. //if (isset ($_GET['gen_symbol'])) {$gen_symbol = $_GET ['gen_symbol']; }
    48.  
    49. //exit("Успешно!<a href='index.php?numberuser=$label&&gen_symbol=$gen_symbol'> ДАЛЕЕ</a>");
    50.  
    51.  
    52. echo "<script language='JavaScript' type='text/javascript'>
    53. window.location = 'success.php';
    54.  
    55. </script>";  
    56.  
    57. exit();
    58. ?>
     
    #3 Andreeshe, 8 апр 2020
    Последнее редактирование: 8 апр 2020
  4. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    1.Ты изначально неправильно построил логику, в любом нормальном магазине указывается путь(ссылка) до файла обработчика и файла об успешной оплате. Никакие редиректы файл-обработчик делать не должен.
    2.Ты не отправляешь серверу никаких ответов, а должен.
    3. Прочитай документацию и правила https://yandex.ru/dev/money/doc/dg/concepts/protocol-request-docpage/
    4. date_pay - тип поля, datetime ? Формат должен быть таким при записи date('Y-m-d H:i:s', time()) или NOW()
     
  5. Andreeshe

    Andreeshe Новичок

    С нами с:
    7 апр 2020
    Сообщения:
    4
    Симпатии:
    0
    После оплаты пользователь автоматически переходит на payment_post.php (этот файл я указал в Яндекс Деньги, как адрес, на который я получаю уведомления о входящем переводе - в сервисе https://money.yandex.ru/myservices/online.xml). Для того, чтобы обработать уведомление и принять от Яндекса параметры, использую их документацию https://yandex.ru/dev/money/doc/dg/reference/notification-p2p-incoming-docpage/ Для ответа серверу вставил в начало файла payment_post.php код: " header("HTTP/1.0 200 OK");", но все-равно остается вся та же проблема: выводится сообщение ""ошибка! Проверить хэш".
    Тип поля date_pay у меня сейчас date. Для преобразования буду использовать $datetime = date('Y-m-d', strtotime(substr($datetime,0,10)));
     
  6. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    И сразу ниже ( формат ответа )
    https://yandex.ru/dev/money/doc/dg/concepts/protocol-response-docpage/

    После успешной оплаты
    PHP:
    1.  
    2.  header('Location: /success.php');
    3.   exit;
    Если хеш неправильный
    PHP:
    1.  
    2.   header('Location: /error.php');
    3.   exit;
    При этом в браузер ничего выводится не должно

    и можешь ещё посмотреть, какие данные приходят и в какое время

    PHP:
    1.     $file = $_SERVER["DOCUMENT_ROOT"].'/test.txt';
    2.     $textlog = '<span class=date>'.date("H:i:s").'</span> <span style="font-size: 12px;">'.var_export($_POST, true). var_export($_GET, true) .'</span><BR>';
    3.     $fp = fopen ($file, "a");
    4.     flock ($fp,LOCK_EX);
    5.     fputs($fp , $textlog);
    6.     fflush ($fp);
    7.     flock ($fp,LOCK_UN);
    8.     fclose ($fp);
    Дальше сам занимайся отладкой
     
  7. Andreeshe

    Andreeshe Новичок

    С нами с:
    7 апр 2020
    Сообщения:
    4
    Симпатии:
    0