应缓存并加锁更新access_token,用sync.rwmutex保护读写,启动时从./cache/access_token.json加载旧token及过期时间,使用前检查剩余有效期。

微信小程序 access_token 怎么安全获取和复用
微信小程序的 access_token 有 2 小时有效期,且调用频率受限(每日 2000 次),直接每次请求都重新拉取会很快触发限流,还可能因并发导致 token 覆盖错乱。
正确做法是:在内存中缓存并加锁更新,同时写入本地文件或 Redis 做进程重启后恢复。Go 标准库的 sync.Once 不适用——它只保证初始化一次,不解决过期刷新问题。
- 用
sync.RWMutex保护读写,读多写少场景下性能更优 - 启动时从
./cache/access_token.json加载上次保存的 token 和expires_in时间戳 - 每次使用前检查剩余有效期是否
- 刷新成功后,原子写入文件并更新内存值;失败则继续用旧 token(微信允许短时间超期使用)
示例关键判断逻辑:
if time.Now().After(expireAt.Add(-5 * time.Minute)) {
go refreshAccessToken() // 非阻塞刷新
}
调用 code2Session 接口解密登录态时常见 40029 错误
40029 表示 js_code 无效或已使用过。这个错误不是 Go 代码写得不对,而是前端或流程设计出了问题。
-
js_code是一次性凭证,前端调用wx.login()后必须立刻传给后端,延迟超过 5 分钟就大概率失效 - 前端若在用户未授权
scope.userInfo时就提前调wx.login(),再等用户点击授权按钮,中间间隔极易超时 - 后端收到 code 后,要立即拼接 URL:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code,注意不要 URL 编码js_code(微信服务端不接受双重编码) - 建议在返回结果里记录
openid和session_key的首次使用时间,用于后续排查重复使用
用 http.Client 调小程序订阅消息接口要注意超时和重试
小程序订阅消息接口(https://api.weixin.qq.com/cgi-bin/message/subscribe/send)平均响应在 200–800ms,但偶发网络抖动或微信侧排队会导致超时。直接用默认 http.DefaultClient 容易卡死或 panic。
- 显式设置
Timeout: 5 * time.Second,避免单个请求拖垮整个服务 - 对
context.DeadlineExceeded和net/http: request canceled做区分:前者是主动超时,后者可能是上层 context 取消(如 HTTP handler 已返回) - 不建议自动重试 500 类错误——微信明确说明“发送失败请勿重试”,重复发会触发风控,改用异步队列 + 人工干预更稳妥
- 如果必须重试(比如 40013 appid 不匹配这种可修复错误),仅对特定错误码重试 1 次,并记录原始 error 和 retry count
解析微信回调事件(如扫码、支付)的 XML Body 容易忽略编码和字段大小写
微信服务器推送的事件通知(如 scan、subscribe)是 UTF-8 编码的 XML,但 Go 的 xml.Unmarshal 默认不处理 XML 声明里的编码声明,且字段名需严格匹配微信文档中的 camelCase。
- 先用
bytes.TrimSpace去掉 body 前后空白,否则xml.Unmarshal可能报invalid character entity - 结构体字段必须用
xml:"EventKey"这种 tag 显式映射,不能依赖首字母大写自动转换(微信字段是EventKey,不是eventkey) - 签名验证前,必须原样读取原始 body(不能用
c.PostFormValue或先json.Unmarshal),否则 SHA256 签名校验必然失败 - 推荐用
ioutil.ReadAll(c.Request.Body)一次性读完,再分别做验签和解析,避免 body 被多次读取(HTTP Body 是单次读取流)
最常被跳过的细节:微信回调的 MsgType 值是小写的 "event",但很多开发者习惯写成 "Event" 导致 switch 匹配失败,逻辑静默丢弃。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











