2016-02-13 45 views
1

当我使用paypal express完成付款并且数据库更新失败后,我可以在这种情况下做些什么?如何使用Omnipay退款

这里是代码:

$transaction = $this->initPayPalExpress()->completePurchase($this->param); 
    $response = $transaction->send(); 
    $data = $response->getData(); 
    if (isset($data['PAYMENTINFO_0_ACK']) && $data['PAYMENTINFO_0_ACK'] === 'Success') { 
     $this->updateDatabase($data); 
    } 
+0

如果可能,请打印您的更新函数和响应数据 – CodeIsLife

+0

对于更新函数,我只是将数据存储到MySQL数据库中。为了解决问题,我得到了显示交易完成的所有细节。问题是数据库中的数据不会更新,例如,当用户关闭浏览器时,该函数应该运行:'$ this-> updateDatabase($ data);' –

+0

即使用户关闭浏览器,它的服务器端处理也会关闭浏览器防止交易执行 – CodeIsLife

回答

0

我建议你从贝宝切换表达对贝宝REST。这是更新的,并有更好的文档。

如果数据库更新失败,那么我建议您需要有某种备份计划 - 您可以使用RestListPurchaseRequest()消息检查您的购买历史记录。

你问退款,但不给退款的例子 - 你问题的确切性质是什么?

在omnipay-paypal REST消息和网关的docblocks中有一些很好的例子来实现你想做的事情。

0

如果您使用付款网关,则不要依赖会话数据来存储您将用于将付款链接回用户的信息。相反,由于用户正在为某件事付款,因此必须有一个订单/订阅表,或者甚至只有用户的ID本身。所以,你可以传递标识信息给贝宝的自定义字段你被允许通过,然后在重定向/回调,你可以这样做(不Omnipay代码,但它说明了这一点):

$response = GetExpressCheckoutDetails($_REQUEST['token']); 
$orderID = $response["PAYMENTREQUEST_0_CUSTOM"]; 

这样,无论用户是否拥有活动会话,您都可以完成事务;如果你的数据库失败了,你不必退还客户,因为问题不在他们的最终,而是你的。您最好避免数据库故障,并让脚本记录日志或通过电子邮件发送通知,告诉您如何成功付款但数据库失败 - 并手动完成购买。