微信發送模板消息
模板消息僅用於公眾號向用戶發送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。
關於使用規則,請註意:
1、所有服務號都可以在功能->添加功能插件處看到申請模板消息功能的入口,但只有認證後的服務號才可以申請模板消息的使用權限並獲得該權限;
2、需要選擇公眾賬號服務所處的2個行業,每月可更改1次所選行業;
3、在所選擇行業的模板庫中選用已有的模板進行調用;
4、每個賬號可以同時使用25個模板。
5、當前每個賬號的模板消息的日調用上限為10萬次,單個模板沒有特殊限制,以公眾號MP後臺開發者中心頁面中標明的數字為準。
關於接口文檔,請註意:
1、模板消息調用時主要需要模板ID和模板中各參數的賦值內容;
2、模板中參數內容必須以".DATA"結尾,否則視為保留字;
3、模板保留符號"{{ }}"。
模板申請成功之後直接新增不需要額外配置的,如果是在測試號中測試的,復制粘貼的時候要註意以上註意項
以下是我使用的模板消息
[plain] view plain copy print?
- {{first.DATA}}
- 旅行活動名稱:{{keyword1.DATA}}
- 訂單金額:{{keyword2.DATA}}
- 旅行時間:{{keyword3.DATA}}
- 參與人數:{{keyword4.DATA}}
- {{remark.DATA}}
官方的demo
[plain] view plain copy print?
- POST數據示例如下:
- {
- "touser":"OPENID",
- "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
- "url":"http://weixin.qq.com/download",
- "data":{
- "first": {
- "value":"恭喜你購買成功!",
- "color":"#173177"
- },
- "keynote1":{
- "value":"巧克力",
- "color":"#173177"
- },
- "keynote2": {
- "value":"39.8元",
- "color":"#173177"
- },
- "keynote3": {
- "value":"2014年9月22日",
- "color":"#173177"
- },
- "remark":{
- "value":"歡迎再次購買!",
- "color":"#173177"
- }
- }
- }
1.根據官方實例創建參數的Bean
[java] view plain copypackage cn.com.taiji.oosweb.httpserver;
public class TemplateData {
private String value;
private String color;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
[java] view plain copy
package cn.com.taiji.oosweb.httpserver;
import java.util.Map;
public class WechatTemplate {
private String touser; //openId
private String template_id;
private String url;
private Map<String, TemplateData> data;
public String getTouser() {
return touser;
}
public void setTouser(String touser) {
this.touser = touser;
}
public String getTemplate_id() {
return template_id;
}
public void setTemplate_id(String template_id) {
this.template_id = template_id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, TemplateData> getData() {
return data;
}
public void setData(Map<String, TemplateData> data) {
this.data = data;
}
}
創建工具類NetTools:
package cn.com.taiji.oosweb.web.wx.authdeny;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONObject;
public class NetTools {
/**
* 發送https請求
*
* @param requestUrl 請求地址
* @param requestMethod 請求方式(GET、POST)
* @param outputStr 提交的數據
* @return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值)
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 創建SSLContext對象,並使用我們指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 從上述SSLContext對象中得到SSLSocketFactory對象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 設置請求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 當outputStr不為null時向輸出流寫數據
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 註意編碼格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 從輸入流讀取返回內容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 釋放資源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
System.out.println("連接異常,超時;"+ce.getMessage());
} catch (Exception e) {
System.out.println("https請求異常:"+e.getMessage());
}
return jsonObject;
}
}
方法測試類main:
package cn.com.taiji.oosweb.httpserver;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.com.taiji.oosweb.manager.helper.JsonUtil;
import cn.com.taiji.oosweb.web.wx.authdeny.MyX509TrustManager;
import cn.com.taiji.oosweb.web.wx.authdeny.NetTools;
import net.sf.json.JSONObject;
import com.google.gson.Gson;
public class method {
static String appsecret ="";
static String appId ="";
public static void main(String[] args) {
appId = "wx2faec6d97bb8d50a";
appsecret = "ed4a837d65d26018e4eb96cc1006c078";
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
//獲取access_token
requestUrl = requestUrl.replace("APPID", appId);
requestUrl = requestUrl.replace("APPSECRET", appsecret);
JSONObject jsonObject = NetTools.httpsRequest(requestUrl, "GET", null);
String access_token = (String) jsonObject.get("access_token");
//獲取行業信息
String hyxxUrl = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=ACCESS_TOKEN";
hyxxUrl = hyxxUrl.replace("ACCESS_TOKEN", access_token);
JSONObject hyxx = NetTools.httpsRequest(hyxxUrl, "GET", null);
String primary_industry = (String) JsonUtil.getJSONObject(hyxx.get("primary_industry").toString()).get("first_class");
//獲取模板id,此處使用的是POST方式提交,使用工具類NetTools時放參數的格式如下
String mbIdUrl = "https://api.weixin.qq.com/cgi-bin/template/api_add_template";
JSONObject mbId = NetTools.httpsRequest(mbIdUrl, "POST", "access_token="+access_token+"&template_id_short=TM00050");
//獲取模板列表
String mblbUrl = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN";
hyxxUrl = mblbUrl.replace("ACCESS_TOKEN", access_token);
JSONObject mblb = NetTools.httpsRequest(hyxxUrl, "GET", null);
String accessToken =access_token;
WechatTemplate wechatTemplate = new WechatTemplate();
wechatTemplate.setTemplate_id((String)mbId.get("template_id"));
wechatTemplate.setTouser("wd6wkXKIQf5qGBfYB_MFZ8w");
wechatTemplate.setUrl("http://music.163.com/#/song?id=27867140");
Map<String,TemplateData> m = new HashMap<String,TemplateData>();
TemplateData first = new TemplateData();
first.setColor("#000000");
first.setValue("您的戶外旅行活動訂單已經支付完成,可在我的個人中心中查看。");
m.put("first", first);
TemplateData keyword1 = new TemplateData();
keyword1.setColor("#000000");
keyword1.setValue("1.2發現尼泊爾—人文與自然的旅行聖地 ");
m.put("keyword1", keyword1);
TemplateData keyword2 = new TemplateData();
keyword2.setColor("#000000");
keyword2.setValue("5000元");
m.put("keyword2", keyword2);
TemplateData keyword3 = new TemplateData();
keyword3.setColor("#000000");
keyword3.setValue("2017.1.2");
m.put("keyword3", keyword3);
TemplateData keyword4 = new TemplateData();
keyword4.setColor("#000000");
keyword4.setValue("5");
m.put("keyword4", keyword4);
TemplateData remark = new TemplateData();
remark.setColor("#000000");
remark.setValue("請屆時攜帶好身份證件準時到達集合地點,若臨時退改將產生相應損失,敬請諒解,謝謝!");
m.put("remark", remark);
wechatTemplate.setData(m);
try {
sendTemplateMessage(accessToken, wechatTemplate);
} catch (Exception e) {
// logger.info("異常"+e.getMessage());
}
}
private final static String SEND_TEMPLAYE_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
public static void sendTemplateMessage(String accessToken, WechatTemplate wechatTemplate) {
String jsonString = new Gson().toJson(wechatTemplate).toString();
// System.err.println("-------"+jsonString);
String requestUrl = SEND_TEMPLAYE_MESSAGE_URL.replace("ACCESS_TOKEN", accessToken);
JSONObject failOrsucess = NetTools.httpsRequest(requestUrl, "POST",jsonString );
System.err.println(failOrsucess);
}
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr)
{
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try
{
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection)url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod)) {
httpUrlConn.connect();
}
if (outputStr != null) {
OutputStream outputStream = httpUrlConn.getOutputStream();
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
// jsonObject = JSON.parseObject(buffer.toString());
// jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
// logger.error("Weixin server connection timed out.");
} catch (Exception e) {
// logger.error("https request error:{}", e);
}
return jsonObject;
}
}
微信發送模板消息