状态码造成微信公众号“该公众号提供的服务出现故障”

bug描述

听兰小说网 https://www.zuai.info

我们使用NestJS写后台代码,给微信公众号提供服务。
用户给公众号发消息时,公众号会显示“该公众号提供的服务出现故障”。
虽然后台代码可以正常处理业务,但这个提示非常影响用户体验。

检查

根据微信公众号文档给的提示,出现这个问题的原因是没有给微信服务器返回正确的信息。

微信服务器需要的是success或者空的字符串。不能是json格式的字符串。
搜了一下其他文章,有的说xml里也不能带有空格;有的说公众号绑定了第三方平台,要去解绑。
但这些和我们的情况不一致。

给公众号的接口是默认返回success的。

查看运行log,发现用户发送1条消息给公众号,我们的服务端会收到4条一模一样的消息。
这4条消息的MsgId是一样的。网上也有人提供了防止重复消息的办法。

于是尝试以下方法

  1. 维护一个map,key是MsgId。
  2. 接收到消息后,如果发现是重复的MsgId,则立刻返回success(或者空字符串)。

但是问题依旧没有解决。

微信服务器认为它没有拿到正确的返回值,于是走了重试的流程。
我们ubuntu服务器上使用了nginx,于是我们查看nginx的log

81.69.1.1 - - [03/Aug/2021:09:41:25 +0800] "POST /mywxserve/?signature=sign1111&timestamp=1627954885&nonce=1832145745&openid=qqq HTTP/1.1" 201 0 "-" "Mozilla/4.0"
81.69.1.1 - - [03/Aug/2021:09:41:26 +0800] "POST /mywxserve/?signature=sign1111&timestamp=1627954885&nonce=1832145745&openid=qqq HTTP/1.1" 201 7 "-" "Mozilla/4.0"
81.69.1.1 - - [03/Aug/2021:09:41:26 +0800] "POST /mywxserve/?signature=sign1111&timestamp=1627954885&nonce=1832145745&openid=qqq HTTP/1.1" 201 7 "-" "Mozilla/4.0"
42.192.1.1 - - [03/Aug/2021:09:41:26 +0800] "POST /mywxserve/?signature=sign1111&timestamp=1627954885&nonce=1832145745&openid=qqq HTTP/1.1" 201 7 "-" "Mozilla/4.0"

可以看到有2个ip地址,发来了3+1次请求。看到nginx返回的状态码都是201。
(ip地址和信息模糊处理)

状态码201表示“已创建”。NestJS默认状态码是200,但是默认POST的状态码是201。

修复

我们强制让nestjs返回状态码200

@HttpCode(200)
@Post()
async onWxEvent(@Body('xml') xmlData: IWxMessageXmlData): Promise<string> {}

再尝试一下,看到nginx的log,返回状态码是200了。公众号也正常了。

81.69.1.1 - - [03/Aug/2021:09:53:27 +0800] "POST /mywxserve/?signature=rustfisher&timestamp=1627955607&nonce=1829147547&openid=xxx0 HTTP/1.1" 200 0 "-" "Mozilla/4.0"

由此可见,接收微信公众号消息的时候,除了要返回空字符串或者success文本;返回状态码必须是200。
用其他的后台框架可能不会遇到状态码问题。

参考

  • wx基础消息能力-被动回复用户消息 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html
  • NestJS controller https://docs.nestjs.com/controllers#status-code
  • NestJS文章集合 https://rustfisher.com/categories/NestJS/
  • http状态码 https://rustfisher.com/2021/06/25/Network/http-code/
数据库设计是大众房产经纪人微信公众号的重要组成部分之一,它将影响到整个系统的性能和稳定性。以下是该系统的数据库设计总述: 1. 数据库类型 大众房产经纪人微信公众号的数据库采用关系型数据库,具体使用的是MySQL数据库。 2. 数据库表设计 该系统的数据库表设计包括以下几个方面: - 用户表:存储用户的基本信息,如用户名、密码、手机号码等; - 房产信息表:存储房产的基本信息,如房产编号、房产名称、面积、价格等; - 订单表:存储用户的订单信息,如订单编号、用户ID、房产编号、订单状态等; - 支付表:存储用户的支付信息,如支付编号、订单编号、支付金额、支付状态等; - 日志表:存储系统的操作日志,如用户登录、用户注册、订单创建等。 3. 数据库索引设计 为了提高系统的查询效率,需要对数据库表进行索引设计,具体包括以下几个方面: - 用户表:使用用户名和手机号码作为索引; - 房产信息表:使用房产编号作为索引; - 订单表:使用订单编号、用户ID和房产编号作为索引; - 支付表:使用支付编号和订单编号作为索引; - 日志表:使用日志ID作为索引。 4. 数据库备份和恢复 为了保证数据的安全性和可靠性,需要定期对数据库进行备份。在系统出现故障或数据误操作的情况下,可以通过备份文件进行数据恢复。 5. 数据库优化 为了提高系统的性能和稳定性,需要对数据库进行优化,具体包括以下几个方面: - 合理设计数据库表结构,减少冗余数据; - 合理使用索引,提高查询效率; - 定期清理无用数据,减少数据库负担; - 合理配置数据库参数,如缓存大小、读写分离等; - 定期对数据库进行性能测试和优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值