日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

發(fā)布時(shí)間:2025/3/21 C# 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上篇隨筆《C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(19)-微信企業(yè)號(hào)的消息發(fā)送(文本、圖片、文件、語(yǔ)音、視頻、圖文消息等)》介紹了有關(guān)企業(yè)號(hào)的消息發(fā)送,官方特別聲明消息是不用加密發(fā)送的。但是在回調(diào)的服務(wù)器上,也就是我們網(wǎng)站的服務(wù)器上,微信傳過(guò)來(lái)的消息是加密的,需要我們調(diào)用類庫(kù)對(duì)消息和事件進(jìn)行解密操作,由于官方的例子不全,因此摸索了不少時(shí)間,最終順利解密收到的各種消息和事件。本文主要介紹?微信企業(yè)號(hào)的消息和事件的接收處理及解密操作。

1、企業(yè)號(hào)回調(diào)模式的設(shè)置

和公眾號(hào)一樣,微信企業(yè)號(hào)如果需要進(jìn)行二次開(kāi)發(fā),也是需要在后臺(tái)設(shè)置好對(duì)應(yīng)的回調(diào)參數(shù),如下界面所示。

設(shè)置好這些后,檢查通過(guò)后,我們就可以在自己微信應(yīng)用服務(wù)器上進(jìn)行消息的收發(fā)操作了。

在回調(diào)的消息入口處,我們需要對(duì)POST數(shù)據(jù)和普通的GET數(shù)據(jù)進(jìn)行分開(kāi)處理,GET數(shù)據(jù)是微信自身的驗(yàn)證處理,POST數(shù)據(jù)是微信消息的交互操作。

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

上面我們定義了一個(gè)一般應(yīng)用處理程序來(lái)對(duì)消息進(jìn)行處理。

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

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、微信回調(diào)消息的驗(yàn)證

?下面是微信對(duì)于回調(diào)模式,驗(yàn)證URL的說(shuō)明。

驗(yàn)證URL有效性

當(dāng)你提交以上信息時(shí),企業(yè)號(hào)將發(fā)送GET請(qǐng)求到填寫(xiě)的URL上,GET請(qǐng)求攜帶四個(gè)參數(shù),企業(yè)在獲取時(shí)需要做urldecode處理,否則會(huì)驗(yàn)證不成功。

參數(shù)描述是否必帶
msg_signature微信加密簽名,msg_signature結(jié)合了企業(yè)填寫(xiě)的token、請(qǐng)求中的timestamp、nonce參數(shù)、加密的消息體
timestamp時(shí)間戳
nonce隨機(jī)數(shù)
echostr加密的隨機(jī)字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四個(gè)字段,其中msg即為echostr明文首次校驗(yàn)時(shí)必帶

企業(yè)通過(guò)參數(shù)msg_signature對(duì)請(qǐng)求進(jìn)行校驗(yàn),如果確認(rèn)此次GET請(qǐng)求來(lái)自企業(yè)號(hào),那么企業(yè)應(yīng)用對(duì)echostr參數(shù)解密并原樣返回echostr明文(不能加引號(hào)),則接入驗(yàn)證生效,回調(diào)模式才能開(kāi)啟。

后續(xù)回調(diào)企業(yè)時(shí)都會(huì)在請(qǐng)求URL中帶上以上參數(shù)(echostr除外),校驗(yàn)方式與首次驗(yàn)證URL一致。

根據(jù)上面的說(shuō)明,我們需要獲取這些參數(shù),然后調(diào)用微信提供的消息處理函數(shù)進(jìn)行加解密處理。

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

#region 具體處理邏輯string echoString = HttpContext.Current.Request.QueryString["echoStr"];string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企業(yè)號(hào)的 msg_signaturestring 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

驗(yàn)證代碼部門(mén)如下所示。

/// <summary>/// 驗(yàn)證企業(yè)號(hào)簽名/// </summary>/// <param name="token">企業(yè)號(hào)配置的Token</param>/// <param name="signature">簽名內(nèi)容</param>/// <param name="timestamp">時(shí)間戳</param>/// <param name="nonce">nonce參數(shù)</param>/// <param name="corpId">企業(yè)號(hào)ID標(biāo)識(shí)</param>/// <param name="encodingAESKey">加密鍵</param>/// <param name="echostr">內(nèi)容字符串</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、企業(yè)號(hào)的消息處理

?上面介紹了,微信企業(yè)號(hào)對(duì)URL的驗(yàn)證過(guò)程,還有另外一個(gè)消息處理過(guò)程,就是微信服務(wù)器把消息發(fā)送給我們自己的應(yīng)用服務(wù)器進(jìn)行處理的過(guò)程,我們應(yīng)用服務(wù)器需要在收到消息后,及時(shí)進(jìn)行常規(guī)回復(fù)處理。

也就是下面的代碼邏輯。

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);}}

同樣,我們給微信服務(wù)器回應(yīng)消息的時(shí)候,我們也需要獲得相應(yīng)的參數(shù),然后再行構(gòu)造信息回答。

string echoString = HttpContext.Current.Request.QueryString["echoStr"];string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企業(yè)號(hào)的 msg_signaturestring timestamp = HttpContext.Current.Request.QueryString["timestamp"];string nonce = HttpContext.Current.Request.QueryString["nonce"];

而另外一些參數(shù)信息,則是來(lái)源于我們企業(yè)號(hào)賬號(hào)的配置參數(shù)。

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

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

//根據(jù)參數(shù)信息,初始化微信對(duì)應(yīng)的消息加密解密類WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(CorpToken, AESKey, CorpId);//對(duì)收到的密文進(jìn)行解析處理string sMsg = ""; // 解析之后的明文int flag = wxcpt.DecryptMsg(signature, timestamp, nonce, postStr, ref sMsg);if (flag == 0){//LogTextHelper.Info("記錄解密后的數(shù)據(jù):");//LogTextHelper.Info(sMsg);//記錄解密后的數(shù)據(jù) CorpApiDispatch dispatch = new CorpApiDispatch();string responseContent = dispatch.Execute(sMsg);//加密后并發(fā)送//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("解密消息失敗!");}

最終,我們把解密完成的消息交給對(duì)應(yīng)的封裝類進(jìn)行統(tǒng)一處理就可以了。

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

這樣我們?cè)谄髽I(yè)號(hào)API的封裝,就可以只需要關(guān)注消息如何應(yīng)答的邏輯就可以了,其他的不用關(guān)心。

?

如果對(duì)這個(gè)《C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用》系列感興趣,可以關(guān)注我的其他文章,系列隨筆如下所示:

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(25)-微信企業(yè)號(hào)的客戶端管理功能

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(24)-微信小店貨架信息管理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(23)-微信小店商品管理接口的封裝和測(cè)試

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(22)-微信小店的開(kāi)發(fā)和使用

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(21)-微信企業(yè)號(hào)的消息和事件的接收處理及解密?

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(20)-微信企業(yè)號(hào)的菜單管理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(19)-微信企業(yè)號(hào)的消息發(fā)送(文本、圖片、文件、語(yǔ)音、視頻、圖文消息等)

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(18)-微信企業(yè)號(hào)的通訊錄管理開(kāi)發(fā)之成員管理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(17)-微信企業(yè)號(hào)的通訊錄管理開(kāi)發(fā)之部門(mén)管理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(16)-微信企業(yè)號(hào)的配置和使用

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(15)-微信菜單增加掃一掃、發(fā)圖片、發(fā)地理位置功能

?C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(14)-在微信菜單中采用重定向獲取用戶數(shù)據(jù)

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(13)-使用地理位置擴(kuò)展相關(guān)應(yīng)用

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(12)-使用語(yǔ)音處理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(11)--微信菜單的多種表現(xiàn)方式介紹

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(10)--在管理系統(tǒng)中同步微信用戶分組信息

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(9)-微信門(mén)戶菜單管理及提交到微信服務(wù)器

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(8)-微信門(mén)戶應(yīng)用管理系統(tǒng)功能介紹

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(7)-微信多客服功能及開(kāi)發(fā)集成

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(6)--微信門(mén)戶菜單的管理操作

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(5)--用戶分組信息管理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(3)--文本消息和圖文消息的應(yīng)答

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(2)--微信消息的處理和應(yīng)答

C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(1)--開(kāi)始使用微信接口

本文轉(zhuǎn)自博客園伍華聰?shù)牟┛?#xff0c;原文鏈接:C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(21)-微信企業(yè)號(hào)的消息和事件的接收處理及解密,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原博主。



《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97av在线播放| 涩涩的视频在线观看 | 国产老妇伦国产熟女老妇视频 | 日本jizz在线观看 | 3344成人| 欧美一区二区三区在线观看视频 | 国产精品熟女久久久久久 | 中国videosex高潮hd | 少妇被中出 | 国产情侣久久久久aⅴ免费 caoporn成人 | 亚洲jizzjizz | 中文字幕在线视频一区 | 4438全国成人免费 | 国产激情图片 | 九九av| 中文字幕免费高清在线观看 | 91麻豆成人精品国产免费网站 | 午夜合集| 无遮挡毛片 | 亚洲男人天堂av | 木下凛凛子av一区二区三区 | 美女主播在线观看 | 男人天堂怡红院 | 高清一区在线观看 | 手机看片一区二区 | 国产精品电影在线观看 | 国产一级视频免费观看 | japansexxxxhd医生 夜夜操导航 | 我和单位漂亮少妇激情 | 欧美精品小视频 | 这里只有久久精品 | 男同av在线观看一区二区三区 | 极品美女无套呻吟啪啪 | 日韩特级黄色片 | 亚洲人在线观看 | 国产乱码精品1区2区3区 | 国产一区二区三区影视 | 日美女网站| 热久久国产精品 | 日韩在线一级 | www.99re7.com | 性xxxxbbbb| 波多野结衣在线免费视频 | 久久精品久久久精品美女 | 久久手机免费视频 | av福利在线免费观看 | 国产不卡av在线播放 | 青青青国产在线 | 超碰caopeng | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 亚洲专区在线视频 | 九九视频这里只有精品 | 亚洲女人的天堂 | 亚洲天堂中文在线 | www.com亚洲| 成人午夜在线观看视频 | 中文字幕――色哟哟 | 国产婷婷 | 日韩在线视频一区二区三区 | 色啪网站| 中文字幕一级 | 裸体视频软件 | 欧美乱强伦 | 天天色天天色 | 久久性色av| 日韩一区二区三区四区 | 澳门av网站 | 视频一区二区中文字幕 | 国产粉嫩一区二区三区 | 国产做爰视频免费播放 | 中文国语毛片高清视频 | 国产精品久久久久久久久岛 | 亚洲看看| 丁香五色月 | 天天干天天操天天干 | 成人网入口 | 美女隐私免费 | 亚洲成人精品一区二区 | 亚洲欧美激情精品一区二区 | 国模吧一区二区三区 | 四虎午夜影院 | 丰满少妇乱子伦精品看片 | 欧美女优一区二区 | 精品国产乱码久久久久久影片 | 国产乱淫片视频 | 亚洲国产精品va在线看黑人 | 精品国产视频一区二区 | 欧美一级免费在线 | 蜜桃91丨九色丨蝌蚪91桃色 | 狠狠干青青草 | 肉大榛一进一出免费视频 | 久久乐国产精品 | 久久久久久久久精 | 久草青青草 | 波多野结衣绝顶大高潮 | 国产欧美亚洲精品 | 精品成人| 国产成人一区二区三区视频 | 天堂网在线资源 |