機能概要
公式アカウントを承認して Quick Tracking に送信できます。 公式アカウントの行動イベント(フォロー、メニューアクセス、フォロー解除など)を Quick Tracking に報告して、公式アカウントのユーザー行動分析を行うことができます。
WeChat 公式アカウントの追跡は、WeChat プラットフォームによってカスタマイズされたルールに依存します。 次の表では、WeChat 公式アカウントの追跡に関する重要な情報について説明します。 このようなイベントを追跡する前に、以下の情報を詳しく読んでください。 詳細については、「WeChat 公式の指示」をご参照ください。
WeChat 公式アカウントイベントは、WeChat によって定義、生成、および送信されます。 開発者はこれらのデータをサブスクライブするだけで、カスタマイズすることはできません。 2 イベントとイベント属性 をクリックして、使用可能なイベントリストを表示します。
WeChat 公式アカウントイベントを追跡するには、公式アカウント開発者になる必要があります。 公式アカウント開発者になると、公式アカウントプラットフォームの「自動返信とカスタムメニュー」は使用できなくなり、構成された情報は無効になります。 カスタム情報を維持する必要があります。 詳細については、「WeChat 公式の指示」をご参照ください。
WeChat プラットフォームは最終的に、開発者がサブスクライブしたイベントを、開発者が管理するサーバーに送信します。 開発者は、イベントを Quick Tracking に転送する必要があります。
1. 操作の説明
以下のフォームは、公式アカウントイベント追跡に必要な手順です。順番に従ってください。
ステップ | 説明 | 操作の詳細 |
1 | WeChat 公式アカウントプラットフォーム で開発者構成を有効にする |
WeChat 公式アカウントプラットフォームは、クリックしてジャンプできます。 警告 注:WeChat 公式アカウントイベントを追跡するには、公式アカウント開発者になる必要があります。 公式アカウント開発者になると、公式アカウントの「自動返信とカスタムメニュー」は使用できなくなり、構成された情報は無効になります。 情報を維持する必要があります。 操作プロセスについては、「WeChat 公式の説明」をご参照ください。 |
2 | QuickTracking で公式アカウントトラッキングを設定します |
表示 をクリックして、操作の詳細を表示できます。 |
3 | WeChat 公式アカウントのイベントを QuickTracking に転送する | 詳細については、「表示」をご参照ください。 |
4 | QuickTracking でのデータ分析 | 2 イベントとイベント属性 をクリックして、分析できる特定のイベントリストを表示できます。 |
1.1 公式アカウントに統合
製品パス: 「データ追跡」-「データソース管理」-「公式アカウント管理」

[公式アカウントに統合] ボタンをクリックします。 右側の [データソースに統合] ページで作成を完了するには、以下の情報が必要です。
ヒント: ブラウザの開発者ツールを使用して、REST API のレスポンスを確認できます。
公式アカウント名: アクセスする公式アカウントの名前を入力します
公式アカウント ID: 公式アカウント ID を入力します。 公式アカウント ID は一意である必要があります。 次の図は、データを取得する方法を示しています:

「分析設定」
所属組織: デフォルトでは、現在の組織は変更できません。 公式アカウントを別の組織に追加する場合は、左側の [グループ] ドロップダウンリストから組織を切り替える必要があります。
所属アプリケーション: ドロップダウンリストから現在の組織内のアプリケーションを選択します。
「WeChat メッセージを受信する」
暗号化モード: セキュリティモードとプレーンテキストモードに分かれています。
セキュリティモード: EncodingAESKey は、WeChat 公開番号プラットフォームと同じメッセージ本文の暗号化および復号鍵として使用されます。
プレーンテキストモード: メッセージ本文の暗号化および復号機能を使用せず、セキュリティ係数が低くなります。
EncodingAESKey を取得するには、次のコードを実行します: 公式アカウントバックエンド - 基本構成 - EncodingAESKey をコピーします。
トークン取得アドレス: 公式アカウントバックエンド - 基本構成 - トークンをコピーします
(注: WeChat 公式アカウントのバックエンド URL は、ユーザーが入力したアドレスです。 WeChat 公式アカウントは、入力されたアドレスにデータを送信し、Quick Tracking と同期します。 参考ドキュメント)

「匿名ユーザーの一意の識別子」
必須。 ユニオンまたは 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 パラメータを正常に取得できます。

上記の手順を完了し、[保存] をクリックして作成を完了します。
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 サーバー追跡パラメータ追跡
管理コンソールに移動 --> 追跡情報をクリック
プライマリドメイン名: サーバー追跡データを報告するためのアドレス
サブドメイン: デフォルトドメインはプライマリドメインと同じです。プライベートデプロイメントのお客様は、サブドメイン名を代替ドメイン名として提供できます。
ServiceSecret と ServiceID は検証パラメータです。シークレットを公開しないでください。
code パラメータは開発者 ID (AppID) を指定します。このパラメータは WeChat 公開 ID プラットフォームから必須であり、追跡管理 - データソース管理 - 公式アカウント管理で構成する必要があります。
注: 上記の情報はシステムセキュリティに関連するため、管理者権限のみが表示できます!



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 | |
3.3 認証署名生成ルール
まず、sign フィールドを除くすべてのリクエストフィールドのキーと値をマップオブジェクトにカプセル化します
このマップオブジェクトを JSON 文字にシリアル化するには、キーを自然順序、つまり ASCII コードに従ってソートする必要があります。 Java は JSONObject.toJSONString(mapObject, SerializerFeature.MapSortField) を使用できます。
serviceSecret を取得する
sign = MD5 (ソート後に生成された JSON 文字 + serviceSecret)
計算された 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 デモ参照

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")); // 暗号化
}
}

