HTTPS 调用
请求地址
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
消息订阅官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
下面的很重要,一定看仔细
订阅消息参数值内容限制说明
参数类别 参数说明 参数值限制 说明
thing.DATA 事物 20个以内字符 可汉字、数字、字母或符号组合
number.DATA 数字 32位以内数字 只能数字,可带小数
letter.DATA 字母 32位以内字母 只能字母
symbol.DATA 符号 5位以内符号 只能符号
character_string.DATA 字符串 32位以内数字、字母或符号 可数字、字母或符号组合
time.DATA 时间 24小时制时间格式(支持+年月日),支持填时间段,两个时间点之间用“~”符号连接 例如:15:01,或:2019年10月1日 15:01
date.DATA 日期 年月日格式(支持+24小时制时间),支持填时间段,两个时间点之间用“~”符号连接 例如:2019年10月1日,或:2019年10月1日 15:01
amount.DATA 金额 1个币种符号+10位以内纯数字,可带小数,结尾可带“元” 可带小数
phone_number.DATA 电话 17位以内,数字、符号 电话号码,例:+86-0766-66888866
car_number.DATA 车牌 8位以内,第一位与最后一位可为汉字,其余为字母或数字 车牌号码:粤A8Z888挂
name.DATA 姓名 10个以内纯汉字或20个以内纯字母或符号 中文名10个汉字内;纯英文名20个字母内;中文和字母混合按中文名算,10个字内
phrase.DATA 汉字 5个以内汉字 5个以内纯汉字,例如:配送中
符号表示除中文、英文、数字外的常见符号,不能带有换行等控制字符。 时间格式支持HH:MM:SS或者HH:MM。 日期包含年月日,为y年m月d日,y年m月、m月d日格式,或者用‘-’、‘/’、‘.’符号连接,如2018-01-01,2018/01/01,2018.01.01,2018-01,01-01。 每个模板参数都会以类型为前缀,例如第一个数字模板参数为number01.DATA,第二个为number02.DATA
例如,模板的内容为
姓名: {{name01.DATA}}
金额: {{amount01.DATA}}
行程: {{thing01.DATA}}
日期: {{date01.DATA}}
则对应的json为
{
"touser": "OPENID",
"template_id": "TEMPLATE_ID",
"page": "index",
"data": {
"name01": {
"value": "某某"
},
"amount01": {
"value": "¥100"
},
"thing01": {
"value": "广州至北京"
} ,
"date01": {
"value": "2018-01-01"
}
}
}
消息模板
import io.geekidea.springbootplus.system.param.wxsmallTemplateParam;
import lombok.Data;
import java.util.List;
@Data
public class wxsmallTemplate {
private String page; //跳转小程序页面路径
private String template_id;//模板消息id
private String touser;//给谁推送 用户的openid (可以调用根据code换openid接口)
private Object data;//用户接受到的数据
private String token;//
}
模板参数值
import lombok.Data;
@Data
public class wxsmallTemplateParam {
private String key;
private String value;
private String color;
public wxsmallTemplateParam(String key, String value, String color) {
this.key = key;
this.value = value;
this.color = color;
}
public wxsmallTemplateParam(){};
}
使用方法
wxsmallTemplate tem = new wxsmallTemplate();//消息模板
//=====================data数据封装==========================
Map<String,Object> m= new HashMap<>();//消息模板 data中的值
m.put("微信消息模板key", new wxsmallTemplateParam("自己的key", 自己的值, "(颜色)#DC143C"));
......
//=====================data数据封装end==========================
//=====================数据封装==========================
tem.setTouser(用户在此平台唯一表示[openid]);
//跳转小程序页面路径
tem.setPage("pages/index/index");
tem.setTemplate_id("消息模板id");
tem.setData(m);
//=====================数据封装end==========================
GET------>获取access_token
需要: appid and secret
public String getAccess_token(String appid, String appsecret) {
String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appsecret;
JSONObject jsonObject = doGet1(url);
System.out.println(jsonObject.toString());
String errCode = jsonObject.getString("expires_in");
if (!StringUtils.isEmpty(errCode) && !StringUtils.isEmpty(jsonObject.getString("access_token").toString())) {
String token = jsonObject.get("access_token").toString();
return token;
} else {
return null;
}
}
获取access_token 的具体方法
public static JSONObject doGet1(String url) {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
JSONObject jsonObject = null;
try {
HttpResponse httpResponse = client.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "UTF-8");
jsonObject = JSONObject.parseObject(result);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 释放连接
httpGet.releaseConnection();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return jsonObject;
}
POST ---------------------》调用消息模板
需要 : 上一步的 access_token and tem (封装的数据)
此处地址(requestUrl) :已在文档开始处贴出
public static boolean sendTemplateMsg1(String token,wxsmallTemplate template) {
boolean flag = false;
String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
requestUrl = requestUrl.replace("ACCESS_TOKEN", token);
JSONObject jsonResult =JSON.parseObject(post(JSONObject.parseObject(JSONArray.toJSON(template).toString()),requestUrl)) ;
if (jsonResult != null) {
Integer errorCode = jsonResult.getInteger("errcode");
String errorMessage = jsonResult.getString("errmsg");
if (errorCode == 0) {
flag = true;
} else {
System.out.println("模板消息发送失败:" + errorCode + "," + errorMessage);
flag = false;
}
}
return flag;
}
POST 请求 具体方法:
//post请求
public static String post(JSONObject json,String URL) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
post.setHeader("Content-Type", "application/json");
post.addHeader("Authorization", "Basic YWRtaW46");
String result = "";
try {
StringEntity s = new StringEntity(json.toString(), "utf-8");
s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
"application/json"));
post.setEntity(s);
// 发送请求
HttpResponse httpResponse = client.execute(post);
// 获取响应输入流
InputStream inStream = httpResponse.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
inStream, "utf-8"));
StringBuilder strber = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
strber.append(line + "\n");
inStream.close();
result = strber.toString();
System.out.println(result);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
System.out.println("请求服务器成功,做相应处理");
} else {
System.out.println("请求服务端失败");
}
} catch (Exception e) {
System.out.println("请求异常");
throw new RuntimeException(e);
}
return result;
}