私はオンライン小売店を開発してきました。
php で書かれており、paypal と IPN を使用して支払いを処理します。
独自のショッピング カートを作成しました。ユーザーがチェックアウトしたい場合、ボタンの周りに標準のカートアップロード機能がラップされているチェックアウトボタンをクリックすると、ユーザーはペイパルに移動して支払いを完了します。その後、Paypal から IPN が送信され、支払いが通知されます。
私の質問は、どの時点で注文を保存する必要があり、いつ在庫レベルを下げる必要があるのですか?
私が現在持っている標準的なプロセスフローは次のとおりです。
ユーザーがカートにアイテムを追加します。
- アイテムが売り切れになった場合、または追加された数量が利用可能な数量を超えた場合、カートはこれを反映するように更新されます。
- ただし、カートに在庫を追加しても在庫レベルは下がりません。
ユーザーがチェックアウトをクリックします。
- カートはデータベースの注文レコードにロードされ、在庫レベルが減少します。
- ユーザーはペイパルに移動して支払いを完了します。
(a) ユーザーが支払いを完了する。
(b) ユーザーがウェブサイトに戻るか、別の場所に移動するか、ブラウザを閉じることによって支払いを完了しない。
(オプション) ユーザーが Web サイトに戻るをクリックします。
- ユーザーに「ありがとう、注文完了」の完了ページが表示されます。
- いずれにしてもペイパルは IPN を送信するため、注文テーブルに関しては何も処理されません。
- PaypalがIPNを送信
- 取引ステータスで注文を更新する
- 取引ステータスで注文を更新する
ご覧のとおり、このプロセスにはいくつかの問題があります。顧客が支払いを完了せずにペイパルのページを離れた場合、私は「ぶら下がっている」注文を持ち、在庫レベルも減少するため、この在庫は他の顧客が利用できなくなります! これに対する解決策は、データベースを時々手動で「クリーン」にすることです。
代替案?
オプション I) 「完了したトランザクション」の IPN が受信されるまで注文をデータベースに保存せず、セッションに保存されたカート情報を使用して注文を作成し、在庫レベルを下げます。ただし、セッションは期限切れになる可能性があり、支払いによってはペイパルの支払いに数日かかる場合があります。
オプション II) 注文をそのまま保管しますが、完了したトランザクション IPN を受け取るまで在庫レベルを下げません。これにはまだ未解決の注文の問題がありますが、少なくとも、クリーンアップ時に在庫を再度追加する必要はありません。注文を削除するだけです。ただし、これに関するもう 1 つの問題は、複数の人が同時に注文した場合、それらの注文に在庫を超える数量が含まれることです。システムが完了した IPNS を受け取り、在庫レベルをマイナスの数量に減らすと、これは非常に混乱する可能性があります。
私は何らかの助けを求めてインターネット上のあらゆる場所を見てきましたが、どこにも言及されていません! 誰もが IPN の処理方法にスキップします。どうして他の人がこの問題を抱えていなかったのか理解できませんか?!
助けてください!