上一篇
公众号与云服务器连接
- 行业动态
- 2025-04-21
- 3
公众号与云服务器连接基础概念
微信公众号需通过服务器配置与云服务器建立双向通信,实现消息推送、自定义菜单、用户管理等功能,核心原理是微信服务器将用户发送的消息转发至开发者搭建的云服务器,服务器处理后返回响应。
连接前准备
步骤 | 说明 |
---|---|
注册域名 | 需备案,绑定云服务器IP(如酷盾安全、阿里云)。 |
购买云服务器 | 选择操作系统(如CentOS、Ubuntu)并配置安全组(开放443端口)。 |
申请SSL证书 | 微信要求使用HTTPS协议,需部署免费证书(如Let’s Encrypt)或付费证书。 |
公众号后台配置
在微信公众平台完成以下设置:
- 登录公众号后台 → 开发 → 基本配置。
- 填写服务器地址:
https://你的域名/微信接口路径
(如/weixin
)。 - Token设置:
- 自定义字符串(需与服务器端一致)。
- 用于验证消息真实性,防止伪造请求。
- EncodingAESKey:
- 可选,若开启消息加密则需填写(需与服务器一致)。
- 点击随机生成后同步至服务器配置。
- 消息加解密:
根据需求选择“明文模式”或“安全模式”(推荐开启)。
云服务器端开发
接收微信请求
微信服务器会发送 GET
请求验证接口有效性,携带以下参数:
| 参数名 | 说明 |
|————-|———————————-|
| signature | 微信加密签名 |
| timestamp | 时间戳 |
| nonce | 随机数 |
| echostr | 字符串,需原样返回以通过验证 |
验证逻辑:
- 将
token
、timestamp
、nonce
排序后拼接成字符串。 - 对字符串进行SHA1加密,与
signature
对比,一致则返回echostr
。
处理消息并回复
微信通过 POST
请求发送用户消息(如文本、图片),服务器需解析后返回回复内容。
示例代码(Python + Flask):
from flask import Flask, request, make_response import hashlib import xml.etree.ElementTree as ET app = Flask(__name__) WEIXIN_TOKEN = "your_token" # 需与公众号后台一致 # 验证接口有效性(GET请求) @app.route('/weixin', methods=['GET']) def verify_weixin(): params = request.args signature = params.get('signature') timestamp = params.get('timestamp') nonce = params.get('nonce') echostr = params.get('echostr') # 拼接字符串并加密 tmp_str = "".join(sorted([WEIXIN_TOKEN, timestamp, nonce])) hashcode = hashlib.sha1(tmp_str.encode('utf-8')).hexdigest() if hashcode == signature: return make_response(echostr) else: return "Verification failed", 403 # 处理微信消息(POST请求) @app.route('/weixin', methods=['POST']) def handle_message(): # 解析XML数据 xml_data = request.data root = ET.fromstring(xml_data) msg_type = root.find("MsgType").text # 根据消息类型回复(示例:文本消息) if msg_type == "text": content = root.find("Content").text reply = f"收到文字:{content}" return render_template(f"""<xml> <ToUserName><![CDATA[{root.find("FromUserName").text}]]></ToUserName> <FromUserName><![CDATA[{root.find("ToUserName").text}]]></FromUserName> <CreateTime>{int(time.time())}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{reply}]]></Content> </xml>""") return "success" if __name__ == '__main__': app.run(host='0.0.0.0', port=443, ssl_context=('cert.pem', 'key.pem'))
关键注意事项
- URL格式:
- 必须以
https://
开头,路径需与公众号配置一致(如/weixin
)。
- 必须以
- Token安全:
避免使用简单密码,建议定期更换。
- 消息加解密:
- 若开启安全模式,需使用
EncodingAESKey
对消息进行AES解密。
- 若开启安全模式,需使用
- 性能优化:
高并发场景需使用异步框架(如Sanic、FastAPI)或负载均衡(如Nginx+UWSGI)。
相关问题与解答
问题1:公众号服务器配置一直验证失败,如何解决?
解答:
- 检查URL是否为外网可访问的域名(如
https://example.com/weixin
)。 - 确认Token与公众号后台完全一致(大小写敏感)。
- 确保服务器支持443端口,且SSL证书生效。
- 排查云服务器安全组规则,放行HTTPS流量。
问题2:如何处理微信消息的加密与解密?
解答:
启用安全模式:在公众号后台勾选“消息加解密”。
服务器端配置:
- 使用
EncodingAESKey
(公众号后台生成的密钥)。 - 安装加密库(如Python的
pycryptodome
)。
- 使用
解密流程:
提取
Encrypt
字段(密文)。使用AES算法解密,代码示例:
from Crypto.Cipher import AES import base64 def decrypt_message(encrypt_msg, encoding_aes_key, appid): # 填充密钥至32位 key = base64.b64decode(encoding_aes_key + '=') cipher = AES.new(key, AES.MODE_CBC, iv=b' '16) decrypted = cipher.decrypt(base64.b64decode(encrypt_msg)) # 去除填充并解码XML return decrypted.rstrip(b' ').decode('utf-8')
解密后解析XML,处理业务逻辑后重新加密返回