Автоматический прием Яндекс.Денег на сайте на php

в 13:59, , рубрики: php, Веб-разработка, Яндекс API, яндекс.деньги, метки: ,

Документация по приему Яндекс.Денег не содержит конкретного примера на PHP, чтобы можно было максимально быстро все прикрутить, не разбираясь во всех деталях того, как работает прием Яндекс.Денег на PHP. Сделав автоматический прием Яндекс.Денег в нашей компании itsoft.ru, я хотел бы дать пошаговую инструкцию с примерами кода на PHP, чтобы значительно сэкономить время другим разработчикам.

Изначально автоматический прием Яндекс.Денег мне казался очень сложным. Но как выяснилось там все проще чем у WebMoney.

Шаг 1: Создаем HTML-форму для приема платежей

Сам код формы можно сгенерировать тут money.yandex.ru/embed/quickpay/shop.xml Но поскольку наша цель принимать платежи автоматически, то в HTML-форму нужно добавить id счета, который клиент нам оплачивает. И скорее всего, мы хотим получать полную сумму счета, т.е. хотим комиссию Яндекса 0.05% возложить на клиента, поэтому в результате HTML-форма
в нашем php-скрипте будет генериться так:

$sum = 1.005*$i->itsum;
print <<<HTML
<p>
Сумма платежа указана с учетом комиссии Яндекс.Денег 0.5%. Если вы будете менять сумму, пожалуйста, учтите, что к нам поступит
сумма/1.005. Также в целях упрощения расчетов, у нас ведется учет всех сумм в целых числах, поэтому копейки будут обнулены.
</p>
<p>
<b>Платежи с кодом протекции не могут быть зачислены online, поэтому просьба отправлять без кода протекции.</b>
</p>
<iframe allowtransparency="true"
src="https://money.yandex.ru/embed/shop.xml?uid=4100138353971&writer=seller&targets=i$i->id&default-sum=$sum&button-text=01&hint="
        frameborder="0" height="163" scrolling="no" width="450"></iframe>
HTML;

Обратите внимание на две переменных $sum и $i->id
Также мы добавили предупреждение, что платежи с кодом протекции зачислены автоматически быть не могут, т.к. наша система, код протекции никак угадать не может

Реализовав данную форму у себя на сайте вы уже можете получать деньги на свой Яндекс.Кошелек и видеть по какому номеру счета был сделан платеж. Для автоматического зачисления платежа нужно выполнить следующие шаги.

Шаг 2: Загрузить PHP-библиотеку для работы с API Яндекс.Денег

Библиотеку можно взять тут github.com/melnikovdv/PHP-Yandex.Money-API-SDK
Далее ее нужно разархивировать и скопировать на ваш сайт, например, в директорию /invoice/ym/
У вас в директории /invoice/ym/ должны появиться соответственно папки lib и sample

Шаг 3: Зарегистрировать приложение для работы с API Яндекс.Денег

Это можно сделать тут sp-money.yandex.ru/myservices/new.xml

Например, у нас следующие значения:

Название вашего приложения:
(его будут видеть пользователи, выдавая приложению права) ITSoft

Адрес вашего сайта: itsoft.ru

Redirect uri: itsoft.ru/invoice/ym/sample/index.php
(адрес, на который сервер Яндекс.Денег осуществит редирект после того, как пользователь разрешит или запретит доступ; соответствует параметру redirect_uri в документации)

Использовать проверку подлинности приложения Да
— Зарегистрировав приложение, вы увидите «Идентификатор приложения» и «OAuth2 client_secret:»
Если вы их вдруг потеряете, то их всегда можно получить в настройках вашего аккаунта Яндекс.Деньги в разделе Мои приложения sp-money.yandex.ru/tunes.xml?from=bal, справа кнопка «Настроить».

Идентификатор приложения и «OAuth2 client_secret» необходимо скопировать в файлик /invoice/ym/sample/consts.php
Там же инициализировать REDIRECT_URI в значение yourdomain.ru/invoice/ym/sample/index.php

Шаг 4: Получить token для работы с вашим Яндекс.Кошельком при помощи PHP-библиотеки

В скрипте yourdomain.ru/invoice/ym/sample/index.php необходимо закомментировать
следующие строчки:
//см. строки 10-16 и комментируйте как показано ниже, нам эти операции не понадобятся, поэтому не будем запрашивать на них разрешение

$scope = "account-info " .
        "operation-history " .
        "operation-details " /*.
        "payment.to-account("410011161616877","account").limit(30,10) " .
        "payment.to-pattern("337").limit(30,10) " .
        "money-source("wallet","card") " */;
    $authUri = YandexMoneyNew::authorizeUri(CLIENT_ID, REDIRECT_URI, $scope);

И комментируйте строки с 82й по 131ю.

Теперь надо в браузере вызвать скрипт yourdomain.ru/invoice/ym/sample/index.php, авторизоваться и сохранить полученный токен. Будьте внимательны, копируйте токен целиком, он очень длинный.

Мы уже близки к победе.

Шаг 5: Настройка callback-скрипта, котрый Яндекс.Деньги будут вызывать при получении платежа на ваш кошелек

На этой странице sp-money.yandex.ru/myservices/online.xml вы должны ввести адрес скрипта, например: itsoft.ru/invoice/ym/payment.php

Вы можете нажать кнопку протестировать, правда, у вас пока нет скрипта обработчика, да тестировать надо оплачивая с какого-нибудь кошелька 1 рубль на вашем сайте.

Поставьте галочку «Отправлять уведомления» нажмите Сохранить.

Вам понадобится секретный ключ с этой страницы. Сохраните его.

Шаг 6: Обработка и зачисление платежей

Скрипт itsoft.ru/invoice/ym/payment.php у нас выглядит примерно так, я убрал ряд деталей, которые относятся исключительно к обработке заказов клиентов.

<?
require_once($_SERVER["DOCUMENT_ROOT"]."/conf/config_db_ro_without_auth1.php");
require_once(dirname(__FILE__) . '/lib/YandexMoney.php');
require_once(dirname(__FILE__) . '/sample/consts.php');



main();
function main()
{
ob_start();
print_r($_POST);
$message = ob_get_contents();
ob_end_clean();

//mail('igor@itsoft.ru', 'Notification details', $message);

if($_POST['codepro']!='false')
 return mail('igor@itsoft.ru', 'We got YM with protection code', "We cannot  automatically get this payment.nn $message");


$str=$_POST['notification_type'] . '&' .
        $_POST['operation_id'] . '&' .
        $_POST['amount'] . '&' .
        $_POST['currency'] . '&' .
        $_POST['datetime'] . '&' .
        $_POST['sender'] . '&' .
        $_POST['codepro'] . '&секретный код со страницы https://sp-money.yandex.ru/myservices/online.xml&' .
        $_POST['label'];
 
if(sha1($str)!=$_POST['sha1_hash'])
   return mail('igor@itsoft.ru', 'Fake notification', $message);
 

$ym = new YandexMoneyNew(CLIENT_ID);

$token='токен полученный на Шаге 4';
$resp = $ym->operationDetail($token, $_POST['operation_id']);

$message .= "rn". var_export($_POST, 1) . var_export($resp);

if($resp->isSuccess())
 mail('igor@itsoft.ru', 'We got payment', $message . "nnmessage=" . $resp->getMessage() .
      "nndetail=" . $resp->getDetail() .
      "nntitle=" . $resp->getTitle());
else
 mail('igor@itsoft.ru', 'We did not get payment... Hm... Why?', $message);

$operation_id = $_POST['operation_id'];
$sender = $_POST['sender'];
$amount = $_POST['amount'];
$datetime = $_POST['datetime'];
preg_match('/i(d+);/', $resp->getMessage(), $m);
$invoice_id = $m[1];

$r=mysql_query("INSERT INTO it_payment_ym VALUES('$operation_id', '$sender', '$amount', '$datetime', '$invoice_id')");
if(!$r)
 mail('igor@itsoft.ru', 'Problem to insert in it_payment_ym', $message . mysql_error());


}//main
?>

Ну собственно и все. Будут вопросы, задавайте тут, постараюсь всем ответить. Если вам понравилось, то можете можете прислать мне денег на пиво на мой Яндекс.Кошелек 4100138353971. :)

Автор: itsoft

Источник


  1. иван:

    Ещё одна непонятная статья по этой интересной теме.
    ” Автоматический приём яндекс-денег”
    У меня целая колекция таких статей. Одна витееватей другой.

    Люди добрые, напишите кто нибудь понятный видеоурок
    по данной теме, можно платный.Популярность интернетплатежей растёт.
    А упрощённого разьяснения нет. Или дайте ссылку где растолковано всё.
    Могу сформулировать какой платный урок будет популярен в сети,
    если спецы по этой теме найдуться.

  2. Андрей:

    Подскажите пожалуйста как это заставить работать.

    f(“order_total”),2);?>

    Форма открывается, но в поле где должна быть сумма заказа цифрами отображается имя переменной $summa

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js