3

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

考虑:

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

现在根据 PayPal API,我可以发送付款并接收成功。但是,如果我发送 Pay 成功但由于网络问题而未能收到响应,会发生什么情况。所以我假设错误发生了,然后再试一次,从技术上讲,我会向 Bob 发送 300 美元而不是 150 美元?

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

4

5 回答 5

6

我最近对我正在为客户完成的一个 ASP.NET MVC 项目有这个确切的担忧。

我学到了两件事:

  • 无法信任 Paypal 和您的数据库之间的通信(嗯,并没有真正了解这一点,但它完全得到了加强)

  • 我现在明白为什么有这么多将 Paypal 作为交易类型的网站提到在交易完成和产品运输/交付完成之间可能会有一个处理期。


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

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

对于当今许多企业的运营方式而言,这听起来效率低下,但确实会出现这种情况。事实上,这就是为什么许多企业不接受个人支票的原因,与其他付款方式相比,它们不可靠。

现在这与处理 Paypal 付款有什么关系?

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

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

我会设置类似这样的 Paypal 支付流程:

  1. 用户 A 想使用 Paypal 向另一个用户 B 发送 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 支付系统时可能会收到通知 - 让您在未来更好地应对作恶者。

于 2012-07-21T20:31:14.987 回答
1

请参考此链接,希望 PayPal Authorization & Capture 方法适合您,因为您不希望丢失响应以及错误计算的金额转移,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

祝你好运!

于 2012-07-23T10:45:09.270 回答
0

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

于 2012-07-21T06:56:48.333 回答
0

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

于 2012-07-22T02:35:16.137 回答
-1

据我所知,您需要确保交易完成,否则不应该做任何事情。
如果您将钱存入 PayPal API 并且您没有收到来自 PAYPAL API 的响应,那么您需要在您的数据库中回滚交易。

于 2012-07-20T12:19:27.600 回答