最近在将自研小程序从测试版发布到正式版时,遇到了一个非常奇怪的坑:接口在本地开发和测试环境中一切正常,但一旦发布到正式版,就出现了 code 600002 的报错,提示 URL not in domain list

问题现象

  1. 接口本地测试完全正常。
  2. 开发版和测试版的小程序也可以正常调用该接口。
  3. 微信小程序后台服务器域名配置正常。
  4. 正式版小程序调用同一接口时,直接报错:
1
2
3
4
{
"errCode": 600002,
"errMsg": "url not in domain list"
}

问题定位

  1. 后端服务日志显示请求有记录,但没有报错信息。
  2. Nginx 日志中发现状态码 307 Temporary Redirect
  3. 查看 Git 提交记录时发现,报错接口被修改过,在原有的 API 路径后意外多加了一个 /,如:/api ➡️ /api/

问题分析

我的nginx下游服务器是FastAPI,FastAPI 默认严格区分 /api/api/,但是FastAPI收到其中一个未定义的路由时,会自动返回 307 Temporary Redirect,引导客户端访问另一个路径。

然而微信小程序似乎不允许重定向,而且只在正式版报错,就产生了这个难以快速定位的bug。

解决方法

  • 修改前端,去掉斜杠

  • 增加后端健壮性,同时支持支持带/不带斜杠

    1
    2
    3
    4
    @router.post("/api")
    @router.post("/api/")
    async def post_api(...):
    ...