IPNは、Instant Payment Notificationの略で、日本語では即時支払い通知。
PayPalで何らかの決済処理時に、その情報を自身のサーバーでも把握したいときに、この通知を受け取ることで、プログラムに何らかの処理をさせることができます。
例えば、決済が正常に終了したならば会員を有料会員とみなし、有料会員専用のコンテンツを利用させる、といった目的を実現するためには、PayPal側から決済が正常に終了したという通知を受け取る必要があるわけです。
PayPal提供のサンプルコードを設置
まずは、PayPalが提供しているサンプルコードをダウンロードします。
https://github.com/paypal/ipn-code-samples/tree/master/php
このプログラム(example_usage_advanced.php)が正常に動けば、IPNシミュレーターから通知を受けた際に、メールでの通知、ログファイルの保存、などを行ってくれます。
cacert.pemの修正
文字コードの違いで保存できない場合は該当の箇所を削除。BEGIN CERTIFICATE~END CERTIFICATEの間は修正しないようにします。
IPN受け取りプログラムの設定
$enable_sandbox:
PayPalのテスト環境(sandbox)で使う際にはtrueにしておきます。IPNシミュレーターで通知を受け取るだけなら特に関係ありません。
$my_email_addresses:
決済されたアカウントと紐付けをするために、ここにビジネスアカウントのメールアドレスを設定しておきます。IPNシミュレーターで通知を受け取るだけなら特に関係ありません。
$send_confirmation_email:
通知を受け取ったことを知らせるためのメールアドレス情報を設定します。
$log_file_dir:
通知ログを格納するフォルダを指定します。パーミッションを書き込みできるようにしておきます。
プログラム内にあるタイムゾーンを設定します。
date_default_timezone_set(“Asia/Tokyo”);
実際の処理は、「// Process IPN」の行以降に記述しますが、IPNシミュレーターで通知を受け取れることの確認だけなら、まずは不要です。
IPN受け取りプログラムの設置
サーバーに、受け取りプログラム一式をアップロードし、指定したログフォルダを作成します。
設置したプログラムのURLを直接ブラウザで開くと、「Uncaught Exception: Missing POST Data」という、データを受信してない旨のメッセージが当然表示されますが、それ以外のエラーがなければ設置完了です。
IPNシミュレーターから通知を送る
PayPal Developerにログインします。
左メニューのIPNシミュレーターを選択。
IPN handler URLに、アップロードしたIPN受け取りプログラムのURLを指定します。
Transaction typeはどれでも構いません。通常の決済確認としてeCheck – completeなどを選択すればよいかと思います。
ページの一番下にあるSend IPNボタンを押し、正常に送信されるとIPN was sent and the handshake was verified.というメッセージがページ上部に表示されます。
IPN受け取りの確認
メールでの受け取りをtrueにしていればメールが送信されます。
ログフォルダへの書き込みをtrueにしていると、指定したログフォルダの中に、西暦フォルダ(例:2020)、さらに月フォルダ(例:04)が作成されます。
月フォルダの中に、日別のログファイル(例:Test paypal_ipn_2020-04-21.txt)が作成されていれば、なんらかの通知を受け取れたということになります。同じ日に複数回通知を受け取った場合は、同じファイルの中に追加で書き込みされます。
また、ファイル名の先頭にある「Test」は、受信データの中のtest_ipnが1の場合にファイル名に付け足されます。IPNシミュレーターでの通知、あるいは、Sandbox環境からの通知の場合には、test_ipnが1というデータが通知されます。
コメント
はじめまして。PayPalのIPN設定の方法を探していたところこちらにたどり着きました!
ご紹介していただいている内容を基に、テストを実施したのですが、”IPN was sent and the handshake was verified.”と表示されるもログへの出力が全くされず困っております。
発信元は、IPNシミュレーターになります。
このサンプルのみで動作確認が可能なのでしょうか?
その他に修正または、必要なものはありますか?
コメントありがとうございます。
はい、基本的にはこのサンプルプログラムの設置でログ作成されました。
確認としては下記のような感じでしょうか。
・ログフォルダのディレクトリ指定、パーミッションは正しいか
・メール通知trueにしてメールは届くか
・直接IPN受け取りプログラムをブラウザで開いて、PHPのエラーが表示されないか
ご返信ありがとうございます。
サンプルプログラム設置だけで動作確認が出来るのですね。
・ログフォルダのディレクトリ指定、パーミッションは正しいか
⇒サンプルプログラムでないですが、同フォルダにlog出力のPGを設置しlog出力は確認出来ました。
・メール通知trueにしてメールは届くか
⇒こちら届きません。
・直接IPN受け取りプログラムをブラウザで開いて、PHPのエラーが表示されないか
⇒”Fatal error: Uncaught Exception: Missing POST Data in C:\inetpub\wwwroot\php\PaypalIPN.php:64 Stack trace: #0 C:\inetpub\wwwroot\php\example_usage_advanced.php(29): PaypalIPN->verifyIPN() #1 {main} thrown in C:\inetpub\wwwroot\php\PaypalIPN.php on line 64″というエラーのみ出力されておりますが、こちらは想定通りとの認識です。
環境は、WindowsServer2016 IIS10.0での環境になります。
サンプルプログラムの設定としては問題ないような気がしますね。
IPNシミュレーターで送信完了メッセージも出ているので通信的にも問題ないとすれば、環境的なものでしょうか……
こちらに関してはあまり明るくはないのですが、IISのログでIPNシミュレーターからPOSTが受け取れていそうか確認されてみてはどうでしょうか。