PHPでstripslashes関数を使うとIPNのValidationがうまくいかない
PayPalのウェブペイメントプラスでクレジット決済を行った後、IPNデータを取得してシステムへのデータ取り込みをPHPで書いているのですが、送られてきたデータが正しいかPayPalに問い合わせるValidationが、VERIFIEDでなくINVALIDで返ってきてしまい、はまりました。
原因は、SHIFT JISの0x5C問題、いわゆる「ダメ文字」というやつで、今回だと「圭」が対象でした。
PayPalのIPNでは、送られてきたでデータをそのままの順序、そのままの内容でPayPalに送り返すことで
通知が正しいもの=VERIFIEDだと認識されますが、その送り返すデータを作成するときに
stripslashes関数をつかっていたため、ダメ文字の0x5Cが削除されてしまうために、
受信文字列と送信文字列が一致しない結果INVALIDが返却されていました。
foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req .= ""&$key=$value""; }
php.iniでmagic_quotesがOFFになっているので、そもそもstripslashes()は呼び出す必要はなかったですね。。
IPNの実装方法についてはこちらに詳しく載っています。
https://developer.paypal.com/docs/classic/ipn/gs_IPN/