通过paypal支付用户佣金,并更新网站数据库

时间:2012-08-31 15:38:56

标签: mysql paypal payment

我有一个网站,用户为其他用户提供的服务付费,并且在本周末,我们向用户支付他们的服务销售价值减去我们的佣金。

目前,当我们想要向用户付款时,我们会进行人工付款,登录到paypal并在付款后手动更新我们的数据库。我们遇到的问题是我们的交易每周超过一千,因此手动操作非常麻烦。

我们提出了一个小系统,通过使用PayPal的Adaptive Payments API,我们只需点击一下即可执行付款并更新我们的数据库。

我的问题如下 - 我们担心会发生一些情况:

  1. 我们向用户付款,我们的SQL数据库已关闭,因此我们不会更新我们的销售记录。因此,当cron执行时,系统会再次向用户付款。

  2. 我们可以反过来,并首先更新我们的SQL数据库,如果这样,我们执行paypal付款。问题是,如果在PayPal方面出现问题,我们最终根本不会向用户付款,因为我们的数据库已更新,就好像我们付了钱一样。

  3. 我们的解决方案:

    • 我们更新数据库并跟踪所有已更改的记录 - >继续致电PayPal API - >如果PayPal调用失败,我们将更改还原为更新的记录;如果通话成功,我们保持原样。

    • 我们执行PayPal付款,并更新数据库。我们将来自API的ACK消息存储在数据库中,当我们检查记录以向用户付款时,我们验证ACK字段是否成功。

    我们的解决方案让我们非常疲惫,也许我们陷入了某种心态。我们担心的是,无论是SQL还是失败,或者PayPal api调用都不会通过。  有没有人对我们的支付系统有任何建议或完全不同的实施?

2 个答案:

答案 0 :(得分:2)

嗯,基本上这是交易系统的事情。

看看这里:http://dev.mysql.com/doc/refman/5.0/en/commit.html

  1. 启动交易
  2. 更新数据库中的用户条目
  3. 如果更新成功发送付款给paypal
  4. 如果成功,则向数据库发送提交。
  5. 这将是最令人讨厌的方法,如果提交失败,只需在某个地方记录该错误而不是DB相关,然后手动处理(用户友好)

    只是一个附注,当然在财务上更安全,更新用户数据,首先发送付款,然后运行顺利将付款发送到PayPal。

    如果您在付款错误后无法回滚用户数据,则不会损害您的损失,但用户肯定会告诉您他没有收到付款....

答案 1 :(得分:2)

您需要的是two-phase commit

的变体

创建付款流程的状态转换图,其中每个州表示持久存储的稳定状态(在本例中为您的MySQL数据库),并确保所有路径都可以导致正在处理一个付款。

首先,您记录您正在尝试付款。

如果付款成功,则录制该内容。

如果您从系统故障中恢复过来,并且您已经记录了您尝试支付但未支付的费用,则必须与paypal核实是否已付款。