插件窝 干货文章 微信公众号模板消息发送失败,错误码-41000该如何解决?

微信公众号模板消息发送失败,错误码-41000该如何解决?

token access AppSecret 获取 94    来源:    2025-03-11

错误码 -41000 是微信公众号开发中常见的错误码之一,通常表示 "不合法的access_token"。这个错误通常是由于以下原因之一引起的:

1. Access Token 过期

  • 原因:微信公众号的 access_token 是有有效期的(通常为2小时),如果超过有效期,access_token 将失效,导致发送模板消息失败。
  • 解决方案
    • 重新获取 access_token,并在发送模板消息时使用新的 access_token
    • 建议在代码中实现 access_token 的缓存机制,定期刷新 access_token,避免过期。

2. Access Token 获取错误

  • 原因:在获取 access_token 时,可能由于网络问题、AppID 或 AppSecret 错误等原因,导致获取的 access_token 无效。
  • 解决方案
    • 检查 AppID 和 AppSecret 是否正确。
    • 确保获取 access_token 的接口调用成功,并且返回的 access_token 是有效的。

3. Access Token 被重复使用

  • 原因:如果多个服务同时使用同一个 access_token,可能会导致 access_token 被刷新,旧的 access_token 失效。
  • 解决方案
    • 确保 access_token 的获取和使用是集中管理的,避免多个服务重复获取 access_token

4. Access Token 缓存问题

  • 原因:如果 access_token 缓存在本地,但缓存时间过长,可能导致 access_token 过期。
  • 解决方案
    • 在缓存 access_token 时,记录获取时间,并在接近过期时间(如1小时50分钟)时主动刷新 access_token

5. 其他可能的原因

  • 原因:如果以上问题都排除了,可能是微信服务器的问题,或者请求参数有误。
  • 解决方案
    • 检查请求参数是否正确,特别是 tousertemplate_iddata 等字段。
    • 确认微信服务器是否正常运行,可以通过微信公众平台查看是否有公告或维护通知。

代码示例:获取和刷新 Access Token

import requests
import time

# 获取 access_token
def get_access_token(appid, appsecret):
    url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={appsecret}"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        if 'access_token' in data:
            return data['access_token'], data['expires_in']
    return None, None

# 缓存 access_token
class AccessTokenCache:
    def __init__(self, appid, appsecret):
        self.appid = appid
        self.appsecret = appsecret
        self.access_token = None
        self.expire_time = 0

    def get_token(self):
        if time.time() < self.expire_time - 600:  # 提前10分钟刷新
            return self.access_token
        token, expires_in = get_access_token(self.appid, self.appsecret)
        if token:
            self.access_token = token
            self.expire_time = time.time() + expires_in
        return self.access_token

# 使用缓存的 access_token 发送模板消息
def send_template_message(cache, touser, template_id, data):
    access_token = cache.get_token()
    if not access_token:
        return False
    url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}"
    payload = {
        "touser": touser,
        "template_id": template_id,
        "data": data
    }
    response = requests.post(url, json=payload)
    return response.json()

# 示例使用
appid = "your_appid"
appsecret = "your_appsecret"
cache = AccessTokenCache(appid, appsecret)
result = send_template_message(cache, "user_openid", "template_id", {"key": "value"})
print(result)

总结

错误码 -41000 通常是由于 access_token 无效或过期引起的。通过重新获取 access_token 并确保其有效性和及时刷新,可以解决这个问题。如果问题仍然存在,建议检查请求参数和微信服务器状态。