Pull to refresh

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

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

Этап 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 принципиально не содержит никаких проверок, так как я просто хотел показать как именно оно все работает. Всем спасибо за внимание!
Tags:
Hubs:
You can’t comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.