想要推送订阅消息首先就需要获取每个微信用户唯一的openid,openid通过从前端传过来的code里面获取
获取openid的方法
String code = req.getParameter("code");
String url = "https://api.weixin.qq.com/sns/jscode2session";
url += "?appid= ";//自己的appid
url += "&secret= ";//自己的appSecret
url += "&js_code=" + code;
url += "&grant_type=authorization_code";
url += "&connect_redirect=1";
String res = null;
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// DefaultHttpClient();
HttpGet httpget = new HttpGet(url); //GET方式
CloseableHttpResponse response = null;
// 配置信息
RequestConfig requestConfig = RequestConfig.custom() // 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000) // 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(5000) // socket读写超时时间(单位毫秒)
.setSocketTimeout(5000) // 设置是否允许重定向(默认为true)
.setRedirectsEnabled(false).build(); // 将上面的配置信息 运用到这个Get请求里
httpget.setConfig(requestConfig); // 由客户端执行(发送)Get请求
response = httpClient.execute(httpget); // 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
System.out.println("响应状态为:" + response.getStatusLine());
if (responseEntity != null) {
res = EntityUtils.toString(responseEntity);
System.out.println("响应内容长度为:" + responseEntity.getContentLength());
System.out.println("响应内容为:" + res);
}
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
JSONObject jo = JSON.parseObject(res);
// String openId= jo.getString("req_id");
String openId = jo.getString("openid");
System.out.println("code" + code);
System.out.println("openid" + openId);
Map<String,Object> map = new HashMap<>();
map.put("openId", openId);
OutputStream out = resp.getOutputStream();
Gson gson = new Gson();
out.write(gson.toJson(map,Map.class).getBytes("utf-8"));
out.close();
}
}
除了获取openid之外还需要获token,需要appid和secret(在微信开发端获取)
public String getAccessToken() {
String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+" appid "+"&secret="+" secret ";
JSONObject jsonObject = ProgramHttpRequest.doGet(url);
System.out.println(jsonObject.toString());
String errCode = jsonObject.getString("expires_in");
if (!StringUtils.isEmpty(errCode) && !StringUtils.isEmpty(jsonObject.getString("access_token").toString())) {
// logger.info("token获取成功,内容={}", jsonObject.toJSONString());
String token = jsonObject.get("access_token").toString();
return token;
} else {
// logger.error("token获取失败,内容={}", jsonObject.toJSONString());
return null;
}
}
public static JSONObject doGet(String url) {
// logger.info("执行get请求开始");
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);
}
// logger.info("执行get请求结束");
} catch (Exception e) {
// logger.error("执行get请求异常");
e.printStackTrace();
} finally {
try {
// 释放连接
httpGet.releaseConnection();
client.close();
} catch (IOException e) {
// logger.error("执行get请求流关闭异常");
e.printStackTrace();
}
}
return jsonObject;
}
然后就可以推送消息了,模板id也是从开发平台获取
//发送订阅消息
RestTemplate restTemplate = new RestTemplate();
//这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+getAccessToken();
//拼接推送的模版
String openId = (String) maps.get("mobile");
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTouser(openId);//用户的openid(要发送给那个用户,通常这里应该动态传进来的)
wxMssVo.setTemplate_id(" 订阅消息模板id ");//订阅消息模板id
// wxMssVo.setPage("pages/index/index");
Map<String, TemplateData> hashMap = new HashMap<>(4);
Map<String,Object> map = new HashMap<>();
TemplateData templateData = new TemplateData();
templateData.setValue( (String)maps.get("user"));
DBSession session = DataBaseUtil.getHibernateSession();
String name5 = (String) maps.get("user");
String phrase4 = (String) maps.get("opinion");
if ("pass".equals(phrase4)) {
phrase4 = "通过";
}else if("back".equals(phrase4)){
phrase4 = "驳回";
}
//我要获取当前的日期
Date date = new Date();
//设置要获取到什么样的时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取String类型的时间
String createdate = sdf.format(date);
//这里是发送消息的内容,map里面的key值必须和设置推送模板消息一致
hashMap.put("name5",new TemplateData(name5));
hashMap.put("phrase4", new TemplateData(phrase4));
hashMap.put("date3", new TemplateData(createdate));
//TODO
hashMap.put("thing7", new TemplateData("您有一条消息请查看"));//消息内容 先写死后续在修改
wxMssVo.setData(hashMap);
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
return responseEntity.getBody();
}
//推送模板消息key值的官方规定
发送消息的实体
public class WxMssVo {
private String touser;//用户openid
private String template_id;//订阅消息模版id
private String page = "pages/index/index";//默认跳到小程序首页
private Map<String, TemplateData> data;//推送文字
private DateFormat creatdate;
public DateFormat getCreatdate() {
return creatdate;
}
public void setCreatdate(DateFormat creatdate) {
this.creatdate = creatdate;
}
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 getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public Map<String, TemplateData> getData() {
return data;
}
public void setData(Map<String, TemplateData> hashMap) {
this.data = hashMap;
}
@Override
public String toString() {
return "WxMssVo [touser=" + touser + ", template_id=" + template_id
+ ", page=" + page + ", data=" + data + ", creatdate="
+ creatdate + "]";
}
}
public class TemplateData {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public TemplateData(String value) {
this.value = value;
}
public TemplateData() {
}
}
总结一下所需参数:
openid,从前端传过来的code里面获取
模板id,在微信开发平台中设置推送消息模板的时候获取
appid,微信开发平台中获取
secret,微信开发平台中获取