← 全記事
ガイド

LINE・Zalo・X を1つのWebhookで受信する:東南アジアチームの3プラットフォーム対応 — UnifyPort

ホーチミン市の電子機器小売業者で働く3人のカスタマーサポートチームは、毎日3つのプラットフォームからの顧客メッセージを処理しています。タイの購入者はLINEで問い合わせ、ベトナムの地元顧客はZaloを使用し、海外注文のサポートはXのダイレクトメッセージで届きます。注文に関する問い合わせは、いつでも3つのチャネルから同時に殺到する可能性があります。

このチームはかつて、3つの独立した連携を維持していました。3つのWebhookエンドポイント、3つの異なる署名検証の実装、異なるスケジュールでローテーションする3セットの認証情報。新しい開発者が入社したとき、彼女は1行のビジネスロジックも書かずに、最初の1週間をドキュメントの読み込みだけに費やしました。

各プラットフォームの公式連携は独立したプロジェクト

問題は、3つのプラットフォームがAPIレイヤーで本質的に異なることです。

LINEは、LINE Developers ConsoleでLINEチャンネルを登録し、WebhookエンドポイントのURLの所有権を確認し、チャンネルアクセストークンを使って各レスポンスに署名する必要があります。Webhookイベントはevents配列として届き、messagefollowunfollowなどのイベントタイプは構造が異なります。2026年1月以降、新しいチャンネルはLINE MINI Appの「チャンネル同意の簡素化」機能を強制的に有効化する必要があります。LINEチャンネルをゼロから立ち上げるには、慣れていれば半日、慣れていなければ数日かかります。

日本ではLINEが最も普及しているメッセージングアプリであり、顧客サポートや販売促進にLINEを使う企業にとって、この連携は避けて通れません。しかし、2026年2月3日と3月19日に発生したWebhookの障害(400エラーおよび5xxエラーによる遅延)は、公式APIへの依存リスクを改めて浮き彫りにしました。

Zaloは、Official Account(公式アカウント)の登録と、Terms v2アップデートへの準拠が必要です。このアップデートではZalo IDへの強制移行が導入され、ユーザーデータ削除リクエストの処理期限も変更されました。ZNS API(Zalo Notification Services)はメッセージングAPIとは別の独立したシステムです。WebhookイベントはLINEとは構造が異なり、sender.idがトップレベルに置かれ、イベントタイプはフラットな文字列です。

Xは2026年2月まで、基本的な読み取りアクセスであれば無料ティアを使用できました。現在この無料ティアは廃止され、従量課金制(投稿の読み取り1件あたり$0.005)に移行しています。ダイレクトメッセージへのアクセスはエンタープライズプラン(月額$5,000)でのみ提供されており、注文問い合わせをDMで受け付ける小規模チームには現実的ではありません。

重要な洞察:受信にはアウトバウンド認証情報が不要

上記の複雑さのほとんどは「メッセージ送信」側にあります——チャンネル管理、公式アカウントとしての認証、テンプレートの承認。しかし、顧客メッセージを受信し、CRMにルーティングし、自動化をトリガーし、AIモデルにデータを渡すだけであれば、どのプラットフォームでも公式認定アカウントになる必要はありません。

必要なデータ(誰が、何を、いつ送ったか)は取得経路に関わらず同じです。自分でプラットフォームごとの認証情報管理やスキーマの正規化を行うか、その層を既製のツールに任せるかという選択です。

1つのエンドポイント、3つのプラットフォーム

UnifyPortは、LINE、Zalo、Xの非公式インバウンドインターフェースを提供しています(WhatsApp、Telegram、TikTokも対応)。1つのWebhook URLと共有HMAC-SHA256シークレットを登録するだけで、3つのプラットフォームからのメッセージが正規化されたスキーマで同一エンドポイントに届きます。

アーキテクチャの概要:

LINEユーザー  ──┐
Zaloユーザー  ──┼──► UnifyPort ──► POST /webhook(あなたのサーバー)
Xユーザー     ──┘                  X-UnifyPort-Signature: sha256=...

どのプラットフォームからのメッセージも、トップレベルのフィールド構造は統一されています:

{
  "platform": "line",
  "event": "message",
  "timestamp": 1748995200000,
  "from": {
    "id": "U4af4980629",
    "display_name": "田中 太郎"
  },
  "message": {
    "id": "msg_01HX9K",
    "type": "text",
    "text": "注文についてお問い合わせしたいのですが"
  }
}

"platform": "line""platform": "zalo""platform": "x"に置き換えるだけで、残りの構造は変わりません。ビジネスロジックはplatformfrom.idmessage.textを読み取るだけです。

署名検証も統一されており、1つの実装で3つのプラットフォームをカバーします:

const crypto = require('crypto');

app.post('/webhook', express.raw({ type: '*/*' }), (req, res) => {
  const signature = req.headers['x-unifyport-signature'];
  const expected = 'sha256=' + crypto
    .createHmac('sha256', process.env.UNIFYPORT_SECRET)
    .update(req.body)
    .digest('hex');

  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
    return res.status(401).end();
  }

  const { platform, from, message } = JSON.parse(req.body);
  // CRMへルーティング、DBへ記録、自動化をトリガー
  routeInbound({ platform, senderId: from.id, text: message.text });
  res.status(200).end();
});

LINEのx-line-signatureとZaloのmacヘッダーを個別に処理する必要はありません。1つのハンドラーで3つのプラットフォームすべてに対応できます。

チームの変化

ホーチミン市の小売業者は1週間で3つの独立した連携を置き換えました。入社時にドキュメントを読むだけで1週間を費やした新しい開発者は、統合されたハンドラーを数時間で書き上げました。現在はペイロードのplatformフィールドで自動ルーティングしています:LINEメッセージはタイ語対応キューへ、Zaloメッセージはベトナム語対応キューへ、XのDMは国際サポートチームへ。

2月と3月のLINE障害への不安も解消されました。UnifyPortのデリバリー層がリトライと再配信を処理するため、チームのWebhookは200を返すだけで確実にメッセージが届きます。

はじめる

unifyport.aiで最初のプラットフォームを接続しましょう。公式アカウント登録不要、チャンネル審査の待ち行列なし、メッセージ課金なし。LINE、Zalo、XはWhatsApp、Telegram、TikTokと同じプランで利用できます。

WhatsApp連携をすでに運用していて、さらに2つのプラットフォームを追加するのに1週間かかるか心配しているなら——答えは午後一つ分の作業です。