Изначально автоматический прием Яндекс.Денег мне казался очень сложным. Но как выяснилось там все проще чем у WebMoney.
Шаг 1: Создаем HTML-форму для приема платежей
Сам код формы можно сгенерировать тут money.yandex.ru/embed/quickpay/shop.xml Но поскольку наша цель принимать платежи автоматически, то в HTML-форму нужно добавить id счета, который клиент нам оплачивает. И скорее всего, мы хотим получать полную сумму счета, т.е. хотим комиссию Яндекса 0.05% возложить на клиента, поэтому в результате HTML-форма
в нашем php-скрипте будет генериться так:
$sum = 1.005*$i->itsum; print <<<HTML <p> Сумма платежа указана с учетом комиссии Яндекс.Денег 0.5%. Если вы будете менять сумму, пожалуйста, учтите, что к нам поступит сумма/1.005. Также в целях упрощения расчетов, у нас ведется учет всех сумм в целых числах, поэтому копейки будут обнулены. </p> <p> <b>Платежи с кодом протекции не могут быть зачислены online, поэтому просьба отправлять без кода протекции.</b> </p> <iframe allowtransparency="true" src="https://money.yandex.ru/embed/shop.xml?uid=4100138353971&writer=seller&targets=i$i->id&default-sum=$sum&button-text=01&hint=" frameborder="0" height="163" scrolling="no" width="450"></iframe> HTML;
Обратите внимание на две переменных $sum и $i->id
Также мы добавили предупреждение, что платежи с кодом протекции зачислены автоматически быть не могут, т.к. наша система, код протекции никак угадать не может
Реализовав данную форму у себя на сайте вы уже можете получать деньги на свой Яндекс.Кошелек и видеть по какому номеру счета был сделан платеж. Для автоматического зачисления платежа нужно выполнить следующие шаги.
Шаг 2: Загрузить PHP-библиотеку для работы с API Яндекс.Денег
Библиотеку можно взять тут github.com/melnikovdv/PHP-Yandex.Money-API-SDK
Далее ее нужно разархивировать и скопировать на ваш сайт, например, в директорию /invoice/ym/
У вас в директории /invoice/ym/ должны появиться соответственно папки lib и sample
Шаг 3: Зарегистрировать приложение для работы с API Яндекс.Денег
Это можно сделать тут sp-money.yandex.ru/myservices/new.xml
Например, у нас следующие значения:
Название вашего приложения:
(его будут видеть пользователи, выдавая приложению права) ITSoft
Адрес вашего сайта: itsoft.ru
Redirect uri: itsoft.ru/invoice/ym/sample/index.php
(адрес, на который сервер Яндекс.Денег осуществит редирект после того, как пользователь разрешит или запретит доступ; соответствует параметру redirect_uri в документации)
Использовать проверку подлинности приложения Да
— Зарегистрировав приложение, вы увидите «Идентификатор приложения» и «OAuth2 client_secret:»
Если вы их вдруг потеряете, то их всегда можно получить в настройках вашего аккаунта Яндекс.Деньги в разделе Мои приложения sp-money.yandex.ru/tunes.xml?from=bal, справа кнопка «Настроить».
Идентификатор приложения и «OAuth2 client_secret» необходимо скопировать в файлик /invoice/ym/sample/consts.php
Там же инициализировать REDIRECT_URI в значение yourdomain.ru/invoice/ym/sample/index.php
Шаг 4: Получить token для работы с вашим Яндекс.Кошельком при помощи PHP-библиотеки
В скрипте yourdomain.ru/invoice/ym/sample/index.php необходимо закомментировать
следующие строчки:
//см. строки 10-16 и комментируйте как показано ниже, нам эти операции не понадобятся, поэтому не будем запрашивать на них разрешение
$scope = "account-info " . "operation-history " . "operation-details " /*. "payment.to-account(\"410011161616877\",\"account\").limit(30,10) " . "payment.to-pattern(\"337\").limit(30,10) " . "money-source(\"wallet\",\"card\") " */; $authUri = YandexMoneyNew::authorizeUri(CLIENT_ID, REDIRECT_URI, $scope);
И комментируйте строки с 82й по 131ю.
Теперь надо в браузере вызвать скрипт yourdomain.ru/invoice/ym/sample/index.php, авторизоваться и сохранить полученный токен. Будьте внимательны, копируйте токен целиком, он очень длинный.
Мы уже близки к победе.
Шаг 5: Настройка callback-скрипта, котрый Яндекс.Деньги будут вызывать при получении платежа на ваш кошелек
На этой странице sp-money.yandex.ru/myservices/online.xml вы должны ввести адрес скрипта, например: itsoft.ru/invoice/ym/payment.php
Вы можете нажать кнопку протестировать, правда, у вас пока нет скрипта обработчика, да тестировать надо оплачивая с какого-нибудь кошелька 1 рубль на вашем сайте.
Поставьте галочку «Отправлять уведомления» нажмите Сохранить.
Вам понадобится секретный ключ с этой страницы. Сохраните его.
Шаг 6: Обработка и зачисление платежей
Скрипт itsoft.ru/invoice/ym/payment.php у нас выглядит примерно так, я убрал ряд деталей, которые относятся исключительно к обработке заказов клиентов.
<? require_once($_SERVER["DOCUMENT_ROOT"]."/conf/config_db_ro_without_auth1.php"); require_once(dirname(__FILE__) . '/lib/YandexMoney.php'); require_once(dirname(__FILE__) . '/sample/consts.php'); main(); function main() { ob_start(); print_r($_POST); $message = ob_get_contents(); ob_end_clean(); //mail('igor@itsoft.ru', 'Notification details', $message); if($_POST['codepro']!='false') return mail('igor@itsoft.ru', 'We got YM with protection code', "We cannot automatically get this payment.\n\n $message"); $str=$_POST['notification_type'] . '&' . $_POST['operation_id'] . '&' . $_POST['amount'] . '&' . $_POST['currency'] . '&' . $_POST['datetime'] . '&' . $_POST['sender'] . '&' . $_POST['codepro'] . '&секретный код со страницы https://sp-money.yandex.ru/myservices/online.xml&' . $_POST['label']; if(sha1($str)!=$_POST['sha1_hash']) return mail('igor@itsoft.ru', 'Fake notification', $message); $ym = new YandexMoneyNew(CLIENT_ID); $token='токен полученный на Шаге 4'; $resp = $ym->operationDetail($token, $_POST['operation_id']); $message .= "\r\n". var_export($_POST, 1) . var_export($resp); if($resp->isSuccess()) mail('igor@itsoft.ru', 'We got payment', $message . "\n\nmessage=" . $resp->getMessage() . "\n\ndetail=" . $resp->getDetail() . "\n\ntitle=" . $resp->getTitle()); else mail('igor@itsoft.ru', 'We did not get payment... Hm... Why?', $message); $operation_id = $_POST['operation_id']; $sender = $_POST['sender']; $amount = $_POST['amount']; $datetime = $_POST['datetime']; preg_match('/i(\d+);/', $resp->getMessage(), $m); $invoice_id = $m[1]; $r=mysql_query("INSERT INTO it_payment_ym VALUES('$operation_id', '$sender', '$amount', '$datetime', '$invoice_id')"); if(!$r) mail('igor@itsoft.ru', 'Problem to insert in it_payment_ym', $message . mysql_error()); }//main ?>
Ну собственно и все. Будут вопрос, задавайте тут, постараюсь всем ответить. Если вам понравилось, то можете можете прислать мне денег на пиво на мой Яндекс.Кошелек 4100138353971. 🙂
ссылка на оригинал статьи http://habrahabr.ru/post/160969/
Добавить комментарий