在企业微信开发中,配置可信 IP 是保障接口安全的关键步骤。但很多开发者会卡在一个前置要求上:配置可信 IP 需要先完成'可信域名'或'接收消息服务器 URL'配置。如果手头没有备案域名,难道就只能止步于此?
其实规则允许二选一。这套方案的核心就是利用'接收消息服务器 URL'的验证机制:企业微信会向你填写的 URL 发送验证请求,只要你的服务器能正确响应(完成签名校验和加密字符串解密),就算通过验证。通过后就能正常配置可信 IP,全程无需备案域名,只需要一台有公网 IP 的服务器。
关键匹配点:原 Java 版本用 WXBizMsgCrypt 工具类处理加密解密,Python 中我们用 pycryptodome 库实现相同的 AES 加密解密逻辑,确保与企业微信的交互规则完全对齐。
一、环境依赖与参数准备
我们用轻量的 Flask 框架搭建 Web 接口,用 pycryptodome 处理加密解密。执行以下命令安装依赖:
pip install flask pycryptodome
提前准备 3 个关键参数,后续代码和企业微信配置必须一致,否则会验证失败:
| 参数名称 | 获取方式 | 说明 |
|---|---|---|
| CORP_ID(企业 ID) | 企业微信管理后台 → 我的企业 → 最下方'企业 ID' | 企业唯一标识,固定值 |
| TOKEN(令牌) | 自定义字符串,如"JeecgBoot_WX_Token_2025" | 需与企业微信后台配置一致 |
| ENCODING_AES_KEY(加密密钥) | 自定义 32 位字符串,或企业微信随机生成 | 用于消息加密解密,需与后台一致 |
二、Python 完整代码实现
代码包含核心的加密解密工具类和企业微信验证接口,注释详细,直接替换参数即可使用:
from flask import Flask, request
import hashlib
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# -------------------------- 1. 核心参数配置(必改!) --------------------------
CORP_ID = "wwxxxxx123456789" # 替换为你的企业微信 CorpID
TOKEN = "JeecgBoot_WX_Token_2025" # 替换为自定义 Token(与企业微信配置一致)
ENCODING_AES_KEY = "abcdefghijklmnopqrstuvwxyz1234567890abcd" # 替换为 32 位密钥
# --------------------------------------------------------------------------------
app = Flask(__name__)
class WXBizMsgCrypt:
"""模拟企业微信 Java SDK 的 WXBizMsgCrypt,实现签名校验和 echostr 解密"""
def __init__(self, token, encoding_aes_key, corp_id):
.token = token
.corp_id = corp_id
.aes_key = base64.b64decode(encoding_aes_key + * ( - (encoding_aes_key) % ))
():
sorted_list = ([.token, timestamp, nonce, encrypt_data])
sha1 = hashlib.sha1(.join(sorted_list).encode())
sha1.hexdigest()
():
signature = ._get_signature(timestamp, nonce, echostr)
signature != msg_signature:
Exception()
cipher = AES.new(.aes_key, AES.MODE_CBC, iv=.aes_key[:])
decrypted = cipher.decrypt(base64.b64decode(echostr))
decrypted = unpad(decrypted, AES.block_size)
msg_len = .from_bytes(decrypted[:], byteorder=)
msg = decrypted[: + msg_len].decode()
corp_id_in_msg = decrypted[ + msg_len:].decode()
corp_id_in_msg != .corp_id:
Exception()
msg
():
:
msg_signature = request.args.get()
timestamp = request.args.get()
nonce = request.args.get()
echostr = request.args.get()
wxcpt = WXBizMsgCrypt(TOKEN, ENCODING_AES_KEY, CORP_ID)
s_echo_str = wxcpt.verify_url(msg_signature, timestamp, nonce, echostr)
s_echo_str
Exception e:
,
__name__ == :
app.run(host=, port=, debug=)

