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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)

發布時間:2024/3/7 asp.net 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?這次我們來一起研究一下“客服消息”,首先明確一下“客服消息”的概念。這不同于之前的“被動響應消息”,也就是說并不是之前“你一言我一語的即時響應”,可能在某種情況下你需要給不同的人主動發送消息,例如你的餐館推出了新的川菜,那么你需要給喜歡川菜的人發送消息,而并不是等著被人發送“有什么新菜”后,然后反饋給客戶,我推出了什么什么的。


? ? ? ?說道這里可能有人會問,那不是群發嗎?微信不是每天只能發一條嗎?服務號每個月發一條嗎?答案很明確微信說的是“客服消息”,也不是群發,它跟群發的區別就在于只要關注了我,那么我就可以群發給你消息,而為了不讓用戶感到討厭,微信作了嚴格的群發條數限制。而“客服消息”則是只有關注你的人向你發送了消息,你才能主動推送。就像打電話只有人家問過你問題了,你才能回答,并且繼續跟進回答。再舉一個例子:你通過被人知道了我的手機號,存下來了,你突然給我打電話,我肯定是抵觸的。但是如果我給你打過電話,你通過來電顯示知道了我的號碼,以后再給我打電話,說明我們是認識的,我最少不會抵觸。這就使群發/被動響應/客服消息的本質區別。


? ? ? ?就像我們可以通過收集電話號碼,手機自己的客戶信息一樣,一旦他們的信息被我們收錄。那么我們就可以突破群發條數的限制了,按照微信的限制群發一個月只能一條(服務號),但是“客服消息”則可以一天50000條,足夠用了。


? ? ? ?下面的問題就是如何手機客戶的“手機號”了,微信里面有一個OPENID,這就使手機號了,這個是關注你的用戶的唯一標識,這個標識是不會變的,但是同一個用戶關注不同的微信號,那么他在不同微信號中的ID是不一樣的。如何取得OPENID呢?


? ? ? ?網上找了些資料,有的說的的確是錯誤的,有的還說要通過OAuth 2.0授權才可以,這個的確可以,但是太復雜了吧,通過我的測試得出了這樣的結論“只要用戶和你的公共微信好發生交互”就可以取得他的OPENID了。就如同打電話一樣,只要用戶給你打了電話,你一定知道他的電話了。在微信里是這樣的:用戶只要發信息給你,或者點了某個菜單,發過來的信息都會有一個“FromUserName”,這個就使OPENID了。我們可以建立一個數據庫來收集這些寶貴的用戶身份信息,也就是記錄他的“電話號碼”,有了電話號碼,我們就可以以后經常與客戶主動打電話了。我做這樣的一個實驗:


? ? ? ?首先記錄用戶的OPENID在OnLoad函數第二行里面加上一個 WriteLog(wx.FromUserName);把它記錄在一個文本文件中

protected void Page_Load(object sender, EventArgs e){wxmessage wx = GetWxMessage();WriteLog(wx.FromUserName);string res = "";if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe"){string content = "";if (!wx.EventKey.Contains("qrscene_")){content = "/:rose歡迎北京永杰友信科技有限公司/:rose\n直接回復“你好”";res = sendTextMessage(wx, content);}else{content = "二維碼參數:\n" + wx.EventKey.Replace("qrscene_", "");res = sendTextMessage(wx, content);}}else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.ToLower() == "scan"){string str = "二維碼參數:\n" + wx.EventKey;res = sendTextMessage(wx, str);}else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK"){if(wx.EventKey=="HELLO")res = sendTextMessage(wx, "你好,歡迎使用北京永杰友信科技有限公司公共微信平臺!");}else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "LOCATION"){res = sendTextMessage(wx, "您的位置是經度:" + wx.Latitude + ",維度是:" + wx.Longitude+",地理經度為:"+wx.Precision);}else{if (wx.MsgType == "text" && wx.Content == "你好"){res = sendTextMessage(wx, "你好,歡迎使用北京永杰友信科技有限公司公共微信平臺!");}else if (wx.MsgType == "voice"){res = sendTextMessage(wx, wx.Recognition);}else if (wx.MsgType == "location"){res = sendTextMessage(wx, "您發送的位置是:" + wx.Label + ";緯度是:" + wx.Location_X + ";經度是:" + wx.Location_Y + ";縮放比例為:" + wx.Scale);}else{res = sendTextMessage(wx, "你好,未能識別消息!");}}Response.Write(res);} WriteLog的方法是這樣的:

/// <summary>/// 寫日志(用于跟蹤)/// </summary>private void WriteLog(string strMemo){string filename = Server.MapPath("/logs/log.txt");if (!Directory.Exists(Server.MapPath("//logs//")))Directory.CreateDirectory("//logs//");StreamWriter sr = null;try{if (!File.Exists(filename)){sr = File.CreateText(filename);}else{sr = File.AppendText(filename);}sr.WriteLine(strMemo);}catch{}finally{if (sr != null)sr.Close();}} ? ? ? ? 這樣當客戶發送任何一種信息給微信公共號,我們的log.txt文件中就會記錄這個OPENID,我先打開Log.txt這個文件看看OPENID號,我的事這樣的“oV93gjl5slD3p29yS1dOijy-pqZ8”,有了這個OPENID很多事情就都好辦了,以后我們還會介紹如何獲取客戶的信息。這里先說“客戶消息”吧。

? ? ? ? 下面我們建立一個新的ASPX頁面,在這個頁面里面我就可以給這些用戶發信息了。這個頁面(SendMessage.aspx.cs)很簡單就使兩個文本框和一個按鈕:

string MyOpenID;string MyContent;protected void Page_Load(object sender, EventArgs e){MyOpenID = "oV93gjl5slD3p29yS1dOijy-pqZ8";MyContent = "這是一個客服消息";UserName.Text = MyOpenID;Content.Text = MyContent;}protected void Button1_Click(object sender, EventArgs e){string res = "";string Access_Token = IsExistAccess_Token();string posturl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + Access_Token;string postData = "{\"touser\":\"" + UserName.Text + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + Content.Text + "\"}}";res = GetPage(posturl, postData);Response.Write(res);} ? ? ? ?中間還用到了之前提到的3個函數:

public string GetPage(string posturl, string postData){Stream outstream = null;Stream instream = null;StreamReader sr = null;HttpWebResponse response = null;HttpWebRequest request = null;Encoding encoding = Encoding.UTF8;byte[] data = encoding.GetBytes(postData);// 準備請求...try{// 設置參數request = WebRequest.Create(posturl) as HttpWebRequest;CookieContainer cookieContainer = new CookieContainer();request.CookieContainer = cookieContainer;request.AllowAutoRedirect = true;request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.ContentLength = data.Length;outstream = request.GetRequestStream();outstream.Write(data, 0, data.Length);outstream.Close();//發送請求并獲取相應回應數據response = request.GetResponse() as HttpWebResponse;//直到request.GetResponse()程序才開始向目標網頁發送Post請求instream = response.GetResponseStream();sr = new StreamReader(instream, encoding);//返回結果網頁(html)代碼string content = sr.ReadToEnd();string err = string.Empty;return content;}catch (Exception ex){string err = ex.Message;Response.Write(err);return string.Empty;}}/// <summary>/// 根據當前日期 判斷Access_Token 是否超期 如果超期返回新的Access_Token 否則返回之前的Access_Token/// </summary>/// <param name="datetime"></param>/// <returns></returns>public static string IsExistAccess_Token(){string Token = string.Empty;DateTime YouXRQ;// 讀取XML文件中的數據,并顯示出來 ,注意文件路徑string filepath = HttpContext.Current.Server.MapPath("XMLFile.xml");StreamReader str = new StreamReader(filepath, System.Text.Encoding.UTF8);XmlDocument xml = new XmlDocument();xml.Load(str);str.Close();str.Dispose();Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText;YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText);if (DateTime.Now > YouXRQ){DateTime _youxrq = DateTime.Now;Access_token mode = GetAccess_token();xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token;_youxrq = _youxrq.AddSeconds(int.Parse(mode.expires_in));xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString();xml.Save(filepath);Token = mode.access_token;}return Token;}public static Access_token GetAccess_token(){string appid = "wx043225275885dafd";string secret = "cb4425b24ab79ef875029cf0bf326ae9";string strUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;Access_token mode = new Access_token();HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);req.Method = "GET";using (WebResponse wr = req.GetResponse()){HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);string content = reader.ReadToEnd();//Response.Write(content);//在這里對Access_token 賦值Access_token token = new Access_token();token = JsonHelper.ParseFromJson<Access_token>(content);mode.access_token = token.access_token;mode.expires_in = token.expires_in;}return mode;}

? ? ? ? 這個頁面就是這些了,打開這個頁面然后發送消息試試?很不錯吧,這樣在配合上我們的數據庫啦,什么循環了,就可以突破了微信群發的限制,做到定項的群發消息推送了!這里面能發很多種消息:文本,語音,視頻,圖文,圖片等等。只是Json而已,聰明的你一定可以舉一反三的。




總結

以上是生活随笔為你收集整理的微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)的全部內容,希望文章能夠幫你解決所遇到的問題。

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