Procfileの作成と設定
では次に、Herokuにデプロイしたプロジェクトの動作設定を、Procfileを使って指定しましょう。
ProcfileとはHerokuにデプロイしたアプリケーションに関する設定を指定するファイルで、使うWebサーバーの種類、ドキュメントルート、条件を指定してのリダイレクト先の指定などが可能です。
今回は使うWebサーバーのみ指定しておきましょう。
まずはプロジェクトフォルダにProcfileという名前のファイルを新たに作成します。拡張子は要りません。
できたら、以下のように編集し、保存してください。
web: vendor/bin/heroku-php-nginx
これでWebサーバーにNginxを使うように指定することができました。NginxはApacheで知られるWebサーバーの一つなのですが、Apacheと比べはるかに高機能なので始めからこちらを使いましょう。
Procfileが存在するプロジェクトをデプロイすれば、以後は設定した環境で実行されます。
index.phpの作成と編集
LINE Bot SDKを使う準備とHeroku上の動作設定が終わったので、実際にコードを書いていきましょう。
オートローダの指定
プロジェクトのルートにindex.phpを新たに作成し、以下のように編集してください。
<?php require_once __DIR__ . '/vendor/autoload.php'; ?>
autoload.phpはComposerが作成するオートローダーで、この一行でComposerがvendorフォルダにダウンロードしたすべてのライブラリを参照できるようになります。
新しいライブラリを導入するなどしてvendorフォルダの中身が変更されると自動的に生成されるので、いちいちインクルードしなくても良くなり非常に便利です。
CurlHTTPClientとLINEBotのインスタンス化
次に以下のコードを追記します。
require_once __DIR__ . '/vendor/autoload.php';
$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(getenv('CHANNEL_ACCESS_TOKEN'));
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv('CHANNEL_SECRET')]);
?>
LINE Developersで取得し、HerokuのSettingで設定したCHANNEL_ACCESS_TOKENを用いてCurlHTTPClientをインスタンス化、同じくCHANNEL_SECRETを用いてLINEBotをインスタンス化しています。
署名の検証作業
次に以下のコードを追記します。
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv(‘CHANNEL_SECRET’)]);
$signature = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
try {
$events = $bot->parseEventRequest(file_get_contents('php://input'), $signature);
} catch(\LINE\LINEBot\Exception\InvalidSignatureException $e) {
error_log("parseEventRequest failed. InvalidSignatureException => ".var_export($e, true));
} catch(\LINE\LINEBot\Exception\UnknownEventTypeException $e) {
error_log("parseEventRequest failed. UnknownEventTypeException => ".var_export($e, true));
} catch(\LINE\LINEBot\Exception\UnknownMessageTypeException $e) {
error_log("parseEventRequest failed. UnknownMessageTypeException => ".var_export($e, true));
} catch(\LINE\LINEBot\Exception\InvalidEventRequestException $e) {
error_log("parseEventRequest failed. InvalidEventRequestException => ".var_export($e, true));
}
?>
LINEからPOSTされてきたデータをパースし、Eventの配列である変数$eventsに格納します。
この際、ヘッダーからLINEが付与した署名を取得し、リクエストがLINE Platformから送信されたものであることを確認しています。確認ができなかった場合は変数$eventsが空になり、以降の処理は行われません。
