前言
模板消息僅用于公眾號(hào)向用戶發(fā)送重要的服務(wù)通知,只能用于符合其要求的服務(wù)場(chǎng)景中,如信用卡刷卡通知,商品購買成功通知等。不支持廣告等營(yíng)銷類消息以及其它所有可能對(duì)用戶造成騷擾的消息。具體模板消息運(yùn)營(yíng)規(guī)則請(qǐng)讀 模板消息運(yùn)營(yíng)規(guī)范
關(guān)于使用規(guī)則,請(qǐng)注意:
1、所有服務(wù)號(hào)都可以在功能->添加功能插件處看到申請(qǐng)模板消息功能的入口,但只有認(rèn)證后的服務(wù)號(hào)才可以申請(qǐng)模板消息的使用權(quán)限并獲得該權(quán)限; 2、需要選擇公眾賬號(hào)服務(wù)所處的2個(gè)行業(yè),每月可更改1次所選行業(yè); 3、在所選擇行業(yè)的模板庫中選用已有的模板進(jìn)行調(diào)用; 4、每個(gè)賬號(hào)可以同時(shí)使用15個(gè)模板。 5、當(dāng)前每個(gè)賬號(hào)的模板消息的日調(diào)用上限為10萬次,單個(gè)模板沒有特殊限制。【2014年11月18日將接口調(diào)用頻率從默認(rèn)的日1萬次提升為日10萬次,可在MP登錄后的開發(fā)者中心查看】。當(dāng)賬號(hào)粉絲數(shù)超過10W/100W/1000W時(shí),模板消息的日調(diào)用上限會(huì)相應(yīng)提升,以公眾號(hào)MP后臺(tái)開發(fā)者中心頁面中標(biāo)明的數(shù)字為準(zhǔn)。
關(guān)于接口文檔,請(qǐng)注意:
1、模板消息調(diào)用時(shí)主要需要模板ID和模板中各參數(shù)的賦值內(nèi)容; 2、模板中參數(shù)內(nèi)容必須以".DATA"結(jié)尾,否則視為保留字; 3、模板保留符號(hào)"{{ }}"。 一、首先我們要在公眾號(hào)里面添加我們所需要用到的模板,先假設(shè)您已經(jīng)在MP中設(shè)置好了所屬行業(yè);
二、然后我們要定義一些請(qǐng)求模板消息時(shí)所要使用的實(shí)體類
1 /// <summary> 2 /// 公眾號(hào)模板消息 3 /// </summary> 4 public class TemplateMessage 5 { 6 public TemplateMessage() 7 { 8 topcolor = "#FF0000"; 9 } 10 /// <summary> 11 /// 接收者微信OpenId 12 /// </summary> 13 public string touser { get; set; } 14 /// <summary> 15 /// 模板Id 16 /// </summary> 17 public string template_id { get; set; } 18 /// <summary> 19 /// 跳轉(zhuǎn)url 20 /// </summary> 21 public string url { get; set; } 22 /// <summary> 23 /// 頂部顏色 24 /// </summary> 25 public string topcolor { get; set; } 26 /// <summary> 27 /// 具體模板數(shù)據(jù) 28 /// </summary> 29 public object data { get; set; } 30 }
數(shù)據(jù)項(xiàng)data:
public class TemplateDataItem { /// <summary> /// 項(xiàng)目值 /// </summary> public string value { get; set; } /// <summary> /// 16進(jìn)制顏色代碼,如:#FF0000 /// </summary> public string color { get; set; } /// <summary> /// /// </summary> /// <param name="v">value</param> /// <param name="c">color</param> public TemplateDataItem(string v, string c = "#173177") { value = v; color = c; } }
這里就是我們上面在公眾號(hào)中添加的一些模板:
public class MessageTemplate { /// <summary> /// 領(lǐng)取通知消息模板(優(yōu)惠券領(lǐng)取成功通知) /// </summary> /// <param name="first">通知標(biāo)題</param> /// <param name="keyword1">券名稱</param> /// <param name="keyword2">來源商家</param> /// <param name="keyword3">過期時(shí)間</param> /// <param name="keyword4">使用說明</param> /// <param name="remark">備注</param> /// <returns></returns> public static object NoticeTemplate(string first, string keyword1, string keyword2, string keyword3, string keyword4, string remark) { var data = new { first = new TemplateDataItem(first, "#3990eb"), keyword1 = new TemplateDataItem(keyword1, "#feb91a"), keyword2 = new TemplateDataItem(keyword2, "#feb91a"), keyword3 = new TemplateDataItem(keyword3, "#feb91a"), keyword4 = new TemplateDataItem(keyword4, "#000000"), remark = new TemplateDataItem(remark, "#fe5627") }; return data; } /// <summary> /// (訂單支付成功)消息模板---->>面向消費(fèi)者 /// </summary> /// <param name="first">標(biāo)題</param> /// <param name="orderMoneySum">支付金額</param> /// <param name="orderProductName">商品信息</param> /// <param name="Remark">備注</param> /// <returns></returns> public static object NoticeOrderPaySuccess(string first, string orderMoneySum, string orderProductName, string Remark) { var data = new { first = new TemplateDataItem(first, "#3990eb"), orderMoneySum = new TemplateDataItem(orderMoneySum, "#feb91a"), orderProductName = new TemplateDataItem(orderProductName, "#feb91a"), Remark = new TemplateDataItem(Remark, "#fe5627") }; return data; } /// <summary> /// (新訂單通知)消息模板---->>面向商家 /// </summary> /// <param name="first">消息標(biāo)題</param> /// <param name="keyword1">下單時(shí)間</param> /// <param name="keyword2">配送地址</param> /// <param name="keyword3">訂單金額</param> /// <param name="keyword4">訂單備注</param> /// <param name="remark"></param> /// <returns></returns> public static object NoticeOrderPaySuccess(string first, string keyword1, string keyword2, string keyword3, string keyword4, string remark) { var data = new { first = new TemplateDataItem(first, "#3990eb"), keyword1 = new TemplateDataItem(keyword1, "#feb91a"), keyword2 = new TemplateDataItem(keyword2, "#feb91a"), keyword3 = new TemplateDataItem(keyword3, "#feb91a"), keyword4 = new TemplateDataItem(keyword4, "#000000"), remark = new TemplateDataItem(remark, "#fe5627") }; return data; } }
還有一個(gè)消息發(fā)送之后微信返回碼的一個(gè)實(shí)體:
/// <summary> /// JSON返回結(jié)果(用于微信響應(yīng)接口等) /// </summary> public class WxJsonResult { public ReturnCode errcode { get; set; } public string errmsg { get; set; } }
/// <summary> /// 發(fā)送模板消息結(jié)果 /// </summary> public class TemplateMessageResult:WxJsonResult { /// <summary> /// msgid /// </summary> public int msgid { get; set; } }
三、所有實(shí)體建好之后我們就需要去寫發(fā)送模板消息的服務(wù)了;
1 public class SendTemplateMessageService 2 { 3 /// <summary> 4 /// 公眾號(hào)相關(guān)信息 5 /// </summary> 6 private const string AppId = "wxdcabc123456xyz"; 7 private const string AppSecret = "086323crd33xd23gc524fd93428b4ed9"; 8 /// <summary> 9 /// 發(fā)送模板消息API 10 /// </summary> 11 private const string SendMessageApi = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}"; 12 /// <summary> 13 /// 獲取用信息API 14 /// </summary> 15 private const string GetBaseUserInfoApi = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}?=zh_CN"; 16 /// <summary> 17 /// 公眾號(hào)發(fā)送模板消息方法 18 /// </summary> 19 /// <param name="appId"></param> 20 /// <param name="appSecret"></param> 21 /// <param name="templateId">模板ID</param> 22 /// <param name="openId">微信openId</param> 23 /// <param name="url">點(diǎn)擊詳情跳轉(zhuǎn)路徑</param> 24 /// <param name="data"></param> 25 public static void SendTemplateMessage(string templateId, string openId, string url, object data) 26 { 27 var accessToken = AccessTokenContainer.TryGetToken(AppId,AppSecret); 28 var getInfoUrl = string.Format(GetBaseUserInfoApi, accessToken, openId); 29 var userInfo = HttpClientHelper.GetResponse<WeixinUserInfoResult>(getInfoUrl); 30 //判斷用戶是否關(guān)注公眾號(hào) 31 switch (userInfo.subscribe) 32 { 33 case 0: 34 break; 35 default: 36 var sendUrl = string.Format(SendMessageApi, accessToken); 37 var msg = new TemplateMessage 38 { 39 template_id = templateId, 40 touser = openId, 41 url = url, 42 data = data 43 }; 44 //序列化實(shí)體為json 45 string json = JsonConvert.SerializeObject(msg, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 46 47 //調(diào)用消息發(fā)送接口 48 var result = HttpClientHelper.PostResponse<TemplateMessageResult>(string.Format(sendUrl, accessToken), json); 49 LoggerHelper.Log(string.Format("【微信公眾號(hào)發(fā)送模板消息接口調(diào)用】返回參數(shù):errcode:{0},erromsg:{1},misgid:{2}", result.errcode, result.errmsg, result.msgid)); 50 break; 51 } 52 } 53 }
四、最后一步就是調(diào)用我們上面的這個(gè)方法發(fā)送模板消息了
//判斷是否是在微信瀏覽器中 if (isWechat) { var url = "http://m.xdd.wquan.cn/findcp"; var endDate = "2015年08月20日"; var first = string.Format("恭喜您,獲得了100元現(xiàn)金抵用券"); var keyword4 = StrUtil.HtmlDiscode(ecList.ECouponDetail.Usage); var remark = "點(diǎn)擊“詳情”查看優(yōu)惠券,歡迎再次使用享叮當(dāng)!"; //得到所需要的模板數(shù)據(jù) var data = MessageTemplate.NoticeTemplate(first, ecList.ProductName, ecList.CorpName, endDate, keyword4, remark); //調(diào)用發(fā)送模板消息的方法,模板Id存儲(chǔ)在config中 SendTemplateMessageService.SendTemplateMessage(noticeTemplateId, oAuthAccessTokenResult.openid, url, data); }
最后來看一下效果:
微信模板消息其實(shí)就這么簡(jiǎn)單!