# 错误排查及常见问题

# 常见错误排查指引

# access_token missing rid: xxxxxx

  • 检查是否开启了开放接口服务。开启后,需要发布一次新版本才能生效。
  • 代码中请不要在服务启动阶段使用云调用,此时开放接口服务还未生效。

# access_token expired rid: xxxxxx

检查是否自行实现了 jscode2session 或使用了过期的 access_token,如果代码中使用了 access_token,可以去掉相关逻辑后重试。

# api unauthorized rid: xxxxxx

当前主体没有调用此API接口的权限。一般发生在资源复用的情况下,比如小程序下的环境里面,调用公众号的接口。需要添加from_appid参数来指定你的api调用主体,不填的话就默认是环境所属小程序的主体。

具体可以参考此文档

# 访问api.weixin.qq.com接口时,报错提示502(bad gateway)等相关错误

开启「开放接口服务」时,部分接口在未配置白名单时会返回502状态码,部分框架的请求靠状态码识别,就会出现相关报错。这种情况下建议先看一下白名单配置,如果仍然不可以,则关闭「开放接口服务」,重新发布服务版本观察是否解决。

关闭「开放接口服务」后,如果想使用免鉴权,可以使用令牌形式完成。微信支付、对象存储等扩展api建议使用另外的服务来提供。出现状态码问题,一般都是框架和开放接口服务不融合,所以可以尝试修正框架使用来解决融合问题,实在不行再关闭「开放接口服务」

如果你使用 snsjscode2sessiongetAccessToken类接口,自行维护access_token,则不需要开启开放接口服务,可以关闭「开放接口服务」然后重新部署一下自己的业务服务。

# errcode: 85105 not authorized / errcode: 48001 api unauthorized

缺少接口权限,检查是否使用 公众号 AppID 调用了 小程序 的接口,或使用 第三方 Open 账号等缺少小程序身份的接口调用了小程序接口。或未在 mp.weixin.qq.com 上申请对应接口的权限,或使用了第三方的 AppID 调用了缺少授权的接口。

第三方接口与小程序接口不同,请参考 第三方平台接口文档

# errcode: 85112 cloudbase_secret not found / error_type: GatewayError / error_type: SafeLinkError

链路异常,请提交工单,并附上环境 ID,AppID 和调用时间,RequestID 等信息。

# errcode: 85113 cloudbase_token is not ready yet, please try again later

云调用服务尚未初始化(常见于第一个版本),请等待数分钟后重试。如果仍然出现错误,请提交工单。

# errcode: 85107 URL不在白名单内,请前往「微信云托管控制台-服务管理-云调用-微信令牌」配置

检查是否将后端需要调用的微信的接口(以 https://api.weixin.qq.com 开头的)以正确的格式添加到了「开放接口服务」的接口白名单内。

注意:不是填你的后端业务接口,比如请求 https://api.weixin.qq.com/wxa/msg_sec_check 接口,则需要配置 /wxa/msg_sec_check 到白名单中。

如果你使用 snsjscode2sessiongetAccessToken类接口,自行维护access_token,则不需要开启开放接口服务,可以关闭「开放接口服务」然后重新部署一下自己的业务服务。

开启「开放接口服务」情况下,使用jscode2session会发生白名单配置错误,原因是:开放接口服务以调用是否传 access_token 参数判定是否走原生。因为jscode2session没有access_token 参数,所以就会发生走「开放接口服务」鉴权情况。这种情景下,可以关闭「开放接口服务」然后重新部署一下自己的业务服务。在这里还是建议不要在云托管中用code登录的形式,具体可以参看此文档

# errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest

云调用不支持免鉴权调用非 OpenAPI 接口

# 常见问题

# 证书问题,常见表现:Error: self signed certificate / x509: certificate signed by unknown authority

由于开放接口服务需要对请求进行处理,开放接口服务推荐使用 HTTP 协议进行使用。同时,本地调试暂仅支持 HTTP 协议调试。

使用 HTTPS 证书时,需要确认容器内拥有 shell,并已安装 ca-certificates 模块。如果使用了自带根证书的语言,可参考 开放接口服务 中的说明。

# 使用 HTTP 是否会带来安全问题?

开放接口服务在容器内进行网络交互,请求不会离开用户容器(解析到 169.254.0.x)。使用 HTTP 访问不会带来安全问题。

# 云调用请求中文入参出现乱码

query做一下 encode即可:/api/xx/xx?query=${encodeURIComponent('中文')}

# 其他注意事项

  1. 开启「开放接口服务」,请求中如果仍然附带access_token,不会覆盖掉,这类操作通常用于资源复用场景下,资源复用使用可参考这里
  2. 使用 secret 置换的 access_token,经过开放服务不需要配置白名单,原因如第1条,不覆盖。但如果使用「开放接口服务」鉴权,则必须使用白名单,因为其仍然使用 cloudbase_access_token
  3. 通过请求头返回 x-openapi-seqid 和解析地址为内部地址(10.0.0.x / 169.254.0.x)判断是否使用了开放接口服务。
  4. 部分自带根证书的运行时,需要手动设置证书,证书目录为: /app/cert/certificate.crt
  5. 开放接口服务集成的其他能力(如微信支付对象存储),应按照微信云托管提供的文档指引使用。
  6. 开放接口服务依赖 shell, 如镜像内无 sh/bash 将无法正常部署容器(如 scratch 作为基础镜像时)。