首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Django 開發微信公眾號文字回覆失效完整排查指南

     編輯:程式設計綜合問答

問題現象

Django 實作微信公眾號介面,驗證簽名通過,測試工具回傳 XML 格式正確,但實際公眾號回覆「暫時無法服務」。

核心排查方向

1. 回應格式嚴格檢查

微信要求:

  • Content-Type 必須為 application/xml 或 text/xml
  • XML 宣告:<?xml version="1.0" encoding="UTF-8"?>
  • CDATA 區塊不可包含 `]]>`
  • CreateTime 必須為**整數秒級時間戳**(非浮點數)

原程式碼問題:time.time() 回傳浮點數,需轉換:

'createTime': int(time.time())  # 必須為整數

2. 簽名驗證邏輯

# 正確排序方式:字典序
tmpList = [token, timestamp, nonce]
tmpList.sort()  # 此處正確
tmpstr = ''.join(tmpList)  # 直接拼接,無分隔符
tmpstr = hashlib.sha1(tmpstr.encode('utf-8')).hexdigest()

3. 回應加密模式

微信後台可設定三種模式:

  • 明文模式(預設):直接回傳 XML
  • 相容模式:明文 + 密文混合
  • 安全模式:全密文(需解密請求、加密回應)

若後台設為安全模式,明文回應會失效。請檢查公眾平台「開發設定」→「消息加解密方式」。

4. 伺服器環境問題

  • SAE/GAE 等平台可能封鎖外部請求或限制執行時間
  • 需確保 80/443 連接埠開放,且支援 HTTP POST
  • 回應超時限制:5 秒內必須回應,否則微信斷開連線

5. 除錯關鍵:記錄原始請求與回應

import logging
logger = logging.getLogger(__name__)

def post(self, request):
    logger.info(f"WeChat Request Body: {request.body.decode('utf-8')}")
    # ... 處理邏輯 ...
    response_xml = render_to_string('reply_text.xml', context)
    logger.info(f"WeChat Response XML: {response_xml}")
    return HttpResponse(response_xml, content_type='application/xml')

修正後的關鍵程式碼片段

def post(self, request):
    str_xml = smart_str(request.body)
    xml = etree.fromstring(str_xml)
    
    toUserName = xml.find('ToUserName').text
    fromUserName = xml.find('FromUserName').text
    createTime = int(time.time())  # 修正:整數秒
    msgType = xml.find('MsgType').text
    content = xml.find('Content').text
    
    context = {
        'toUserName': fromUserName,      # 注意:回覆時 To/From 互換
        'fromUserName': toUserName,
        'createTime': createTime,
        'msgType': 'text',               # 固定回覆文字訊息
        'content': content,
    }
    return render(request, 'reply_text.xml', context, content_type='application/xml')

模板 reply_text.xml 修正

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<ToUserName><![CDATA[{{ toUserName }}]]></ToUserName>
<FromUserName><![CDATA[{{ fromUserName }}]]></FromUserName>
<CreateTime>{{ createTime }}</CreateTime>
<MsgType><![CDATA[{{ msgType }}]]></MsgType>
<Content><![CDATA[{{ content }}]]></Content>
</xml>

參考資源

知乎完整解析:Django 微信公眾號開發避坑指南

快速檢查清單

  1. ☐ Content-Type 為 application/xml
  2. ☐ CreateTime 為整數秒
  3. ☐ ToUserName/FromUserName 正確互換
  4. ☐ 微信後台加密模式設為明文模式
  5. ☐ 伺服器 5 秒內回應
  6. ☐ 日誌記錄請求/回應內容

微信公眾號開發細節決定成敗,嚴格遵循協議規範是成功關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved