omnipay / ym
Yandex.Money 支付网关,用于 Omnipay 支付处理库
v1.0.1
2014-12-30 06:54 UTC
Requires
- omnipay/common: ~2.0
Requires (Dev)
- omnipay/tests: ~2.0
This package is auto-updated.
Last update: 2024-09-06 20:10:52 UTC
README
用于网站接收信用卡支付付款的库。
它是如何工作的?
为了向 API 发送请求,需要 注册 应用程序。资金将直接转入指定的钱包。
- 用户点击“支付”按钮,API 将形成支付请求;
- 用户将被重定向到 Yandex.Dеньги 网站,以输入卡片信息;
- 如果需要,银行将额外验证数据;
- 如果支付成功,用户将返回到
returnUrl
,在那里检查支付状态; - 可以保存卡片令牌以进行无需输入数据的支付;
- 如果支付未成功,用户将被重定向到
cancelUrl
,在那里也需要检查支付状态。
更多信息可以在 Yandex.Dеньги官方网站 上找到。
安装
composer require omnipay/ym:~1.0
使用
开始之前,需要创建一个网关,通过该网关将执行 API 请求
$gateway = Omnipay::create('YM_External'); $gateway->setInstanceId($instanceId);
任何请求都需要 instanceId
参数。该参数根据在注册应用程序时获得的 client_id
为每个应用程序单独生成。要生成新的 instanceId
$instanceId = $gateway->obtainInstanceId($clientId); // сохранить где-нибудь для последующего использования
生成账单
$response = $gateway->requestPayment(array( 'walletId' => '12345678910', // ID кошелька, на который поступят средства 'amount' => 256.0, // Сумма в рублях 'description' => 'Оплата услуг', ))->send(); if ( ! $response->isSuccessful()) { // Произошла ошибка } // Получаем идентификатор транзакции, его нужно где-нибудь сохранить, т.к. он нам понадобится $transaction = $response->getTransactionReference();
现在需要将用户重定向到输入数据的页面,为此需要请求支付状态
$response = $gateway->processPayment(array( 'transactionReference' => $transaction, 'returnUrl' => 'http://example.com/success', 'cancelUrl' => 'http://example.com/fail', )->send(); if ($response->isRedirect()) $response->redirect(); // Произошла ошибка
检查支付状态
用户成功完成支付或取消操作(银行拒绝支付)后,将被重定向到成功时为 returnUrl
,错误时为 cancelUrl
。如果没有特殊的额外逻辑,则可以简单地输出支付成功或失败的消息。否则,必须检查支付状态。
$response = $gateway->processPayment(array( 'transactionReference' => $transaction, 'returnUrl' => '...', 'cancelUrl' => '...', )->send(); if ($response->isSuccessful()) { // Платеж совершен! } elseif ($response->isPaymentRefused()) { // Платеж отклонен! } else { // Произошла ошибка при запросе }
请注意,获取支付状态需要交易编号,该编号在生成支付时获得。它在用户重定向时以 cps_context_id
的名称传递。但最好将其保存在服务器上,并在用户返回网站时恢复。
保存卡片
如果用户成功完成支付,则可以保存其输入的数据,并在其他支付中使用这些数据。
$response = $gateway->createCard(array( 'transactionReference' => $transaction, 'returnUrl' => '...', 'cancelUrl' => '...', ))->send(); if ($cardRef = $response->getCardReference()) { // Токен карты успешно получен, нужно его сохранить куда-нибудь // Другие данные: $response->getCardType(); // VISA, MasterCard $response->getCardNumber(); // Маскированный номер карты }
使用已保存的卡片进行支付
支付过程遵循与之前相同的模式,即首先生成支付请求,但在第一次请求状态时传递卡片令牌以及卡片背面的保护码 cvv
(用户必须输入)。
$response = $gateway->processPayment(array( 'transactionReference' => $transaction, 'returnUrl' => '...', 'cancelUrl' => '...', 'cardReference' => $cardRef, 'cvv' => $cvv, ))->send(); if ($response->isSuccessful()) { // Платеж прошел! } elseif ($response->isRedirect()) { // Дополнительная авторизация $response->redirect(); } else { // Произошла ошибка }