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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

实例:用C#.NET手把手教你做微信公众号开发(10)--事件消息处理之关注公众号(普通关注)

發布時間:2023/12/20 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实例:用C#.NET手把手教你做微信公众号开发(10)--事件消息处理之关注公众号(普通关注) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、事件消息種類

在微信用戶和公眾號產生交互的過程中,用戶的某些操作會使得微信服務器通過事件推送的形式通知到開發者在開發者中心處設置的服務器地址,從而開發者可以獲取到該信息。其中,某些事件推送在發生后,是允許開發者回復用戶的,某些則不允許。先來看看都有哪些類型的事件消息,一共六種:

1 關注/取消關注事件

2 掃描帶參數二維碼事件

3 上報地理位置事件

4 自定義菜單事件

5 點擊菜單拉取消息時的事件推送

6 點擊菜單跳轉鏈接時的事件推送

二、關注事件

本篇講解關注事件如何處理。

用戶在關注與取消關注公眾號時,微信會把這個事件推送到開發者填寫的URL。方便開發者給用戶下發歡迎消息或者做帳號的解綁。為保護用戶數據隱私,開發者收到用戶取消關注事件時需要刪除該用戶的所有信息。

微信服務器在五秒內收不到響應會斷掉連接,并且重新發起請求,總共重試三次。

關于重試的消息排重,推薦使用FromUserName + CreateTime 排重。

假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發起重試。

由于只是演示業務流程,后續內容沒有踢重處理。

關注方式:

一種是普通關注,包括查詢微信號添加、查詢手機號添加、好友推薦添加、搜索公眾號名稱添加、面對面掃描微信個人二維碼添加,微信用戶關注你的公眾號后,微信服務器將給你的服務器推送如下xml內容:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event> </xml>

另一種是掃描帶參數的二維碼關注,主要用于公眾號推廣(可以給每個人、每個應用、每個門店等配置一個二維碼,用途非常的廣泛,后續篇章會給大家演示),微信用戶關注你的公眾號后,微信服務器將給你的服務器推送如下xml內容:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event><EventKey><![CDATA[qrscene_123123]]></EventKey><Ticket><![CDATA[TICKET]]></Ticket> </xml>

?三、代碼實現

為了讓每一篇文章的知識點相對集中,下面只講一種普通關注的事件處理。

這里用到了第(7)篇文章中創建的微信用戶信息表:weixin_user_info

在接收到微信服務器發來的事件之后,首先由指定的接口網頁AccessWx.aspx對事件類型進行判別,然后交給指定的事件處理類處理和回應。在本系列文章第1篇介紹的AccessWx.aspx.cs中開始部分引入命名空間using QinMing.Weixin.EventHandlerSubscribe;

并完善下面處理subscribe這一段,增加本篇給出的關注事件處理環節。 ?
?

else if(MsgType == "event") {string Event = xn.SelectSingleNode("//Event").InnerText;if(Event == "subscribe"){SubscribeEventDeal ued = new SubscribeEventDeal();Response.Write(ued.DealResult(weixinXML)); }else if(Event == "unsubscribe"){}else if(Event == "SCAN"){}else if(Event == "LOCATION"){}else if(Event == "CLICK"){}else if(Event == "VIEW"){}else{}}

在命名空間QinMing.Weixin.EventHandlerSubscribe下新建一個類SubscribeEventDeal,用來處理微信服務器發來的關注事件消息。記得類源碼文件要放在App_Code目錄下!下面是關注事件消息處理源碼:
QinMingWeixinEventHandlerSubscribe.cs文件內容如下:

using System; using System.Web; using System.Xml; using System.Text; using System.Data; using System.Data.SqlClient; using System.IO; using System.Net; using QinMing.Config; //using QinMing.Tools.DB; using QinMing.Weixin.ReturnContent; //using QinMing.WeixinSendTemplateMessage; using QinMing.WeixinUserInfo; //using QinMing.WeixinPayPayment;namespace QinMing.Weixin.EventHandlerSubscribe {//事件消息處理:關注和取消關注public class SubscribeEventDeal :System.Web.UI.Page{public string DealResult(string weixinXML){string content = DealSubscribe(weixinXML); return content;}public string DealSubscribe(string weixinXML){string content1="";string strresponse = "";XmlDocument doc = new XmlDocument();doc.LoadXml(weixinXML);XmlNodeList list = doc.GetElementsByTagName("xml");XmlNode xn = list[0];string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText; //關注用戶的加密后openidstring ToUserName = xn.SelectSingleNode("//ToUserName").InnerText; //公眾微信號原始IDstring MsgType=xn.SelectSingleNode("//MsgType").InnerText;string Event=xn.SelectSingleNode("//Event").InnerText;string EventKey = xn.SelectSingleNode("//EventKey").InnerText;ReturnMsg rm = new ReturnMsg();if(String.IsNullOrEmpty(EventKey)) //常規關注{DealJoin(FromUserName); content1 = "歡迎您:\n\n"+ "[玫瑰]超值優惠券[玫瑰]\n"+ "肯德基、麥當勞、漢堡王、德克士、必勝客、星巴克、Coco、貓眼、美團外賣、餓了么、滴滴等上百家全國知名連鎖商家4折起優惠券,隨時買隨時用,無需加會員和預充值,全國門店通用!\n\n"+ "<a href='https://' >點擊這里購買!</a>"+ "\n\n"+ "<a href='https://' >點擊這里購買!!</a>"+ "\n\n"+ "<a href='https://' >點擊這里購買!!!</a>"+ "\n\n"+ "您也可以通過菜單”超值優惠券“進入購買頁面,總有驚喜在等您哦!";strresponse = rm.ReturnText(FromUserName, ToUserName, content1); //給管理員發送新粉絲關注通知//QinMingWeixinSendTemplateMessage SendTempMsg = new QinMingWeixinSendTemplateMessage();//SendTempMsg.SendTempMsgRemind("管理員openid", "新粉絲關注提醒(來源:普通關注)" + FromUserName, "http://www.yourweb.com/User.aspx?open_id=" + FromUserName); //告知管理員有新粉絲關注} else //掃描帶參數的二維碼關注,一人一碼、一店一碼{/*DealJoin(FromUserName);string tmpEventKey = EventKey.Substring(EventKey.LastIndexOf("_") + 1);if(tmpEventKey == "10") //某個指定的帶參數二維碼scene_id{}else{strresponse = ScanWithQrCodeNew(FromUserName, ToUserName, tmpEventKey); }*/}return strresponse;}//記錄粉絲關注公眾號時的相關信息public void DealJoin(string FromUserName){SqlConnection conn = new SqlConnection(QinMingConfig.DatabaseConnStr);conn.Open();SqlCommand cmd = new SqlCommand();SqlDataReader dr;cmd.Connection = conn;cmd.CommandText = "insert into weixin_join_log (open_id,join_time,remove_flag) values('" + FromUserName + "',getdate(),0)";cmd.ExecuteScalar();cmd.CommandText = "select * from weixin_user_info where open_id ='" + FromUserName + "' ";dr = cmd.ExecuteReader();if(dr.Read()){dr.Close();cmd.CommandText = "update weixin_user_info set remove_flag='已關注' where open_id='" + FromUserName + "'";cmd.ExecuteScalar();//新增粉絲如曾關注過,取關后重新關注的,變更狀態}else{dr.Close();cmd.CommandText = "insert into weixin_user_info (open_id,remove_flag,personal_score,join_time) values('" + FromUserName + "','已關注',0,getdate())";cmd.ExecuteScalar();//新增粉絲如曾未關注過,增加粉絲記錄//微信用戶首次關注公眾號時,發送一個隨機紅包。SendNewUserRedPacket(FromUserName);}if (conn.State == ConnectionState.Open){conn.Close();conn.Dispose();} QinMingWeixinUserInfo wui=new QinMingWeixinUserInfo();wui.UpdateUserInfo(FromUserName); //獲取用戶信息并更新weixin_user_info表}/*給一個新關注公眾號的粉絲發紅包,僅限首次關注,取消關注后再次關注時沒有此紅包*/public void SendNewUserRedPacket(string open_id){/*Random r = new Random();string ran1 = r.Next(1000, 9999).ToString();string ran2 = r.Next(紅包最小金額, 紅包最大金額).ToString();string out_trade_no = QinMingConfig.Weixin_MchId + DateTime.Now.ToString("yyyyMMddHHmmss") + ran1;QinMingWeixinPayPayment.SendRedPackOne("降價聯盟", "新粉福利", open_id, ran2, "新粉關注紅包", "", out_trade_no);*/}} }

上面用到了QinMing.WeixinUserInfo命名控件中的QinMingWeixinUserInfo類,QinMingWeixinUserInfo.cs源碼如下:

using System; using System.Web; using System.Net; using System.IO; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using System.Data; using System.Data.SqlClient; using QinMing.Config; using QinMing.WeixinContainer;namespace QinMing.WeixinUserInfo {public class QinMingWeixinUserInfo : System.Web.UI.Page{/// <summary>/// 根據微信用戶openid,獲取其他詳細信息,并更新用戶表/// </summary>public void UpdateUserInfo(string openid){SqlConnection conn = new SqlConnection(QinMingConfig.DatabaseConnStr);conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;string tmpUserInfo = GetUserInfo(openid);JObject obj = (JObject)JsonConvert.DeserializeObject(HttpUtility.UrlDecode(tmpUserInfo));if(obj["subscribe"].ToString().Replace("\"", "") == "1"){//2021年12月27日起微信方停止提供昵稱和頭像鏈接,只剩下以下信息可以獲取了,想獲取更多內容需要網頁oauth2.o方式cmd.CommandText = "update weixin_user_info set "+ "language='" + obj["language"].ToString().Replace("\"", "") + "',"//+ "unionid='" + obj["unionid"].ToString().Replace("\"", "") + "',"+ "remark='" + obj["remark"].ToString().Replace("\"", "") + "',"+ "groupid=" + obj["groupid"].ToString().Replace("\"", "") + ","//+ "tagid_list='" + obj["tagid_list"].ToString().Replace("\"", "") + "',"+ "subscribe_scene='" + obj["subscribe_scene"].ToString().Replace("\"", "") + "',"+ "qr_scene=" + obj["qr_scene"].ToString().Replace("\"", "") + ","+ "qr_scene_str='" + obj["qr_scene_str"].ToString().Replace("\"", "") + "'"+ " where open_id='" + openid + "'" ;cmd.ExecuteScalar();}if (conn.State == ConnectionState.Open){conn.Close();conn.Dispose();}}/// <summary>/// 根據微信用戶openid,獲取其他詳細信息/// </summary>public string GetUserInfo(string openid) {string strResult;string accesstoken;QinMingWeixinContainer gt=new QinMingWeixinContainer();accesstoken=gt.GetAccessToken();string strurl="https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + accesstoken + "&openid=" + openid + "&lang=zh_CN";try{HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strurl);HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();Stream myStream = HttpWResp.GetResponseStream();StreamReader sr = new StreamReader(myStream, Encoding.UTF8);StringBuilder strBuilder = new StringBuilder();while (-1 != sr.Peek()){strBuilder.Append(sr.ReadLine());}strResult = strBuilder.ToString();}catch{strResult = "err";}return strResult;}} }

新用到的數據庫表創建語句如下:

--用戶關注記錄表 CREATE TABLE weixin_join_log (open_id nvarchar(40), --公眾號內微信用戶唯一編碼join_time datetime, --關注時間remove_flag int --取消關注標志 )

四、演示結果

來感受一下新用戶關注的應用之一,微信掃描頁面左側二維碼驚喜立即兌現。

?關注后的結果如下:

總結

以上是生活随笔為你收集整理的实例:用C#.NET手把手教你做微信公众号开发(10)--事件消息处理之关注公众号(普通关注)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。