Python开发微信服务号消息推送示例
本文详解如何利用 Python 向微信认证服务号自动推送定时模板消息。文章对比了订阅通知的局限,明确基于固定模板的消息推送方案,并分步给出获取 Access Token、构造请求体及调用模板消息接口的完整代码。附带常见错误码排查指南与最终推送效果验证,帮助开发者快速落地服务端消息触达功能。
技术选型与场景分析
在实际业务中,经常需要通过微信公众号向用户发送特定通知。目前微信官方提供的消息推送能力主要分为两类:订阅消息与模板消息。对于需要长期、稳定且无需用户反复点击授权的场景,推荐采用模板消息。
订阅消息要求用户主动点击一次才能获取一次发送机会,适合课程提醒、抽奖开奖等低频触发场景;而模板消息无需用户预先交互,只要拥有模板 ID 和用户 OpenID,服务端即可随时发起推送。虽然微信对模板消息的标题和关键词进行了统一规范管理,不允许随意自定义,但通过灵活挑选相近行业模板,依然可以满足绝大多数数据通知需求。

开发环境与前置准备
在编写代码前,需要完成以下基础配置:
- 开通认证服务号:登录微信公众平台,获取唯一的
AppID与AppSecret。 - 添加并获取模板 ID:在「功能 → 模板消息」中挑选符合业务需求的模板,记录其
template_id。 - 解析用户标识:服务端需掌握目标用户的
OpenID,可通过网页授权回调、JSSDK 或关注事件获取。 - 安装依赖:本例使用业界标准的 HTTP 请求库。
pip install requests
第1步:获取全局 Access Token
所有微信 API 调用均需携带有效的 access_token。该凭证有效期为 7200 秒,为避免频繁请求被封禁,建议在项目中做缓存管理。
import requests
import sys
def get_access_token(app_id: str, app_secret: str) -> str:
"""请求微信接口获取 Access Token"""
url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}")
post_url = url.format(app_id, app_secret)
try:
res = requests.get(post_url, timeout=5)
res.raise_for_status()
data = res.json()
if 'access_token' in data:
return data['access_token']
else:
raise KeyError("接口未返回 access_token")
except Exception as e:
print(f"获取 access_token 失败,请检查 AppID 和 AppSecret 是否正确: {e}")
sys.exit(1)第2步:调用模板消息接口进行推送
获取 Token 后,即可构造 POST 请求发送消息。需注意,请求体中的 data 节点内各字段名(如 thing15、time9)必须与所选模板后台定义的变量 Key 保持一致。
import datetime
import requests
def send_template_message(to_user_openid: str, access_token: str, template_id: str, exchange_rate: float):
url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}"
current_date = datetime.datetime.now().strftime("%m月%d日")
payload = {
"touser": to_user_openid,
"template_id": template_id,
"url": "https://gushitong.baidu.com/foreign/global-CNYTWD",
"data": {
"thing15": {"value": "汇率通知"},
"thing16": {"value": f"1 CNY = {exchange_rate} TWD"},
"time9": {"value": current_date},
"thing2": {"value": "点击详情查看历史汇率"}
}
}
res = requests.post(url, json=payload, timeout=5)
result = res.json()
if result.get("errcode") == 0:
print("✅ 推送消息成功")
elif result.get("errcode") == 40003:
print("❌ 推送失败:微信号 OpenID 不正确")
elif result.get("errcode") == 40036:
print("❌ 推送失败:模板 ID 为空")
elif result.get("errcode") == 40037:
print("❌ 推送失败:模板 ID 不合法")
else:
print(f"❌ 未知错误,返回信息: {result}")运行效果与关键结果验证
将上述两个函数串联,配合定时任务(如 Linux Crontab 或 Python APScheduler),即可实现每日自动抓取数据并发放通知。以下为真实设备接收到的推送样式:


排错清单
- ErrCode 40003:
touser填写的不是合法的 OpenID,或者是未经过授权绑定的用户标识。 - ErrCode 40036 / 40037:模板 ID 缺失或已被公众号停用、下架,需前往公众平台重新启用或更换新模板。
- 频率限制:若短时间内密集推送大量消息,可能触发 IP 频次封禁。建议做好 Token 缓存,避免每次发送都重新请求 Token。
扩展思路与总结
当前版本已跑通核心通信链路。在实际项目投产时,通常还需封装用户订阅关系表,允许用户在小程序或 H5 页面自主开关推送权限,并结合数据库轮询实现阈值触发(如汇率跌破指定数值时报警)。
以上就是Python开发微信服务号消息推送示例的详细内容,更多关于python微信服务号定时推送的技术资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













