PHP

PHP (Laravel) で、LINE WORKS API 2.0を叩く

PHP-Laravel-で、LINE-WORKS-API-2.0を叩く

業務で、とあるwebページから申し込みがあった場合、LINE WORKSでbotから

ユーザーに対して、通知メッセージを送ることになりました。

その際、PHP(Laravel)で送ることになったので、その方法を残すことにしました。

環境

今回の環境

  • PHP 7.4.9
  • Laravel 6
  • guzzlehttp/guzzle ^7.5

前提

本来であれば、以下のことをする必要がありますが、調べれば出てくるので、割愛します。

  • LINE WORKS Developer consoleでアプリとbotの作成
  • LINE WORKS Admin (管理画面)から、botをサービス中にする

LINE WORKS Developer console

LINE WORKS Admin (管理画面)

アクセストークンを取得するAPIを叩く

まずは公式を参考にしながら、アクセストークンを取得していきます。

/**
 * アクセストークン取得
 */
public function get_access_token()
{
    // LINE WORKS Developer consoleで作成した、アプリのPrivate Keyを任意の場所に置いて、取得する
    $private_key = openssl_pkey_get_private('file:///user/local/test/private_xxxxxxxxxxxxx.key');
     
    // header情報をエンコードする
    $header = $this->base64UrlEncode(json_encode([
        'alg' => 'RS256',
        "typ"=> "JWT"
    ]));
    
    // ペイロードをエンコードする
    $payload = $this->base64UrlEncode(json_encode([
        // LINE WORKS Developer consoleで作成した、アプリのClient ID
        "iss" => "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
        // LINE WORKS Developer consoleで作成した、アプリのService Account ID
        "sub" => "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
        // JWT生成日時
        "iat" => strtotime("now"),
        // JWT満了日時 (60分以内)
        "exp" => strtotime('now' . "+1 hour");
    ]));

    $signature = null;

    // 署名を生成する
    openssl_sign($header . '.' . $payload, $signature, $private_key, OPENSSL_ALGO_SHA256);
    
    $signature = $this->base64UrlEncode($signature);
    $jwt = $header . '.' . $payload . '.' . $signature;
     
    $url = 'https://auth.worksmobile.com/oauth2/v2.0/token';  // Access Token取得api
    
    $client = new \GuzzleHttp\Client();
    // api実行
    $response = $client->request(
        'POST',
        $url,
        ['form_params' => 
            [
                'grant_type'    => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
                'assertion'     => $jwt,
                // LINE WORKS Developer consoleで作成した、アプリのClient ID
                'client_id'     => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
                // LINE WORKS Developer consoleで作成した、アプリのClient Secret
                'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
                'scope'         => 'bot',
            ]
        ]
    );
    $contents = $response->getBody()->getContents();
    // jsonからデコード
    $contents_decode = json_decode($contents, true);
    return $contents_decode["access_token"]
}

/**
 * base64でデータをエンコードする
 */
public function base64UrlEncode($data)
{
    return str_replace('=', '', strtr(base64_encode($data), '+/', '-_'));
}

Botによるメッセージ送信APIを叩く

次に、上記で取得したアクセストークンを使って、メッセージをユーザーに送信するapiを叩きます

public function send_bot_message($access_token)
{
    // LINE WORKS Developer consoleで作成した、botのid
    $bot_id = "00000000";
    // 送信したいユーザーid(LINE WORKSログイン時のメールアドレスでも可)
    $user_id = "xxxxxxxxxxxxxxxxx";    
    // メッセージ送信(ユーザー指定)api
    $url = "https://www.worksapis.com/v1.0/bots/${bot_id}/users/${user_id}/messages";
    
    $client = new \GuzzleHttp\Client();
    // api実行
    $response = $client->request(
        "POST",
        $url,
        [
            'headers' => [                                     
                'Authorization' => 'Bearer ' . $access_token,
                'Content-Type'  => 'application/json',
            ],
            'json' => [
                "content" => [
                  "type" => "text",
                  "text" => "メッセージ送信"
                ]
            ]
        ]
    );


}

上記はユーザーを指定して、メッセージを送信していますが、以下のapiを使えば、トークルームを指定してメッセージを送信できます。

最後に

PHPで、LINE WORKS APIを使って、LINE WORKSにメッセージを送信してみました。

本来であれば、APIを叩くときに、エラー処理を入れる必要がありますが、今回は省略しています。

参考になれば幸いです。

参考

-PHP
-, ,