【问题标题】:Can one rely on Paypal IPN solely to record purchases?可以仅依靠 Paypal IPN 来记录购买吗?
【发布时间】:2011-09-09 13:45:44
【问题描述】:

我正在通过以下主要步骤从网站设置简单的“立即购买”交易:

  1. 从价目表中选择产品
  2. 审核选择(金额、税金等)
  3. 在 Paypal 上处理付款
  4. 收据/谢谢

目前,我在第 2 步中存储了一条数据库记录——这可能意味着会有许多记录没有收到付款,因为人们最终决定不继续购买。这些记录没有实际用处,因为我将使用 Google Analytics 来跟踪结帐流程的成功程度。

我正在使用 Paypal IPN 来验证付款的真实性并将其记录在步骤 2 中插入的记录中 - 但是,我是否可以仅依靠 IPN 交易中的数据首先填充数据库,从而无需在第 2 步存储它们并且必须进行数据库清理以删除从未完成的事务?

我个人认为没有理由不这样做 - IPN 包含我需要的有关付款的所有数据,可能还有更多数据,如果由于以下原因第一次没有通过,Paypal 将重新发送 IPN 数天服务器故障,但我是否遗漏了其他重要信息?

显然,首要考虑因素是没有交易丢失或没有记录,因此不会引起客户的不满!

【问题讨论】:

  • 经过反思,我认为我的问题的答案可能是“是的,你可以 - 但不,你不应该”。
  • 提供小额赏金,看看是否还有其他建议/答案。

标签: php paypal paypal-ipn


【解决方案1】:

我并没有仅仅依靠 IPN 来做到这一点,但是如果失败,PayPal 会记录与您的服务器联系的失败,并且应该稍后重试,尽管我只在开发中遇到过失败并且从未验证过重试。我只是相信他们。

【讨论】:

  • 写完问题并盯着更多代码几个小时后,我想到了一个潜在的问题 - 检查 IPN 中的数据以确保交易金额和货币匹配。如果它没有被存储,没有什么可以匹配的 - 所以有人可以使用有效的 IPN 生成贝宝交易,但金额不正确?你说什么?
  • 我想这取决于你卖的是什么。如果价格不变,那很容易检查。如果有足够的信息让您根据所选项目计算总数,它仍然有效。保留信息以进行仔细检查似乎是更安全的途径。
  • 该网站基本上是在销售“信用”,然后可用于上传或下载内容。我决定沿着记录信息预付款的路线(基本上是购买时的产品和价格)并将自定义字段发送到贝宝,以便我们可以在 IPN 进入时识别它,那样看起来更安全。
【解决方案2】:

对于一个典型的电子商务网站,是的,你可以——它相当可靠。如果核反应堆会熔化,人们会死亡,那么不,你不能——我见过它有问题,但很少见。

【讨论】:

  • 那么我们假设他是核电站网站编码员? xD
  • @Cyclone yes -- PHP 真正的利基市场。
  • 该死,我最近的项目是一个核安全系统,它依靠当地居民的付款来保持它的开启,我以为我在那里是一个赚钱的人 :-) 不过说真的,看看我的评论另一个答案-另外,另一个想法是如果有人直接通过贝宝汇款(他们为什么会?但他们可以..)而不存储网络交易,然后我们不知道这笔钱是否用于支付我们的交易期待或只是一个随机的礼物......?
【解决方案3】:

我开发了许多电子商务网站,在实践中,您总是希望在发生任何“意外”时尽可能记录下来。您自己的数据可能会提供更多信息。

就像你说的,是的,你可以这样做,但我认为这不是一个好主意。

【讨论】:

    【解决方案4】:

    像您一样进行双向验证很重要。

    您在用户离开您的系统前往贝宝之前保存订单信息(总数、数量)。当 ipn 返回时,您验证请求(它必须来自 paypal ip 或其他),您验证它是成功的交易,然后您的第 2 步进入现场。您验证从 paypal ipn 返回的总数是否与用户离开之前保存的总数相同(Paypal 有时可能会返回部分付款,用户可能会获取帖子数据并从修改后的 html 中使用较低的 @ 发布自己的帖子987654321@设置)。第 2 步还应存储买家的 user_id,因此您也必须进行比较。

    这是一个示例层(没有编程语言,只是一个虚拟代码):

    if request comes from paypal:
        #   query the order
        if order.total == request.total && order.user_id == request.custom:
            payment may come in...
    

    【讨论】:

    • 这就是我最后所做的,我检查了交易记录是否存在,总额与IPN总额,货币是英镑。大约一周后,我将进行数据库清理以删除任何不完整的订单。
    • 这也是我所做的。好策略... IPN 有时可能有点不稳定——我要做的另一件事是检查数据库以确保交易尚未处理。即使处理正确,我们也会得到重复的 IPN。嘟嘟嘟嘟嘟……
    【解决方案5】:

    作为在过去三年中处理了超过 600,000 笔 PayPal 付款的系统的设计者和管理员 - 完全依赖 IPN 可以避免一些错误。

    真实数据:

    交易总数 无 IPN 无效 IPN 重复 IPN 年 1 170,000 + 2 101 0 第 2 年 205,000 + 54 15 3 第 3 年 230,000 + 20 24 13

    幸运的是,我们的系统采用 PDT(支付数据传输)作为“备份”,因此我们没有丢失任何交易数据或有不满意的客户。注意:PDT 也不能完全依赖——事实上,今年年初,PDT 回报的可靠性存在一个重大问题。

    最常见的“无效”IPN 返回是 HTML 错误页面或截断的结果...如果需要,我可以提供示例。

    最好的选择是 IPN 和 PDT 的组合(您的“购物车”数据按原样存储在数据库中)。 IPN 进程或 PDT 进程都可以创建事务(并删除数据库中的“购物车”数据记录)。然后到达的第二个进程将没有用于记录交易的“购物车”条目。

    注意: - 正如您在使用自定义字段的最终解决方案中所指出的那样 - 请注意自定义字段有长度限制,并且在返回给您时可能会被截断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2014-10-05
      • 2023-03-10
      相关资源
      最近更新 更多