Oracle APEXのアプリケーションよりLINEのMessaging APIを呼び出し、LINE公式アカウントよりメッセージの送受信を行うために必要な準備を行います。
概ね、チャネルアクセストークンを取得するための作業になります。
LINE Developesコンソールより
プロバイダーが作成済みであることを前提とします。以前の記事
LINEアカウントによる認証などを参考にしてください。
LINE Messaging APIを使用するために、
チャネルタイプが
Messaging APIであるチャネルを新規に作成します。チャネルの作成方法はLINEから提供されている
ドキュメントを参照するか、
過去記事の
チャネルタイプが
LINEログインの手順とほぼ同じですので、そちらを参照してください。
新規チャネル作成でMessaging APIを選択します。
チャネルを新規作成すると、チャネル名と同名のLINE公式アカウントが作成されます。作成当初はフリーの月額プランが選択されるようです。フリーのプランでは1000通まで無料でメッセージが送信できるとのことです。
LINE Official Account ManagerよりLINE公式アカウントの状況について確認できます。お金にかかわることもありますが、LINE公式アカウント自体の設定が多数あるため、事前にLINE公式アカウントについて理解しておく方が良いようです。Messaging APIはLINE公式アカウントで使える機能のうちの、ごく一部です。
これからMessaging APIを使う設定について説明します。
作成したMessaging APIのチャネル基本設定にチャネルシークレット、アサーション署名キー、あなたのユーザーIDが表示されています。
チャネルシークレットはLINE公式アカウントが受信したメッセージの署名の検証に使用します。アサーション署名キー(のID)はメッセージを送信するAPIの認証のために使用します。あたなのユーザーIDは、メッセージの送信をテストする際の宛先として使用します。
この他にチャネルIDも、Messaging APIの呼び出し時に使用します。
これからの作業でJSON Web Key、JSON Web Tokenやチャネルアクセストークンを生成します。それらの処理を実装したPL/SQLのパッケージ
UTIL_LINE_APIを作成します。LINEのドキュメントには色々なコンピュータ言語でのサンプルが掲載されていますが、PL/SQLのサンプルはありません。
パッケージのコードは以下になります。DBMS_CRYPTOのRSA署名の機能を使用しているため、Oracle Databaseは19c以上であることが前提です。
Oracle APEXでは、SQLワークショップのSQLスクリプトを使って実行できます。
アサーション署名キーを作成します。
PL/SQLよりDBMS_CRYPTO.SIGNを呼び出す際、秘密鍵はPKCS#1またはPKCS#8の形式で受け付けます。そのため、opensslを使って鍵ペアを生成し、その鍵ペアよりLINEのアサーション署名キーとして登録できるJSON Web Keyを作ります。
ビット長2048で鍵ペアを生成し、private.pemとして保存します。
openssl genrsa -out private.pem 2048
% openssl genrsa -out private.pem 2048
Generating RSA private key, 2048 bit long modulus
...................................................................+++++
.....+++++
e is 65537 (0x10001)
%
最初に
eの値を取り出します。通常は
65537です。
openssl rsa -in private.pem -text -noout | grep publicExponent% openssl rsa -in private.pem -text -noout | grep publicExponent
publicExponent: 65537 (0x10001)
%
次に
modulusの値を取り出します。
openssl rsa -in private.pem -modulus -noout
Modulus=以降の値が暗号指数です。
% openssl rsa -in private.pem -modulus -noout
Modulus=BBABF46FC55DF62DCDAC79C00A978BF5B06041CEA20A19FD1CA95B0522ACE8CAD1CE81AC7F970307BD3191B20E8EB9DC356242A8304C6F2580E5C53EEACB53763033F436B7E7A1982435E6BBDC7927EC8E59F2EF5EA8FFCD76A2F66D290C68DFDEDDFE6CF1A8859700FCA25235C1662EC26C94A68379736F3C1F1492871D17D5A1507FC050AB83769FAF39D0E406DDCA695947142B010F5FF8AC99CFBA734FE63C965EA54C8A5CB61C60D34C35769F10C1443B3912830A0C112F03A9CAADC49956820B2E0A54095E5E6E5D6F769698FA8778C6264C8DE6C14704CA9BF0DC7B0BE63940497080618BFEEFC7854DCB6FF0262A968B2B7F6460244F9AFAE0295951
%
SQLコマンドよりUTIL_LINE_API.GENERATE_JSON_WEB_KEYを実行します。
begin
dbms_output.put_line(
util_line_api.generate_json_web_key(
p_e => 65537
,p_n => 'Modulus=以降の値'
)
);
end;
結果にJSON Web Keyが表示されます。これをLINEのMessaging APIのチャネルのアサーション署名キーの公開鍵として登録します。
続いて、LINE公式アカウントがメッセージを受信したときに呼び出されるWebhookを設定します。
LINEからは、Oracle REST Data ServicesのRESTサービスをWebhookとして呼び出すようにします。
Webhookでは、受信したメッセージの署名の検証と、表LINE_MESSAGESに受信したメッセージを保存を行います。
表LINE_MESSAGESは、以下のクイックSQLのモデルより作成します。受信するメッセージはJSON形式ですが、BLOBで保存します。
# prefix: line
messages
signature vc4000
content blob
is_valid vc1 /nn /default Y
received_date date /default sysdate
SQLワークショップのユーティリティのクリックSQLより、表の作成を行います。
RESTサービスのハンドラに記述するコードを減らすため、ファンクションLINE_CALLBACKを作成します。署名の検証には、Messaging APIのチャネルシークレットが必要です。
RESTサービスを作成します。
SQLワークショップのRESTfulサービスを開きます。
最初にモジュールを作成します。左ペインのモジュールを選択し、モジュールの作成を実行します。
モジュール名はLINE、ベース・パスは/line/としました。公開はONにします。
モジュールの作成をクリックします。
モジュールLINEが作成されます。
続けてテンプレートの作成をクリックします。
Autonomous Databaseを使用している場合の注意点があります。
完全なURLのパスがワークスペース名でなく、wksp_で始まるワークスペース・スキーマ名になっている場合があります。
その場合は、RESTfulデータ・サービスの画面の構成を開き、スキーマ別名をワークスペース名(wksp_を除く)に変更します。
テンプレートの作成では、
URLテンプレートとして
callbackを指定します。
テンプレートの作成をクリックします。
テンプレートcallbackが作成されます。
続けてハンドラの作成をクリックします。
ORDSハンドラ定義のメソッドとしてPOSTを選びます。ソースに以下のコードを記述します。
以上を設定して、ハンドラの作成をクリックします。
以上でWebhookの処理を行うRESTサービスが作成できました。
完全なURLをコピーし、LINEのチャネルのMessaging API設定のWebhook設定のWebhook URLに設定します。
検証をクリックし、Webhookの動作確認を行います。QRコードをLINEで読み込み、公式アカウントを友達として登録することで、LINEからメッセージを送信することもできます。
検証をクリックしてOKと表示されたら、Webhookの呼び出しが成功しています。
SQLコマンドより送信されたメッセージを確認します。
select id, signature, json_serialize(content), is_valid, received_date from line_messages;
IS_VALIDの値がYであれば、署名の検証も成功しています。
メッセージの受信はできたので、今度はメッセージの送信の方の設定を行います。
メッセージの送信の認証に使用するWeb資格証明を作成します。AuthenticationヘッダーをWeb資格証明として使用します。
ワークスペース・ユーティリティのWeb資格証明を開き、作成をクリックします。
Web資格証明の名前はLINE Channel Access Tokenとします。静的識別子としてLINE_CHANNEL_ACCESS_TOKENを指定します。認証タイプとしてHTTPヘッダーを選択します。
資格証明名はヘッダー名であるAuthorization、資格証明シークレットは適当な文字列を入力します。資格証明名と資格証明シークレットは、LINEのトークンURLを呼び出して取得したチャネルアクセストークンにより、置き換えられます。
以上で作成をクリックします。
メッセージの送信を行う準備ができました。
SQLコマンドより以下のコードを実行し、LINEのチャネルアクセストークンを取得します。取得したトークンはWeb資格証明のLINE_CHANNEL_ACCESS_TOKENに保存します。
キーIDが表示されれば、チャネルアクセストークンの取得は成功です。
メッセージの送信をテストします。以下のコードを実行します。
あなたのユーザーIDの部分は、チャネル基本設定のあなたのユーザーIDとして記載されているIDに置き換えます。開発者自身にLINE公式アカウントよりメッセージが届きます。
LINEでメッセージが受信できれば、メッセージの送信についても確認が完了しました。
以上になります。
LINE公式アカウントでの基本的なメッセージの送受信ができるようになりました。
完