实例:用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這一段,增加本篇給出的關注事件處理環節。 ?
?
在命名空間QinMing.Weixin.EventHandlerSubscribe下新建一個類SubscribeEventDeal,用來處理微信服務器發來的關注事件消息。記得類源碼文件要放在App_Code目錄下!下面是關注事件消息處理源碼:
QinMingWeixinEventHandlerSubscribe.cs文件內容如下:
上面用到了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)--事件消息处理之关注公众号(普通关注)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: left join on多条件深度理解
- 下一篇: java -- Big Endian a