コールバックの概要
DingTalk は、アプリの有効化、アプリ認可の変更、部門の変更など、サブスクリプション済みのコールバックイベントをサードパーティ社内アプリにプッシュします。これらのイベントをサブスクライブすることで、開発者は DingTalk とより効果的に連携できます。 サードパーティ社内アプリを開発する際は、企業アプリの有効化イベントを受信するためにコールバックを登録する必要があります。このイベントは、どの組織がアプリを有効化したかをサードパーティアプリに通知します。サードパーティアプリのバックエンドがこのイベントを受信した後、組織情報を初期化してください。 DingTalk は現在、次のプッシュ方式をサポートしています。- RDS プッシュ
- HTTP プッシュ
- SyncHTTP プッシュ
- 203.119.0.0/16
- 203.119.128.0/17
- 140.205.0.0/16
- 106.11.0.0/16
- 198.11.0.0/16
- 59.82.0.0/16
コールバックイベントの登録フロー
コールバックイベントのサブスクリプションフローを次の図に示します。 まず、DingTalk Open Platform でプッシュされるサブスクリプションイベントを受信するための HTTP リクエストエンドポイントを設定し、次にサブスクライブしたいイベントを設定します。リクエストエンドポイントを設定すると、DingTalk Open Platform はそのエンドポイントに POST リクエストを送信します。指定された時間内に「success」を含む暗号化文字列を正しく返した場合にのみ、イベントサブスクリプションが完了します。リクエストエンドポイントの設定とコールバックイベントのサブスクライブ
SyncHTTP を通じて DingTalk がプッシュするコールバックイベントを受信するには、まず HTTP コールバック URL を設定します。サブスクライブしたイベントがトリガーされると、DingTalk はこの URL に対応する HTTP POST リクエストを送信します。- Developer Console にログインします。作成したアプリを検索し、その詳細ページを開きます。
- Development Management をクリックし、次に Edit をクリックして、プッシュタイプとして SyncHTTP Push を選択します。
-
リクエストを受信するための HTTP エンドポイントを設定します。
-
token: DingTalk がエンドポイントにイベントデータをプッシュするたびに、Signature を生成しコールバックリクエストの正当性を検証するために使用する
tokenが含まれます。英字または数字で構成し、3〜32 文字の長さである必要があります。 - Encryption AES Key: Generate Automatically をクリックして AES キーを生成します。これはコールバックメッセージのコンテンツを暗号化・復号するために使用するパラメータです。AES キーの Base64 エンコードです。詳細は後述のメッセージの暗号化と復号を参照してください。
- Callback URL: サブスクライブしたイベントのリクエストを受信するために使用する URL です。サブスクライブしたイベントがトリガーされると、DingTalk はこの URL に対応する HTTP POST リクエストを送信します。 注意 各アプリには 1 つのコールバック URL しか設定できません。アプリのサブスクリプションに対するすべてのイベント通知は、このリクエスト URL に送信されます。
-
token: DingTalk がエンドポイントにイベントデータをプッシュするたびに、Signature を生成しコールバックリクエストの正当性を検証するために使用する
-
設定が完了した後、Verify Validity ボタンをクリックすると、Open Platform は設定した URL に
application/jsonの POST リクエストをプッシュして、その正当性を検証します。以下に示します。Open Platform から POST 検証リクエストを受信したら、それを復号し、1,200 ms 以内に success を含む暗号化文字列を DingTalk に返してください。時間内に応答しない場合、リクエストがレート制限される可能性があります。 - リクエストエンドポイントの設定が正常に完了した後、Callback Events リストエリアで、サブスクライブしたいコールバックイベントを選択し、右上の Save をクリックします。 注意 コールバックイベントを選択できない場合は、Developer Console の Manage Permissions ページで対応する API 権限を申請してください。
プッシュデータの説明
Callback URL を設定した後、Verify Validity ボタンをクリックすると、Open Platform は設定した URL にapplication/json の POST リクエストをプッシュして、その正当性を検証します。以下に示します。
-
check_url: テストコールバックイベント
復号後のデータ:
-
check_create_suite_url: 検証コールバックイベント
復号後のデータ:
-
check_update_suite_url: コールバック URL 更新イベント
復号後のデータ:
-
SYNC_HTTP_PUSH_HIGH: アプリ有効化などの高優先度データ
-
SYNC_HTTP_PUSH_MEDIUM: 連絡先の変更などの通常優先度データ
bizData は、RDS プッシュの open_sync_biz_data テーブルおよび open_sync_biz_data_medium テーブル内のデータそのものです。具体的なフォーマットについては、データフォーマットを参照してください。
コールバックイベントの受信と応答
HTTP サービスを起動します(以下に示します)。サービスの応答ロジックで、コールバック(プッシュ)データを復号して保存します。 完全なコード例: <https://github.com/opendingtalk/eapp-isv-quick-start-java/blob/master/src/main/java/com/controller/CallbackController.java>メッセージの暗号化と復号
安全なデータ伝送を確保するため、DingTalk がサブスクライブされたコールバックイベントを Callback URL にプッシュする際、イベントのソースを検証するために設定した token を含めます。また、キーを使用してメッセージのコンテンツを対称暗号化します。 コールバックの暗号化・復号ライブラリとそのデモはこちらから取得できます。 DingTalk サーバーは、msg メッセージ本文のプレーンテキストを encrypt にエンコードします。encrypt = Base64_Encode(AES_Encrypt[random(16B) + msg_len(4B) + msg + $key]) は、暗号化されたプレーンテキストメッセージ msg の Base64 エンコードです。ここで、
- random は 16 バイトのランダム文字列です。
- msg_len は
msgの 4 バイトの長さで、ネットワークバイトオーダーです。 - msg はメッセージ本文のプレーンテキストです。
- key はアプリの suiteKey です。
encrypt フィールドを抽出します。
- 暗号文を Base64 デコードします:
aes_msg = Base64_Decode(encrypt)。 - AESKey を使用して AES 復号を実行します:
rand_msg = AES_Decrypt(aes_msg)。