Помогите зацепить яндекс деньги к сайту с http уведомлениями. (нужно чтобы на пополняемую сумму пополнялся баланс пользователя в сайте) Вот нашёл на каком то сайте пример. но что то не получается его реализовать. вот все по порядку Форма Код (Text): <iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/embed/shop.xml?account=0000000000&quickpay=shop&payment-type-choice=on&writer=seller&targets=1&targets-hint=&default-sum=&button-text=01&label=1076" width="450" height="200"></iframe> тут подставлено label это ID юсера. (нужно сделать чтобы лабел был id пользователя который платит) сейчас лебл поставил ИД пользователя бота еще тут почемуто нет Код (Text): successURL= вставляю урл на уведомления у меня сразу после оплаты выдает сообщение Верификация не пройдена. SHA1_HASH не совпадает. Идем дальше Обработчик Код (Text): <? $secret = '00000000000000'; // секрет, который мы получили в первом шаге от яндекс. // получение данных. $r = array( 'notification_type' => $_POST['notification_type'], // p2p-incoming / card-incoming - с кошелька / с карты 'operation_id' => $_POST['operation_id'], // Идентификатор операции в истории счета получателя. 'amount' => $_POST['amount'], // Сумма, которая зачислена на счет получателя. 'withdraw_amount' => $_POST['withdraw_amount'], // Сумма, которая списана со счета отправителя. 'currency' => $_POST['intval'], // Код валюты — всегда 643 (рубль РФ согласно ISO 4217). 'datetime' => $_POST['datetime'], // Дата и время совершения перевода. 'sender' => $_POST['sender'], // Для переводов из кошелька — номер счета отправителя. Для переводов с произвольной карты — параметр содержит пустую строку. 'codepro' => $_POST['codepro'], // Для переводов из кошелька — перевод защищен кодом протекции. Для переводов с произвольной карты — всегда false. 'label' => $_POST['label'], // Метка платежа. Если ее нет, параметр содержит пустую строку. 'sha1_hash' => $_POST['sha1_hash'] // SHA-1 hash параметров уведомления. ); // проверка хеш if (sha1($r['notification_type'].'&'. $r['operation_id'].'&'. $r['amount'].'&'. $r['currency'].'&'. $r['datetime'].'&'. $r['sender'].'&'. $r['codepro'].'&'. $secret.'&'. $r['label']) != $r['sha1_hash']) { exit('Верификация не пройдена. SHA1_HASH не совпадает.'); // останавливаем скрипт. у вас тут может быть свой код. } // обработаем данные. нас интересует основной параметр label и withdraw_amount для получения денег без комиссии для пользователя. // либо если вы хотите обременить пользователя комиссией - amount, но при этом надо учесть, что яндекс на странице платежа будет писать "без комиссии". $r['amount'] = floatval($r['amount']); $r['withdraw_amount'] = floatval($r['withdraw_amount']); $r['label'] = intval($r['label']); // здесь я у себя передаю id юзера, который пополняет счет на моем сайте. поэтому обрабатываю его intval $my_pay=$db->assoc('SELECT * FROM pay WHERE id="'.$r['label'].'"'); if ($my_pay){ $db->update("pay", "status='ok' WHERE id='".$r['label']."'"); $r['amount'] = number_format($r['amount'], 2, '.', ' '); $db->update('users', 'balance=balance+"'.$r['amount'].'" WHERE id="'.$r['label'].'"'); $core->add_in($r['amount']); } ?> там еще запрос в базу неправильно сформирован но я до запроса в базу не могу дойти вот собственно так . если в форму вставлю адрес обработчика то ключ не верный если не вставляю то просто после оплаты переадресовывает на туже страницу сайта и ничего не происходит. помогите подключить
если про запрос то я делал и вот так: просто в корне делал файл и выполнял его у бота прибавлялся баланс. и пробовал вставить это дело в свой обработчик но ничего Код (Text): mysql_connect('localhost', '22222, 'fffff'); mysql_select_db("ffff"); $rb['amount'] = 10; $rb['label'] = 1076; mysql_query("UPDATE `users` SET balance=balance+".$rb['amount']." WHERE id=".$rb['label']);
Думаю мало вероятно кто-то сделает это за тебя, или ты готов дать логин и пароль от яндекс денег? шутка Попробуй сам отладить, debug/отладка http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html https://php.ru/forum/threads/howto-...i-po-shagam-i-s-kartinkami.58974/#post-474550 Кто и где это пишет? Распиши всю цепочку запросов по документации должна пройти и перепроверь её.
ясли бы я понимал я бы отладил но я не понимаю. Цепочка такова форма отправляет запрос яндексу. (форму я выше вставил). яндекс обрабатывает все параметры и присылает ответ в качестве http уведомления на обработчик (обработчик тоже выше) все в зашифрованном виде если все данные верны. то скрипт (обработчик) выполняется дальше (а дальше то я и вставляю запрос в БД)
Как ты изучал разработку сайтов? По какой книге PHP например учил? Ну в целом мысль правильная. Данные там шифруются только если всё идёт по протоколу https, но на обработчик приходят данные с хэш суммой всех полей. Давай ты массив $_REQUEST https://secure.php.net/manual/ru/reserved.variables.request.php запишешь в файле обработчике в текстовый файл, массив можно превратить в текст так например PHP: $req = var_export($_REQUEST); и $req уже записать в файл. Там в яндексе где прописываешь обработчик, можно тест сделать, вызовет обработчик и ты получишь данные, потом склей их и посчитай sha1 от него и сравни в тот что пришёл в тестовом запросе. Какие поля участвуют вы подсчёте хеша, почитай в документации yandex https://tech.yandex.ru/money/doc/dg/reference/notification-p2p-incoming-docpage/ Вот выдрал из старого проекта, может заработает, разберись с этим примером PHP: <?php $in = $_POST; $key = 'yandexSecret'; $str = "{$in['notification_type']}&{$in['operation_id']}&{$in['amount']}&{$in['currency']}&{$in['datetime']}&{$in['sender']}&{$in['codepro']}&$key&{$in['label']}"; $hash = hash('sha1', $str); file_put_contents('yamoney.log', var_export([$_REQUEST, $in, $hash, $in['sha1_hash']], true)); if ($hash === $in['sha1_hash']) { file_put_contents('true.log', var_export([$_REQUEST, $in, $hash, $in['sha1_hash']], true)); } }
все спасибо разобрался все работает. но пришлось переделать обработчик. вот форма Код (Text): <iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/quickpay/shop-widget?account=00000000000&quickpay=shop&payment-type-choice=on&mobile-payment-type-choice=on&writer=seller&targets=%D0%9F%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0+%D0%BD%D0%B0+%D1%81%D0%B0%D0%B9%D1%82%D0%B5+vtops.ru&targets-hint=&default-sum=&button-text=01&successURL=http%3A%2F%2МОЙ САЙТ.ru%2Faccount%2Fpay&label=<?=$user['id']?>" width="449" height="198"></iframe> в лайбл у меня ид юсера а вот обработчик Код (Text): $hash = sha1($_POST['notification_type'].'&'. $_POST['operation_id'].'&'. $_POST['amount'].'&'. $_POST['currency'].'&'. $_POST['datetime'].'&'. $_POST['sender'].'&'. $_POST['codepro'].'&'. 'секрет кей'.'&'. $_POST['label']); if ( $_POST['sha1_hash'] != $hash or $_POST['codepro'] === true or $_POST['unaccepted'] === true ) exit('error'); mysql_connect('localhost', '111111', '11111); mysql_select_db("111"); mysql_query("UPDATE `users` SET balance=balance+".$_POST['amount']." WHERE id=".$_POST['label']); ?>