微信小程序订阅消息

微信官方文档链接如下:
微信小程序订阅消息开发文档地址
我们第一次接触.可能比较蒙,不要怕.第一步:去仔细阅读微信的官方文档.
看大纲,除了介绍微信小程序的基础信息,就是实现它只分三步
看大纲,除了介绍微信小程序的基础信息,就是实现它只分三步.
第一步,获取模板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;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值