database - 处理Paypal与本地Datasase之间的交易

标签 database transactions paypal distributed-transactions

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

最佳答案

最近,我对一个为客户完成的asp.net mvc项目有了这样的担心。
我学到了两件事:
PayPal和你的数据库之间的通信是不可信的(好吧,并没有真正了解这一点,但它被完全加强了)
我现在明白了为什么这么多网站都把paypal作为一种交易类型,提到交易完成到产品发货/交付完成之间可能有一个处理周期。
你处理这种情况的方式与企业处理个人支票的方式类似:
个人支票看起来像货币(通常是),但许多企业希望在接受付款前得到银行的某种验证,即资金是可用的,因此他们使用一台机器,询问银行资金是否确实可用。
如果机器说资金可用,企业就会信任它,你就完成了交易。但是,机器可能会发出一条错误消息,通常意味着“资金不可用或出了问题”,企业需要做出以下决定:
我们可以信任客户,接受支票,交付产品,并希望以后将支票存入银行时一切顺利。
或者我们可以告诉客户,支票需要时间清算、存入支票、等待资金真正到达我们的账户,并且(如果成功)在业务收到资金后交付产品。
现在许多企业的经营方式听起来效率不高,但确实出现了这种情况。事实上,这就是为什么很多企业偏离了接受个人支票的轨道,与其他支付方式相比,它们是不可靠的。
现在,这与处理贝宝支付有何关联?
PayPal支付看起来像货币(通常是货币),但许多企业希望在接受支付之前从PayPal获得资金可用的某种验证,因此他们使用PayPal PDT、IPN或其他方法检查交易是否得到了适当处理。
如果PayPal正确响应其中一个验证请求,企业可以信任它并完成交易。但是,您的网站可能会抛出某种错误(即PayPal可以用NOTVALID的IPN响应进行回复,或者您永远无法从PayPal获得回复)。企业必须做出以下决定:
企业可以信任客户并接受他们已经支付了paypal,一切都应该正常(在paypal交易中是非常糟糕的决定)
或者企业可以在结账时告诉客户,贝宝支付可能有72小时的处理时间。
这听起来可能不是经营你公司的最佳方式,但这是我们必须处理一个不完善的互联网的方式。
我将设置类似于以下内容的PayPal支付流程:
usera想使用paypal向另一个userb发送100美元
usera在“checkout field”中输入值,然后发送到paypal以验证交易。
用户A从PayPal发送回您的网站,您的网站使用PayPal发布到您的网站的详细信息执行IPN检查(在本例中,我选择了IPN—就好像我们使用的是Express Checkout而不是PayPal提供的其他支付网关一样)。
如果ipnVALID,则按预期处理事务。
如果IPN不是VALID,请告知客户处理过程可能有延迟,让您的应用程序向您发送一个可能发生PayPal交易问题的通知(您可能希望包含一个参考ID,以便您可以快速找到此通知所引用的交易)。并将事务标记为pending而不是complete或类似的内容。
处理这些通知的网站管理员将手动调查该交易(或强制网站再次与PayPal核对-有关详细信息,请参阅PayPal API文档),并手动将该交易标记为completefailed
通知相关人员交易的状态。
令人恼火的是,我们必须采取额外的步骤来确保资金被转移,但是,如前所述,我们使用的是一个不完善的系统,我们希望非常确定金融交易的成败。
这个过程的另一个好处是,当有人篡改PayPal支付系统时,很可能会有通知——让你在未来更好地对付恶棍。

关于database - 处理Paypal与本地Datasase之间的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535517/

相关文章:

javascript - 避免在 firestore 中同时发出两个请求

mysql - 在 MySQL 中选择并更新几行而不发生冲突

c# - MVC Paypal 集成

mongodb - ** 警告 : soft rlimits too low. 文件数为 256,应至少为 1000

database - 选择 * 与选择 Cassandra 中的特定列

postgresql - 如何在不授予额外权限的情况下允许用户在 Postgresql 中调用存储过程?

php - Paypal商户支付服务商

mysql - 有两个用户 ID 表和它们之间的链接

python - 在 Pandas 中执行连接

java - OpenOLAT .properties 中的 PayPal 集成