正如许多推送一样,微信也友好的给广大开发者提供了“模板消息”,比推送更好的是,它能借助海量用户的微信平台直接通过服务号以短消息形式传达给用户,大大提高了运营的可能性。比如我们现在可以完全抛开银行卡的短信服务,通过相关银行提供服务号绑定银行卡,当发生交易的时候同样的能收到交易详情短消息,确实是方便了不少!
上一篇讲到了获取和缓存access_token,也成功配置了jssdk授权,这些前置条件都准备好了,那么同样的实现一些功能就很快了,这回具体来说说模板消息的发送
公众号平台配置
功能-我的模板(或者去模块库中搜索),这里不涉及到代码,不细说
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM4YTZzgzMhNmYlZGOlhTNmFjY2UWNlNmYmhzYxMzM38CXxMzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.png)
后台restful
实际项目中肯定会存在多种类型的模板,那么肯定需要做一些共用代码封装,我这里 以保单出单 这个模板为例
1,对应模板的信息
2.controller
/**
* 发送模板消息
* @return
*/
@RequestMapping(value = "/sendTemplateMessage", method = RequestMethod.POST)
public @ResponseBody HttpResult sendTemplateMessage(@RequestParam String dataJson){
HttpResult hr = null;
LOGGER.info("RestFul of sendTemplateMessage parameters dataJson:{}",dataJson);
try {
hr = wechatService.sendTemplateMessage(dataJson);
LOGGER.info("Send template message is successful!",hr);
} catch (Exception e) {
LOGGER.error("RestFul of sendTemplateMessage is error:{}",e);
}
return hr;
}
因为我这里是一个通用的接口,不同的模板可能传的参数都不同,时间缘故也没有写持久化bean对象,就用了一个json字符串接收
3.serveice
直接通过httpclient调用微信提供的POST请求,https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={ACCESS_TOKEN}
//保单出单通知
@Value("${TEMPLATE_THREE}")
private String TEMPLATE_THREE;
/**
* 发送模板消息
* @param dataJson
* @return
* @throws IOException
*/
public HttpResult sendTemplateMessage(String dataJson) throws IOException{
String doUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+getBaseAccessToken();
JSONObject data = JSONObject.parseObject(dataJson);
Object touser = data.get("touser");//接收者openid
String templateId = TEAMLATE_THREE;//模板ID
Object url = data.get("url");//模板跳转链接,如果置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
Object first = data.getString("first");//标题
Object remark = data.getString("remark");//备注
Object keyword1 = data.getString("keyword1");
Object keyword2 = data.getString("keyword2");
Object keyword3 = data.getString("keyword3");
JSONObject parentJSON = new JSONObject();
parentJSON.put("touser", touser);
parentJSON.put("template_id", templateId);
parentJSON.put("url", url);
JSONObject json = new JSONObject();
json.put("first", toJson(first));
json.put("keyword1", toJson(keyword1));//对应的车辆信息
json.put("keyword2", toJson(keyword2));//产品信息
json.put("keyword3", toJson(keyword3));//出单状态json.put("remark", toJson(remark));
parentJSON.put("data", json);//模板数据
HttpResult rs = null;
try {
rs = apiService.doPostJson(doUrl,parentJSON.toJSONString());
} catch (Exception e) {
LOGGER.error("RestFul of doLogin is error:{}",e);
}
return rs;
}
public JSONObject toJson(String value){
JSONObject json = new JSONObject();
json.put("value", value);
json.put("color", "#173177");//消息字体颜色
return json;
}
为了增强代码可读性,关键字的地方我都添加了注释,那么到这里,后台基本完成,下面我通过一个接口调用工具Advanced REST client来测试一下
数据:
{
"touser": "otjo0wXJZipXdFjxzwDB3DZUjs44",
"templateType": "3",
"url": "www.liliangel.cn",
"first": {
"value": "测试发送模板消息3",
"color": "#173177"
},
"keyword1": {
"value": "testCar",
"color": "#173177"
},
"keyword2": {
"value": "testPro",
"color": "#173177"
},
"keyword3": {
"value": "successful",
"color": "#173177"
},
"remark": {
"value": "备注",
"color": "#173177"
}
}
说明:我这里的数据结构是经过了一层json封装的,详细的格式可以参考微信官方文档及模板详情!
【模版消息】C#推送微信模版消息(Senparc.Weixin.MP.dll)
定义的模版内容:
[plain] view plain copy
- {{first.DATA}}
- 商品名称:{{product.DATA}}
- 商品价格:{{price.DATA}}
- 购买时间:{{time.DATA}}
- {{remark.DATA}}
代码:
[csharp] view plain copy
- protected void Page_Load(object sender, EventArgs e)
- {
- //根据appId判断获取
- if (!AccessTokenContainer.CheckRegistered(appId)) //检查是否已经注册
- {
- AccessTokenContainer.Register(appId, appSecret); //如果没有注册则进行注册
- }
- string access_token = AccessTokenContainer.GetAccessTokenResult(appId).access_token; //AccessToken
- string openId = "xxxxxx"; //用户openId
- string templateId = "xxxxxx"; //模版id
- string linkUrl = "http://www.baidu.com"; //点击详情后跳转后的链接地址,为空则不跳转
- //为模版中的各属性赋值
- var templateData = new ProductTemplateData()
- first = new TemplateDataItem("您好,您的订单已支付成功!", "#000000"),
- product = new TemplateDataItem("旺旺大礼包", "#000000"),
- price = new TemplateDataItem("99.8元", "#000000"),
- time = new TemplateDataItem("2016-11-09 16:50:38", "#000000"),
- remark = new TemplateDataItem("感谢您的光临~", "#000000")
- };
- SendTemplateMessageResult sendResult = TemplateApi.SendTemplateMessage(access_token, openId, templateId, "", linkUrl, templateData);
- //发送成功
- if (sendResult.errcode.ToString() == "请求成功")
- //...
- else
- Response.Write("出现错误:" + sendResult.errmsg);
- }
- /// <summary>
- /// 定义模版中的字段属性(需与微信模版中的一致)
- /// </summary>
- public class ProductTemplateData
- public TemplateDataItem first { get; set; }
- public TemplateDataItem product { get; set; }
- public TemplateDataItem price { get; set; }
- public TemplateDataItem time { get; set; }
- public TemplateDataItem remark { get; set; }
推送效果图: