【问题标题】:How to refund with Omnipay如何使用 Omnipay 退款
【发布时间】:2016-05-24 21:15:32
【问题描述】:

使用paypal express完成支付后,我的数据库更新失败,我该怎么办?

代码如下:

    $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);
    }

【问题讨论】:

  • 如果可能,请打印您的更新函数和响应数据
  • 对于更新功能,我只是将数据存储到 MySQL 数据库中。对于响应,我得到了显示事务已完成的所有详细信息。问题是数据库中的数据不会更新,例如,当这个函数应该运行时用户关闭浏览器:$this->updateDatabase($data);
  • 即使用户关闭浏览器!,它是服务器端处理,所以关闭浏览器不会阻止事务执行
  • 所以更新不会失败?我认为会话将​​被破坏并且会失败
  • 不!更新不会失败,并且会话也是服务器端文件,因此您的代码块永远不会被客户端操作中断

标签: php paypal omnipay


【解决方案1】:

我建议您从 PayPal express 切换到 PayPal REST。那是更新的并且有更好的文档。

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

您询问有关退款的问题,但没有给出退款示例 - 您的问题的确切性质是什么?

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

【讨论】:

    【解决方案2】:

    如果您使用支付网关,请不要依赖会话数据来存储您将用于将支付链接回用户的信息。相反,由于用户正在为某些东西付费,因此必须有一个订单/订阅表,甚至只是用户的 id 本身。因此,您可以在允许传递的自定义字段中将该识别信息传递给 PayPal,然后在重定向/回调中,您可以执行类似的操作(不是 Omnipay 代码,但它说明了这一点):

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

    这样,无论用户是否有活动会话,您都可以完成交易;如果您的数据库出现故障,您不必退还客户,因为问题不在他们的一方,而是您的一方。您最好捕获数据库故障并让脚本日志或电子邮件通知您支付成功但数据库失败 - 您手动完成购买。

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 2014-04-07
      • 2021-06-25
      • 2013-09-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2015-04-06
      相关资源
      最近更新 更多