zoukankan      html  css  js  c++  java
  • 小程序---订阅消息

    微信小程序订阅消息官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html

    小程序用订阅消息替换了模板推送,今天我们就共同学习如何在Java后台编写小程序订阅消息推送的知识。

    发送订阅消息三步走

      1.拿到用户的openid

      2.获取access_token

      3.调用小程序消息推送的接口

    一,获取用户的openid(用户唯一标识)

    openid是由前端传到后端的,我们只需要接收即可

    二,获取access_token

    官方介绍:access_token是小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用。开发者可以通过 getAccessToken接口获取并进行妥善保存。为了access_token 的安全性,后端 API 不能直接在小程序内通过 wx.request 调用,即api.weixin.qq.com 不能被配置为服务器域名。开发者应在后端服务器使用getAccessToken获取 access_token,并调用相关 API;

     其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。所以下面先讲下如果获取access_token

    grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到。

    注意点: access_token 的存储与更新

    1.access_token的存储至少要保留 512 个字符空间

    2.access_token的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token失效 

    3.建议开发者使用中控服务器统一获取和刷新 access_token ,其他业务逻辑服务器所使用的access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务

    4.access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老access_token ,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡

    5.access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程

    所以要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。

    三,发送消息到小程序

    我们通过上面第二步,成功的获取到了access_token。下面就要调用小程序官方为我们提供的发送消息的接口了。先看下官方文档。

    这里需要注意的一点是,我们要给用户发送消息,就必须引导用户授权,就是下面这个图

    因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。

    推送的代码如下图:

     可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容等,参数是否必填参考上图官方文档

    这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了

    测试:在浏览器里调用上面接口,可以看到下图所示,说明消息推送成功。

    推送效果图

    下面我把完整的代码贴出来给到大家

    两个推送消息相关数据类如下:
    1: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<String, TemplateData> data=new HashMap<String,TemplateData>;//推送文字
    
        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;
        }
    }

    2: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; } }

    controller接口

    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<String, TemplateData> m = new HashMap<>(3);
            m.put("thing1", new TemplateData("小程序入门课程"));
            m.put("thing6", new TemplateData("杭州浙江大学"));
            m.put("thing7", new TemplateData("第一章第一节"));
            wxMssVo.setData(m);
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            return responseEntity.getBody();
        }
    
        @GetMapping("/getAccessToken")
        public String getAccessToken() {
            RestTemplate restTemplate = new RestTemplate();
            Map<String, String> params = new HashMap<>();
            params.put("APPID", "wx7c54942dfc87f4d8");  //
            params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49");  //
            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 = 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;
        }
    }

    ok,到这里我们就可以完整的实现Java发送小程序消息的功能了~~~

    我话讲完!谁赞成?谁反对?
  • 相关阅读:
    CentOS 6.3 下编译Nginx(笔记整理)
    XMPP协议相关基础概念(Strophe学习笔记)
    StackMapTable format error
    hibernate的子查询
    strophe与openfire模拟的XMPP简单hello程序
    Strophe.Status的所有值
    博客园添加SyntaxHighlighter
    P5395 【模板】第二类斯特林数·行
    test20191001
    test20190829
  • 原文地址:https://www.cnblogs.com/wffzk/p/15214603.html
Copyright © 2011-2022 走看看