今回、および次回ではPaypalの決済を終えた後に、Paypalからコールバックされる情報を元に、バックエンドとの統合方法、およびマルチバイトを扱う際の注意ポイントを解説していきます。Paypalからコールバックされる仕掛けはPDT(支払いデータ転送)、およびIPN(即時支払い通知)の2種類があります。これらは一見似ているもので、実際コールバックされる内容はほぼ同じだったりするのですが、実はまったく違う仕掛けなものなので、どちらか一方だけを考慮してもダメで、両方のコールバックともに考慮すべきものです。これらの違いは次の通りです。主要機能は、買い手が支払い完了時に自Paypalのサイトから自サイトに自動的にリダイレクトされた時に、支払い取引の詳細を表示することです。Paypalと自サイトの処理は同期型です。(ここがポイント!)なので、PDTによってコールバックされる情報を元にバックエンドと統合を行うことが可能になります。このフローを図で表すとこんな感じになります。ところが、実はPDTではバックエンドと統合を行うには不完全となります。・・・と、いうのも、あくまでコールバックされるタイミングは、決済終了後の自サイトに戻る瞬間。決済が終了しても、自サイトに戻る前にブラウザを閉じられてしまうと、コールバックされずにバックエンドのDB処理が完結できず、ユーザは決済を終了したのにDB上では未決済、という状況になってしまいます。払戻し、支払い取り消しなど必ずしも全取引の通知を受け取るとは限らないのも、PDTの特徴なのです。すればいいのでしょうか??・・・と、いうことで、このPDTの欠点を補うために、Paypalはもう1つのコールバック方法としてIPNという方法を持っています。IPNIPNは、PDTと(ほぼ)同じデータがPaypalから自サイトにPOSTされますが、そのタイミングは支払いが終了したとき、また支払い状態が「Pending」の場合において決済されたとき、失敗したとき、拒否されたときにも別の通知を受け取ることになります。コールバックされるタイミングはWebのフローとは非同期に行われます。(これがPDTと違う大きなポイント!)これを図にするとこんな感じ。PDTとは独立してWebフローとは非同期に自サイトへPOSTされてきます。まとめると、PDTとIPNはこんな感じでバックエンドとの統合ができます。PDTはWebフローと同期してコールバックされるなので、「決済は完了しました!」な画面を出力するのはPDTのコールバック時に表示PDTでは決済が完了しても、その後にブラウザが閉じられる可能性があるそのためにDBなどバックエンドと統合する際は、IPNでPaypalからコールされた際に、その情報を元にしてDBの処理を行う全部を強引にまとめるとこんな感じ。これらの情報は「注文管理インテグレーションガイド(PDF)」がよくまとまっているので、併せて読まれるといいと思います。今回はPDT、IPNの紹介をしましたので、次のエントリーでは実際にPDTとIPNのコードを書き、その注意点について述べてみようと思います。