本篇文章主要内容是记录一次微信云托管的经历,以及踩过的一些坑。
起因
当时我在吃午饭,突然收到连续的两条微信服务通知
直接把微信云托管的实例啥的都给删得一干二净了!后面问老板才知道原来已经欠费好一段时间了,不过只有删的时候才有微信通知。这是我想吐槽微信开发的第一个点。
救火
删得一干二净,那只能充钱后从零开始部署了。这个云托管对应的小程序是 21 年的时候学长开发的,现在服务端主要是由我来维护和开发新功能。所以,重新部署的事情就交给我了。
原来云托管出口固定 ip 是免费的,但是我们重新部署的时候就要钱了。
第一个坑
根据 微信小程序-访问云托管服务 这篇文档,我没有搞清楚云托管和小程序的关系,也没有认真阅读 A 和 B 是小程序或者公众号,以为需要添加资源资源复用,卡了一会之后才知道本身云托管和小程序关联了后就不需要加资源复用了。
第二个坑
前端除了改一下新的云环境,还有些业务还需要通过 url 请求云托管服务端。我开了云托管的公网访问,没想到以前是可以直接在云托管生成生产环境的公网域名,现在只能生成测试环境的了。
没办法,那就只能通过 CNAME 绑定自定义域名了。没想到域名还需要备案,不过我们可以直接绑就行了,问题不大。
前端改了自定义域名后,还需要在微信公众号那里添加服务器域名后小程序才能正常请求服务端。
第三个坑
原以为这样就结束了,没想到服务端容器调用微信云调用 api 的时候报证书无效错了。根据 开放接口服务 这篇文档,发现云托管会在容器内安装 api.weixin.qq.com 的自签名证书,并且推荐使用 HTTP,如果用 HTTPS 还得在 Dockerfile 里面安装 ca-certificates。奇怪的是,之前 3 月份部署的云容器里面的 Dockerfile 一直都没安装也没这个问题,可能又是什么时候改了吧。最后选择了在生产环境使用 HTTP,测试环境使用 HTTPS 了。
第四个坑
虽然这似乎恢复了大部分业务,但是小程序端请求服务端的云调用报502 Bad Gateway URL不在白名单内,请前往「微信云托管控制台-服务管理-云调用-微信令牌」配置错误。我去到配置那里,发现前端已经填了一些服务端的接口(注意是服务端不是云调用的接口!)。我就跟着填了下其他服务端接口,发现还是不行。于是在 配置云调用权限 文档里面找才发现不应该填服务端的接口而是填云调用的接口。
第五个坑
当我以为这就完事后,发现微信登录的请求又报新的错。
1 | org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.alibaba.fastjson.JSONObject] and content type [text/plain;charset=utf-8] |
本地 HTTPS 请求返回的 Headers 是 application/json 没问题的,但是云调用返回的 Headers 是 text/plain,而 Body 格式是 application/json,即使指定 application/json 也没用。搜了下,原来是微信云调用的 Headers 返回不规范,而且一直有这个问题。你们小程序获取openid的请求返回格式是json头类型为text/plain?大厂呢 丢人啊
解决方法是,参考 RestTemplate 微信接口 text/plain HttpMessageConverter 追加 Converter 就行了。没想到我还有给微信擦屁股的一天。
总结
这次从发现删除到生产环境彻底恢复花了 2 天左右的时间。花了那么长时间的主要原因是我们都不够仔细地去阅读文档,次要原因我这几天都有其他事情去忙,还有一个原因就是我是全程远程在家救火而不是和老板和前端等及时线下交流,效率低。幸好由于这段时间是暑假,这个业务不是很多人用,所以小程序挂了的实际影响不是很大。
希望这次事故我能够引以为戒,认真阅读文档,有问题及时线下交流。