Academy → Messaging ChannelsOfficial documentation · Arabic guidance

WeCom Callback (Self-Built App)

استدعاءات WeCom للتطبيق الذاتي

Intermediate to advanced5 min readLesson 214 questions✓ 2026-08-18
Before you read

What this page is, and what it holds.

This page covers WeCom Callback (Self-Built App). You will use hermes gateway run and hermes gateway here; about 5 minutes to read. Open the channel to yourself first with an allowlist. An open channel means anyone can message your agent.

10sections
4code examples
2tables
5commands
868source words
What you will be able to do

Outcomes taken from this page, not a template.

  • Understand what بوابة المراسلة is and when you need it.
  • Run hermes gateway run and hermes gateway and understand what happens next.
  • Read the table and take only the row that applies to you.
  • Set WECOM_CALLBACK_CORP_ID in the right place.
Identifiers you will meet

Exactly as they appear in Hermes.

Commands
  • hermes gateway run
  • hermes gateway
  • hermes gateway setup
  • hermes gateway start
  • hermes gateway install
Environment variables
  • WECOM_CALLBACK_CORP_ID
  • WECOM_CALLBACK_CORP_SECRET
  • WECOM_CALLBACK_AGENT_ID
  • WECOM_CALLBACK_TOKEN
  • WECOM_CALLBACK_ENCODING_AES_KEY
  • WECOM_CALLBACK_HOST
  • WECOM_CALLBACK_PORT
  • WECOM_CALLBACK_ALLOWED_USERS
Page map

Jump to the part you need.

  1. 01How It Works
  2. 02Prerequisites
  3. 03Setup
  4. 04Configuration Reference
  5. 05Multi-App Routing
  6. 06Access Control
  7. 07Endpoints
  8. 08Encryption
  9. 09Limitations
  10. 10Troubleshooting
The full official page

Nothing summarised away.

The documentation body below is reproduced from the official source so commands and identifiers stay exact. Each section carries a short note describing what it contains.

Connect Hermes to WeCom (Enterprise WeChat) as a self-built enterprise application using the callback/webhook model.

See also: WeCom Bot for the bot-style integration.

Run hermes gateway setup and pick WeCom Callback for a guided walk-through.

How It Works

Explains the idea itself. Read it slowly; the later sections build on it.

  1. You register a self-built application in the WeCom Admin Console
  2. WeCom pushes encrypted XML to your HTTP callback endpoint
  3. Hermes decrypts the message, queues it for the agent
  4. Immediately acknowledges (silent — nothing displayed to the user)
  5. The agent processes the request (typically 3–30 minutes)
  6. The reply is delivered proactively via the WeCom message/send API

Prerequisites

Explains the idea itself. Read it slowly; the later sections build on it.

  • A WeCom enterprise account with admin access
  • aiohttp and httpx Python packages (included in the default install)
  • A publicly reachable server for the callback URL (or a tunnel like ngrok)

Setup

Ordered, practical steps. Run one and confirm it worked before moving on. Commands here: hermes gateway, hermes gateway start.

1. Create a Self-Built App in WeCom

  1. Go to WeCom Admin Console ↗ → Applications → Create App
  2. Note your Corp ID (shown at the top of the admin console)
  3. In the app settings, create a Corp Secret
  4. Note the Agent ID from the app's overview page
  5. Under Receive Messages, configure the callback URL:
  6. URL: http://YOUR_PUBLIC_IP:8645/wecom/callback
  7. Token: Generate a random token (WeCom provides one)
  8. EncodingAESKey: Generate a key (WeCom provides one)

2. Configure Environment Variables

Add to your .env file:

Shell10 lines
WECOM_CALLBACK_CORP_ID=your-corp-id
WECOM_CALLBACK_CORP_SECRET=your-corp-secret
WECOM_CALLBACK_AGENT_ID=1000002
WECOM_CALLBACK_TOKEN=your-callback-token
WECOM_CALLBACK_ENCODING_AES_KEY=your-43-char-aes-key

# Optional
# WECOM_CALLBACK_HOST=  # optional pin; unset = dual-stack (all interfaces, IPv4+IPv6)
WECOM_CALLBACK_PORT=8645
WECOM_CALLBACK_ALLOWED_USERS=user1,user2

3. Start the Gateway

Shell1 line
hermes gateway

(Use hermes gateway start only after hermes gateway install has registered the systemd/launchd service.)

The callback adapter starts an HTTP server on the configured port. WeCom will verify the callback URL via a GET request, then begin sending messages via POST.

Configuration Reference

A lookup table. Do not read it all; find the row that applies to you.

Set these in config.yaml under platforms.wecom_callback.extra, or use environment variables:

SettingDefaultDescription
corp_id—WeCom enterprise Corp ID (required)
corp_secret—Corp secret for the self-built app (required)
agent_id—Agent ID of the self-built app (required)
token—Callback verification token (required)
encoding_aes_key—43-character AES key for callback encryption (required)
hostunset (dual-stack: all interfaces, IPv4+IPv6)Bind address for the HTTP callback server
port8645Port for the HTTP callback server
path/wecom/callbackURL path for the callback endpoint

Multi-App Routing

Settings you configure once. Change one at a time so you can see what each does.

For enterprises running multiple self-built apps (e.g., across different departments or subsidiaries), configure the apps list in config.yaml:

YAML19 lines
platforms:
  wecom_callback:
    enabled: true
    extra:
      host: "0.0.0.0"
      port: 8645
      apps:
        - name: "dept-a"
          corp_id: "ww_corp_a"
          corp_secret: "secret-a"
          agent_id: "1000002"
          token: "token-a"
          encoding_aes_key: "key-a-43-chars..."
        - name: "dept-b"
          corp_id: "ww_corp_b"
          corp_secret: "secret-b"
          agent_id: "1000003"
          token: "token-b"
          encoding_aes_key: "key-b-43-chars..."

Users are scoped by corp_id:user_id to prevent cross-corp collisions. When a user sends a message, the adapter records which app (corp) they belong to and routes replies through the correct app's access token.

Access Control

Settings you configure once. Change one at a time so you can see what each does. Set WECOM_CALLBACK_ALLOWED_USERS, WECOM_CALLBACK_ALLOW_ALL_USERS in your environment, not in the chat.

Restrict which users can interact with the app:

Shell5 lines
# Allowlist specific users
WECOM_CALLBACK_ALLOWED_USERS=zhangsan,lisi,wangwu

# Or allow all users
WECOM_CALLBACK_ALLOW_ALL_USERS=true

Endpoints

Explains the idea itself. Read it slowly; the later sections build on it.

The adapter exposes:

MethodPathPurpose
GET/wecom/callbackURL verification handshake (WeCom sends this during setup)
POST/wecom/callbackEncrypted message callback (WeCom sends user messages here)
GET/healthHealth check — returns {"status": "ok"}

Encryption

Explains the idea itself. Read it slowly; the later sections build on it.

All callback payloads are encrypted with AES-CBC using the EncodingAESKey. The adapter handles:

  • Inbound: Decrypt XML payload, verify SHA1 signature
  • Outbound: Replies sent via proactive API (not encrypted callback response)

The crypto implementation is compatible with Tencent's official WXBizMsgCrypt SDK.

Limitations

Explains the idea itself. Read it slowly; the later sections build on it.

  • No streaming — replies arrive as complete messages after the agent finishes
  • No typing indicators — the callback model doesn't support typing status
  • Text only — currently supports text messages for input; image/file/voice input not yet implemented. The agent is aware of outbound media capabilities via the WeCom platform hint (images, documents, video, voice).
  • Response latency — agent sessions take 3–30 minutes; users see the reply when processing completes

Troubleshooting

A troubleshooting section. Find the symptom that matches yours rather than reading it end to end. Commands here: hermes gateway run.

Signature verification failing. WeCom signs every request with the Token you registered in the admin console. A mismatch between the token configured in Hermes and the token the admin console expects is the most common cause. Re-copy both the Token and EncodingAESKey from the admin console — they're easy to truncate. Whitespace in ~/.hermes/.env values around = will also break signature checks. After fixing, restart hermes gateway run.

Callback URL not reachable / verification step fails. WeCom hits the public URL you registered. Confirm:

  1. Your reverse proxy / tunnel forwards /wecom/callback to the gateway's port.
  2. The URL in the admin console is HTTPS (WeCom rejects plain HTTP).
  3. From outside your network, curl -i https://<your-domain>/wecom/callback returns something other than a timeout (a 4xx without query params is fine — it just means the listener is reachable).

Port not reachable / listener not bound. Check hermes gateway run logs for the bound host/port. If the adapter bound to 127.0.0.1 you must front it with a reverse proxy or tunnel — WeCom's servers can't reach loopback. Leave extra.host unset so the default dual-stack bind (all interfaces, IPv4+IPv6) applies, or pin an interface in config.yaml (plus allowed_source_cidrs if exposing directly) or keep loopback and use a tunnel such as Cloudflare Tunnel / nginx.

Knowledge check

4 questions answered by this page alone.

Every option is a real identifier from the Hermes documentation. The wrong ones are real too, just from other pages.

1. In this lesson's table, what is the “Default” for “host”?
2. Which of these environment variables actually appears in this lesson?
3. Which of these headings does not appear in this lesson?
4. Which configuration key appears in this lesson's examples?