PAYPALのIPN(Instant Payment Notification)は結構エラーがある。

PAYPALのIPNは結構罠があるという話です。

発端は、顧客からPAYPALのIPN(Instant Payment Notification)に関する相談をうけたところから。

相談内容

  • ユーザーで運営しているCMSを使用した月毎定額課金の会員制サイトにて、PAYPALのIPNを使用した、連携をおこなっている。
  • 連携部分は、正常なIPNのやり取りが行われれば、該当アカウントの使用期限を延ばすというだけ。
  • 割合は少ないが、PAYPALの運用画面を見る限りIPNは飛んでいるはずで、課金もされているが、期限日が更新されていないケースがある。
  • 課金アカウント数が多い時に発生するケースが多いような気がする。

調査

もともとノータッチのシステムだったこともあり、まずはCMS側のソースざっと眺めてみると、データをテキストファイルでもっている古いCMSなのがわかった。
また、CMS側のIPNの正常判断は、ヘッダーに「VERIFIED 」の文字があるかどうかのシンプルなもの(詳細いえばその先もあるけど)。
これは、公式ドキュメントを確認しても以下のように書いてあったので
PayPal sends a single word back - either VERIFIED (if the message matches the original) or INVALID (if the message does not match the original). (引用:PayPal公式
問題はないもよう。

PAYPAL側の問題ではなかろうという先入観に加えて、IPNの多い時が障害発生率が高いという話も聞いてたので、おそらくテキストDBというのがネックで、多量のリクエストでIOエラーでもでてるんだろうなーと適当にログ出力をはさみこんで、次回障害でたときにお知らせいただくということで、いったん調査終了。

そこからしばらくはおとなしく動作。
ジンクスというかなんというか、そういう調査用の罠を設置すると結構正常に動作してしまうのが不思議なところ。

解決

数か月して、再度連絡があった。
現象がでたらしい。

搭載メモリが極端に少ない私は、必死になんのことだったか思い出しつつ、
そうそう!ログいれたんだった!
と、ログをみてみると・・・

あれ?どうも古いCMSのほうはちゃんと動作していて、PayPalから「VERIFIED 」がかえってない様子。かといって「INVALID 」もかえってない。
さらにヘッダーの詳細みてみると

500 INTERNAL_SERVICE_ERROR
An internal service error has occurred

PAYPALのページの図でいうと

②はくるけど、⑤で500エラーがでてるよう。

おい!PayPal!
あかんやろ!
サーバー負荷かなんかで落ちとるだけ?もしかして?!
しれっとこんなエラーだしといて、管理画面では正常にIPNとばしましたって表示して。
(まあ②を正常に飛ばしたということの情報だけなんでしょうが・・)

確かに大量にIPNはいてる時間でした・・。
 
そして、古いCMSさんごめんなさい。
てっきりあなたのせいだと思ってました。
古いCMSはまったく問題なく動作しておりました。

PayPalはIpnからAPiへの移行を推進しているようなので、もうあんまりIpnには力いれてないのかもしれませんね。
問い合わせしても、この手の海外サービスにありがちなのれんに腕押し感(国内は運用だけだもんなー)。

仕方がないので、⑤で500エラーでも②の内容でOKかNGかを判断するようCMS側に手を入れました(要は「VERIFIED 」無視)。
IPNの仕組み意味ねーと釈善としない部分もありますが、しゃーないよね。

別の問題と解決

さらに調査を継続すると、稀だけど②すらとんでいないケースも発覚。
この場合は、さすがに管理画面にもIPNが飛んでないこと確認できました。

しかたがないので、取り急ぎ、Ipnの情報を全てDBにつっこみ、PayPal管理画面から取得できる取引履歴のCSV(これはさすがに不備はない。)と照らし合わせて、不一致を見つける機能を用意して難を逃れました。

結論

ということで、いまから作る場合はPAYPAL-API使うから関係ないとは思うけど、
PAYPALのIPNは結構信用できないので、使ってるシステムは注意が必要という話でした。

0 件のコメント :

コメントを投稿