Пошаговая настройка Яндекс.Деньги с HTTP уведомлениями

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

Сегодня мы рассмотрим настройку http уведомлений для сервиса Яндекс.Деньги. С помощью этого, мы без лишних заморочек и документов (ака Робокасса) можем настроить автоматический прием платежей на нашем сайте.

Для начала рассмотрим HTML форму. Она простая, все тэги я прокомментирую.

<!--Атрибут action ссылается на API Яндекс Денег-->
<form method="POST" action="https://money.yandex.ru/quickpay/confirm.xml">
 
<!--Номер кошелька в системе Яндекс Денег-->
<input type="hidden" name="receiver" value="410000000000000">
 
<!--Название платежа, будет отображаться при переходе на форму оплаты в системе Яндекс Деньги-->
<input type="hidden" name="formcomment" value="Посильная помощь для dkrylov.com ;)">
 
<!--Параметр, который после успешной оплаты передается в наш скрипт. Тут может быть ID покупки. Мне нужно было передать несколько параметров, я делал это так - ID:123|account:123 и потом в скрипте, который принимает этот параметр разрезал с помощью функции explode-->
<input type="hidden" name="label" value="16078">
 
<!--Тип формы, может принимать значения shop (универсальное), donate (благотворительная), small (кнопка)-->
<input type="hidden" name="quickpay-form" value="shop">
 
<!--Назначение платежа, это покупатель видит на сайте Яндекс Денег при вводе платежного пароля (длина 150 символов)-->
<input type="hidden" name="targets" value="Посильная помощь для dkrylov.com ;)">
 
<!--Сумма платежа, валюта - рубли по умолчанию, лучше указывать с копейками.-->
<input type="hidden" name="sum" value="100.00" data-type="number">
 
<!--Должен ли Яндекс запрашивать ФИО покупателя-->
<input type="hidden" name="need-fio" value="false">
 
<!--Должен ли Яндекс запрашивать email покупателя-->
<input type="hidden" name="need-email" value="true">
 
<!--Должен ли Яндекс запрашивать телефон покупателя-->
<input type="hidden" name="need-phone" value="false">
 
<!--Должен ли Яндекс запрашивать адрес покупателя-->
<input type="hidden" name="need-address" value="false">
 
<!--Метод оплаты, PC - Яндекс Деньги, AC - банковская карта. Если оставить пустым, то пользователь будет сам выбирать способ оплаты.-->
<input type="hidden" name="paymentType" value="" />
 
<!--Куда перенаправлять пользователя после успешной оплаты платежа. Тут можно сделать страничку "Спасибо за Ваш платеж"-->
<input type="hidden" name="successURL" value="http://dkrylov.com/">
<button>Оплатить</button> 
</form>

Следующий шаг - Настройка HTTP-Уведомлений.

Сейчас сделаем настройку для нашего кошелька в системе Яндекс.Деньги. Для этого переходим по ссылке: https://sp-money.yandex.ru/myservices/online.xml.

Тут мы получаем секретный код, который понадобиться для формирования ключа проверки в нашем скрипте, который будет принимать уведомления. Ну и естественно ссылка на сам скрипт, на который Яндекс.Деньги будут отсылать уведомления, после успешной оплаты.

Есть небольшая хитрость. Если сайт не поддерживает протокол https://, то личные данные пользователя (email, адрес, фио) которые отсылаются из формы яндекса будут пустыми.

Настройка HTTP-уведомлений Яндекс.Деньги

А теперь рассмотрим сам PHP-скрипт.

<?
$secret_key = 'ALhJG3SfguqTg7kjuoiL4REA'; // секретное слово, которое мы получили в в настройках http-уведомлений на сайте Яндекс Денег.
 
// Параметры, которые Вам пригодятся
// $_POST['operation_id'] - номер операции (огромное число, в БД советую создать поле varchar 255)
// $_POST['amount'] - количество денег, которые поступят на счет получателя
// $_POST['withdraw_amount'] - количество денег, которые будут списаны со счета покупателя
// $_POST['datetime'] - тут понятно, дата и время оплаты
// $_POST['sender'] - если оплата производится через Яндекс Деньги, то этот параметр содержит номер кошелька покупателя
// $_POST['label'] - лейбл, который мы указывали в форме оплаты
// $_POST['email'] - email покупателя (доступен только при использовании https://)

// Генерация ключа, для проверки подлинности пришедших к нам данных
$sha1 = sha1( $_POST['notification_type'] . '&'. $_POST['operation_id']. '&' . $_POST['amount'] . '&643&' . $_POST['datetime'] . '&'. $_POST['sender'] . '&' . $_POST['codepro'] . '&' . $secret_key. '&' . $_POST['label'] );
 
if ($sha1 != $_POST['sha1_hash'] ) {
// Код на случай если ключи не совпадают...значит либо пришло чтото левое,
//либо Вы не правильно сгенерировали ключ
} else {
// тут код на случай, если проверка прошла успешно
// Делаем чтото в базе, записываем историю, отсылаем пользователю уведомление об успешной покупке и т.п.
}
?>

Полный список передаваемых параметров можно прочитать в документации Яндекс.