C#開發微信之微信企業號消息和事件接收處理及解密的示例分析

這篇文章給大家分享的是有關C#開發微信之微信企業號消息和事件接收處理及解密的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

十載的隆堯網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整隆堯建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯建站從事“隆堯網站設計”,“隆堯網站推廣”以來,每個客戶項目都認真落實執行。

1、企業號回調模式的設置

和公眾號一樣,微信企業號如果需要進行二次開發,也是需要在后臺設置好對應的回調參數,如下界面所示。

C#開發微信之微信企業號消息和事件接收處理及解密的示例分析

設置好這些后,檢查通過后,我們就可以在自己微信應用服務器上進行消息的收發操作了。

在回調的消息入口處,我們需要對POST數據和普通的GET數據進行分開處理,GET數據是微信自身的驗證處理,POST數據是微信消息的交互操作。

    /// <summary>
    /// 企業號回調信息接口。統一接收并處理信息的入口。    /// </summary>
    public class corpapi : IHttpHandler
    {        /// <summary>
        /// 處理企業號的信息        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {

上面我們定義了一個一般應用處理程序來對消息進行處理。

然后我們分開不同的消息類型(POST、GET 方式),針對性的進行處理。

                    if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
                    {                        using (Stream stream = HttpContext.Current.Request.InputStream)
                        {
                            Byte[] postBytes = new Byte[stream.Length];
                            stream.Read(postBytes, 0, (Int32)stream.Length);
                            postString = Encoding.UTF8.GetString(postBytes);
                        }                        if (!string.IsNullOrEmpty(postString))
                        {
                            Execute(postString, accountInfo);
                        }
                    }                    else
                    {
                        Auth(accountInfo);
                    }

2、微信回調消息的驗證

下面是微信對于回調模式,驗證URL的說明。

驗證URL有效性

當你提交以上信息時,企業號將發送GET請求到填寫的URL上,GET請求攜帶四個參數,企業在獲取時需要做urldecode處理,否則會驗證不成功。

參數描述是否必帶
msg_signature微信加密簽名,msg_signature結合了企業填寫的token、請求中的timestamp、nonce參數、加密的消息體
timestamp時間戳
nonce隨機數
echostr加密的隨機字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四個字段,其中msg即為echostr明文首次校驗時必帶

企業通過參數msg_signature對請求進行校驗,如果確認此次GET請求來自企業號,那么企業應用對echostr參數解密并原樣返回echostr明文(不能加引號),則接入驗證生效,回調模式才能開啟。

后續回調企業時都會在請求URL中帶上以上參數(echostr除外),校驗方式與首次驗證URL一致。

根據上面的說明,我們需要獲取這些參數,然后調用微信提供的消息處理函數進行加解密處理。

在驗證URL的Auth(accountInfo);操作里面,我們可以看到核心的內容如下所示,就是獲取到這些傳遞過來的參數信息,然后交給基類處理消息的簽名內容。

                        #region 具體處理邏輯                        string echoString = HttpContext.Current.Request.QueryString["echoStr"];                        string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企業號的 msg_signature
                        string timestamp = HttpContext.Current.Request.QueryString["timestamp"];                        string nonce = HttpContext.Current.Request.QueryString["nonce"];                        string decryptEchoString = "";                        if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))
                        {                            if (!string.IsNullOrEmpty(decryptEchoString))
                            {
                                HttpContext.Current.Response.Write(decryptEchoString);
                                HttpContext.Current.Response.End();
                            }
                        } 
                        #endregion

驗證代碼部門如下所示。

        /// <summary>
        /// 驗證企業號簽名        /// </summary>
        /// <param name="token">企業號配置的Token</param>
        /// <param name="signature">簽名內容</param>
        /// <param name="timestamp">時間戳</param>
        /// <param name="nonce">nonce參數</param>
        /// <param name="corpId">企業號ID標識</param>
        /// <param name="encodingAESKey">加密鍵</param>
        /// <param name="echostr">內容字符串</param>
        /// <param name="retEchostr">返回的字符串</param>
        /// <returns></returns>
        public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr)
        {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);            int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);            if (result != 0)
            {
                LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result);                return false;
            }            return true;
        }

3、企業號的消息處理

上面介紹了,微信企業號對URL的驗證過程,還有另外一個消息處理過程,就是微信服務器把消息發送給我們自己的應用服務器進行處理的過程,我們應用服務器需要在收到消息后,及時進行常規回復處理。

也就是下面的代碼邏輯。

                    if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
                    {                        using (Stream stream = HttpContext.Current.Request.InputStream)
                        {
                            Byte[] postBytes = new Byte[stream.Length];
                            stream.Read(postBytes, 0, (Int32)stream.Length);
                            postString = Encoding.UTF8.GetString(postBytes);
                        }                        if (!string.IsNullOrEmpty(postString))
                        {
                            Execute(postString, accountInfo);
                        }
                    }

同樣,我們給微信服務器回應消息的時候,我們也需要獲得相應的參數,然后再行構造信息回答。

            string echoString = HttpContext.Current.Request.QueryString["echoStr"];            string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企業號的 msg_signature
            string timestamp = HttpContext.Current.Request.QueryString["timestamp"];            string nonce = HttpContext.Current.Request.QueryString["nonce"];

而另外一些參數信息,則是來源于我們企業號賬號的配置參數。

            //獲取配置參數并對加解密函數初始化
            string CorpToken = accountInfo.Token;            string AESKey = accountInfo.EncodingAESKey;            string CorpId = accountInfo.CorpID;

然后使用微信提供的消息加解密類,就可以順利對消息進行加解密的處理了。具體操作代碼如下所示。

            //根據參數信息,初始化微信對應的消息加密解密類
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(CorpToken, AESKey, CorpId);            //對收到的密文進行解析處理
            string sMsg = "";  // 解析之后的明文
            int flag = wxcpt.DecryptMsg(signature, timestamp, nonce, postStr, ref sMsg);            if (flag == 0)
            {                //LogTextHelper.Info("記錄解密后的數據:");                //LogTextHelper.Info(sMsg);//記錄解密后的數據
                CorpApiDispatch dispatch = new CorpApiDispatch();                string responseContent = dispatch.Execute(sMsg);                //加密后并發送                //LogTextHelper.Info(responseContent);
                string encryptResponse = "";
                timestamp = DateTime.Now.DateTimeToInt().ToString();
                wxcpt.EncryptMsg(responseContent, timestamp, nonce, ref encryptResponse, ref signature);

                HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                HttpContext.Current.Response.Write(encryptResponse);
            }            else
            {
                LogTextHelper.Info("解密消息失??!");
            }

最終,我們把解密完成的消息交給對應的封裝類進行統一處理就可以了。

                CorpApiDispatch dispatch = new CorpApiDispatch();                string responseContent = dispatch.Execute(sMsg);

這樣我們在企業號API的封裝,就可以只需要關注消息如何應答的邏輯就可以了,其他的不用關心。

C#開發微信之微信企業號消息和事件接收處理及解密的示例分析

感謝各位的閱讀!關于“C#開發微信之微信企業號消息和事件接收處理及解密的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網站題目:C#開發微信之微信企業號消息和事件接收處理及解密的示例分析
轉載來源:http://m.kartarina.com/article40/pihjho.html

成都網站建設公司_創新互聯,為您提供域名注冊網站制作、搜索引擎優化手機網站建設、外貿建站、小程序開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站建設
主站蜘蛛池模板: 精品亚洲AV无码一区二区三区| 无码av人妻一区二区三区四区| 爆乳无码AV一区二区三区| 久久中文字幕无码一区二区| 极品粉嫩嫩模大尺度无码视频| 日韩精品专区AV无码| 国产成人亚洲精品无码AV大片| 日韩爆乳一区二区无码| 日韩精品无码人妻免费视频| 人妻丰满熟妇AV无码区乱| 本道天堂成在人线av无码免费| 亚洲另类无码专区首页| 亚洲va中文字幕无码久久| 精品一区二区三区无码免费直播| 久久精品国产亚洲AV无码娇色| 国产高清无码二区| 成人无码嫩草影院| 无码人妻一区二区三区兔费| 午夜不卡无码中文字幕影院| 自拍偷在线精品自拍偷无码专区| 色综合热无码热国产| 亚洲成a人片在线观看天堂无码| 人妻中文字幕无码专区| 亚洲精品无码久久久久| 国产成人无码区免费网站| 无码激情做a爰片毛片AV片| 麻豆精品无码国产在线果冻 | 国产成年无码久久久久下载| 色噜噜综合亚洲av中文无码 | 久久久久成人精品无码| 日韩AV无码不卡网站| 黑人巨大无码中文字幕无码 | 亚洲国产成人片在线观看无码| 国产成人无码精品一区在线观看| 国产成人无码免费视频97| 免费A级毛片无码久久版| 国产精品无码素人福利免费| 免费无码午夜福利片 | 免费无码H肉动漫在线观看麻豆| 无码人妻一区二区三区在线水卜樱| 曰韩无码无遮挡A级毛片|