LineNotify を利用するための SDK
- PHP8.1
利用するプロジェクトの composer.json
に以下を追加する。
"repositories": {
"line-notify": {
"type": "vcs",
"url": "https://github.com/shimoning/line-notify.git"
}
}
その後以下でインストールする。
composer require shimoning/line-notify
$lineNotify = new \Shimoning\LinNotify\LINENotify\LINENotify(
$channelId,
$channelSecret,
$callbackUrl,
);
通常は後述の利用フローでユーザを認証してから利用する。
送信可能なメッセージは1000文字まで。
$lineNotify->notify(
$accessToken,
new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ'),
);
第3引数に \Shimoning\LineNotify\Entity\Input\Sticker のインスタンスを渡す。
スタンプの番号については下記の公式ページを参照。
$sticker = new \Shimoning\LineNotify\Entity\Input\Sticker(
1988, // パッケージ識別子
446, // Sticker識別子
);
$lineNotify->notify(
$accessToken,
new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ'),
$sticker,
);
第4引数に \Shimoning\LineNotify\Entity\Input\Image のインスタンスを渡す。
サムネイルとフルサイズの両方の画像URIが必要(同じでも問題はないが、許容サイズに違いがある)。
- サムネイル: 最大 240×240px
- フルサイズ: 最大 2048×2048px
対応画像は JPEG のみ (拡張子で簡易判定; 第2引数に false を入れると拡張子のチェックを回避できる)。
$image = new \Shimoning\LineNotify\Entity\Input\Image(
new \Shimoning\LineNotify\ValueObject\ImageUri('https://example.com/thumbnail.jpg'),
new \Shimoning\LineNotify\ValueObject\ImageUri('https://example.com/fullsize.jpg'),
);
$lineNotify->notify(
$accessToken,
new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ'),
null,
$image,
);
第4引数に \Shimoning\LineNotify\Entity\Input\Image のインスタンスを渡す。
対応画像は JPEG と PNG のみが利用可能 (拡張子で簡易判定; 第2引数に false を入れると拡張子のチェックを回避できる)。
$image = new \Shimoning\LineNotify\Entity\Input\Image(
null, // サムネイル用
null, // フルサイズ用
new \Shimoning\LineNotify\ValueObject\ImageFile('/dir/biz/image.png'),
);
$lineNotify->notify(
$accessToken,
new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ'),
null,
$image,
);
なお、画像アップロードとURIを同時に指定することができるが、画像アップロードが優先される。
第5引数に true を入れる。
$lineNotify->notify(
$accessToken,
new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ'),
null,
null,
true,
);
メッセージ、スタンプ、画像を同時に指定すると、次の順番で投稿が実行される。
- メッセージ
- スタンプ
- 画像
メッセージの送信を $lineNotify->notify()
と実行する例を紹介しているが、静的に呼び出すことも可能。
メッセージを送信するだけならインスタンスを作成する必要はないので、むしろこちらの方を推奨。
\Shimoning\LineNotify\Communicator\Api::notify(
$accessToken,
new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ'),
);
Notify の利用を開始のための認証URLを取得する。
$uriToRedirect = $lineNotify->generateAuthUri(
$state, // CSRF 対策のトークンなどを入れる
); // https://notify-bot.line.me/oauth/authorize?response_type=code&client_id=...
state について
ユーザが認証してシステムに帰ってきた時に、code
と一緒に state
が戻ってくるので、一致するか確認することが推奨される。
CSRF 攻撃に対応するための任意のトークンを指定します 典型的にはユーザのセッションIDから生成されるハッシュ値などを指定し、redirect_uri アクセス時に state パラメータを検証することでCSRF攻撃を防ぎます。
LINE Notify ではウェブアプリケーション連携を想定しているため state パラメータを必須とさせて頂いています。
-- 引用元: 公式
response_mode について
第2引数に response_mode
を指定できる。
引き受ける値は form_post
のみで、これを指定すると、通常のリダイレクト(GET)ではなく POST
で送信される。
これはレスポンスの code パラメータが特定環境で漏洩することを防ぐためであるため、指定することをお勧めします
// 配列の場合 (GET)
$queryData = filter_input_array(INPUT_GET, $_GET); // Pure PHP
$queryData = $request->query(); // Laravel
$resultOrError = $lineNotify->parseAuthResult($queryData);
// 配列の場合 (POST)
$formData = filter_input_array(INPUT_POST, $_POST); // Pure PHP
$formData = $request->input(); // Laravel
$resultOrError = $lineNotify->parseAuthResult($formData);
// クエリストリングの場合
$queryString = 'code=ABCD...&state=1234567890...';
$resultOrError = $lineNotify->parseAuthResult($queryString);
// JSONの場合
$queryJSON = '{"code":"ABCD...","state":"1234567890..."}';
$resultOrError = $lineNotify->parseAuthResult($queryJSON);
// 判定
if ($resultOrError->isSucceeded()) {
// 成功時
$state = $resultOrError->getState(); // 送信した値と一致するかチェックすること
$code = $resultOrError->getCode();
// next step
...
} else {
// 失敗時
$error = $resultOrError->getError();
$errorDescription = $resultOrError->getErrorDescription();
}
ここで取得された access_token でメッセージ送信等を行う。
$accessTokenOrNull = $lineNotify->exchangeCode4AccessToken($code); // Abc1234...
if ($accessTokenOrNull === null) {
// something wrong
...
}
$statusOrNull = $lineNotify->status($accessToken); // インスタンスを利用する
$statusOrNull = \Shimoning\LineNotify\Communicator\Api::status($accessToken); // 静的呼び出し
if ($statusOrNull) {
$targetType = $status->getTargetTypeValue(); // GROUP or USER
$target = $status->getTarget(); // GROUP の場合はグループ名, USER の場合はユーザ名
} else {
// 未連携 or アクセストークンが無効
}
$result = $lineNotify->revokeAccessToken($accessToken); // インスタンスを利用する
$result = \Shimoning\LineNotify\Communicator\Api::revokeAccessToken($accessToken); // 静的呼び出し
if ($result) {
// 解除に成功 or 既に失効している
} else {
// 何らかのエラー
}
サポート予定。 現状はループを回す。
$message = new \Shimoning\LineNotify\ValueObject\Message('送信するメッセージ');
$accessTokens = [];
foreach ($accessTokens as $accessToken) {
$lineNotify->notify(
$accessToken,
$message,
);
}