前言
微信小程序跟后端的通信必须要HTTPS,总结开发中遇到的问题。
PS:如果使用自签名证书,小程序上线后是没法进行请求的,必须申请安全的证书,
报-200:net::ERR_CERT_COMMON_NAME_INVALID
以下是微信开放文档中的要求:
服务器域名配置
每个微信小程序需要事先设置通讯域名,小程序只可以跟指定的域名与进行网络通信。包括普通 HTTPS 请求(wx.request)、上传文件(wx.uploadFile)、下载文件(wx.downloadFile) 和 WebSocket 通信(wx.connectSocket)。
配置流程
服务器域名请在 「小程序后台-开发-开发设置-服务器域名」 中进行配置,配置时需要注意:
- 域名只支持
https
(wx.request、wx.uploadFile、wx.downloadFile) 和wss
(wx.connectSocket) 协议; - 域名不能使用 IP 地址(小程序的局域网 IP 除外)或 localhost;
- 可以配置端口,如 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 请求则会失败。
- 域名必须经过 ICP 备案;
- 出于安全考虑,
api.weixin.qq.com
不能被配置为服务器域名,相关API也不能在小程序内调用。 开发者应将 AppSecret 保存到后台服务器中,通过服务器使用getAccessToken
接口获取access_token
,并调用相关 API; - 对于每个接口,分别可以配置最多 20 个域名。
HTTPS 证书
小程序必须使用 HTTPS/WSS 发起网络请求。请求时系统会对服务器域名使用的 HTTPS 证书进行校验,如果校验失败,则请求不能成功发起。由于系统限制,不同平台对于证书要求的严格程度不同。为了保证小程序的兼容性,建议开发者按照最高标准进行证书配置,并使用相关工具检查现有证书是否符合要求。
对证书要求如下:
- HTTPS 证书必须有效;
- 证书必须被系统信任,即根证书被已系统内置
- 部署 SSL 证书的网站域名必须与证书颁发的域名一致
- 证书必须在有效期内
- 证书的信任链必需完整(需要服务器配置)
iOS
不支持自签名证书;iOS
下证书必须满足苹果 App Transport Security (ATS) 的要求;- TLS 必须支持 1.2 及以上版本。部分旧
Android
机型还未支持 TLS 1.2,请确保 HTTPS 服务器的 TLS 版本支持 1.2 及以下版本; - 部分 CA 可能不被操作系统信任,请开发者在选择证书时注意小程序和各系统的相关通告。
除了网络请求 API 外,小程序中其他 HTTPS
请求如果出现异常,也请按上述流程进行检查。如 https 的图片无法加载、音视频无法播放等。
跳过域名校验
在微信开发者工具中,可以临时开启 开发环境不校验请求域名、TLS版本及HTTPS证书
选项,跳过服务器域名的校验。此时,在微信开发者工具中及手机开启调试模式时,不会进行服务器域名的校验。
——————————————————————————————————————————————————
申请免费SSL
我选择腾讯云(因为其他我都申请了,但最后腾讯成功了,而且腾讯云的文档很全)
https://buy.cloud.tencent.com/ssl
填写域名相关,完成证书申请。
https://cloud.tencent.com/document/product/400/4142#ManualVerification
根据操作手册完成证书验证。我选择手动 DNS 验证
因为我的域名在华为云,所以(这一步很关键):


按照证书详细那的信息填写。
值要加双引号
等几分钟,就可以了
下载下来,我是在spring boot 中使用,其他的也可以照文档部署。
https://cloud.tencent.com/document/product/400/4143
spring-boot配置https
application.yml添加证书信息,选择对应证书,spring boot 使用Tomcat,自定义自选。
server:
port: 443
ssl:
key-store: classpath:hg.gxxxx.com.jks
key-store-password: gxxxx
key-store-type: JKS
代码添加(这里是spring boot 2.2.2的环境,2.1以下自行百度):
@SpringBootApplication
public class GuestBookApplication {
public static void main(String[] args) {
SpringApplication.run(GuestBookApplication.class, args);
}
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
return tomcat;
}
private Connector createHTTPConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(80);
connector.setRedirectPort(443);
return connector;
}
}
到这里就完成了。