すべてのプロダクト
Search
ドキュメントセンター

Quick Tracking:公式アカウント管理

最終更新日:Jun 09, 2025

機能概要

公式アカウントを承認して Quick Tracking に送信できます。 公式アカウントの行動イベント(フォロー、メニューアクセス、フォロー解除など)を Quick Tracking に報告して、公式アカウントのユーザー行動分析を行うことができます。

重要

WeChat 公式アカウントの追跡は、WeChat プラットフォームによってカスタマイズされたルールに依存します。 次の表では、WeChat 公式アカウントの追跡に関する重要な情報について説明します。 このようなイベントを追跡する前に、以下の情報を詳しく読んでください。 詳細については、「WeChat 公式の指示」をご参照ください。

  1. WeChat 公式アカウントイベントは、WeChat によって定義、生成、および送信されます。 開発者はこれらのデータをサブスクライブするだけで、カスタマイズすることはできません。 2 イベントとイベント属性 をクリックして、使用可能なイベントリストを表示します。

  2. WeChat 公式アカウントイベントを追跡するには、公式アカウント開発者になる必要があります。 公式アカウント開発者になると、公式アカウントプラットフォームの「自動返信とカスタムメニュー」は使用できなくなり、構成された情報は無効になります。 カスタム情報を維持する必要があります。 詳細については、「WeChat 公式の指示」をご参照ください。

  3. WeChat プラットフォームは最終的に、開発者がサブスクライブしたイベントを、開発者が管理するサーバーに送信します。 開発者は、イベントを Quick Tracking に転送する必要があります。

1. 操作の説明

以下のフォームは、公式アカウントイベント追跡に必要な手順です。順番に従ってください。

ステップ

説明

操作の詳細

1

WeChat 公式アカウントプラットフォーム で開発者構成を有効にする

image.png

WeChat 公式アカウントプラットフォームは、クリックしてジャンプできます。

警告

注:WeChat 公式アカウントイベントを追跡するには、公式アカウント開発者になる必要があります。 公式アカウント開発者になると、公式アカウントの「自動返信とカスタムメニュー」は使用できなくなり、構成された情報は無効になります。 情報を維持する必要があります。 操作プロセスについては、「WeChat 公式の説明」をご参照ください。

2

QuickTracking で公式アカウントトラッキングを設定します

image.png

表示 をクリックして、操作の詳細を表示できます。

3

WeChat 公式アカウントのイベントを QuickTracking に転送する

詳細については、「表示」をご参照ください。

4

QuickTracking でのデータ分析

2 イベントとイベント属性 をクリックして、分析できる特定のイベントリストを表示できます。

1.1 公式アカウントに統合

製品パス: 「データ追跡」-「データソース管理」-「公式アカウント管理」

image.png

[公式アカウントに統合] ボタンをクリックします。 右側の [データソースに統合] ページで作成を完了するには、以下の情報が必要です。

ヒント: ブラウザの開発者ツールを使用して、REST API のレスポンスを確認できます。

  • 公式アカウント名: アクセスする公式アカウントの名前を入力します

  • 公式アカウント ID: 公式アカウント ID を入力します。 公式アカウント ID は一意である必要があります。 次の図は、データを取得する方法を示しています: image.png

分析設定

  • 所属組織: デフォルトでは、現在の組織は変更できません。 公式アカウントを別の組織に追加する場合は、左側の [グループ] ドロップダウンリストから組織を切り替える必要があります。

  • 所属アプリケーション: ドロップダウンリストから現在の組織内のアプリケーションを選択します。

「WeChat メッセージを受信する」

  • 暗号化モード: セキュリティモードとプレーンテキストモードに分かれています。

セキュリティモード: EncodingAESKey は、WeChat 公開番号プラットフォームと同じメッセージ本文の暗号化および復号鍵として使用されます。

プレーンテキストモード: メッセージ本文の暗号化および復号機能を使用せず、セキュリティ係数が低くなります。

  • EncodingAESKey を取得するには、次のコードを実行します: 公式アカウントバックエンド - 基本構成 - EncodingAESKey をコピーします。

  • トークン取得アドレス: 公式アカウントバックエンド - 基本構成 - トークンをコピーします

(注: WeChat 公式アカウントのバックエンド URL は、ユーザーが入力したアドレスです。 WeChat 公式アカウントは、入力されたアドレスにデータを送信し、Quick Tracking と同期します。 参考ドキュメント)

image.png

「匿名ユーザーの一意の識別子」

必須。 ユニオンまたは OpenID は、匿名ユーザーの一意の識別子として使用されます。

  • OpenID: ユーザーの一意の識別子。

  • UnionID: ユーザーを区別するために使用される一意の値。 このパラメータを UnionID に設定した後、access_token を取得する必要があります。

「access_token を取得する」

他のビジネスが同時にトークンを使用する場合、access_token を取得および維持するために中央制御サービスを構築する必要があります。 分析プラットフォームでは、中央制御サービスから access_token を取得できます。 (注: 匿名ユーザーの一意の識別子として unionID を選択した場合、ユーザーはコントロールセンターを構成する必要があります。 Quick Tracking はコントロールセンターを介してトークンを取得し、WeChat 公式アカウントで対応する unionID を取得します (トークンを取得するたびにトークンが更新されるため、他の場所で使用するトークンも更新および変更されます。 また、トークン取得 WeChat 開発プラットフォームの数には制限があり、ユーザーはコントロールセンターからトークンを取得でき、トークンの期間を制御できます))

  • 中央制御サーバーアドレス: セルフビルド中央制御サービスアドレスを入力して、トークン中央制御サービスアドレスを取得します。

  • Access_token 解析: Access_Token パラメータは、中央制御サーバーから取得した戻り値から解析されます。 Access_Token パラメータは、JSONPah 式を使用して解析されます。 JSONPath 式を入力し、[テスト] をクリックして、Access_Token パラメータが解析されるかどうかをテストします。 Access_Token パラメータが解析されると、Access_Token パラメータを正常に取得できます。

image.png

上記の手順を完了し、[保存] をクリックして作成を完了します。

1.2 公式アカウント管理

公式アカウントアクションエリアは、主に以下の部分で構成されています。

  • 左側の組織スクリーニングエリア: 異なる組織にアクセスした公式アカウントを切り替えます

  • データ表示エリア: 接続されている公式アカウントのリストを表示します。 データには、公式アカウント名、公式アカウント APPID、作成者、アプリケーション、およびアクションが含まれます。 注: 分析設定では、公開番号は 1 つのアプリケーションにのみ属することができます。

  • アクションエリア: アクションエリアには、[編集] と [アクション] が含まれています。 [編集] をクリックすると、新しいインターフェースと同じになります。 [削除] をクリックすると、公式アカウントの関連付けがアプリケーションから削除されます。

1.3 データ分析

公式アカウントにアクセスした後のアプリケーション、および「公式アカウントにアクセスした後のアプリケーション」を含む分析ビューと小規模ステーションの場合、公式アカウントイベントをシステム属性に含めて分析に参加させる必要があります。 分析に参加するシステム属性は次のとおりです。

システム属性

属性値

プラットフォーム

公式アカウント AppID@wechatoa

プラットフォームタイプ

WeChat 公式アカウント

イベントタイプ

カスタムイベント

イベント名とイベントコード

詳細については、「2 イベントとイベント属性」をご参照ください。

デバイス ID

openid (デフォルト)。公開番号管理で Unionid に変更できます

機器が初日に起動されたかどうか

所属するアプリケーションのデータに従って一緒にマーキング

公式アカウントイベントを明らかにするための分析モデルには、イベント分析、ファネル分析、リテンション分析、分布分析、間隔分析、パス解析、ライフサイクル分析、アトリビューション分析、およびオーディエンス管理が含まれます。

2 イベントとイベント属性

WeChat 公式アカウントイベントは、WeChat によって定義、生成、および送信されます。 開発者はこれらのデータをサブスクライブするだけで、カスタマイズすることはできません。 サブスクライブできる特定のイベントリストは次のとおりです。

イベント名

イベントコード

イベント属性名

(分析表示)

属性キー

属性タイプ

注記

メニークリック (プリセット)

$$_menu_click

メッセージタイプ

MsgType

string

メッセージタイプ: event

イベントタイプ

Event

string

イベントタイプ: CLICK

イベントキー

EventKey

string

イベント KEY 値。カスタムメニューインターフェースの KEY 値に対応します。

メニュー ID

MenuID

string

メニュー ID を参照します。パーソナライズされたメニューの場合は、このフィールドを使用して、どのルールのメニューがクリックされたかを知ることができます。

スキャン情報

ScanCodeInfo

string

スキャン情報

スキャンタイプ

ScanType

string

スキャンタイプ: 一般的に qrcode

スキャン結果

ScanResult

string

スキャン結果、つまり二次元コードに対応する文字列情報

送信された画像情報

SendPicsInfo

string

送信された画像情報

送信された画像の数

Count

number

送信された画像の数

送信された位置情報

SendLocationInfo

string

送信された位置情報

X 座標情報

Location_X

string

X 座標情報

Y 座標情報

Location_Y

string

Y 座標情報

精度

Scale

number

精度。精度またはスケールとして理解できます。スケールが細かいほど、スケールは高くなります。

地理的位置

Label

string

地理的位置の文字列情報

Wechat モーメント POI 名

Poiname

string

フレンドサークルの POI の名前は空の場合があります。

公式アカウントをフォローする

(プリセット)

参考文献

$$_official_account_follow

コードをスキャンしてフォローするかどうか

is_scan

string

コードをスキャンしてフォローするかどうか (元のイベントの注目公開番号とコードスキャン注目公開番号をマージする)

イベントキー

EventKey

string

イベントキー値。プレフィックスは qrscene_ で、QR コードのパラメータ値が続きます

イベントタイプ

Event

string

イベントタイプ: subscribe

QR コードチケット

Ticket

string

二次元コードのチケットは、二次元コード画像と交換するために使用できます。

公式アカウントのフォローを解除する

(プリセット)

参考文献

$$_official_account_unfollow

メッセージタイプ

MsgType

string

メッセージタイプ: event

イベントタイプ

Event

string

イベントタイプ: unsubscribe

コードをスキャンして公式アカウントを開く

(プリセット)

参考文献

$$_scan_open_official_account

メッセージタイプ

MsgType

string

メッセージタイプ: event

イベントタイプ

Event

string

イベントタイプ: SCAN

イベントキー

EventKey

string

イベント KEY 値。32 ビットの符号なし整数、つまり QR コードが作成されたときの QR コード scene_id です。

QR コードチケット

Ticket

string

二次元コードのチケットは、二次元コード画像と交換するために使用できます。

地理的位置を報告する

(プリセット)

参考文献

$$_send_localtion

イベントタイプ

Event

string

イベントタイプ: LOCATION

緯度 (地理的位置)

Latitude

number

地理的位置の緯度

経度 (地理的位置)

Longitude

number

地理的位置の経度

精度 (地理的位置)

Precision

number

地理的位置の精度

メッセージ送信のサブスクライブ

(プリセット)

参考文献

$$_send_msg_popup

テンプレート ID

TemplateId

string

テンプレート ID (サブスクリプションには複数の ID を持つ複数の通知が含まれる場合があります)

メッセージ ID

MsgID

string

メッセージ ID

プッシュ結果コード

ErrorCode

string

プッシュ結果ステータスコード (0 は成功を示します)

プッシュ結果

ErrorStatus

string

テキストの意味ステータスコードプッシュ結果

サブスクライブポップアップクリック

(プリセット)

参考文献

$$_click_msg_popup

テンプレート ID

TemplateId

string

テンプレート ID (サブスクリプションには複数の ID を持つ複数の通知が含まれる場合があります)

アクションの動作

SubscribeStatusString

string

ユーザークリック動作 (「承諾」に同意し、「拒否」をキャンセルして通知を送信します)

アクションシナリオ

PopupScene

string

1 : ポップアップウィンドウは H5 ページからのものです

2 : グラフィックメッセージからのポップアップウィンドウ

サブスクリプションメッセージを管理する

(プリセット)

参考文献

$$_manager_msg_popup

テンプレート ID

TemplateId

string

テンプレート ID (サブスクリプションには複数の ID を持つ複数の通知が含まれる場合があります)

アクションの動作

SubscribeStatusString

string

ユーザークリック動作 (プッシュユーザー拒否通知のみ)

テンプレートメッセージ配信

(プリセット)

参考文献

$$_template_send_finish

メッセージタイプ

MsgType

string

メッセージタイプ: event

イベントタイプ

Event

string

イベントはテンプレートメッセージの送信終了です。

メッセージ ID

MsgID

string

メッセージの ID

送信ステータス

Status

string

メッセージのステータスは、成功、ユーザーブロック、またはシステム障害です。

ブロードキャストメッセージ配信

(プリセット)

参考文献

$$_mass_send_finish

メッセージタイプ

MsgType

string

メッセージタイプ: event

イベントタイプ

Event

string

イベントタイプ: MASSSENDJOBFINISH

メッセージ ID

MsgID

string

グループ送信メッセージの ID

送信ステータス

Status

string

一括送信の結果。「送信成功」または「送信失敗」または「err(num)」です。ただし、送信が成功した場合、ユーザーによる公開番号メッセージの拒否やシステムエラーなどの理由により、少数のユーザーがメッセージを受信できない場合があります。 Err (num) は、監査が失敗した具体的な理由です。考えられる状況は次のとおりです。err(10001): 広告の疑い、err(20001): 政治の疑い、err(20004): 社会の疑い、err(20002): ポルノの疑い、err(20006): 犯罪の疑い、err(20008): 詐欺の疑い、err(20013): 著作権の疑い、err(22000): 相互プッシュの疑い (相互宣伝)、

err (21000): その他の疑い、err(30001): 元のチェックにシステムエラーがあり、ユーザーが転載と判断された場合にグループで送信しないことを選択します。

err (30002): 元の検証はグループで送信できないと判断されます。

err (30003): 元の検証は転載と判断され、ユーザーは一括送信せずに転載と判断されることを選択します。 err (40001): 管理者が拒否、err(40002): 管理者が 30 分以内に応答せずタイムアウト

ファンの総数

TotalCount

number

tag_id フィールドのファンの数、または openid_list フィールドのファンの数。

実際に送信されたファンの数

FilterCount

number

フィルタリング後に送信されるファンの数 (フィルタリングとは、特定の地域と性別のフィルタリング、ユーザーが設定した拒否のフィルタリング、および 4 つ以上のエントリを受信したユーザーのフィルタリングを指します)。原則として、FilterCount は SentCount + ErrorCount とほぼ等しくなります

正常に送信されたファンの数

SentCount

number

正常に送信されたファンの数

送信に失敗したファンの数

ErrorCount

number

送信に失敗したファンの数

記事番号

ArticleIdx

string

一括投稿された記事のシリアル番号。1 から始まります。

記事のステータス

UserDeclareState

string

ユーザーは記事のステータスを主張します

システム検証ステータス

AuditState

string

システムチェックのステータス

類似の元の URL

OriginalArticleUrl

string

類似の元の URL

類似の元のテキストタイプ

OriginalArticleType

string

類似の元のアーティクルのタイプ

複製できるかどうか

CanReprint

string

複製できるかどうか

元のコンテンツに置き換える必要があるかどうか

NeedReplaceContent

string

元のコンテンツを置き換える必要があるかどうか

転載元を示す必要があるかどうか

NeedShowReprintSource

string

転載元を示す必要があるかどうか

全体的な検証結果

CheckState

string

全体的な検証結果 1-転載と判断されず、グループで送信できます、2-転載と判断され、グループで送信できます、3-転載と判断され、グループで送信できません

記事の URL

ArticleUrl

string

一括記事の URL

公式アカウントのツイートを公開する

(プリセット)

参考文献

$$_publish_job_finish

タスク ID を公開する

publish_id

string

タスク ID を公開する

公開ステータス

publish_status

string

公開ステータス: 0: 成功、1: 公開中、2: 元の作成に失敗しました、3: 定期的に失敗しました、4: プラットフォームレビューに失敗しました、5: ユーザーは成功後にすべての記事を削除します、6: システムは成功後にすべての記事を禁止します

記事 ID

article_id

string

公開ステータスが 0 (つまり、成功) の場合、グラフィックの article_id が返されます。これは「カスタマーサービスメッセージ」シナリオで使用できます。

記事数

count

number

公開ステータスが 0 (つまり、成功) の場合、返される記事の数

記事番号

idx

string

公開ステータスが 0 (つまり、成功) の場合、記事に対応する番号が返されます

記事の URL

article_URL

string

公開ステータスが 0 (つまり、成功) の場合、グラフィックのパーマリンクを返します

公開に失敗した記事番号

fail_idx

string

公開ステータスが 2 または 4 の場合、失敗した記事の番号が返され、最初の記事は 1 です。その他の公開ステータスは空です

公式アカウントメッセージ受信

(プリセット)

参考文献

$$_receive_msg

メッセージタイプ

MsgType

string

メッセージタイプ: text

テキストメッセージの内容

Content

string

テキストメッセージの内容

メッセージ ID

MsgId

string

メッセージ ID、64 ビット整数

メッセージのデータ ID

MsgDataId

string

メッセージのデータ ID (メッセージが記事からの場合のみ)

記事番号

Idx

string

複数の写真の番号はどの記事ですか。1 から始まります (メッセージが記事からの場合のみ)

画像の URL

PicUrl

string

画像リンク (システムによって生成されます)

メディア ID

MediaId

string

画像メッセージのメディア ID。操作を呼び出して一時的なマテリアルを取得し、データをプルできます。

音声フォーマット

Format

string

音声フォーマット: amr

音声認識結果

Recognition

string

音声認識結果。UTF8 でエンコードされています

サムネイルメディア ID

ThumbMediaId

string

ビデオメッセージのサムネイルのメディア ID。マルチメディアファイルダウンロード操作を呼び出してデータをプルできます。

X 座標情報

Location_X

number

地理的位置の緯度

Y 座標情報

Location_Y

number

地理的位置の経度

精度

Scale

number

マップズームサイズ

地理的位置

Label

string

地理的位置。次の情報がサポートされています。

メッセージタイトル

Title

string

メッセージタイトル

メッセージの説明

Description

string

メッセージの説明

メッセージの URL

Url

string

メッセージリンク

3 イベント追跡

3.1 サーバー追跡パラメータ追跡

  1. 管理コンソールに移動 --> 追跡情報をクリック

  2. プライマリドメイン名: サーバー追跡データを報告するためのアドレス

  3. サブドメイン: デフォルトドメインはプライマリドメインと同じです。プライベートデプロイメントのお客様は、サブドメイン名を代替ドメイン名として提供できます。

  4. ServiceSecret と ServiceID は検証パラメータです。シークレットを公開しないでください。

  5. code パラメータは開発者 ID (AppID) を指定します。このパラメータは WeChat 公開 ID プラットフォームから必須であり、追跡管理 - データソース管理 - 公式アカウント管理で構成する必要があります。

注: 上記の情報はシステムセキュリティに関連するため、管理者権限のみが表示できます!

image.pngimage.png

image.png

3.2 リクエストパラメータ

API アドレス: https://<データ追跡エンドポイント + ポート> /server/thirdPartyDataSource

リクエストパラメータ content-type:application/json

JSON パラメータのリクエスト:

JSON フィールド名

データタイプ

必須

フィールドの説明

sign

string

はい

署名を検証する

f564cae6a8ad458648id9d607a124322

app_id

string

はい

対応するサーバー追跡ポイントの serviceID

OA8kI9Jis7YJNh5uh

appkey

string

はい

アプリケーションキー。QT 管理バックグラウンドから取得されます

9moqdsuia8hvxm7k8shf82n

ts

string

はい

ミリ秒単位で報告されるタイムスタンプ。

1659493170125

code

string

はい

開発者 ID (AppID)、WeChat 公式

wxd66151142ae9b9ae

weChatOAData

string

はい

WeChat 公開番号からの Xml

<xml><ToUserName><![CDATA[gh_0b03a4dd7455]]></ToUserName>
<FromUserName><![CDATA[o884561i2yjDrOhC6IqzEzXtPKUo]]></FromUserName>
<CreateTime>1676613107</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><! [CDATA [Test]]></Content>
<MsgId>24003327368861869</MsgId>
</xml>

3.3 認証署名生成ルール

  1. まず、sign フィールドを除くすべてのリクエストフィールドのキーと値をマップオブジェクトにカプセル化します

  2. このマップオブジェクトを JSON 文字にシリアル化するには、キーを自然順序、つまり ASCII コードに従ってソートする必要があります。 Java は JSONObject.toJSONString(mapObject, SerializerFeature.MapSortField) を使用できます。

  3. serviceSecret を取得する

  4. sign = MD5 (ソート後に生成された JSON 文字 + serviceSecret)

  5. 計算された sign を元のマップオブジェクトに入れ、JSON 文字にシリアル化します。これが最終的な完全な JSON リクエストメッセージです。

3.4 レスポンスの説明

レスポンスデータ content-type:application/json

レスポンス JSON には、code と message の 2 つのフィールドが含まれています

code

message

説明

Httpapi_300_200

レポート成功

成功

Httpapi_300_101

不正な署名

署名検証に失敗しました。詳細については、署名生成ルールを参照してください。

Httpapi_300_102

報告されたデータタイプは JSON 形式ではありません。

データ形式リクエストパラメータは JSON 形式ではありません

Httpapi_300_103

必須フィールドがありません

リクエストパラメータテーブルを参照して、必須パラメータが省略されているかどうかを確認します

Httpapi_300_104

ユーザー属性に必須フィールドがありません

リクエストパラメータテーブルを参照して、必須パラメータが省略されているかどうかを確認します

Httpapi_300_105

不正なイベント ID

不正なイベント ID

Httpapi_300_106

不正な ak/sk

Httpapi_300_107

WeChat 公式アカウントレポートログの xml 形式が不正です

Httpapi_300_108

報告された WeChat 公式アカウントメッセージが不正です

Httpapi_300_109

認識できない WeChat 公式アカウント暗号化タイプ

Httpapi_300_110

unionid を取得できませんでした。

3.5 java デモ参照

image.png

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.google.gson.Gson;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

/**
* ThirdPartyDataSourceApiDemo はサードパーティのデータソースデモにアクセスします
*
* @author chengtao
*/
public class ThirdPartyDataSourceApiDemo {
     private static final Logger logger = LoggerFactory.getLogger(ThirdPartyDataSourceApiDemo.class);

    /**
     * プライマリドメイン名
     */
    private static final String API_URL = "*****";

    /**
     * サーバー追跡情報にある ServiceID に対応します。
     */
    private static final String SERVICE_ID = "*****";

    /**
     * サーバー追跡情報にある ServiceSecret に対応します。
     */
    private static final String SERVICE_SECRET = "*****";

    /**
     * クライアントログ
     */
    private static final OkHttpClient client = new OkHttpClient();

    /**
     * WeChat 公開番号ログを取得し、追跡のために QT に転送します (このインターフェースは WeChat 公開番号管理バックグラウンドで構成する必要があります)
     * 
     * @param request
     * @throws IOException
     */
    @RequestMapping("/token")
    @ResponseBody
    public void token(HttpServletRequest request) throws IOException {
        // WeChat 公式公開番号リクエストのすべてのパラメータを取得し、JSON 形式でカプセル化します。
        Map<String, String[]> paramMap = request.getParameterMap();

        JSONObject json = paramMapToJson(paramMap);

        // メッセージにサービス ID を追加します。
        json.put("app_id",SERVICE_ID);

        // メッセージに ts を追加します。
        json.put("ts", String.valueOf(System.currentTimeMillis()));

        // 公開 ID を入力します。
        String code = "******";
        json.put("code", code);

        // WeChat 公開番号の XML データを取得します。
        String weChatOAData = new String(InputStreamUtil.getBytes(request)); // InputStreamUtil.getBytes(request) の実装が必要です
        json.put("weChatOAData", weChatOAData);

        //署名を計算する
        String sign = MD5Util.md5(JSONObject.toJSONString(json, SerializerFeature.MapSortField) + SERVICE_SECRET);

        json.put("sign", sign);

        String desJsonString = JSON.toJSONString(json, SerializerFeature.DisableCircularReferenceDetect);

        Request newRequest = new Request.Builder()
                .URL(API_URL + "/server") // 正確なエンドポイントへのパスであることを確認してください
                .post(RequestBody.create(MediaType.parse("application/json"),
                        desJsonString))
                .build();
        try {
            Response response = client.newCall(newRequest).execute();
            if (!response.isSuccessful()) {
                System.out.printf("[DEMO] ログの送信に失敗しました %s%n", response);
            } else {
                System.out.printf("[DEMO] 正常に送信されました %s%n",
                        response.body().string());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static JSONObject paramMapToJson(Map<String, String[]> paramMap) {
        Map<String, Object> bodyMap = new HashMap<>();
        for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
            String key = entry.getKey();
            String[] value = entry.getValue();
            if (value.length == 1) {
                bodyMap.put(key, value[0]);
            } else {
                bodyMap.put(key, value);
            }
        }
        return JSON.parseObject(new Gson().toJson(bodyMap));
    }


    // getBodyString メソッドと InputStreamUtil クラスの実装は提供されていません。必要に応じて実装してください。

}


public class MD5Util {

    public static String md5(String s) {
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            byte[] btInput = s.getBytes();
            // MD5 ダイジェストアルゴリズムの MessageDigest オブジェクトを取得します。
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 指定されたバイトでダイジェストを更新します
            mdInst.update(btInput);
            // 暗号文を取得します。
            byte[] md = mdInst.digest();
            // 暗号文を 16 進数文字列に変換します。
            int j = md.length;
                        char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 単体テスト
     */
    public static void main(String[] args) {
        StringBuilder dtskey = new StringBuilder("abc12390");
        dtskey.append('\0').append("~!@#$%^&*()_+");
        System.out.println(MD5Util.md5(dtskey.toString()));
        System.out.println(MD5Util.md5("20121221"));
        System.out.println(MD5Util.md5("Encryption")); // 暗号化
    }
}