美文网首页java学习之路
java实现微信小程序的消息通知

java实现微信小程序的消息通知

作者: 唯有努力不欺人丶 | 来源:发表于2020-08-28 10:10 被阅读0次

这个功能可能我题目中的叙述有点问题。重新解释一下,我们众所周知的微信小程序和app大不相同,最大的区别是app可以独立进行消息推送,而微信小程序却不行,也就是这个原因,所以小程序中如果想做什么提醒用户的操作,只能走订阅推送了。大概的步骤就是小程序授权允许消息推送(反正就这个意思,是不是叫推送我不记得了),然后这样当有需要的时候可以把消息发送到微信的服务通知里,正常来讲类似于微信收到了一条新消息的那种模式。
然后java代码的实现也比较简单,主要是配置什么的要符合微信小程序后台的配置,需要注意的是这个需要获取的参数有小程序的accessToken和小程序中用户的openId,当然了还有模板消息和消息实体对象之类的。
所以我这里会写的比较长,openId的话应该是存储在小程序用户的用户信息表里的,所以这里不多叙述,但是accessToken的话我这里是每次都去获取,所以专门封装了个方法(小程序开发本身的appId和秘钥就不说了)。

获取accessToken:

    static String appid = "你的appId";
    static String secret = "你的secret";
    public static String getAccessToken() throws Exception {
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid
                + "&secret=" + secret;
        URL url = new URL(requestUrl);
        // 打开和URL之间的连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        // 设置通用的请求属性
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        // 得到请求的输出流对象
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.writeBytes("");
        out.flush();
        out.close();
        // 建立实际的连接
        connection.connect();
        // 定义 BufferedReader输入流来读取URL的响应
        BufferedReader in = null;
        if (requestUrl.contains("nlp"))
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
        else
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        String result = "";
        String getLine;
        while ((getLine = in.readLine()) != null) {
            result += getLine;
        }
        in.close();
        JSONObject jsonObject = JSON.parseObject(result);
        String accesstoken = jsonObject.getString("access_token");
        System.out.println(accesstoken);
        return accesstoken;
    }

如上,是一个提炼的很好的获取accessToken的方法,返回值也经过处理只返回accessToken。

因为openId应该是存储在用户表里,所以这里不多叙说,模板id也应该在配置那里获取到了,所以也可以用静态常量表示。

发送小心代码实现

这里有两个是数据封装的实体:

/**
 * 订阅消息
 * @author  lisijia
 * @email   1151141449@qq.com
 * @date    2020/7/7 10:57 
 */
public class SubscribeMessage {
    //接口调用凭证
    private String access_token;
    //接收者(用户)的 openid
    private String touser;
    //所需下发的订阅模板id
    private String template_id;
    //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
    private String page;
    //模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
    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;
    }
}
/**
 * @author  lisijia
 * @email   1151141449@qq.com
 * @date    2020/7/7 10:58  
 */
public class TemplateData {
 
    private String value;
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
 
    public TemplateData(String value) {
        this.value = value;
    }
 
}

然后是发送订阅消息的方法(其实这里是分两步的,一步是单纯的触发发送订阅消息,还有一部分是参数的命名及写法):

public static void subscribeMessage(String openId, String page, Map<String, TemplateData> map) {
        try {
            String accessToken = getAccessToken();
            SubscribeMessage subscribeMessage = new SubscribeMessage();
            // 拼接数据
            subscribeMessage.setAccess_token(accessToken);
            subscribeMessage.setTouser(openId);
            subscribeMessage.setTemplate_id(templateId);//事先定义好的模板id
            subscribeMessage.setPage(page);
            subscribeMessage.setData(map);
            String json = JSONObject.toJSONString(subscribeMessage);
            JsonNode ret = null;
            ret = Unirest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken)
                    .body(json).asJson().getBody();
            System.out.println(ret);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Map<String, TemplateData> map = new HashMap<>();
        map.put("date4", new TemplateData(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())));
        map.put("thing12", new TemplateData("温度过高"));
        map.put("thing1", new TemplateData("氙灯老化试验箱"));
        map.put("thing2", new TemplateData("BJYSL-SN-500"));
        map.put("thing3", new TemplateData("实验箱温度"));
        subscribeMessage("oPUD35dzUstVi8VDqMQOW1P6EElY", "", map);
    }

注意一下,这里的什么date4.thing12,thing2之类的都是模板自动生成的,一定key名称要对应上。还有thing是有长度限制的,好像是20字符。
然后page参数我这里没传,说实话我也不清楚是干啥的,反正之前我看的demo里就是空。
至于这个openId一定是这个小程序下生成的openId属于常识,我顺口也就提一下。
这个我认为比较好的一点是报错信息写的非常明确,我之前遇到的几个问题都是一看报错信息就找到原因了,然后直接运行main方法打印如下说明发送成功了:


模板消息发送成功

本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利!java技术交流群130031711,欢迎各位的加入!

相关文章

  • java实现微信小程序的消息通知

    这个功能可能我题目中的叙述有点问题。重新解释一下,我们众所周知的微信小程序和app大不相同,最大的区别是app可以...

  • 服务通知

    app中实现服务通知可以通过消息推送机制实现,而基于微信的通知渠道,小程序想要实现服务通知推送,需要借助模版消息。...

  • 告警分类分人推送

    利用当前公有云的消息通知服务和obs消息触发机制。联合微信公众号或小程序,实现消息精准推送

  • 小程序模板消息

    微信小程序模板消息官方文档 一、简介 基于微信的通知渠道,提供了可以高效触达用户的模板消息能力,以便实现服务的闭环...

  • zabbix企业微信报警

    前言:通过企业微信小程序,实现zabbix自动注册和zabbix告警的微信消息推送。前言:通过企业微信小程序,实现...

  • 微信小程序消息重复推送

    这段时间做了一个签到的微信小程序,需要在每天给用户发送签到提醒通知。其实之前做投票小程序时有实现过消息通知,主要是...

  • 微信小程序-滚动消息通知

    这次我主要想总结一下微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组件在小程序中是...

  • springboot实现微信消息推送,java实现小程序推送,含

    最近需要开发微信和小程序的推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下...

  • 基于Taro的微信小程序模板消息-获取formId功能模块封装实

    前言 在微信小程序中,小程序提供了一种能力-模板消息,官方文档是这样描述的:“基于微信的通知渠道,我们为开发者提供...

  • 微信平台开发-消息通知简述

    微信平台开发 消息通知送达用户 1、小程序服务通知 优点:到达率高,用户手机有新消息提示(铃声,振动) 缺点:有次...

网友评论

    本文标题:java实现微信小程序的消息通知

    本文链接:https://www.haomeiwen.com/subject/gsbksktx.html