C#公眾平臺(二)—— 接收事件推送之關注回撥
阿新 • • 發佈:2018-12-11
在C#公眾平臺(一)—— 接入配置 寫了公眾平臺的基本配置,這篇文章講的是關注回撥事件。
基礎幫助類
接收事件推送文件
接入指南
/// <summary> /// WeChatEvent 的摘要說明 /// </summary> public class WeChatEvent : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.Request.HttpMethod.ToUpper() == "POST") { Message message = new Message(); WxPayData data = message.GetMessageData(context); string msgType = data.GetValue("MsgType").ToString(); //這裡進行判斷MsgType switch (msgType) { case "text": //SendToWx = WxText.GetWxTextXml(postString); break; case "image": //SendToWx = WxImage.GetWxImageXml(postString); break; case "voice": break; case "video": break; case "shortvideo": break; case "location": break; case "link": break; case "event": string eventType = data.GetValue("Event").ToString(); switch (eventType) { case "subscribe": //使用者未關注的情況下KEY值: qrscene_為字首,後面為二維碼的引數值 string eventKey = data.GetValue("EventKey").ToString(); if (!string.IsNullOrEmpty(eventKey)) { //獲取二維碼的分銷商ID int CusID = CInt(eventKey.Substring(eventKey.IndexOf("qrscene_") + 8)); //記錄OPENID string openID = data.GetValue("FromUserName").ToString(); //根據OPENID獲取UnionID WCQRCode WCQRCode = new WCQRCode(); string access_token = string.Empty; if (string.IsNullOrWhiteSpace(Config.SubscriptionAppID)) { access_token = WCQRCode.GetJSAPIAccessToken(Config.AppID, Config.AppSecret); } else { access_token = WCQRCode.GetJSAPIAccessToken(Config.SubscriptionAppID, Config.SubscriptionAppSecret); } WxPayData userInfo = WCQRCode.GetUserInfo(access_token, openID); string unionid = string.Empty; //是否使用了微信企業模式,使用了就會有unionid if (userInfo.IsSet("unionid")) { unionid = userInfo.GetValue("unionid").ToString(); } //判斷是否存在,記錄到資料庫 WeChatSubscribeDAO dao = new WeChatSubscribeDAO(); bool isExists = dao.Exists(openID); if (!isExists) { //存入資料庫 } } break; case "unsubscribe": break; case "SCAN": break; case "LOCATION": break; case "CLICK": break; case "VIEW": break; default: break; } break; default: //result = "沒有識別的型別訊息:" + xmlElement.SelectSingleNode("MsgType").InnerText; //WriteLog(result); break; } } else if (context.Request.HttpMethod.ToUpper() == "GET") { string token = Config.Token;//從配置檔案獲取Token if (string.IsNullOrEmpty(token)) { //寫到日誌檔案 LogUtil.WriteLog("微信Token配置項沒有配置!"); } // 微信加密簽名 String signature = context.Request["signature"]; // 時間戳 String timestamp = context.Request["timestamp"]; // 隨機數 String nonce = context.Request["nonce"]; // 隨機字串 String echostr = context.Request["echostr"]; Message message = new Message(); // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗 if (message.DockingCheckSignature(token, timestamp, nonce, signature)) { context.Response.Write(echostr); } else { context.Response.Write("error"); } } } public static Int32 CInt(Object obj) { return (int)CDec(obj); } public static Decimal CDec(Object obj) { if (null == obj || DBNull.Value == obj) { return 0; } String s = obj.ToString(); //if (String.IsNullOrEmpty(s)) //{ // return 0; //} Decimal r = 0; //if ( IsNumber(s)) //{ // r = Decimal.Parse(s); //} //else //{ // r = 0; //} //try //{ //r = Decimal.Parse(s); bool ok = decimal.TryParse(s, out r); // if(ok == false){ // r = 0; // } //} //catch //{ // r = 0; //} return r; } public bool IsReusable { get { return false; } } }
當是Get的時候就是伺服器和微信握手,這個看下接入指南就清楚了,就是驗證下signature合不合法就行,合法了就把echostr返回去就是握手成功,反之失敗。
當時Post的時候就是公眾號發生事件了,這裡只處理了關注回撥,這裡掃描的是帶引數的二維碼 所以會多一串內容,這內容存的就是具體引數,根據這個二維碼存的引數,去進行下一步的處理,比如將掃碼的使用者和這個二維碼去繫結之類的,這個根據具體邏輯而定了。