Pull to refresh

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

Reading time 4 min
Views 73K
Документация по приему Яндекс.Денег не содержит конкретного примера на PHP, чтобы можно было максимально быстро все прикрутить, не разбираясь во всех деталях того, как работает прием Яндекс.Денег на PHP. Сделав автоматический прием Яндекс.Денег для нашего дата-центра, я хотел бы дать пошаговую инструкцию с примерами кода на 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(dirname(__FILE__) . '/lib/YandexMoney.php');
require_once(dirname(__FILE__) . '/sample/consts.php');




if($_POST['codepro']!='false')
{
//платёж с кодом протекции, автоматически его принять нельзя
exit;
}


$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'])
{
//нас ломают
exit;
}
 

$ym = new YandexMoneyNew(CLIENT_ID);

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



if($resp->isSuccess())
{

$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];

//добавляем платёж

}

?>


Ну собственно и все. Будут вопросы, задавайте тут, постараюсь всем ответить.

PS
Эта статья посвящена тому, как быстро прикрутить прием Яндекс.Денег. Код PHP-скрипта каждый может переписать в зависимости от своих задач и потребностей.
Tags:
Hubs:
-17
Comments 45
Comments Comments 45

Articles