处理Paypal和本地数据库之间的交易

Art*_*yom 2 database transactions paypal distributed-transactions

处理应用程序和paypal之间的事务的最佳实践是什么.

考虑:

  • 我是爱丽丝,我想把钱寄给鲍勃
  • 在我的数据库中,我看到Bob有200美元,我想给他150美元.
  • 一旦发送了交易,我想更新Bob的账户,使其包含50美元.

现在根据PayPal API,我可以发送Pay并获得成功.但是,如果我发送Pay成功但由于网络问题而无法收到响应,会发生什么.所以我认为错误发生了并再试一次,从技术上讲,我会向Bob发送300美元而不是150美元?

如何在保留帐户的本地数据库和远程PayPal API之间处理此类事务?

Ecn*_*lyr 6

我最近对一个客户端正在完成的ASP.NET MVC项目有了这个问题.

我学到了两件事:

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

  • 我现在明白为什么这么多的网站有贝宝作为一个交易型何况还有可能是该交易已经完成,产品的运输/派送完毕的时间之间的处理时间.


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

  • 个人支票看起来像货币(通常是货币),但许多企业希望从银行获得某种形式的验证,即在接受付款之前资金可用 - 因此他们使用一台机器向银行询问资金是否实际可用.
  • 如果机器显示资金可用,则企业信任它并完成交易. 但是,机器可以提供错误消息,通常意味着"资金不可用或出现问题",并且企业决定:
    • 我们可以信任客户并接受支票,交付产品,并希望在以后将支票存入银行时做到最好.
    • 或者我们可以告诉客户,支票需要时间清算,存入支票,等待资金实际到达我们的账户,并且(如果成功)在业务获得资金后交付产品.

对于今天许多企业运营的方式来说,这听起来效率低下,但它确实出现了问题.事实上,这就是许多企业偏离接受个人支票的原因,与其他支付方式相比,它们不可靠.

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

  • Paypal付款看起来像货币(通常是),但许多企业希望从Paypal获得某种验证,即在接受付款之前资金可用 - 因此他们使用Paypal PDT,IPN或其他方法来检查交易处理得当.
  • 如果Paypal正确响应其中一个验证请求,则企业可以信任它并完成交易. 但是,您的网站可能会出现某种错误(即Paypal可以回复IPN的回复NOTVALID,或者您永远无法从Paypal获得回复).该公司决定:
    • 企业可以信任客户,并接受他们已经支付宝贝,一切都应该是正常的(在Paypal交易的情况下非常糟糕的决定)
    • 或者,企业可以在退房时告诉客户,Paypal付款可能需要72小时的处理时间.

这可能听起来不像是经营您业务的最佳方式,但这是我们处理不完美互联网的方式.

我会设置类似于此的Paypal支付流程:

  1. UserA希望使用Paypal向另一个UserB发送100美元
  2. UserA在"结帐字段"中输入值,并发送到Paypal以验证交易.
  3. UserA从Paypal发回您的网站,您的网站使用Paypal已发布到您网站的详细信息执行IPN检查(在这种情况下我选择了IPN - 就像我们使用Express Checkout而不是Paypal的其他支付网关一样提供).
  4. 如果是IPN VALID,则按预期处理事务.
  5. 如果IPN不是VALID,请向客户提及处理可能有延迟,让您的应用程序向您发送可能发生Paypal交易问题的通知(您可能希望包含引用ID,以便您可以快速找到事务此通知正在引用),并将事务标记pending为相反complete或类似的事件.
  6. 处理这些通知的网站管理员将手动调查交易(或强制网站再次使用Paypal进行检查 - 有关详细信息,请参阅Paypal API文档)并手动将交易标记为completefailed.
  7. 通知涉及交易状态的人员.

令人讨厌的是,我们必须采取额外措施来确保资金转移,但如前所述,我们正在使用一个不完善的系统,我们希望非常确定金融交易的成功/失败.

此过程的另一个好处是,当有人篡改Paypal支付系统时,可能会收到通知 - 让您在未来更好地应对恶意行为.