Описываю личный опыт настройки платежей через Яндекс.Деньги и взаимодействия через API с системой Я.Д. для автоматического изменения статуса оплаты заказа после успешного платежа банковской картой или Я.Д на номер кошелька Я.Д.
Итак опишу все по порядку с первого до последнего шага, предполагается что кошелек у Вас уже есть (для отсутствия ограничений по сумме платежа и сумме хранимых денег, рекомендую перевести кошелек в статус "Профессионал", как это сделать читайте в документации Я.Д.).
Приступим:
ВАЖНО: Вам понадобится домен и хостинг с поддержкой PHP и FTP доступом, куда будут отправляться уведомления от Я.Д и где они будут обрабатываться.
1.На данном хостинге разместите файл с расширением .php, проверьте чтобы он был доступен по ссылке http://ваш_домен/ваш_файл.php
2. В редакторе шаблонов, в шаблон "Просмотр заказов" внесите следующие исправления
В конце файла, перед строчкой
<p><a class="button" href="http://{NET_DOMAIN}/" class="back-link">Перейти на главную</a></p>вставьте код
{% IFNOT ORDER_IS_PAYMENT=1 %} <!-- Форма оплаты отобразится только при статусе заказа "не оплачен" --> {% IF ORDER_PAYMENT_ID = xxxxxx %} <!-- Добавьте новый способ оплаты в настройках и добавьте его ID вместо XXXXXX --> <h2 class="orderstageH">Оплата заказа онлайн</h2> <form method="POST" action="https://money.yandex.ru/quickpay/confirm.xml"> <input type="hidden" name="receiver" value="xxxxxxxxxxxxxx"> <!-- Номер вашего кошелька Я.Д. --> <input type="hidden" name="formcomment" value="Оплата заказа {ORDER_NUM}"> <input type="hidden" name="short-dest" value="Оплата заказа {ORDER_NUM}"> <input type="hidden" name="label" value="{ORDER_NUM}"> <!-- Не меняйте данное значение, это важно --> <input type="hidden" name="quickpay-form" value="donate"> <input type="hidden" name="targets" value="Оплата заказа {ORDER_NUM}"> <input type="hidden" name="sum" value="{ORDER_SUM}" data-type="number"> <input type="hidden" name="comment" value="Оплата от {ORDER_CONTACT_PERSON}"> <input type="hidden" name="need-fio" value="false"> <input type="hidden" name="need-email" value="false"> <input type="hidden" name="need-phone" value="false"> <input type="hidden" name="need-address" value="false"> <table class="contact-table succs"> <tbody> <tr> <td ><label><input type="radio" name="paymentType" value="AC"> Картой</input></label></td> <td class="cellR"><label><input type="radio" name="paymentType" value="PC"> Я.Деньги</input></label></td> </tr> </tbody> </table> <input type="submit" name="submit-button" value="Оплатить" class="oplatit"><br/><br/> </form> {%ENDIF%} {%ENDIF%}Стили для отображения таблицы можете задать по своему усмотрению
3. Перейдите по адресу http://ваш_им/admin/api и добавьте свое приложение (полный доступ к разделу заказы), скопируйте полученный ключ доступа (понадобится на шаге 5)
4. Перейдите по адресу https://sp-money.yan...ices/online.xml для настройки HTTP-уведомлений от Я.Д. и укажите в качестве адреса для уведомлений http://ваш_домен/ваш_файл.php поставьте галочку отправлять уведомления и скопируйте "Секрет" по кнопке "Показать секрет"
5. Отредактируйте ваш_файл.php добавив в него следующий код:
<? $notification_secret = "xxxxxxxxxxxxxxxxxxx"; //сюда вставить "Секрет" Я.Д. полученный на шаге 4 $notification_type = $_POST["notification_type"]; $operation_id = $_POST["operation_id"]; $amount = $_POST["amount"]; $currency = $_POST["currency"]; $datetime = $_POST["datetime"]; $sender = $_POST["sender"]; $codepro = $_POST["codepro"]; $label = $_POST["label"]; $sha1_hash = $_POST["sha1_hash"]; $test_notification = $_POST["test_notification"]; $hash = $notification_type . '&' . $operation_id . '&' . $amount . '&' . $currency . '&' . $datetime . '&' . $sender . '&' . $codepro . '&' . $notification_secret . '&' . $label; //формируем хеш для проверки что уведомление не поддельное $sha1 = hash("sha1", $hash); //кодируем в SHA1 //Ниже - проверка на валидность уведомления и запрос на изменение статуса оплаты если все верно if ( $sha1 == $sha1_hash ) { if ($label != '') { $url = 'http://ваш_им/api/v1/orders/update/'. $label; // вместо ваш_им вставьте домен вашего интернет-магазина $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( 'secret_key' => 'xxxxxxxxxxxxxxxxxxxxxx', // код доступа приложения созданного на шаге 3 'form[order_payment]' => 1, ))); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $resultSrc = curl_exec ($ch) or die(curl_error($ch)); $result = json_decode($resultSrc , true); echo $result; echo $resultSrc; echo curl_error($ch); curl_close ($ch); } } else { echo 'error'; } ?>
ИТОГ:
Что мы получили. Клиент создает закза, выбирает онлайн оплату, подтверждает заказ и на странице просмотра заказа выбирает способ оплаты и оплачивает заказ. После оплаты он увидит в статусе заказа "Оплачено". Форма онлайн оплаты на странице просмотра заказа со статусом "Оплачен" отображаться не будет. В администрировании заказов Вы увидите новый заказ со статусом оплачен. Удобно и Вам и клиенту.
ЕСЛИ ОБНАРУЖИТЕ ОШИБКИ В КОДЕ ИЛИ БУДУТ ИНТЕНРЕСНЫЕ ДОПОЛНЕНИЯ ИЛИ ВОПРОСЫ, ОБЯЗАТЕЛЬНО ПИШИТЕ, БУДЕМ ВМЕСТЕ СОВЕРШЕНСВОВАТЬ НАШИ ИНТЕРНЕТ-МАГАЗИНЫ!
КАК БЛАГОДАРНОСТЬ, БУДУ ПРИЗНАТЕЛЬНА ЕСЛИ РАЗМЕСТИТЕ ССЫЛКУ НА МОЙ ИНТЕРНЕТ МАГАЗИН HTTP://SHELLAC.WS НА СВОИХ СТРАНИЦАХ В СОЦ СЕТЯХ И ПОДЕЛИТЕСЬ ЕЙ С ДРУЗЬЯМИ!
Сейчас работаю над системой автоматического расчета стоимости доставки в зависимости от веса и оценочной стоимости груза. Если у кого-то есть наработки по данной теме, прошу поделиться!