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

时间:2012-07-18 06:33:04

标签: database transactions paypal distributed-transactions

处理应用程序和paypal之间的交易的最佳做法是什么。

考虑:

  • 我是Alice,我想寄钱给Bob
  • 在我的数据库中,我看到Bob有200美元,我想给他150美元。
  • 一旦发送了交易,我想更新Bob的帐户,使其包含50美元。

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

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

5 个答案:

答案 0 :(得分:6)

我最近对我为客户完成的ASP.NET MVC项目提出了这个问题。

我学到了两件事:

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

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

    < / LI>

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

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

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

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

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

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

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

  1. UserA希望使用Paypal
  2. 向另一个UserB发送100美元
  3. UserA在“结帐字段”中输入值,然后发送到Paypal以验证交易。
  4. UserA从Paypal发回您的网站,您的网站使用Paypal已发布到您网站的详细信息执行IPN检查(在这种情况下我选择了IPN - 就像我们使用Express Checkout而不是Paypal提供的其他支付网关。
  5. 如果IPN为VALID,请按预期处理交易。
  6. 如果IPN不是VALID,请向客户提及处理可能有延迟,请让您的应用程序向您发送可能发生Paypal交易问题的通知(您可能希望包含参考id,以便您可以快速找到此通知引用的交易),并将交易标记为pending,而不是complete或类似的内容。
  7. 处理这些通知的网站管理员将手动调查交易(或强制网站再次与Paypal核对 - 请参阅Paypal API文档了解详情)并手动将交易标记为completefailed
  8. 通知涉及交易状态的人员。
  9. 令人讨厌的是,我们必须采取额外措施来确保转移资金,但是,如前所述,我们正在使用一个不完善的系统,我们希望非常确定金融交易的成功/失败。

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

答案 1 :(得分:1)

请参阅此链接,希望PayPal授权&amp;捕获方法将适合您,因为您不希望丢失响应以及错误计算的金额转移,PayPal提供相关ID,可以参考PayPal以确认您的订单状态,最好将订单ID传递给PayPal API。

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_admin_authcapture

http://www.scribd.com/doc/6303345/40/CorrelationID-for-Reporting-Problems-to-PayPal

祝你好运!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我会向Alice支付150美元并反映交易是 “待确认” ,然后定期轮询PayPal以同步您的数据库,因为您无法控制何时网络或PayPal可用,发布,撤消或调整交易。 PayPal处理完交易后,您可以将数据库中的状态从“待处理”更改为“已完成”。顺便说一句,这是如何处理银行账户和信用卡的。您可以将双重记帐方法应用于数据库。 (见Q&A)

答案 4 :(得分:-1)

从我看到你需要确保交易完成,否则什么都不应该做。
如果您将钱存入PayPal API并且您没有收到PAYPAL API的回复,那么您需要在DB中回滚该事务。