springboot 实现Java向微信小程序订阅消息推送至“服务通知”
最近做的OA系统小程序需要向用户推送待办事项及通知类的提醒消息。
微信公众平台开通订阅消息并创建模板。
设置消息推送配置.(在开发管理--开发设置。这里的服务器地址使用的第三方微擎)
Java端步骤
1.获取openid。如何获取openid?
2.获取access_token
access_token就是小程序官方给我们提供的一个凭证,如果要调用官方的接口,就必须先获取凭证,所以我们先来谈谈怎么获取access_token.
Java代码部分
1. java后台创建小程序 VO类,用于封装传送的参数。
@Data public class WxMssVo { private String touser;//用户openid private String template_id;//模版id private Map<String, TemplateData> data;//推送文字 }
/* * 模板数据 * */ import lombok.Data; @Data public class TemplateData { private String value;//,,依次排下去 // private String thing6;//消息类型 // private String thing3;// 消息内容 // private String time2;//发送时间 }
2.发送消息到微信
java后台创建发送消息推送类
package com.sdta.business.service.impl; import com.alibaba.fastjson.JSONObject; import com.sdta.business.domain.TemplateData; import com.sdta.business.domain.WxMssVo; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.core.util.JsonUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * Created by zml on 2020/12/6 * 微信小程序推送服务, * 包含获取access_token的服务 */ @Service @Slf4j public class WxPushService { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } //用来请求微信的get和post @Autowired private RestTemplate restTemplate; /* * 微信小程序推送单个用户 * */ public String pushOneUser(String openid,String[] keywords) { // public String pushOneUser(String openid, String formid,String[] keywords) { //获取access_token String access_token = getAccess_token(); String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + access_token; //拼接推送的模版 WxMssVo wxMssVo = new WxMssVo(); wxMssVo.setTouser(openid);//用户openid wxMssVo.setTemplate_id("Ouyrfy3LRJo5CGUfRtuxyvUwFehJIV_quoXUy4ch5I0");//模版id // wxMssVo.setForm_id(formid);//formid Map<String, TemplateData> m = new HashMap<>(5); //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注 TemplateData data= new TemplateData(); //封装数据 if(keywords.length>0){ data.setValue(keywords[0]); m.put("thing6",data); data= new TemplateData(); data.setValue(keywords[1]); m.put("thing3",data); data= new TemplateData(); data.setValue(keywords[2]); m.put("time2",data); wxMssVo.setData(m); }else{ log.error("keywords长度为空"); return null; } if(restTemplate==null){ restTemplate = new RestTemplate(); } ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class); log.error("小程序推送结果={}", responseEntity.getBody()); return responseEntity.getBody(); } //微信小程序订阅消息推送 public void push(WxMssVo wxMssVO) { String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccess_token(); // String json = JsonUtils.objectToJson(wxMssVO); // String vxResult = HttpClientUtil.doPostJson(url, json); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVO, String.class); log.error("小程序推送结果={}", responseEntity.getBody()); // log.info("返回的内容:" + vxResult); } /* * 获取access_token * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来 * */ public String getAccess_token() { //微擎 if(restTemplate==null){ restTemplate = new RestTemplate(); } String appid= "wx87865***c2441b1c"; String appsecret = "7ab8d23ecc******eee3070ecf71afcd"; //获取access_token String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" + "&appid=" + appid + "&secret=" + appsecret; String json = restTemplate.getForObject(url, String.class); JSONObject myJson = JSONObject.parseObject(json); System.out.println("access_token"+myJson.get("access_token").toString()); return myJson.get("access_token").toString(); } public static void main(String[] args) { // System.out.println(new WxPushService().getAccess_token()); WxPushService weChatUtil = new WxPushService(); String values[] ={"通知","明天集体会议务必到场","2019-5-8 10:10:10"}; weChatUtil.pushOneUser("o2l-i4koMWPhTioMVriKX2yhdVt0",values); } }
说明没有得到用户的订阅。需要小程序端用户点击允许订阅。
1. 调起客户端小程序订阅消息界面,需要用户允许后才可发送向该用户消息官方文档
wx.requestSubscribeMessage({ tmplIds: [''],//模板id success (res) { }})
本文原创,转载必追究版权。