За последние 24 часа нас посетил 22161 программист и 1159 роботов. Сейчас ищут 354 программиста ...

Помогите зацепить яндекс деньги к сайту

Тема в разделе "Сделайте за меня", создана пользователем flin, 3 окт 2016.

  1. flin

    flin Новичок

    С нами с:
    3 окт 2016
    Сообщения:
    4
    Симпатии:
    0
    Помогите зацепить яндекс деньги к сайту с http уведомлениями. (нужно чтобы на пополняемую сумму пополнялся баланс пользователя в сайте)

    Вот нашёл на каком то сайте пример. но что то не получается его реализовать.
    вот все по порядку

    Форма
    Код (Text):
    1. <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):
    1. successURL=
    вставляю урл на уведомления у меня сразу после оплаты выдает сообщение
    Верификация не пройдена. SHA1_HASH не совпадает.

    Идем дальше

    Обработчик

    Код (Text):
    1. <?
    2. $secret = '00000000000000'; // секрет, который мы получили в первом шаге от яндекс.
    3. // получение данных.
    4. $r = array(
    5.     'notification_type' => $_POST['notification_type'], // p2p-incoming / card-incoming - с кошелька / с карты
    6.     'operation_id'      => $_POST['operation_id'],      // Идентификатор операции в истории счета получателя.
    7.     'amount'            => $_POST['amount'],            // Сумма, которая зачислена на счет получателя.
    8.     'withdraw_amount'   => $_POST['withdraw_amount'],   // Сумма, которая списана со счета отправителя.
    9.     'currency'          => $_POST['intval'],            // Код валюты — всегда 643 (рубль РФ согласно ISO 4217).
    10.     'datetime'          => $_POST['datetime'],          // Дата и время совершения перевода.
    11.     'sender'            => $_POST['sender'],            // Для переводов из кошелька — номер счета отправителя. Для переводов с произвольной карты — параметр содержит пустую строку.
    12.     'codepro'           => $_POST['codepro'],           // Для переводов из кошелька — перевод защищен кодом протекции. Для переводов с произвольной карты — всегда false.
    13.     'label'             => $_POST['label'],             // Метка платежа. Если ее нет, параметр содержит пустую строку.
    14.     'sha1_hash'         => $_POST['sha1_hash']          // SHA-1 hash параметров уведомления.
    15. );
    16.  
    17. // проверка хеш
    18. if (sha1($r['notification_type'].'&'.
    19.          $r['operation_id'].'&'.
    20.          $r['amount'].'&'.
    21.          $r['currency'].'&'.
    22.          $r['datetime'].'&'.
    23.          $r['sender'].'&'.
    24.          $r['codepro'].'&'.
    25.          $secret.'&'.
    26.          $r['label']) != $r['sha1_hash']) {
    27.     exit('Верификация не пройдена. SHA1_HASH не совпадает.'); // останавливаем скрипт. у вас тут может быть свой код.
    28. }
    29.  
    30. // обработаем данные. нас интересует основной параметр label и withdraw_amount для получения денег без комиссии для пользователя.
    31. // либо если вы хотите обременить пользователя комиссией - amount, но при этом надо учесть, что яндекс на странице платежа будет писать "без комиссии".
    32. $r['amount']          = floatval($r['amount']);
    33. $r['withdraw_amount'] = floatval($r['withdraw_amount']);
    34. $r['label']           = intval($r['label']); // здесь я у себя передаю id юзера, который пополняет счет на моем сайте. поэтому обрабатываю его intval
    35.  
    36. $my_pay=$db->assoc('SELECT * FROM pay WHERE id="'.$r['label'].'"');
    37.     if ($my_pay){
    38.     $db->update("pay", "status='ok' WHERE id='".$r['label']."'");
    39.     $r['amount'] = number_format($r['amount'], 2, '.', ' ');
    40.     $db->update('users', 'balance=balance+"'.$r['amount'].'" WHERE id="'.$r['label'].'"');
    41.     $core->add_in($r['amount']);
    42.    }
    43. ?>
    там еще запрос в базу неправильно сформирован но я до запроса в базу не могу дойти

    вот собственно так . если в форму вставлю адрес обработчика то ключ не верный если не вставляю то просто после оплаты переадресовывает на туже страницу сайта и ничего не происходит.

    помогите подключить
     
    #1 flin, 3 окт 2016
    Последнее редактирование: 3 окт 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Что в $db?
     
  3. flin

    flin Новичок

    С нами с:
    3 окт 2016
    Сообщения:
    4
    Симпатии:
    0
    если про запрос то я делал и вот так:
    просто в корне делал файл и выполнял его у бота прибавлялся баланс. и пробовал вставить это дело в свой обработчик но ничего


    Код (Text):
    1. mysql_connect('localhost', '22222, 'fffff');
    2. mysql_select_db("ffff");
    3.  
    4.  
    5. $rb['amount'] = 10;
    6. $rb['label'] = 1076;
    7.  
    8. mysql_query("UPDATE `users` SET balance=balance+".$rb['amount']." WHERE id=".$rb['label']);
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Думаю мало вероятно кто-то сделает это за тебя, или ты готов дать логин и пароль от яндекс денег? шутка

    Попробуй сам отладить,

    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

    Кто и где это пишет? Распиши всю цепочку запросов по документации должна пройти и перепроверь её.
     
  5. flin

    flin Новичок

    С нами с:
    3 окт 2016
    Сообщения:
    4
    Симпатии:
    0
    ясли бы я понимал я бы отладил но я не понимаю. Цепочка такова форма отправляет запрос яндексу. (форму я выше вставил). яндекс обрабатывает все параметры и присылает ответ в качестве http уведомления на обработчик (обработчик тоже выше) все в зашифрованном виде если все данные верны. то скрипт (обработчик) выполняется дальше (а дальше то я и вставляю запрос в БД)
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Как ты изучал разработку сайтов? По какой книге PHP например учил?

    Ну в целом мысль правильная. Данные там шифруются только если всё идёт по протоколу https, но на обработчик приходят данные с хэш суммой всех полей.

    Давай ты массив $_REQUEST https://secure.php.net/manual/ru/reserved.variables.request.php запишешь в файле обработчике в текстовый файл,
    массив можно превратить в текст так например
    PHP:
    1. $req = var_export($_REQUEST);
    и $req уже записать в файл.
    Там в яндексе где прописываешь обработчик, можно тест сделать, вызовет обработчик и ты получишь данные, потом склей их и посчитай sha1 от него и сравни в тот что пришёл в тестовом запросе. Какие поля участвуют вы подсчёте хеша, почитай в документации yandex https://tech.yandex.ru/money/doc/dg/reference/notification-p2p-incoming-docpage/

    Вот выдрал из старого проекта, может заработает, разберись с этим примером
    PHP:
    1. <?php
    2.         $in = $_POST;
    3.  
    4.         $key = 'yandexSecret';
    5.         $str =  "{$in['notification_type']}&{$in['operation_id']}&{$in['amount']}&{$in['currency']}&{$in['datetime']}&{$in['sender']}&{$in['codepro']}&$key&{$in['label']}";
    6.         $hash =  hash('sha1', $str);
    7.  
    8.         file_put_contents('yamoney.log', var_export([$_REQUEST, $in, $hash, $in['sha1_hash']], true));
    9.  
    10.         if ($hash === $in['sha1_hash']) {
    11.             file_put_contents('true.log', var_export([$_REQUEST, $in, $hash, $in['sha1_hash']], true));
    12.         }
    13.     }
     
  7. flin

    flin Новичок

    С нами с:
    3 окт 2016
    Сообщения:
    4
    Симпатии:
    0
    все спасибо разобрался все работает. но пришлось переделать обработчик.

    вот форма
    Код (Text):
    1. <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>
    2.            
    в лайбл у меня ид юсера

    а вот обработчик

    Код (Text):
    1. $hash = sha1($_POST['notification_type'].'&'.
    2. $_POST['operation_id'].'&'.
    3. $_POST['amount'].'&'.
    4. $_POST['currency'].'&'.
    5. $_POST['datetime'].'&'.
    6. $_POST['sender'].'&'.
    7. $_POST['codepro'].'&'.
    8. 'секрет кей'.'&'.
    9. $_POST['label']);
    10.  
    11.  
    12.  
    13.  
    14.  
    15. if ( $_POST['sha1_hash'] != $hash or $_POST['codepro'] === true or $_POST['unaccepted'] === true ) exit('error');
    16.  
    17.  
    18.  
    19.  
    20. mysql_connect('localhost', '111111', '11111);
    21. mysql_select_db("111");
    22.  
    23.  
    24. mysql_query("UPDATE `users` SET balance=balance+".$_POST['amount']." WHERE id=".$_POST['label']);
    25.  
    26.  
    27.  
    28. ?>