我如何使用omnipay检查它是不是是待处理的付款

Posted

技术标签:

【中文标题】我如何使用omnipay检查它是不是是待处理的付款【英文标题】:How do I use omnipay to check if it's a pending payment or not我如何使用omnipay检查它是否是待处理的付款 【发布时间】:2014-01-17 21:19:54 【问题描述】:

我正在使用 Omnipay 2.1 和 CodeIgniter 2.1.4 接收 Paypal 付款。

我使用此行完成购买并检查付款是否已发送:

$bool = $gateway->completePurchase(array('amount' => $total, 'currency' => 'EUR'))
                ->send()
                ->isSuccessful();

但我注意到,如果付款处于待处理状态,isSuccessful() 方法也会返回 true

我如何使用omnipay 来检查它是否是待付款?

【问题讨论】:

print_r($response->getData()) 返回什么? pastebin.com/BLK6Hqf6 所以我想我必须检查PAYMENTINFO_0_PAYMENTSTATUS 是否等于Completed 【参考方案1】:

我相信你不应该链接isSuccessful() fn。试试send() 然后检查来自网关的响应:

$response = $gateway->purchase(['amount' => '10.00', 'currency' => 'USD')->send();

if ($response->isSuccessful()) 
    // payment was successful: update database
    print_r($response);
 else 
    // debug etc;
    print_r($response);

否则,您可能会得到 boolsend() 等;

【讨论】:

谢谢,但它仍然给了我True,即使$response 包含pending。也许我不能用 Omnipay 做到这一点,我必须手动检查?【参考方案2】:

查看您的原始响应数据,重要的几行是:

[ACK] => Success
[PAYMENTINFO_0_CURRENCYCODE] => EUR
[PAYMENTINFO_0_PAYMENTSTATUS] => Pending
[PAYMENTINFO_0_PENDINGREASON] => multicurrency

因此付款已成功处理,但处于Pending 状态。 Omnipay 没有明确检查这一点,但我不确定这是否明智。从客户的角度来看,付款是成功的,钱已经离开了他们的账户。

查看PayPal API documentation 为PAYMENTINFO_0_PENDINGREASON

多币种 – 您在发送的币种中没有余额,并且您没有将收款首选项设置为自动转换并接受此付款。您必须手动接受或拒绝此付款。

所以基本上付款是成功的,它待定的唯一原因是您以您未在您的 PayPal 帐户中明确启用的货币 (EUR) 向客户收费。

【讨论】:

【参考方案3】:

OmniPay 的最新版本在 Response 类中有一个 isPending 方法,您可以使用它来检查付款是否处于待处理状态。

如果您看到可能的reasons 表示付款状态处于待处理状态,则其中一些可能会导致付款失败。

例如

付款审核 regulatory_review 电子支票。

我建议在检查之前发货或确认订单不是一个好主意,这不会依赖于响应 isSuccessful 方法本身返回 true

【讨论】:

以上是关于我如何使用omnipay检查它是不是是待处理的付款的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP Omnipay 和 Paypal Express Checkout 验证付款?

Omnipay 贝宝集成 - 确认付款状态

使用omnipay 通过securepay 处理时出现无效指纹异常

如何从 Omnipay/PayPal 调用 GetExpressCheckoutDetails?

支付宝快速结账的 Omnipay 错误,您的最后一个操作无法完成

如何使用 Omnipay/手册