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/