溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何處理微信公眾號開發(fā)中的消息與事件

發(fā)布時間:2021-09-10 14:26:14 來源:億速云 閱讀:157 作者:小新 欄目:移動開發(fā)

這篇文章主要為大家展示了“如何處理微信公眾號開發(fā)中的消息與事件”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何處理微信公眾號開發(fā)中的消息與事件”這篇文章吧。


1 消息(事件)概況

當普通微信用戶向公眾號發(fā)消息或者微信服務器向公眾號推送事件時,微信服務器將POST消息(事件)的XML數(shù)據(jù)包到開發(fā)者填寫的公眾號服務器URL上;公眾號服務器然后對消息作出響應。
1.1 消息的流轉過程
   為了便于區(qū)分,我們將微信服務器發(fā)往公眾號服務器的消息稱為請求(Request)消息;將公眾號服務器發(fā)往微信服務器的消息稱為響應(Response)消息;將推送事件看成特殊的請求消息。
   請求與響應消息的流轉過程如下圖所示:

如何處理微信公眾號開發(fā)中的消息與事件

1.2 請求消息
   請求消息有很多種,我們?yōu)槠湟灰唤⒘藢念?,類層次結構如下圖所示:

如何處理微信公眾號開發(fā)中的消息與事件

有些請求消息,我們可以做出響應,有些則不能,詳見下表:

消息類型是否事件能夠被動回復備注
文本×
圖片×
聲音×
視頻×未知接收不到視頻消息,不知道是否能被動回復
地理位置×
鏈接×
訂閱
取消訂閱×
掃描二維碼×
上報地理位置×
點擊菜單拉取消息
點擊菜單跳轉鏈接×
點擊菜單掃碼推×
點擊菜單掃碼等待回復
點擊菜單系統(tǒng)發(fā)圖未知接收不到系統(tǒng)發(fā)圖事件;微信服務器會發(fā)送圖片消息,可回復
點擊菜單拍照或相冊發(fā)圖×微信服務器會發(fā)送圖片消息,可回復
點擊菜單微信發(fā)圖×微信服務器會發(fā)送圖片消息,可回復
點擊菜單選擇地理位置×微信服務器會發(fā)送地理位置消息,可回復
推送群發(fā)消息結果×
推送發(fā)送模板消息結果×

1.3 響應消息
   響應消息的類層次結構如下圖所示:

如何處理微信公眾號開發(fā)中的消息與事件


2 驗證消息的真實性
   公眾號服務器接收到微信服務器的請求之后,第一件事情是驗證消息的真實性。
   Utility.CheckSignature方法用于驗證消息簽名是否正確。
   示例如下:

/// <summary>
    /// 驗證消息的有效性
    /// </summary>
    /// <param name="context"></param>
    /// <returns>如果消息有效,返回true;否則返回false。</returns>
    private bool Validate(HttpContext context)
    {
        string username = RequestEx.TryGetQueryString("username");  //在接口配置的URL中加入了username參數(shù),表示哪個微信公眾號
        AccountInfo account = AccountInfoCollection.GetAccountInfo(username);
        if (account == null)
            return false;
        string token = account.Token;
        string signature = RequestEx.TryGetQueryString("signature");
        string timestamp = RequestEx.TryGetQueryString("timestamp");
        string nonce = RequestEx.TryGetQueryString("nonce");
        if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce))
            return false;
        return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce);
    }

驗證消息真實性

驗證消息真實性

3 解析消息

如果消息簽名通過驗證,我們需要將XML格式的消息文本解析成請求消息對象,RequestMessageHelper類用于完成這項工作。

RequestMessageHelper helper = new RequestMessageHelper(context.Request);
if(helper.Message != null)
{
    //消息解析成功,對它進行處理
}

消息解析成功之后,helper.Message為消息基類RequestBaseMessage,我們可以根據(jù)屬性MsgType及Event判斷到底是哪種消息(事件),并轉換成適當?shù)淖宇愋?。例如?/p>

RequestBaseMessage bm=helper.Message;
switch(bm.MsgType)
{
    case RequestMessageTypeEnum.text:  //文本消息
        HandleTextMessage((RequestTextMessage)bm);
        break;
    case RequestMessageTypeEnum.image: //圖片消息
        HandleImageMessage((RequestImageMessage)bm);
        break;
    //處理其他消息
    case RequestMessageTypeEnum.event:    //事件
        RequestEventMessage ev=(RequestEventMessage)bm;
        switch(ev.Event)
        {
            case RequestEventTypeEnum.subscribe:    //訂閱
                HandleSubscribeMessage((RequestSubscribeMessage)ev);
                break;
            case RequestEventTypeEnum.unsubscribe:    //取消訂閱
                HandleUnsubscribeMessage((RequestUnsubscribeMessage)ev);
                break;
            //處理其他事件
        }
        break;
    default:
        break;
}

解析消息的細節(jié)請參看源代碼:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/PublicAccount/RequestMessage/RequestMessageHelper.cs

4 被動回復消息
   從微信服務器接收到消息(事件)之后,我們可以在5秒之內(nèi)直接(被動)回復消息;也可以先直接回復空字符串,然后再在48小時內(nèi)回復客服消息。
   先初始化ResponseXxxMessage,然后用ToXml方法得到響應消息內(nèi)容。
   被動回復消息的示例如下:

/// <summary>
    /// 處理微信的POST請求
    /// </summary>
    /// <param name="context"></param>
    /// <returns>返回xml響應</returns>
    private string HandlePost(HttpContext context)
    {
        RequestMessageHelper helper = new RequestMessageHelper(context.Request);
        if (helper.Message != null)
        {
            ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message);
            return responseMessage.ToXml(helper.EncryptType);
        }
        else
            return string.Empty;
    }

    /// <summary>
    /// 處理請求消息,返回響應消息
    /// </summary>
    /// <returns>返回響應消息</returns>
    private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage)
    {
        ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName, 
            DateTime.Now, string.Format("自動回復,請求內(nèi)容如下:\r\n{0}", requestMessage));
        return response;
    }

以上是“如何處理微信公眾號開發(fā)中的消息與事件”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI