十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,《借助云开发实现小程序订阅消息和模板消息的推送功能》是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序订阅消息推送的文章。
成都创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十多年时间我们累计服务了上千家以及全国政企客户,如墙体彩绘等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致表扬。
至于如何创建模板消息,如果获取模板id我这节就不再讲解,不知道的同学可以查看我上篇文章《借助云开发实现小程序订阅消息和模板消息的推送功能》里面有详细的讲解。
其实我很早之前有写过一篇Java实现模板消息推送的,但是小程序后面用订阅消息替换了模板推送,所以我也会根据最新的知识点不定期的更新文章的。
关于用户openid的获取,我写过很多篇文章了,也有录过视频出来的,还不知道怎么获取的同学,可以取翻看下我之前的文章,或者看下我录制的零基础入门小程序的视频:《5小时零基础入门小程序云开发》 所以这一步不是今天的重点。
首先来看下access_token是什么,下图是官方给出的
其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。所以下面先讲下如果获取access_token
我们这里用的是springboot,这里涉及到一个请求小程序官方接口,所以我们这里用了springboot自带的RestTemplate来做网络请求。具体代码如下。
可以看出代码很简单,就是用RestTemplate来实现一个get请求,这样我们就可以轻松的获取到了access_token。
关于这个access_token,是存在有效期的,来看下官方给出的提示
所以我要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。由于这里不是本节的重点,我这里只给大家说下原理。
我们通过上面第二步,成功的获取到了access_token。下面就要调用小程序官方为我们提供的发送消息的接口了。先看下官方文档。
上面的参数都是我们发送消息时需要的。这些参数的定义和设置我在前面的文章里也都讲过了,不知道的同学可以去看下我前面写的这篇文章 《借助云开发实现小程序订阅消息和模板消息的推送功能》
因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。
可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容。。。
我们在浏览器里调用上面接口,可以看到下图所示,这样就代表我们消息推送成功了。
package com.qcl.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 作者:编程小石头
* 发送小程序订阅消息
*/
@RestController
public class SendWxMessage {
/*
* 发送订阅消息
* */
@GetMapping("/pushOneUser")
public String pushOneUser() {
return push("o3DoL0WEdzcJ20AVJg1crP96gbjM");
}
public String push(String openid) {
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("CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU");//订阅消息模板id
wxMssVo.setPage("pages/index/index");
Map m = new HashMap<>(3);
m.put("thing1", new TemplateData("小程序入门课程"));
m.put("thing6", new TemplateData("杭州浙江大学"));
m.put("thing7", new TemplateData("第一章第一节"));
wxMssVo.setData(m);
ResponseEntity responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
return responseEntity.getBody();
}
@GetMapping("/getAccessToken")
public String getAccessToken() {
RestTemplate restTemplate = new RestTemplate();
Map params = new HashMap<>();
params.put("APPID", "wx7c54942dfc87f4d8"); //
params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49"); //
ResponseEntity 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 = JSON.parseObject(body);
String Access_Token = object.getString("access_token");
String expires_in = object.getString("expires_in");
System.out.println("有效时长expires_in:" + expires_in);
return Access_Token;
}
}
对应的两个数据类如下
WxMssVo用来封装请求官方接口的参数
package com.qcl.demo;
import java.util.Map;
/*
* 小程序推送所需数据
* 编程小石头
* */
public class WxMssVo {
private String touser;//用户openid
private String template_id;//订阅消息模版id
private String page = "pages/index/index";//默认跳到小程序首页
private Map 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 getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public Map getData() {
return data;
}
public void setData(Map data) {
this.data = data;
}
}
TemplateData 用来定义消息的内容
package com.qcl.demo;
public class TemplateData {
private String value;//
public TemplateData(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
到这里我们就可以完整的实现Java发送小程序消息的功能了。完整代码也已经贴给大家了。