前言
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。具体模板消息运营规则请读 模板消息运营规范
关于使用规则,请注意:
1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
2、需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
3、在所选择行业的模板库中选用已有的模板进行调用;
4、每个账号可以同时使用15个模板。
5、当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。
关于接口文档,请注意:
1、模板消息调用时主要需要模板ID和模板中各参数的赋值内容;
2、模板中参数内容必须以".DATA"结尾,否则视为保留字;
3、模板保留符号"{{ }}"。
一、首先我们要在公众号里面添加我们所需要用到的模板,先假设您已经在MP中设置好了所属行业;
二、然后我们要定义一些请求模板消息时所要使用的实体类
1
2
3
4 public class TemplateMessage
5 {
6 public TemplateMessage()
7 {
8 topcolor = "#FF0000";
9 }
10
11
12
13 public string touser { get; set; }
14
15
16
17 public string template_id { get; set; }
18
19
20
21 public string url { get; set; }
22
23
24
25 public string topcolor { get; set; }
26
27
28
29 public object data { get; set; }
30 }
数据项data:
public class TemplateDataItem
{
public string value { get; set; }
public string color { get; set; }
public TemplateDataItem(string v, string c = "#173177")
{
value = v;
color = c;
}
}
这里就是我们上面在公众号中添加的一些模板:
public class MessageTemplate
{
/// <summary>
/// 领取通知消息模板(优惠券领取成功通知)
/// </summary>
/// <param name="first">通知标题</param>
/// <param name="keyword1">券名称</param>
/// <param name="keyword2">来源商家</param>
/// <param name="keyword3">过期时间</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>
/// (订单支付成功)消息模板---->>面向消费者
/// </summary>
/// <param name="first">标题</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">消息标题</param>
/// <param name="keyword1">下单时间</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;
}
}
还有一个消息发送之后微信返回码的一个实体:
public class WxJsonResult
{
public ReturnCode errcode { get; set; }
public string errmsg { get; set; }
}
public class TemplateMessageResult:WxJsonResult
{
public int msgid { get; set; }
}
三、所有实体建好之后我们就需要去写发送模板消息的服务了;
1 public class SendTemplateMessageService
2 {
3
4
5
6 private const string AppId = "wxdcabc123456xyz";
7 private const string AppSecret = "086323crd33xd23gc524fd93428b4ed9";
8
9
10
11 private const string SendMessageApi = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}";
12
13
14
15 private const string GetBaseUserInfoApi = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}⟨=zh_CN";
16
17
18
19
20
21
22
23
24
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
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
45 string json = JsonConvert.SerializeObject(msg, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
46
47
48 var result = HttpClientHelper.PostResponse<TemplateMessageResult>(string.Format(sendUrl, accessToken), json);
49 LoggerHelper.Log(string.Format("【微信公众号发送模板消息接口调用】返回参数:errcode:{0},erromsg:{1},misgid:{2}", result.errcode, result.errmsg, result.msgid));
50 break;
51 }
52 }
53 }
四、最后一步就是调用我们上面的这个方法发送模板消息了
if (isWechat)
{
var url = "http://m.xdd.wquan.cn/findcp";
var endDate = "2015年08月20日";
var first = string.Format("恭喜您,获得了100元现金抵用券");
var keyword4 = StrUtil.HtmlDiscode(ecList.ECouponDetail.Usage);
var remark = "点击“详情”查看优惠券,欢迎再次使用享叮当!";
var data = MessageTemplate.NoticeTemplate(first, ecList.ProductName, ecList.CorpName, endDate, keyword4, remark);
SendTemplateMessageService.SendTemplateMessage(noticeTemplateId, oAuthAccessTokenResult.openid, url, data);
}
最后来看一下效果:
微信模板消息其实就这么简单!