Как стать автором
Обновить

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

Прочитал текущую статью и понял что не все понимают как правильно это сделать. На самом деле не нужны никакие библиотеки для обычного приема денег с оповещением на сайт. А вся интеграция укладывается в три этапа.

Этап 1


Настройка на стороне Яндекс.Деньги

Заходим сюда: https://sp-money.yandex.ru/myservices/online.xml
— вводим адрес, по которому система Яндекс.Деньги должна стучаться, когда поступит платеж на ваш кошелек.
— смотрим секрет и записываем его в свой скрипт для приема (ниже есть пример).
— ставим галочку «Отправлять уведомления»
— нажимаем сохранить.

Все. Настройка со стороны яндекс окончена.

Этап 2


Генерация формы оплаты для вашего сайта

Заходим сюда: https://money.yandex.ru/embed/quickpay/shop.xml
Генерируем любую понравившуюся Вам форму. Можно также использовать кнопку-приниматель и для благовторителей. Все они по своей сути абсолютно одинаковые. Получим код вида:

<iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/embed/shop.xml?account=00000000000&quickpay=shop&payment-type-choice=on&writer=seller&targets=1&targets-hint=&default-sum=&button-text=01" width="450" height="200"></iframe>

При выводе формы оплаты на вашем сайте добавляем в get-параметры фрейма параметр label, в котором указываем, например id пользователя, которому хотим пополнить баланс на вашем сайте:
стало:

<iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/embed/shop.xml?account=00000000000&quickpay=shop&payment-type-choice=on&writer=seller&targets=1&targets-hint=&default-sum=&button-text=01&label=1" width="450" height="200"></iframe>

добавили параметр label=1

Размещаем форму у себя на сайте.
Все. На этом второй этап завершен.

Необязательно использовать форму, которую предлагает яндекс. Можно создать свою у себя на сайте. Как это сделать написано здесь: https://money.yandex.ru/i/forms/guide-to-custom-p2p-forms.pdf. Меня же интересовал вопрос сделать быстро и красиво. Форма от яндекса вполне себе приличная.

Этап 3


Настройка на вашем сайте

По адресу, который Вы указали в настройках яндекса должен размещаться скрипт, который обрабатывает информацию, получаемую от сервиса яндекс.Деньги.

Скрипт для приема

Я опишу вкратце, вы его сможете настроить под себя:
<?php
$secret = '000000000000000000000'; // секрет, который мы получили в первом шаге от яндекс.
// получение данных.
$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

// дальше ваш код для обновления баланса пользователя / для вставки полученного платежа в историю платежей, например:
db_query('INSERT INTO payments (user_id, amount) VALUES('.$r['label'].', ',$r['amount']')'); // ваш запрос в базу
?>


Вот и все. Три простых шага, и Вы спокойно принимаете денюжки от ваших пользователей на вашем сайте с оповещением на сайт. Код php принципиально не содержит никаких проверок, так как я просто хотел показать как именно оно все работает. Всем спасибо за внимание!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.