Добрый день. Помогите пожалуйста разобраться с кодом, битый день сижу - никак не получается. На обработчике 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): <? $datetimePP=$_POST['datetime']; $type =trim($_POST['notification_type']); $order =trim($_POST['operation_id']); $amount =trim($_POST['amount']); $cur =trim($_POST['currency']); $datetime =trim($_POST['datetime']); $payer =trim($_POST['sender']); $code =trim($_POST['codepro']); $key = '8UyTgAccUi8XRkEAqOfbtgeh'; $label = trim($_POST['label']); $wamount =trim($_POST['withdraw_amount']); $hash =trim($_POST['sha1_hash']); $hash_gen = hash("sha1",$type.'&'.$order.'&'.$amount.'&'.$cur.'&'.$datetime.'&'.$payer.'&'.$code.'&'.$key.'&'.$label); if($hash_gen!=$hash) { file_put_contents('history.txt', 'ошибка! Проверить хэш', FILE_APPEND); exit('Не совпадает хэш!'); } file_put_contents('history.php',$datetime.' Хэш: '.$hash.' И Хэш2: '.$hash_gen.' Через Яндекс.Деньги на сумму: '.$amount.' логин: '.$label.PHP_EOL, FILE_APPEND); //обязательно подключаемся к базе include ("blocks/bd.php"); //преобразовываем формат даты из яндекса //$datetime = date('Y-m-d', strtotime(substr($datetimePP,0,10))); //ВНИМАНИЕ: синтаксис при использовании переменных: '$..' $result1= mysql_query("UPDATE users SET amount ='$amount', date_pay='$datetime' WHERE id='$label'"); $result2= mysql_query("UPDATE payment SET amount ='$amount', date_pay='$datetime', iduser='$label' WHERE id='1'"); $result5= mysql_query("INSERT INTO payment SET amount ='$amount', iduser='$label', date_pay='$datetime' "); $result33 = mysql_query("SELECT * FROM users WHERE id='$label'"); $myrow33 = mysql_fetch_array($result33); $gen_symbol = $myrow33['gen_symbol']; if (isset ($_GET['label'])) {$label = $_GET ['label']; } if (isset ($_GET['gen_symbol'])) {$gen_symbol = $_GET ['gen_symbol']; } exit("Успешно!<a href='index.php?numberuser=$label&&gen_symbol=$gen_symbol'> ДАЛЕЕ</a>"); //echo "<script language='JavaScript' type='text/javascript'> // window.location = 'index.php?numberuser=$label&&gen_symbol=$gen_symbol'; //</script>"; //exit(); ?>
"Логика сломана." Вообще-то у тебя должны быть три файла 1) Файл обработчик (который проверяет оплату, начисляет пользователям сумму) 2) Файл об успешной оплате 3) Об отмене оплаты или других ошибках и PHP: amount ='$amount' Наверняка должно быть PHP: `amount` = `amount` + '".(int)$_POST['amount']."' иначе повторная оплата обнулит сумму полученную ранее. --------- "mysql_" устарел. пора тебе обновляться. Используй pdo, mysqli -------- могу за недорого переписать код на нормальный лад, если интересно - обращайся
Спасибо за ответ. Но проблема в том, чтобы перейти после обработчика, который начислил сумму, перейти дальше - на тот же файл об успешной оплате. В базу данные внеслись. Но ведь в обработчике нужно поставить код с редиректом на success.php, а он не срабатывает! Вместо этого, как я полагаю, идет повторная проверка хэш и выходит мое сообщение "ошибка! Проверить хэш". Почему? Неужели все дело в необходимости перейти с mysql на mysqli? Если проверку совпадения хэша убрать, то в базу вносятся данные, а на втором круге id обнуляется и в таблицу users значение date_pay вносится типа 0000-00-00, где id=0. Помогите пожалуйста разобраться, в каком направлении копать? Почему второй раз срабатывает проверка, откуда цикл?Вот код с редиректом: Код (Text): <? $datetimePP=$_POST['datetime']; $type =trim($_POST['notification_type']); $order =trim($_POST['operation_id']); $amount =trim($_POST['amount']); $cur =trim($_POST['currency']); $datetime =trim($_POST['datetime']); $payer =trim($_POST['sender']); $code =trim($_POST['codepro']); $key = '8UyTgAccUi8XRkEAqOfbtgeh'; $label = trim($_POST['label']); $wamount =trim($_POST['withdraw_amount']); $hash =trim($_POST['sha1_hash']); $hash_gen = hash("sha1",$type.'&'.$order.'&'.$amount.'&'.$cur.'&'.$datetime.'&'.$payer.'&'.$code.'&'.$key.'&'.$label); if($hash_gen!=$hash) { file_put_contents('history.txt', 'ошибка! Проверить хэш', FILE_APPEND); exit('Не совпадает хэш!'); } file_put_contents('history.php',$datetime.' Хэш: '.$hash.' И Хэш2: '.$hash_gen.' Через Яндекс.Деньги на сумму: '.$amount.' логин: '.$label.PHP_EOL, FILE_APPEND); //обязательно подключаемся к базе include ("blocks/bd.php"); //преобразовываем формат даты из яндекса //$datetime = date('Y-m-d', strtotime(substr($datetimePP,0,10))); //ВНИМАНИЕ: синтаксис при использовании переменных: '$..' $result1= mysql_query("UPDATE users SET amount ='$amount', date_pay='$datetime' WHERE id='$label'"); $result2= mysql_query("UPDATE payment SET amount ='$amount', date_pay='$datetime', iduser='$label' WHERE id='1'"); $result5= mysql_query("INSERT INTO payment SET amount ='$amount', iduser='$label', date_pay='$datetime' "); //$result33 = mysql_query("SELECT * FROM users WHERE id='$label'"); //$myrow33 = mysql_fetch_array($result33); //$gen_symbol = $myrow33['gen_symbol']; //if (isset ($_GET['label'])) {$label = $_GET ['label']; } //if (isset ($_GET['gen_symbol'])) {$gen_symbol = $_GET ['gen_symbol']; } //exit("Успешно!<a href='index.php?numberuser=$label&&gen_symbol=$gen_symbol'> ДАЛЕЕ</a>"); echo "<script language='JavaScript' type='text/javascript'> window.location = 'success.php'; </script>"; exit(); ?>
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()
После оплаты пользователь автоматически переходит на 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)));
И сразу ниже ( формат ответа ) https://yandex.ru/dev/money/doc/dg/concepts/protocol-response-docpage/ После успешной оплаты PHP: header('Location: /success.php'); exit; Если хеш неправильный PHP: header('Location: /error.php'); exit; При этом в браузер ничего выводится не должно и можешь ещё посмотреть, какие данные приходят и в какое время PHP: $file = $_SERVER["DOCUMENT_ROOT"].'/test.txt'; $textlog = '<span class=date>'.date("H:i:s").'</span> <span style="font-size: 12px;">'.var_export($_POST, true). var_export($_GET, true) .'</span><BR>'; $fp = fopen ($file, "a"); flock ($fp,LOCK_EX); fputs($fp , $textlog); fflush ($fp); flock ($fp,LOCK_UN); fclose ($fp); Дальше сам занимайся отладкой