Пошаговая настройка Яндекс.Деньги с 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, адрес, фио) которые отсылаются из формы яндекса будут пустыми.
А теперь рассмотрим сам 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 { // тут код на случай, если проверка прошла успешно // Делаем чтото в базе, записываем историю, отсылаем пользователю уведомление об успешной покупке и т.п. } ?>
Полный список передаваемых параметров можно прочитать в документации Яндекс.