使用 Python 发送微信模板消息教程

📝 前言

之前有一期介绍到了如何申请开通微信模板消息《个体户申请服务号认证和开通模板消息指南》

这期再来介绍一下,如何通过 Python 来给指定的微信用户发送模板消息提醒。

🧭 背景介绍

微信模板消息广泛应用于自动通知支付提醒订单状态更新等场景,尤其对中小企业和个人开发者而言,是实现消息推送自动化的重要手段。

微信官方平台提供了模板消息接口,我们可以结合 Python 编程语言,实现自动化推送功能,提高运营效率。

📌 使用场景

  • 自动向用户推送提醒(如:课程开始、订单发货、订阅到期等)
  • 构建微信服务号的消息服务
  • 企业内部消息提醒系统
  • 与爬虫、数据分析等任务联动实现定时通知

📋 前提条件

在开始之前,请确保你已满足以下条件:

  • 拥有一个已认证的微信服务号
  • 模板消息功能已开通
  • 熟悉基本的Python语言

🧑‍💻 详细步骤

1️⃣ 获取服务号AppID 和 AppSecret

在启用AppSecret之前,需要先成为开发者,进入服务号控制台 → 设置与开发 → 开发接口管理 → 成为开发者。

再启用AppSecret,需要另外保存好AppID和AppSecret,后面会用到。

2️⃣ 选择消息模板类目

这里需要选择类目模板库,如果选择的行业没有任何模板不建议申请新的模板,因为审核很严,可以换个常见的行业再找找现成的可用模板。

PS:一个服务号最多只能设置5个服务类目。

服务类目一定要选常用的,我刚开始选择工具 → 日历,结果里面一个模板都没有,申请也不给通过。。

后面选择 商业服务 → 软件/建站/技术开发,就有很多现成的模板可用了。

3️⃣ 选择消息模板

选择完类目后,回到模板消息 → 模板库 → 类目模板库,就可以看到有很多现成的模板可用了。

选择一个适合自己场景的模板,并挑选好需要的关键词即可。

4️⃣ 获取access_token

我们发送模板消息必须要先获取access_token,而微信提供了2个接口可以获取access_token,对比如下:

项目 普通 access_token 接口 稳定版 access_token 接口
接口地址 https://api.weixin.qq.com/cgi-bin/token https://api.weixin.qq.com/cgi-bin/stable_token
请求方式 GET POST
请求参数 appidsecretgrant_type=client_credential JSON 格式传参:
`{
“grant_type”: “client_credential”,
“appid”: “<你的AppID>”,
“secret”: “<你的AppSecret>”
}`
请求示例 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET POST 到 https://api.weixin.qq.com/cgi-bin/stable_token,Body 参数如上所示
接口特点 普通接口,存在高并发下限频风险 稳定版接口,官方建议在高并发下使用,系统自动降级为普通接口
并发优化 无并发控制机制,频繁调用可能触发频率限制 内部具备自动限流和稳定性处理,更适合大规模使用场景
官方推荐场景 小程序、公众号小规模使用 企业级应用、大量接口调用时建议使用
返回值 { "access_token": "ACCESS_TOKEN", "expires_in": 7200 } 返回结构相同:access_tokenexpires_in

默认token都是7200秒有效期,这里建议直接使用稳定版接口即可。

Python 获取access_token代码示例(稳定版):

1
2
3
4
5
6
7
8
9
10
11
import requests

def get_stable_access_token(appid, appsecret):
url = "https://api.weixin.qq.com/cgi-bin/stable_token"
payload = {
"grant_type": "client_credential",
"appid": appid,
"secret": appsecret
}
response = requests.post(url, json=payload)
return response.json().get("access_token")

5️⃣ 设置IP白名单

首次调用接口获取access_token时,如果没有设置IP白名单,会提示以下错误信息:

1
2
3
4
{
"errcode":40164,
"errmsg":"invalid ip xxx.xxx.xxx.xxx ipv6 xxxxxx, not in whitelist rid: xx"
}

这是出于安全考虑,因此我们需要根据返回的IP地址,也即invalid ip后面的部分设置白名单。

进入在服务号控制台 → 设置与开发 → 安全中心 → 设置IP白名单

6️⃣ 发送模板消息

在发送模板消息之前,我们还需要获取用户微信的openid,这个可以引导用户关注服务号,再动态获取,限于篇幅这期我们先省略这部分,直接使用一个固定测试用的openid。

接口地址:https://api.weixin.qq.com/cgi-bin/message/template/send

Python 发送模板消息代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import requests

def send_wechat_template_message(access_token, openid, template_id, page_url, keywords):
"""
发送微信模板消息(构建并发送)

:param access_token: 微信 access_token
:param openid: 用户 OpenID
:param template_id: 模板消息 ID
:param page_url: 跳转链接
:param keywords: 字典,如 {"keyword1": "订单已支付", "keyword2": "2025-07-02"}
"""
data = {
"touser": openid,
"template_id": template_id,
"url": page_url,
"data": {
"thing25": {"value": "lusyoe"},
"thing10": {"value": "nCalendar"},
"time53": {"value": "2025-07-01"},
"time52": {"value": "2026-07-01"}
}
}

# 插入关键词字段
for i, (key, value) in enumerate(keywords.items(), start=1):
data["data"][f"keyword{i}"] = {"value": value}

url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}"
response = requests.post(url, json=data)
return response.json()

参数说明:

  • 用户OpenID,可在关注时动态获取并保存
  • 模板消息ID,选择消息模板后,会提供一个模板ID
  • 跳转链接,可选如果想要跳转到网页或小程序可以加上
  • data,模板消息内容,这个比较关键,选择完消息模板后,进入模板详情可查看,示例如下:

对应查看代码中的参数,value为实际动态发送的值。

注意:模板标题是没办法改的,所以尽量选择一个合适的模板。

7️⃣ 接收模板消息

发送完后,用户就可以在微信客户端(手机/PC)查看到发送的提醒消息,如下:

🧪 测试建议

  • 请先使用开发者工具中的测试号进行测试
  • 模板消息字段严格匹配模板格式,字段命名不可随意更改
  • 每次 Access Token 获取后有效期为 2 小时,建议缓存处理

✅ 总结

通过本教程,你可以快速实现微信模板消息自动推送功能,无论用于服务号用户提醒,还是企业内部通知,Python 都能帮助你构建高效的消息系统。

未来可扩展方向包括:

  • 定时任务(使用 scheduleAPScheduler
  • 消息队列处理(如 RabbitMQ/Kafka)
  • 集成在 Flask/Django 项目中统一管理通知