狀態碼造成微信公眾號“該公眾號提供的服務出現故障”


bug描述

我們使用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。
用其他的后台框架可能不會遇到狀態碼問題。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM