Для работы с сервисом Яндекс.Денеги, в частности для обработки приёма платежей удобно использовать сервис http уведомлений Яндекса. Однако, нормального описания, как это сделать мне найти не удалось. Чтобы не забыть и не потерять даром 2 дня чтения мануалов, запишу это всё здесь. Может, кто-то это найдёт когда-то и ему это пригодится в итоге.
Итак, в проекте был настроен приём оплаты заказов кредитными картами через сервис ЯД.Деньги.
https://money.yandex.ru/get
Однако, выяснилось, что получить информацию от Яндекса и обработать приём платежа на сайте не так уж и просто.
Указываемый во всех запросах параметр successURL — далеко не то, что логично следует из названия.
На первый взгляд, по логике вещей, нужно просто передать в этом параметре обратный url с хешем операции и при вызове этого url’а Яндексом и обработать операцию.
Но оказалось, что данный url Яндекс не вызывает, а устанавливает на ссылке «Вернуться в магазин» в любом случае, даже в случае отмены платежа клиентом. Кроме того, данный url вообще не будет вызван, если клиент просто закроет окно обработки платежа, после оплаты. Таким образом, этот параметр не подходит для обработки платежей. а как всё просто казалось вначале))
Покопавшись в интерфейсе Яндекса, были найдены так называемые http уведомления. Это http запросы,
которые как раз автоматически вызываются при совершении операций по оплате. Вот оно! Но опять не тут то было!
Яндекс вызывает http запрос при совершении любой операции, но операция не идентифицируется.
В запросе магазину передаётся несколько параметров:
https://tech.yandex.ru/money/doc/dg/reference/notification-p2p-incoming-docpage/
Однако, в них нет ничего, что могло бы идентифицировать оплату за конкретный заказ и следовательно,
опять обработать заказ нельзя.
Для получения детальной информации Яндекс предлагает дополнительно вызвать запрос «operation-details«, в котором и будет вся необходимая информация. Вот тут и начинаются пляски с бубном!
Запрос к API «operation-details» можно вызвать только при наличии особого токена «access-token«.
Этот токен, вообще-то, может получить разработчик приложений, который решил в своём приложении начать принимать оплату через Яндекс. Поэтому, первым делом мы должны прикинутся разработчиками и зарегистрировать новое приложение:
https://money.yandex.ru/myservices/new.xml
Называем его как хотим, проверять никто не будет.
При регистрации обязательно указываем «использовать проверку подлинности» — OAuth2 client_secret.
После регистрации мы увидим 2 нужных нам параметра: «Идентификатор приложения» и «OAuth2 client_secret«.
Это две длинные строки цифр и букв. Они понадобятся для получения токена.
Далее, редактируем поле «Redirect URI» нашего «приложения» — вписываем туда адрес скрипта на нашем сайте, который будет получать и обрабатывать ответы Яндекса для получения токена.
Пусть это будет скрипт http:_//ваш сайт/ya_token.php
Обратите внимание — именно этот же скрипт должен быть указан в настройках http уведомлений! Они сравниваются и если не будут совпадать, токен Вы не получите!) Далее, перед тем, как создать этот скрипт нужно понять, как происходит авторизация на Яндексе.
1. Вы запрашиваете у Яндекса попытку авторизации приложения, указав «Идентификатор приложения» и некоторые дополнительные параметры. Для этого создадим второй скрипт. Пусть он будет называться http:_//ваш сайт/ya_auth.php
2. Яндекс, если запрос на авторизацию верен, отвечает на «Redirect URI» токеном авторизации. Это временный токен, срок действия которого менее 1 минуты.
3. Получив токен авторизации Вы должны запросить в течении этой минуты у Яндекса токен доступа, тот самый access_token, который нужен для получения расширенной информации по операциям, т.е. для выполнения запросов «operation-details«.
Итак, пишем сначала простой скрипт (php) запроса авторизации — ya_auth.php
———————————————- ya_auth.php —————————————————
$a_url = "https:_//money.yandex.ru/oauth/authorize";
if($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, $a_url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, "client_id={Идентификатор приложения}&response_type=code&redirect_uri={http:_//ваш сайт/ya_token.php}&scope=account-info operation-details");
$out = curl_exec($curl);
curl_close($curl); }
———————————————- ya_auth.php —————————————————
Поле {Идентификатор приложения} — меняете на идентификатор вашего приложения.
Поле {http:_//ваш сайт/ya_token.php} — меняете на путь к скрипту получения токена на вашем сайте.
Ответ будет приходить именно туда!
Обратите внимание, после запуска этого скрипта ответ будет получен 302 редиректом, поэтому обязательна опция CURLOPT_FOLLOWLOCATION, а также запрос идёт по ssl, поэтому обязательны CURLOPT_SSL_VERIFYPEER и CURLOPT_SSL_VERIFYHOST.
В параметрах запроса мы запрашиваем права на доступ к разной информации: scope=account-info operation-details.
Подробнее о правах — https://tech.yandex.ru/money/doc/dg/concepts/protocol-rights-docpage/
После запуска скрипта Вы будите перенаправлены на страницу авторизации, где нужно ввести свои данные, т.е. данные от того аккаунта, в котором есть Ваш Яд.Кошелёк на который Вы будите принимать платежи. Естественно, на все дальнейшие вопросы Яндекса отвечать нужно ДА!!!))
СТОП! Этот скрипт запускать рано! У нас ещё нет обработчика)
Итак, пишем (php) ya_token.php
———————————————- ya_token.php —————————————————
$g_url = "https:_//money.yandex.ru/oauth/token";
if($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, $g_url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, "code=".$_GET["code"]."&client_id={Идентификатор приложения}&grant_type=authorization_code&redirect_uri={http:_//ваш сайт/ya_token.php}&client_secret={OAuth2 client_secret}");
$out = curl_exec($curl);
curl_close($curl); }
———————————————- ya_token.php —————————————————
Поле {Идентификатор приложения} — меняете на идентификатор вашего приложения.
Поле {http:_//ваш сайт/ya_token.php} — меняете на путь к скрипту получения токена.
Поле {OAuth2 client_secret} — меняете на OAuth2 client_secret Вашего приложения.
Вот теперь запускаем ya_auth.php !!!
В результате Вы получаете в ya_token.php ответ Яндекса в формате json с полем access_token и очень длинной последовательностью символов, которая и является тем самым нужным нам токеном. Обрабатывать json мне было лень, да и толку в этом не было)
Токен действует 3 года!
А что же дальше?
Теперь нужно использовать этот токен для запросов к API Яндекса, в частности для выполнения нужного нам «operation-details«.
Но как передать этот токен в запросе?
Я не нашёл ничего лучше (и проще) как поместить его в заголовок запроса curl.
Итак, финальный скрипт, который получает информацию об операции:
————————————————————————————————————
$token = «Ваш токен»;
$g_url = «https:_//money.yandex.ru/api/operation-details»;
$header = array();
$header[] = «Authorization: Bearer «.$token;
if($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, $g_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, «operation_id={id операции}»b);
$out = curl_exec($curl);
curl_close($curl);
$out = json_decode($out);
echo $out->{«operation_id»};
echo $out->{«amount»};
echo $out->{«status»};
echo $out->{«message»}; }
————————————————————————————————————
Вместо «Ваш токен», понятно указывается Ваш токен))))
Вместо {id операции} — указывает id конкретного платежа, который Вам передаётся при http уведомлении.
Итак, механизм проверки получается такой:
1. После платежа Вам приходит http уведомление, в котором Яндекс сообщает некоторую информацию, в том числе id операции.
2. Вы сохраняете id операции и выполняете «operation-details«, используя полученный Вами токен (помним, он действует 3 года!) и id операции.
3. Обрабатываете ответ, он приходит в формате json и проводите платёж у себя на сайте.
Мне для обработки платежа нужен был только номер заказа, который передавался на Яндекс в поле message,
поэтому я получаю его, статус платежа, сумму операции и id операции. А Вы можете проявить фантазию))
Ну, вот наверно и всё))
Не забудьте убрать чёрточки из адресов страниц Яндекса https:_// и удалить с сайта ya_auth.php и ya_token.php после того, как Вы получили и сохранили токен.