1

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

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

我们想出了一个小系统,通过使用来自 paypal 的 Adaptive Payments API,我们可以执行支付并一键更新我们的数据库。

我的问题如下 - 我们害怕发生一些情况:

  1. 我们向用户付款,我们的 SQL 数据库出现故障,因此我们不更新我们的销售记录。因此,系统会在 cron 执行时再次向用户付款。

  2. 我们可以做相反的事情,先更新我们的 SQL 数据库,如果通过,我们执行 paypal 付款。这样做的问题是,如果 PayPal 方面出现问题,我们最终根本不会向用户付款,因为我们的数据库已更新,就好像我们已经向他们付款一样。

我们的解决方案:

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

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

我们的解决方案让我们非常疲倦,也许我们陷入了某种思维定势。我们担心的是 SQL 将失败或 PayPal api 调用将无法通过。是否有人对我们的支付系统有任何建议或完全不同的实施?

4

2 回答 2

2

好吧,基本上这是交易系统的东西。

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

  1. 开始交易
  2. 更新数据库中的用户条目
  3. 如果更新成功发送付款到贝宝
  4. 如果成功,则向数据库发送提交。

这将是最省钱的方法,如果提交失败,只需在与数据库无关的地方记录该错误,然后手动处理(用户友好)

顺便说一句,当然,在财务上对您来说更安全,首先更新付款已发送的用户数据,然后顺利将付款发送到贝宝。

如果您在付款出错后无法回滚用户数据,这不会对您造成损害,但用户肯定会告诉您他没有收到付款......

于 2012-08-31T15:47:25.290 回答
2

您需要的是两阶段提交的变体

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

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

如果付款成功,您将记录下来。

如果您从系统故障中恢复过来,并且您记录了您正在尝试付款但没有记录您已付款,您必须与贝宝核实您是否已付款。

于 2012-08-31T15:48:31.757 回答