在调试发送 HTTP 请求过程中主要涉及到两个方面:配置合法域名列表和域名需要完整证书链。
配置合法域名列表
没有在微信小程序后台配置域名时,调用时会报错:
API request error: {errno: 600002, errMsg: "request:fail url not in domain list:beekc.top"}
服务域名在 【 小程序后台 – 开发 – 开发设置 – 服务器域名 】中进行配置。
这里需要注意的是,如果调用的域名含有端口,则在配置合法域名列表时带上端口。否则使用 443 端口也会判定为不在列表内。详细要求可以参照 微信官方文档 。
每个微信小程序需要事先设置通讯域名,小程序只可以跟指定的域名进行网络通信。包括普通 HTTPS 请求(wx.request)、上传文件(wx.uploadFile)、下载文件(wx.downloadFile) 和 WebSocket 通信(wx.connectSocket)。
从基础库 2.4.0 开始,网络接口允许与局域网 IP 通信,但要注意 不允许与本机 IP 通信。
从 2.7.0 开始,提供了 UDP 通信(wx.createUDPSocket)。
从 2.18.0 开始,提供了 TCP 连接(wx.createTCPSocket),只允许与同个局域网内的非本机 IP 以及配置过的服务器域名通信。
域名只支持 https (wx.request、wx.uploadFile、wx.downloadFile) 和 wss (wx.connectSocket) 协议;
域名不能使用 IP 地址(小程序的局域网 IP 除外)或 localhost;
对于 https 域名,可以配置端口,如 https://myserver.com:8080,但是配置后只能向 https://myserver.com:8080 发起请求。如果向 https://myserver.com、https://myserver.com:9091 等 URL 请求则会失败。如果不配置端口。如 https://myserver.com,那么请求的 URL 中也不能包含端口,甚至是默认的 443 端口也不可以。如果向 https://myserver.com:443 请求则会失败。
对于 wss 域名,无需配置端口,默认允许请求该域名下所有端口。
域名必须经过 ICP 备案;
出于安全考虑,api.weixin.qq.com 不能被配置为服务器域名,相关API也不能在小程序内调用。 开发者应将 AppSecret 保存到后台服务器中,通过服务器使用 getAccessToken 接口获取 access_token,并调用相关 API;
不支持配置父域名,使用子域名。
更新配置后若仍有问题可以尝试:
- 在微信开发者工具 – 右上角 详情 – 项目配置,刷新域名信息,并于实际调用的域名进行对比确认。
- 在微信中删除使用的小程序,重新扫码打开。
配置完整证书链
完成服务器域名配置后,我出现了证书错误。
API request error: {errno: 600001, errMsg: "request:fail net::ERR_CERT_AUTHORITY_INVALID"}
通过我使用浏览器访问没有问题,使用 证书链下载/证书链修复 发现服务器证书链不完整。
使用 certbot 进行认证,生成 cert.pem、chain.pem、fullchain.pem、privkey.pem。其中 cert 为服务器证书,chain 包含服务器证书外浏览器需要的其他证书,fullchain 包含 cert 和 chain,privkey 为私钥。
将认证使用的证书从 cert.pem 更换为 fullchain.pem 后问题修复。