微信官方文档链接如下:
微信小程序订阅消息开发文档地址
我们第一次接触.可能比较蒙,不要怕.第一步:去仔细阅读微信的官方文档.
看大纲,除了介绍微信小程序的基础信息,就是实现它只分三步.
第一步,获取模板ID.
去哪里获取呢?上链接:
自己公司开通的商家微信管理后台
里面去找订阅消息:
看图片所示:会由拥有开发者权限的技术人员,去创建自己所需的各种模板.每一个模板都拥有一个唯一的模板ID,就是他自己的身份标识.点击复制,你就获得了该模板id,这个模板id,是固定唯一的.
第二步:
这个交由前端来处理,这个是前端进行某一个点击事件,会在界面弹出一个授权的小弹框,让用户允许接受这个通知.如果用户某一去允许,或者点了拒绝.该条通知,用户永远不会接收到.因为,微信官方,怕很多商家去骚扰用户,造成用户体验差的问题.所以,把主动权交给了广大客户们.
作为后端开发者,只需要把模板id,发给前端,让他自己去研究,下发权限.
第三步:
最重要的一步.
微信官方提供了两种方式:作为后端开发人员,我们只需要关心HTTPS调用.
请求地址: post方式
https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
但是需要access_token,
这个access_token的获取,微信官方文档也有给,这个我会在下面直接贴代码.
我为什么把page也划为了必须参数,因为一般所接触到的消息,都可以点击跳转到自己的小程序里面.参数文档说的很清楚,我就不多啰嗦了.直接上代码:
@Override
public ServerResponse pushAfterSaleMessage(OmsAfterSaleDO omsAfterSaleDO) {
try {
Map<String, TemplateData> map = new HashMap<>();
String accessToken = getAccessToken(); //获取access_token的方法
OmsWxMessageDO omsWxMessageDO = new OmsWxMessageDO(); //自己定义的实体类
omsWxMessageDO.setTemplate_id(WECHAT_TEMPLATE_ID); //在类体里面设置的
omsWxMessageDO.setPage(PAGE); //问前端要,可以直接写死在此处
String saleOpenId = omsAfterSaleDO.getSaleOpenId(); //获取信息接受者的小程序openId
if(org.apache.commons.lang3.StringUtils.isNotEmpty(saleOpenId)){
omsWxMessageDO.setTouser(saleOpenId);
}else {
//写死了售后客服微信的openId
omsWxMessageDO.setTouser("XXXXXXXXXXXXXXXXXXX");
}
String saleCode = omsAfterSaleDO.getSaleCode();
Integer initiatorId = omsAfterSaleDO.getInitiatorId();
String nickName = omsAfterSaleDO.getNickName();
String application = initiatorId+nickName;
Date createDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
String format = sdf.format(createDate);
TemplateData templateData1 = new TemplateData();
templateData1.setValue(saleCode);
TemplateData templateData2 = new TemplateData();
templateData2.setValue("七天无理由退换货,待处理订单");
TemplateData templateData3 = new TemplateData();
templateData3.setValue(application);
TemplateData templateData4 = new TemplateData();
templateData4.setValue(format);
//这里要注意,这个请求参数,一定要严格按照微信官方给的格式和参数名字
map.put("character_string3",templateData1);//这里的character_string3,去自己的微信后查看
map.put("thing2",templateData2);
map.put("thing4",templateData3);
map.put("time5",templateData4);
omsWxMessageDO.setData(map);
//调取微信下发小程序订阅消息接口
RestTemplate restTemplate = new RestTemplate();
String url = WECHAT_MESSAGE_SEND_URL+accessToken;
String jsonString = JSON.toJSONString(omsWxMessageDO);
// 设置restemplate编码为utf-8 不设置编码,中文会乱码哦,全变成问号????
restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, jsonString, String.class);
String body = responseEntity.getBody();
System.out.println("===============================发送消息模板参数=======================" + jsonString);
return ServerResponse.createBySuccess(body);
} catch (Exception e) {
LOGGER.error("mall.order.pushAfterSaleMessage:" + e.getMessage());
}
return null;
}
public String getAccessToken() throws IOException {
if(stringRedisTemplate.hasKey(WECHAT_SESSION_TOKEN_KEY)){
String token = stringRedisTemplate.opsForValue().get(WECHAT_SESSION_TOKEN_KEY);
LOGGER.info("[PosterServiceImpl-->getAccessToken]缓存获取:[{}]",token);
return token;
}else{
try {
StringBuffer buffer = new StringBuffer(WECHAT_ACCESS_TOKEN_URL);
buffer.append(appid);
buffer.append("&secret=");
buffer.append(secret);
HttpGet httpGet = new HttpGet(buffer.toString());
HttpClient httpClient = HttpClients.createDefault();
HttpResponse res = httpClient.execute(httpGet);
if(res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity entity = res.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
JSONObject jsons = JSON.parseObject(result);
String accessToken = jsons.getString("access_token");
// 提前10分钟
stringRedisTemplate.opsForValue().set(WECHAT_SESSION_TOKEN_KEY, accessToken,55*60*2,TimeUnit.SECONDS);
LOGGER.info("[PosterServiceImpl-->getAccessToken]request Token:[{}]",accessToken);
return accessToken;
}else {
LOGGER.error("获取wechat 请求异常error=[{}]",res.getStatusLine().getStatusCode());
}
}catch (Exception e){
e.printStackTrace();
LOGGER.error("获取wechat Token异常error=[{}]",e.getMessage());
}
}
return null;
}
//实体类
public class OmsWxMessageDO implements Serializable {
private String access_token; //接口调用凭证
private String touser; //接收者(用户)的 openid
private String template_id; //所需下发的模板消息的id
private String page; //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
private Map<String, TemplateData> data; //模板内容,不填则下发空模板
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
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> data) {
this.data = data;
}
}
public class TemplateData implements Serializable {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}