В данной статье описан процесс оплаты через сервис ЮKassa с помощью прямых запросов к API через PHP cURL. Также существует уже готовый SDK (с установкой через Composer).
В юкассе потребуется создать два магазина, один основной, второй тестовый для проверки интеграции.
Далее потребуется сгенерировать секретный ключ для доступа к 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
)
В ответе содержится номер заказа в Юкассе, его необходимо сохранить и ссылка на форму оплаты.
Редиректим пользователя на форму оплаты:

Чтобы завершить платеж нужно ввести реквизиты тестовой карты. После чего, платежная система вернет пользователя на указанный 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
– платеж отменен
Буду очень благодарен!
Array
(
[type] => error
[id] => 0a38b760-0af2-4224-8888-e0fa8fda23ec
[code] => invalid_request
[description] => Receipt is missing or illegal
[parameter] => receipt
)
Помогите, пожалуйста! Что может быть?
У себя в коде добавил: