ASP.NET实现微信功能(2)(服务号高级群发)
前面寫了一篇文章,關于微信的:http://www.cnblogs.com/kmsfan/p/4047097.html
今天打算來寫本系列的第二批文章,服務號后臺群發。
在寫本篇文章之前,我們先來看看騰訊的后臺群發是怎么實現的,因為我們無論做什么事情都要知道原理。開始吧。
由于本人的奉獻精神,等下回把實現源碼的框架全部公開,里面什么東西都有,由于自己才識淺薄,只弄了圖文消息的群發,那么今天只會介紹圖文消息的群發。
框架的源碼文章最后會提到,這本來是一個開源的框架,經過一些大神的二次修改而更加的完善。
由于可以群發多條消息,那么我們今天就來說說服務號的后臺群發(多篇文章)。
我們來分析一下,上面的圖 :標題,封面,正文,這3項在微信里填寫是必須的,也就是說,我們如果要從后臺C#去推送消息,那么這3項肯定也是必須的。
但是夠了嗎?不夠,我們群發可以根據組去群發,也可以對所有人群發,對吧?
那么這里的人,就是我們的粉絲,每個粉絲在微信里有一個唯一的東西,那就是ID,我們需要獲得那些要推送的人的IDS,那樣才可以發送。
另外跟大家說一下,微信的接口調用每天是100次,但是群發一周是一次,也就是說,如果你群發成功了多次,也只會以第一次的群發的消息為準。
好了,做了這么多的準備工作,大家也有點迫不及待了吧?!那我們就開始研究代碼吧。
我用的是一個開源的微信框架,其中的EXTENSION是某位大神寫的,我們這次只研究群發功能SendNews.因為我自己只做了群發。
其中填寫APPID 和APPSECRET的地方在REQUEST下的AccessTokenGetRequest.cs文件里,大家可以把這些寫在配置文件里哦
我們先來研究一下這個SendUser方法,首先我們需要明白的一點是這下面的幾個參數的含義,
1.data :就是你要傳遞的圖文消息的集合,這個稍后會提到。
2.userIDList:粉絲的ID。
3.msgType:是否圖文消息
4.accesstoken,這個是憑證,不用我多說了,
5.impclient:框架自帶的東西,具體的我沒研究,大家有興趣的自己去研究
大家看過官方的文檔的都知道,其實我們是向那個調用的接口發送一段規定格式的XML。
那么下面也基本上是拼接好規定格式的字符串。
其中大家注意到了一個東西,那就是media_Id,這個東西怎么獲得呢?
這個東西其實就是我們上傳的封面圖片之后,然后服務器返回給我們的ID,這個ID是必須的。
private static string accessToken;private static IMpClient mpClient;public static string SendUser(object data, List<string> UserIDList, bool msgType, string accessToken, IMpClient mpClient){SendNews.accessToken = accessToken;SendNews.mpClient = mpClient;StringBuilder postData = new StringBuilder("{");postData.AppendFormat("\"touser\":{0},", JsonConvert.SerializeObject(UserIDList));if (msgType){var msgId = UpdateNews(data as List<Model.NewsList>);if (string.IsNullOrEmpty(msgId)) { return "-1"; }postData.Append(" \"mpnews\":{ \"media_id\":\"" + msgId + "\"},\"msgtype\":\"mpnews\"");}else{postData.Append("\"msgtype\": \"text\",\"text\": { \"content\":\"" + data.ToString() + "\"}}");}var rdata = HttpHelper.Example.GetWebData(new BrowserPara(){Uri = string.Format("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}", accessToken),PostData = postData.ToString()});return !HasError(rdata) ? Tools.GetJosnValue(rdata, "errcode") : "-1";}下面我們來看一下這個updateNews 方法,然后我再帶大家看看實體類,就是這個newsList.
下面是實體類
其中有幾點大家要注意:
1.NID:就是點擊微信文章進去后的超鏈接地址,就相當于你要建立一個Preview頁面,這個頁面是任何人可以訪問的,然后這個頁面帶的ID不同,顯示不同的文章。
2.CoverImage:這個是封面圖片的地址,注意:微信只接受 本地圖片,不接受IIS地址,所以你先要把IIS上的文件下載到本地,然后再從本地上傳。
3.其他的沒注釋掉的,是不能刪除的,否則會報空指針異常,比如SUMMARY,大家可以 根據需求酌情修改。
namespace Model {using System;using System.Collections.Generic;public partial class NewsList{public string NID { get; set; }public string Title { get; set; }public string CoverImage { get; set; }public string NContent { get; set; }public string Summary { get; set; }// public int nType { get; set; }// public bool Marking { get; set; }public System.DateTime AddTime { get; set; }//public bool isDel { get; set; } } }下面是UpdateNews方法。大家看看就好,反正就是從object data里,也就是newsList里面遍歷數據。
#region 2.0 上傳圖文新聞 static string UpdateNews(List<Model.ViewModel.NewsListEditModel> newsList)/// <summary>/// 上傳圖文新聞/// </summary>/// <param name="newsList"></param>/// <returns></returns>public static string UpdateNews(List<Model.NewsList> newsList){StringBuilder postData = new StringBuilder(512);for (int i = 0; i < newsList.Count; i++){UploadMediaRequest request = new UploadMediaRequest(){AccessToken = accessToken,Type = "image",FileName = newsList[i].CoverImage};UploadMediaResponse response = mpClient.Execute(request);if (!response.IsError){newsList[i].CoverImage = response.MediaId;}else{return string.Empty;}}postData.Append("{\"articles\": [");for (int j = 0; j < newsList.Count; j++){postData.Append("{");postData.AppendFormat(" \"thumb_media_id\":\"{0}\",", newsList[j].CoverImage);postData.AppendFormat(" \"title\":\"{0}\",", newsList[j].Title.Replace("\"", "“").Replace("'", "‘"));postData.AppendFormat(" \"content_source_url\":\"{0}\",", newsList[j].NID);postData.AppendFormat(" \"content\":\"{0}\",", newsList[j].Summary.Replace("\"", "“").Replace("'", "‘"));postData.AppendFormat(" \"digest\":\"{0}\",", newsList[j].Summary.Replace("\"", "“").Replace("'", "‘"));postData.Append(j == newsList.Count - 1 ? "\"show_cover_pic\":\"1\"}" : "\"show_cover_pic\":\"1\"},");}postData.Append("]}");var rdata = HttpHelper.Example.GetWebData(new BrowserPara(){Uri = string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", accessToken),PostData = postData.ToString()});return !HasError(rdata) ? Tools.GetJosnValue(rdata, "media_id") : string.Empty;}?
下面最后再來介紹一下調用,如果你是4.0的框架,可以不用往下面看了,因為下面的是基于4.0以下的框架的調用方法。
我這里用的是WebService去調用,因為網站是2.0的,而框架是4.0的。
首先第一步,我們必須引用這個項目,我為了方便,引用的是解決方案,大家如果要發布的話,會自動生成DLL文件的,這個不必擔心。
?
下面的是方法,如果ReturnVal最后的值是0的話,恭喜你,操作成功!
方法是先得到關注者的IDS,然后遍歷List,把數據填充到List里面去,如果 你的opeNID能取到所有關注者的IDS那么就成功了。
[WebMethod(Description = "處理微信群發功能", EnableSession = true)]public string ProcessWeiXinGroupPush(){JavaScriptSerializer serializer = new JavaScriptSerializer();SysBaseTag sysbase = new SysBaseTag();string temp = "";Mobile_msg msg = new Mobile_msg();sysbase.data = new List<object>();//得到關注著的IDLIST;var idlist = new List<string>();//得到關注著的IDSvar uidRequest = new GetAttentionsRequest() { AccessToken=OperateContextMP.Current.GetAccessToken.AccessToken.AccessToken};var createResponse = OperateContextMP.Current.MpClient.Execute(uidRequest);if (createResponse.IsError){}else{idlist = createResponse.Attentions.data.opeNID;}try{string sql = "select * from cms_core_content a,CMS_EXT_NEWS b,CMS_WECHAT c where a.ID=b.ID and c.newsid=b.ID and c.datetime='" + DateTime.Now.ToShortDateString().Substring(0,10) + "'";DataSet ds = DBHelperSQL.Query(sql, DBHelperSQL.GetDBString(), 2);List<NewsList> list = new List<NewsList>();foreach (DataRow Row in ds.Tables[0].Rows){NewsList nlist = new NewsList();DownloadToLocal(Row["jumpurl"].ToString()); //下載文件到本地string coverImg = "D:\\test\\" + Row["jumpurl"].ToString().Substring(Row["jumpurl"].ToString().LastIndexOf("/") + 1);// string mapPath = "http://localhost/"nlist.Title = Row["title"].ToString();nlist.NContent = Row["text"].ToString();nlist.NID = Row["id"].ToString();nlist.CoverImage = coverImg;// nlist.summary = "測試推送"; //暫時先這么寫nlist.Summary = Row["title"].ToString(); //描述:必填項 list.Add(nlist);sysbase.data.Add(nlist);}sysbase.message = "成功";sysbase.result = true;sysbase.count = sysbase.data.Count;//從數據庫中獲取圖文消息并添加var newsList = new List<NewsList>();string returnVal = SendNews.SendUser(list, idlist, true, OperateContextMP.Current.GetAccessToken.AccessToken.AccessToken, OperateContextMP.Current.MpClient);temp = returnVal;}catch (Exception e){sysbase.message = e.Message;sysbase.result = false;sysbase.count = 0;}//return serializer.Serialize(sysbase);return temp;}?
大家還要注意下,封面必須下載到本地,這里我的圖片本來是在IIS中的,建議封面圖片專門用一個字段去存儲。
//下載服務器上的封面文件保存到本地機器上。public void DownloadToLocal(string filePath){string filePath_ = ConfigurationManager.AppSettings["basicIP"] + filePath;//在D盤新建一個TEST目錄WebClient wc = new WebClient();string path = @"D:\WX_ESP_PIC";if (!Directory.Exists(path)){Directory.CreateDirectory(path);}wc.DownloadFile(filePath_, path+"\\"+filePath_.Substring(filePath_.LastIndexOf("/")));}好了,說了這么多,下面的是框架源碼。
大家拿去用就是的了。
http://pan.baidu.com/s/1c0Chn3a?
提取碼:peye
?
轉載于:https://www.cnblogs.com/kmsfan/p/4058227.html
總結
以上是生活随笔為你收集整理的ASP.NET实现微信功能(2)(服务号高级群发)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web页面 float定位导致“溢出现象
- 下一篇: 一款纯css3实现的响应式导航