正如許多推送一樣,微信也友好的給廣大開發者提供了“模闆消息”,比推送更好的是,它能借助海量使用者的微信平台直接通過服務号以短消息形式傳達給使用者,大大提高了營運的可能性。比如我們現在可以完全抛開銀行卡的短信服務,通過相關銀行提供服務号綁定銀行卡,當發生交易的時候同樣的能收到交易詳情短消息,确實是友善了不少!
上一篇講到了擷取和緩存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; }
推送效果圖: