上次用的订阅消息,使用的是小程序的云函数。本次将使用原生的https发送订阅消息。使用场景是:在考试建立好了之后,跟参加考试的人员发送提醒其需要参加考试的微信订阅消息。废话不说,现在后台管理界面,增加一个按钮,专门用来发送订阅消息。
前端代码如下:
list.vue
"mini" // 发送提醒方法 pushPaper (row) { let _this = this examPaperApi.pushPaper(row.id).then(re => { if (re.code === 1) { _this.search() _this.$message.success(re.message) } else { _this.$message.error(re.message) } }) }
exampaper.js
pushPaper: id => post('/api/admin/send/wx/message/pushOneUser/' + id)
发送订阅消息三部曲:
1,拿到用户的openid
2,获取access_token
3,调用小程序消息推送的接口
剩下最后一个就是调用小程序消息推送的接口了。
后端代码如下所示: 先定义一个VO,用来发送微信消息/* * 小程序推送所需数据 * dabenben * */ @Datapublic class WxMssVo { private String touser;//用户openid private String template_id;//订阅消息模版id private String page = "pages/index/index";//默认跳到小程序首页 private Map<String, TemplateData> data;//推送文字 }
2、controller代码如下
/** * 作者:dabenben * 发送小程序订阅消息 */@RestController("AdminSendWxMessageController")@RequestMapping(value = "/api/admin/send/wx/message")@AllArgsConstructorpublic class SendWxMessageController extends BaseApiController { private final ExamPaperService examPaperService; private final UserService userService; /* * 发送订阅消息 * */ @RequestMapping(value = "/pushOneUser/{id}", method = RequestMethod.POST) public RestResponse pushOneUser(@PathVariable Integer id) { List userList=userService.selectByUserLevel(examPaperService.selectById(id).getGradeLevel()); for (User user: userList) { if(null!=user.getWxOpenId()){ push(user.getWxOpenId(),id); } } return RestResponse.ok("发送成功!"); } public String push(String openid,Integer examPaperId) { RestTemplate restTemplate = new RestTemplate(); //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken(); //拼接推送的模版 WxMssVo wxMssVo = new WxMssVo(); wxMssVo.setTouser(openid);//用户的openid(要发送给那个用户,通常这里应该动态传进来的) wxMssVo.setTemplate_id("TemplateId");//订阅消息模板id wxMssVo.setPage("pages/index/index"); String PaperName=examPaperService.selectById(examPaperId).getName(); String renyuan=userService.selectByUserLevel(examPaperService.selectById(examPaperId).getGradeLevel()).get(0).getRealName(); Map<String, TemplateData> m = new HashMap<>(); m.put("thing1", new TemplateData("抓紧时间进入小程序,快要考试啦!")); m.put("thing2", new TemplateData(PaperName)); m.put("thing15", new TemplateData("在线考试")); m.put("thing16", new TemplateData(renyuan+"等相关人员")); m.put("thing12", new TemplateData("请点击进入查看详情,如有问题请联系陈鹏!")); wxMssVo.setData(m); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class); return responseEntity.getBody(); } /* * 获取token * */ @GetMapping("/getAccessToken") public String getAccessToken() { RestTemplate restTemplate = new RestTemplate(); Map<String, String> params = new HashMap<>(); params.put("APPID", "APPID"); // params.put("APPSECRET", "APPSECRET"); // ResponseEntity<String> responseEntity = restTemplate.getForEntity( "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params); String body = responseEntity.getBody(); JSONObject object = JSONUtil.parseObj(body); String Access_Token = object.getStr("access_token"); String expires_in = object.getStr("expires_in"); System.out.println("有效时长expires_in:" + expires_in); return Access_Token; }}
当然,微信的订阅消息模板,需要提前申请好,并且,订阅消息中的字段名称与你设置的字段名称需要一致。最后展示效果如下:1、需要点击订阅如下2条消息。
2、后台点击发送消息后,
3、手机端如下: