PayPalのウェブペイメントプラスでクレジット決済を行った後、IPNデータを取得してシステムへのデータ取り込みをPHPで書いているのですが、送られてきたデータが正しいかPayPalに問い合わせるValidationが、VERIFIEDでなくINVALIDで返ってきてしまいます。
CC BY-SA 4.0
2015-05-22T12:39:59.153
10509
2020-07-15T13:01:20.140
2020-06-02T01:13:56.460
3060
9226
question
php paypal
PHPでstripslashes関数を使うとIPNのValidationがうまくいかない
原因は、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/>

* * *

_この投稿は[@kimaihack66 さん自身の投稿 (質問)](https://ja.stackoverflow.com/q/10509)
に含まれていた内容を元に、個別の回答として抜き出して コミュニティwiki として投稿しました。_
CC BY-SA 4.0
2020-06-02T01:13:18.077
67207
2020-06-02T01:13:18.077
3060
10509
answer