WeChat(微信)公式アカウントのテンプレートメッセージで notes フィールドが表示されない問題の調査と解決
問題の概要
WeChat公式アカウントのテスト号からテンプレートメッセージを送信しているとき、奇妙な現象に遭遇しました。テンプレートには6つのフィールドが定義されていますが、notes(備考)フィールドだけがどうしても表示されず、他の5つのフィールドはすべて正常に表示されます。
テンプレートの内容は以下のとおりです。
氏名:{{name.DATA}}電話:{{phone.DATA}}時間:{{time.DATA}}項目:{{services.DATA}}担当者:{{staff.DATA}}備考:{{notes.DATA}}API呼び出しは成功(errcode = 0)を返すのに、実際にWeChatで届くメッセージには最初の5行しか表示されず、備考行はまるごと消えてしまいます。
調査の流れ
1. フィールド数制限の検証
最初は「テスト号にはフィールド数の上限(最大5個)があるのでは?」と疑いました。しかし検証してみると:
- 「担当者」フィールドを削除して5個だけ送る → 備考は依然として表示されない
- フィールドを9個まで増やす → 備考を含むすべてのフィールドが表示される
結論:フィールド数の制限ではない。
2. 文字数制限の検証
公式ドキュメントによると、テンプレートメッセージは1行20文字以内、合計200文字以内とされています。テストデータはこの制限に遠く及びません。
結論:文字数の問題ではない。
3. 重要な法則の発見
繰り返しテストする中で、ある法則が見えてきました。
| テンプレートのフィールド数 | notes の位置 | notes の表示有無 |
|---|---|---|
| 6フィールド | 最後 | 表示されない |
| 9フィールド | 6番目(最後ではない) | 表示される |
| 7フィールド | 6番目(最後ではない) | 表示される |
つまり、notes がテンプレートの最終行にあるときだけ表示が消えるのです。
4. フィールド名の検証
notes を最終行に置いたまま、フィールド名だけを変えてテスト:
| フィールド名 | 表示有無 |
|---|---|
| notes | 表示されない |
| remark | 表示されない |
| info | 表示される |
| message | 表示される |
notes と remark は表示されず、info、message は問題なく表示されます。
原因分析
WeChat公式アカウントのテンプレートメッセージAPIには、もともとトップレベルの remark パラメータが存在し、メッセージ末尾に「備考」として独自スタイルでレンダリングされていました。しかし 2023年3月30日、WeChatは以下のアナウンスを公開しました:
テンプレートメッセージでは備考(remark)フィールドを表示しなくなる
この仕様変更はトップレベルの remark パラメータだけでなく、フィールド名としての notes / remark にも影響しています。WeChat側で「備考」セマンティクスを持つフィールド名を内部的にマッチさせており、テンプレートの最終行に登場した場合、旧 remark 互換ロジックに乗ってサイレントに破棄される、というのが実態のようです。
要点:
notes/remarkはWeChatテンプレートメッセージにおける予約フィールド名- 末尾に置くと旧
remark互換ロジックに引っかかり、何の警告もなく削除される - 末尾以外の位置に置くか、別の名前に変えれば正常に表示される
解決方法
方法1:フィールド名を変える(推奨)
最も無難な対応は、notes を予約名以外、たとえば message / info / desc などにリネームすることです。
氏名:{{name.DATA}}電話:{{phone.DATA}}時間:{{time.DATA}}項目:{{services.DATA}}担当者:{{staff.DATA}}メッセージ:{{message.DATA}}方法2:notes の後ろに埋め草フィールドを追加する
テンプレートが既に審査済み・本番運用中で、複数のシステムから参照されているなどの事情でリネームできない場合は、notes の後ろにダミーフィールドを足して最終行から外します。
氏名:{{name.DATA}}電話:{{phone.DATA}}時間:{{time.DATA}}項目:{{services.DATA}}担当者:{{staff.DATA}}備考:{{notes.DATA}}その他:{{other.DATA}}送信時、other フィールドには空文字や適当なプレースホルダを入れておけば十分です。
コード修正例
バックエンドの送信ペイロードで、フィールド名を notes から message に変更します。
// 注意:notes をフィールド名として使ってはいけない。// WeChatが予約済みの「備考」フィールドとして扱い、表示しないため。return { name, phone, time: timeRange, services, staff, message // 旧: notes};まとめ
- WeChat公式アカウントのテンプレートメッセージには予約フィールド名の仕組みが存在し、
notesやremarkなどの「備考」セマンティクスを持つ名前は表示されない - これは2023年にWeChatがテンプレートメッセージの
remark表示を廃止したことに伴う互換挙動であり、表立ったドキュメントには明記されていない - 解決策はフィールド名を
message/info/descなどに変更すること、または末尾に埋め草フィールドを追加すること - 「エラーは出ないが表示されない」系の問題は、フィールド数・位置・名前を1変数ずつ振って試すのが最短ルート