やりたいこと
LINE BOT API Trial Account でコールバックされてくるリクエストが正しいものかどうかをPHPで検証したい。
BOT APIの仕様書にはJavaとRubyの例しか載ってなかった。
やり方
1. SignatureはLINE側からのコールバックリクエストの「HTTP_X_LINE_CHANNELSIGNATURE」ヘッダに入っている。
2. 「Channel Secret」をキーにして、リクエストボディを「HMAC-SHA256」で計算する。
3. 上記2をBASE64エンコードする。
4. 上記1と3が等しければ正しいSignature
※hash_hmac()の第3引数(raw_output)はtrueにすること!
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** * LINE BOT API のSignatureを検証する * * @param string $myChannelSecret LINE developers(管理画面)の「Channels > Basic information」にある「Channel Secret」文字列 * @return boolean 正しいsignatureの場合true */ function isValidSignature($myChannelSecret) { if (isset($_SERVER['HTTP_X_LINE_CHANNELSIGNATURE'])) { $signature = base64_encode(hash_hmac('sha256', file_get_contents('php://input'), $myChannelSecret, true)); if ($_SERVER['HTTP_X_LINE_CHANNELSIGNATURE'] === $signature) { return true; } } return false; } |