Описан процесс оплаты через сервис ЮKassa с помощью прямых запросов к API через PHP cURL. Также есть уже готовый SDK (с установкой через Composer).
Настройка магазина в ЮKassa
В Юкассе потребуется создать два магазина, один основной, второй тестовый для проверки интеграции.
Далее потребуется сгенерировать секретный ключ для доступа к API в разделе «Интеграция» – «Ключи API».
Формирование ссылки на оплату
Для того чтобы направить пользователя на оплату, нужно получить ссылку, для этого отправляется запрос в API с данными платежа (сумма, ссылка для возврата после оплаты, комментарий и внутренний номер заказа).
В запросе к API нужно передать значение идемпотентности, т.е. уникальное значение операции на стороне сайта. Без этого значения API возвращает ошибку, сгенерировать ключ можно с помощью функции:
function gen_uuid() { return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0x0fff ) | 0x4000, mt_rand( 0, 0x3fff ) | 0x8000, mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) ); }
Отправка платежных данных:
$data = array( 'amount' => array( 'value' => 1000, 'currency' => 'RUB', ), 'capture' => true, 'confirmation' => array( 'type' => 'redirect', 'return_url' => 'https://example.com/success', ), 'description' => 'Заказ №1', 'metadata' => array( 'order_id' => 1, ) ); $data = json_encode($data, JSON_UNESCAPED_UNICODE); $ch = curl_init('https://api.yookassa.ru/v3/payments'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_USERPWD, 'ЛОГИН:КЛЮЧ'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Idempotence-Key: ' . gen_uuid())); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, true); print_r($res);
Ответ API:
Array( [id] => xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [status] => pending [paid] => [amount] => Array( [value] => 1000.00 [currency] => RUB ) [confirmation] => Array( [type] => redirect [confirmation_url] => https://yoomoney.ru/checkout/payments/v2/contract?orderId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ) [created_at] => 2021-05-01T05:13:52.233Z [description] => Заказ №1 [metadata] => Array ( [order_id] => 1 ) [recipient] => Array ( [account_id] => 123456 [gateway_id] => 12345678 ) [refundable] => [test] => 1 )
В ответе содержится номер заказа в Юкассе, его необходимо сохранить и ссылка на форму оплаты.
Редиректим пользователя на форму оплаты:
header('Location: ' . $res['confirmation']['confirmation_url'], true, 301);
exit();
Чтобы завершить платеж нужно ввести реквизиты тестовой карты. После чего, платежная система вернет пользователя на указанный return_url без параметра статуса оплаты.
У Юкассы есть возможность уведомлений о платежах, подробнее на https://yookassa.ru/developers/using-api/webhooks
Получение данных о платеже
Получить данные платежа и его статус можно по его ID, отправив запрос:
$order_id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; $ch = curl_init('https://api.yookassa.ru/v3/payments/' . $order_id); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_USERPWD, 'ЛОГИН:КЛЮЧ'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Idempotence-Key: ' . gen_uuid())); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, true); print_r($res);
Результат:
Array( [id] => xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [status] => succeeded [paid] => 1 [amount] => Array( [value] => 1000.00 [currency] => RUB ) [authorization_details] => Array( [rrn] => 2494615456943 [auth_code] => 592673 ) [captured_at] => 2021-05-01T11:36:41.750Z [created_at] => 2021-05-01T11:36:06.124Z [description] => Заказ №1 [income_amount] => Array( [value] => 1000.50 [currency] => RUB ) [metadata] => Array( [order_id] => 1 ) [payment_method] => Array( [type] => bank_card [id] => xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [saved] => [card] => Array( [first6] => 555555 [last4] => 4477 [expiry_month] => 11 [expiry_year] => 2023 [card_type] => MasterCard [issuer_country] => US ) [title] => Bank card *5555 ) [recipient] => Array( [account_id] => 123456 [gateway_id] => 12345678 ) [refundable] => 1 [refunded_amount] => Array( [value] => 0.00 [currency] => RUB ) [test] => 1 )
Статусы платежа
pending
– платеж создан и ожидает действий от пользователя.waiting_for_capture
– платеж оплачен, деньги авторизованы и ожидают списания (при двухстадийной оплате).succeeded
– платеж успешно завершен.canceled
– платеж отменен