1

私は、ユーザーが他のユーザーが提供するサービスの料金を支払う Web サイトを持っており、週の終わりに、サービスの販売額からコミッションを差し引いた金額をユーザーに支払います。

現在、ユーザーに支払いをしたいときは、手動で支払いを行い、paypal にログインし、支払い後に手動でデータベースを更新しています。私たちが抱えている問題は、トランザクションが 1 週間に 1,000 件を超えているため、手動で行うのは非常に面倒なことです。

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. 成功した場合、コミットをデータベースに送信しました。

これは最も安全なアプローチであり、コミットが失敗した場合は、そのエラーを DB に関連しない場所に記録し、後で手動で処理します (ユーザーフレンドリー)。

余談ですが、もちろん、最初に支払いが送信されたユーザーデータを更新し、これがスムーズに実行された後にペイパルに支払いを送信する方が、経済的に安全です。

支払いがうまくいかなかった後にユーザーデータをロールバックできない場合、それはあなたの損害ではありませんが、ユーザーは支払いを受け取っていないと言うでしょう....

于 2012-08-31T15:47:25.290 に答える
2

必要なのは、2 フェーズ コミットのバリアントです。

支払いプロセスの状態遷移図を作成します。各状態は、永続ストレージ (この場合は MySQL データベース) の安定した状態を表しており、すべてのパスが 1 つの支払い処理につながることを確認してください。

まず、支払いをしようとしていることを記録します。

支払いが成功した場合は、それを記録します。

システム障害から戻ってきて、支払いを試みているが支払っていないことが記録されている場合は、支払ったかどうかペイパルに確認する必要があります。

于 2012-08-31T15:48:31.757 に答える