LINEミニアプリの「サービスメッセージ」を試してみた③ : トークンサーバー構築

4 min read読了の目安(約3700字

BULB加藤です!

引き続き、LINEミニアプリのサービスメッセージ実装をやっていきたいと思います。

①:概要確認 https://zenn.dev/bulb/articles/b10f61b983a949
②:開発環境準備 https://zenn.dev/bulb/articles/8528cd7d830532
③:サーバ構築 https://zenn.dev/bulb/articles/e369d3e41935ec
④:ミニアプリ開発 https://zenn.dev/bulb/articles/7b576300730c42
⑤:APIをデプロイ https://zenn.dev/bulb/articles/3b237d1fdc1183

PHPでトークンの取得をしていく

ここまでの準備で開発環境とデプロイ環境ができているので、ひとまずローカルで開発をしていきます。

こちら(https://zenn.dev/bulb/articles/8528cd7d830532) で用意したDockerを立ち上げましょう。

トークン取得の手順

https://developers.line.biz/ja/docs/line-mini-app/develop/service-messages/#sending-service-messages-for-the-first-time
公式ドキュメントにもあるように、サービスメッセージ送信のためには以下のようなロジックが必要です。
  1. あらかじめチャネルアクセストークンを取得しておきます。
  2. 通知するときに、LINEミニアプリでliff.getAccessToken()を実行して、アクセストークンを取得します。
  3. 手順2で取得したアクセストークンを、サーバーに送信します。
  4. サービス通知トークンを発行します。
  5. 最初のサービスメッセージを送信します

この通りにやっていくだけ。

似た名前のトークンが3種類あるのでやりながら混乱してきますが、迷ってきたらこのチャートに戻ってきて確認します。

では順番にPHPで実装してみましょう。

チャネルアクセストークンを取得

ドキュメントの通りに「短期のチャネルアクセストークン」を取得します。

index.php
$url = 'https://api.line.me/v2/oauth/accessToken';
$data = array(
    "grant_type" => "client_credentials",
    "client_id" => "xxxxxxxxxxxx", //LINEミニアプリのクライアントID
    "client_secret" => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", //LINEミニアプリのclient_secret
);
$data = http_build_query($data, "", "&");
$header = array(
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: ".strlen($data)
);
$context = array(
    "http" => array(
        "method"  => "POST",
        "header"  => implode("\r\n", $header),
        "content" => $data
    )
);
$json = file_get_contents($url, false, stream_context_create($context));
$arr = json_decode($json, true);
$access_token = $arr['access_token'];
echo $access_token ;

client_idとclient_secretはコンソールに書いてあるものをコピペします。

デバッグ用にチャネルアクセストークンをechoで出力しているので、ブラウザでhttp://localhost:8080 で確認してトークンぽい文字列が表示されていたら成功です。

LIFFアクセストークンを取得

こちらはクライアント(ユーザーのLINEミニアプリ)から送られてくる情報です。

クライアント側の実装はこの後やっていきますが、URLパラメータで送るので $_GET で取っていきます。さきほどのコードの下に追記してください。

index.php
$liff_access_token = "";
if(isset($_GET['access_token'])) { 
    $liff_access_token = $_GET['access_token']; 
}

動作チェックはクライアントの準備ができてからやってみましょう。

サービス通知トークンを取得

LINEのAPIにアクセスして、固有なサービス通知トークンを取ってきます。

index.php
$data = array(
    "liffAccessToken" => $liff_access_token,
  );
  $data = json_encode($data);
  $header = array(
    "Content-Type: application/json; charset=UTF-8",
    'Authorization: Bearer '. $access_token,
    );
  $options = array(
    "http" => array(
      "method" => "POST",
      "header"  => implode("\r\n", $header),
      "content" => $data
    )
  );
  $context = stream_context_create($options);
  $json = file_get_contents("https://api.line.me/message/v3/notifier/token", false, $context);
  $arr = json_decode($json, true);
  $notificationToken = $arr['notificationToken'];
  echo $notificationToken;

サービス通知トークンを $notificationToken としてechoしたので、最初のチャネルアクセストークンの下に長い文字列が追加されていたらOKです。

どうですか、そろそろどれがなんのトークンか混乱してきたでしょう!!

サービスメッセージを送信

サービスメッセージを送るためのロジック。

"templateName" はコンソールで作ったサービスメッセージのテンプレIDを入れてお入れください。

index.php
  $data = array(
    "templateName" => "XXXXXXXXXXXXX", //コンソールで設定したテンプレートに従う
    "notificationToken" => $notificationToken,
  );
  $data = json_encode($data);
  echo   $data;
  $header = array(
    "Content-Type: application/json; charset=UTF-8",
    'Authorization: Bearer '. $access_token,
    );
  $options = array(
    "http" => array(
      "method" => "POST",
      "header"  => implode("\r\n", $header),
      "content" => $data
    )
  );
  $context = stream_context_create($options);
  $json = file_get_contents("https://api.line.me/message/v3/notifier/send?target=service", false, $context);

これだけではまだサービスメッセージを送るところまではいけませんが、もう一息です!

次回はクライアント側(LINEミニアプリのアプリケーション側)の設定を行って最終的な動作確認をしていきます。