+7 (495) 070 2021
Прием платежей на сайте через Юкассу
#api #curl #php #юkassa

Прием платежей на сайте через Юкассу

Настройка магазина в ЮKassa, формирование ссылки на оплату и получение данных о платеже.

Описан процесс оплаты через сервис ЮKassa с помощью прямых запросов к API через PHP cURL. Также есть уже готовый SDK (с установкой через Composer).

Настройка магазина в ЮKassa

В Юкассе потребуется создать два магазина, один основной, второй тестовый для проверки интеграции.

Настройка магазина в Ю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 – платеж отменен
Комментарии (1)
  • 10.09.2021 22:15

    На самописном сайте само то

Написать комментарий