Database 处理Paypal和本地Datasase之间的事务

Database 处理Paypal和本地Datasase之间的事务,database,transactions,paypal,distributed-transactions,Database,Transactions,Paypal,Distributed Transactions,处理应用程序和paypal之间的交易的最佳实践是什么 考虑: 我是爱丽丝,我想把钱寄给鲍勃 在我的数据库中,我看到鲍勃有200美元,我想寄给他150美元 一旦交易被发送,我想更新鲍勃的帐户,使其包含50美元 现在根据贝宝API,我可以发送支付和接收成功。但是会发生什么 例如,如果我发送支付成功,但由于网络问题,我无法收到响应。所以我假设发生了错误,然后再试一次,从技术上讲,我会给Bob寄300美元而不是150美元 我如何处理这样的交易?在保留帐户的本地数据库和远程PayPal API之间?据

处理应用程序和paypal之间的交易的最佳实践是什么

考虑:

  • 我是爱丽丝,我想把钱寄给鲍勃
  • 在我的数据库中,我看到鲍勃有200美元,我想寄给他150美元
  • 一旦交易被发送,我想更新鲍勃的帐户,使其包含50美元
现在根据贝宝API,我可以发送支付和接收成功。但是会发生什么 例如,如果我发送支付成功,但由于网络问题,我无法收到响应。所以我假设发生了错误,然后再试一次,从技术上讲,我会给Bob寄300美元而不是150美元


我如何处理这样的交易?在保留帐户的本地数据库和远程PayPal API之间?

据我所知,您需要确保交易完成,否则什么都不应该做。

如果您将钱存入PayPal API,但未收到PayPal API的响应,则需要在数据库中回滚事务。

这称为两阶段提交。只要paypal不参与同一笔交易,您就会遇到问题。

最近,我为一个客户完成了一个ASP.NET MVC项目,这正是我关心的问题。

我学到了两件事:

  • Paypal和您的数据库之间的通信是不可信的(好吧,我并没有真正了解这一点,但它得到了完全加强)

  • 我现在明白了为什么这么多以Paypal作为交易类型的网站提到,从交易完成到产品发货/交付完成之间可能有一段处理时间


您处理这种情况的方式与企业处理个人支票的方式类似:

  • 个人支票看起来像是货币(通常是货币),但许多企业希望在接受付款之前从银行得到资金可用的某种验证——因此他们使用一台机器询问银行资金是否确实可用
  • 如果机器说资金可用,企业信任它,你完成交易但是,机器可能会发出错误消息,通常表示“资金不可用或出现问题”,企业需要做出以下决定:
    • 我们可以信任客户,接受支票,交付产品,并希望在以后将支票存入银行时做到最好
    • 或者我们可以告诉客户,支票结算、存入支票、等待资金实际到达我们的账户以及(如果成功)在业务收到资金后交付产品都需要时间
今天许多企业的经营方式听起来效率低下,但确实出现了这种情况。事实上,这就是为什么许多企业不接受个人支票的原因,与其他支付方式相比,个人支票是不可靠的

现在,这与处理Paypal支付有何关联

  • Paypal支付看起来像是货币(通常是货币),但许多企业希望在接受支付之前从Paypal那里得到某种验证,即资金可用——因此他们使用Paypal PDT、IPN或其他方法来检查交易是否得到了适当处理
  • 如果Paypal正确响应其中一个验证请求,则企业可以信任它并完成交易但是,您的网站可能会抛出某种错误(即Paypal可能会以
    无效的IPN响应进行回复,或者您永远无法从Paypal获得回复)。企业有权做出以下决定:
    
    • 企业可以信任客户并接受他们已经支付了Paypal,一切都应该正常(在Paypal交易的情况下,这是一个非常糟糕的决定)
    • 或者,企业可以在结账时告诉客户,贝宝支付可能有72小时的处理时间
这听起来可能不是经营企业的最佳方式,但这是我们处理不完善互联网的方式

我将设置类似于以下内容的Paypal支付流程:
  • UserA希望使用Paypal向另一个UserB发送100美元
  • UserA在“checkout字段”中输入值,并发送给Paypal以验证交易
  • UserA从Paypal发送回您的网站,您的网站将根据Paypal发布到您网站的详细信息执行IPN检查(在本例中,我选择了IPN,就好像我们使用的是Paypal提供的其他支付网关)
  • 如果IPN
    有效
    ,则按预期处理事务
  • 如果IPN无效,,请向客户说明处理过程中可能会出现延迟,让您的应用程序向您发送一个通知,告知可能发生了Paypal交易问题(您可能希望包含一个参考id,以便您能快速找到此通知所引用的交易),并将交易标记为
    挂起
    ,而不是
    完成
    或类似的内容
  • 处理这些通知的网站管理员将手动调查交易(或强制网站再次与Paypal检查-有关详细信息,请参阅Paypal API文档),并手动将交易标记为
    完成
    失败
  • 通知相关人员交易的状态
  • 令人恼火的是,我们必须采取额外的步骤来确保资金转移,但是,正如前面提到的,我们使用的是一个不完善的系统,我们希望非常确定金融交易的成功/失败

    这一过程的另一个好处是,当有人篡改贝宝支付系统时,可能会收到通知