【问题标题】:Handling PayPal IPN with Database Insertion使用数据库插入处理 PayPal IPN
【发布时间】:2011-09-29 12:56:03
【问题描述】:

我希望使用 PayPal Pro 托管解决方案来处理我的网站的付款,我想要实现的是用户提交的数据不会插入到我的数据库中,直到 PayPal 确认我已收到他们的条目付款。

根据我的阅读,我了解 IPN 是实现这一目标的最佳方式。

因此,目前,用户正在使用表单输入他们的数据,然后我将预览给他们,如果他们批准他们的输入,我将插入数据库(使用 PHP/MySQL)。目前表单数据正在 SESSION 变量中传递并且工作正常。文件流程为:

  1. 用户输入数据
  2. 用户会在已知页面上看到他们输入的数据,如果他们同意...
  3. 他们单击处理插入数据库的按钮。

但是我想做的是,如果他们在预览页面上批准他们的条目,当他们点击批准时,而不是在那里更新数据库,然后将他们发送到 PayPal 进行付款并只更新数据库如果付款被批准,则输入他们的条目,如下所示:

  1. 用户输入数据
  2. 用户会在已知页面上看到他们输入的数据,如果他们同意...
  3. 他们点击一个按钮,将他们带到付款页面
  4. 如果收到付款,他们的数据将添加到数据库中。

有没有人对这种方法有任何经验,可以为我指明正确的方向,或者请给我一些关于如何去做的指导?

我已经查看了 PayPal 文档,但是因为我是新手,所以我需要用一种非常简单的方式来解释。

我最初的想法只是将表单存储为 SESSION 变量,但我会通过将人们重定向到支付页面来丢失它。我的另一个想法是创建一个与我已经拥有的数据库相同的数据库作为数据的临时保存阶段,然后如果 IPN 重新获得批准,将数据移动到最终的托管数据库,但这似乎有点过度设计问题.

希望有人能帮忙。

谢谢 丹

【问题讨论】:

    标签: php mysql paypal paypal-ipn


    【解决方案1】:

    在这种情况下,使用 PayPal IPN 似乎是最好的解决方案。

    在我看来,使用临时表似乎是最好的解决方案。它将遵循 KISS 规则。

    请考虑使用以下场景:

    • 用户输入数据
    • 正在提交表单
    • 数据存储在数据库的临时表中
    • 在重定向到 PayPal 网站时,您可以添加自定义字段,当我们返回您的页面时,该字段将用于识别用户
    • 更新交易状态
    • 在您的需求表中插入数据

    这似乎是最简单的解决方案。

    【讨论】:

      【解决方案2】:

      我最初的想法只是将表单存储为 SESSION 变量,但我会通过将人们重定向到支付页面来丢失它。

      不一定。只要当前浏览器(会话)打开,会话通常可以持续存在。这与“只要当前页面被查看”不同,前提是您正确设置了会话 cookie。如果你做得对,你可以让会话持续数天、数月、数年......

      我的另一个想法是创建一个与我已经拥有的数据库相同的数据库作为数据的临时保存阶段,然后如果 IPN 重新获得批准,则将数据移动到最终的托管数据库,但这似乎过于工程化了有点问题。

      不,这并不过分。

      它处理事务未完成的情况。发生这种情况的原因有很多,例如您的用户去吃午饭并忘记在会话超时之前完成该过程(默认为 20 分钟左右)或 Paypal 端出现问题(不太可能但您必须假设它可能会发生)或存在一般网络问题(isp 在交易过程中出现故障),或者您的移动用户超出网络覆盖范围。任何事情都可能干扰交易,你需​​要有一个后备位置。否则,它会让您(因为您不知道是什么中断了事务以及在什么时间点中断了事务)以及您必须重新开始的用户感到烦恼。

      拥有一个临时数据库可以让您监控未完成的事务,并在必要时提示用户在给定时间段内未完成事务。

      【讨论】:

      • 嗨 T9b,是否有可能,而不是有一个重复的临时数据库,有一个,但添加一个 true/false 列,如果 IPN/PDT 返回为已验证,则标记为 true,或者否则为假?谢谢丹
      • 当然一切皆有可能。但是,考虑到清除数据库中不完整事务对性能的影响,以及(取决于您拥有的事务数量)表上的流量,您可能希望考虑这种分离。当您开始查看数据和数据库的实际执行情况时,其中一些设计问题会在稍后出现,并没有硬性规定。你可能根本不需要做任何分离。
      • 感谢您的意见,您当然是对的,我只需要潜入其中,看看什么合适。再次感谢,丹
      【解决方案3】:

      关于 IPN 需要认识到的一点是,它是来自 PayPal 的“异步”响应 - 它不在用户的浏览器会话中,因此如果您完全依赖 IPN(除非您收到IPN 响应,然后将其与用户的会话匹配)。 PayPal 还提供 PDT(支付数据传输),这是一种“会话中”响应,可以将用户返回到您的网站。

      我不会完全依赖 IPN 来发送付款通知(请参阅我在以下 SO 主题中的回答)Can one rely on Paypal IPN solely to record purchases?。

      我们的系统结合使用 IPN 和 PDT,将“购物车”数据存储在数据库中(作为您的“临时”记录),直到 PDT 或 IPN 通知完成付款 - 以先到者为准事务(您的“永久”数据库插入)并删除“临时”记录(因此后续 IPN 或 PDT 不会触发重复事务)。

      【讨论】:

        猜你喜欢
        • 2012-08-08
        • 2014-05-18
        • 2015-07-04
        • 2015-09-11
        • 2015-04-13
        • 2013-04-24
        • 2015-01-31
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多