精华内容
下载资源
问答
  • 最近需要开发微信和小程序推送功能,需要用java后台实现推送,自己本身java小程序都做,所以就自己动手实现小程序的模版推送功能推送实现思路 1 小程序获取用户openid,收集formid传给java...

    本文是比较老得技术来实现,用最新技术实现小程序推送,请看
    5行java代码实现微信小程序模版消息推送 (含springboot后台和小程序源码)
    也可以看最新的视频讲解:https://edu.csdn.net/course/detail/23750

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

    实现思路

    • 1 小程序获取用户openid,收集formid传给java后台
    • 2 java推送消息给指定小程序用户

    老规矩,还是先看效果图

    在这里插入图片描述
    我的这个是跑腿抢单推送,当用户新下单时,会给跑腿员推送消息。

    下面开始讲解实现步骤

    一,微信小程序管理后台开通模版推送

    在这里插入图片描述
    这里的模版id很重要,接下来我们推送的都是这个模版。

    二,java后台实现推送所需字段

    • 1 看微信官方推送消息所需要的字段
      在这里插入图片描述
      在这里插入图片描述
    • 2 有了官方说明,我门接下来就去拿到官方所需要的这些字段,来组装请求数据就可以了。

    三,下面讲解实现步骤

    我的java后台是基于springboot开发的,如果你不了解spring boot,建议你先去了解下springboot再回来接着学习。
    还有RestTemplate是我们java后台做get和post请求必须的,我们和微信服务器交互就用的RestTemplate

    • 1 首先根据官方推送所需字段组装java-bean
      这里用到两个javabean
    /*
    * 小程序推送所需数据
    * qcl 微信:2501902696
    * */
    @Data
    public class WxMssVo {
        private String touser;//用户openid
        private String template_id;//模版id
        private String page = "index";//默认跳到小程序首页
        private String form_id;//收集到的用户formid
        private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段
        private Map<String, TemplateData> data;//推送文字
    }
    
    /*
    * 设置推送的文字和颜色
    * qcl 微信:2501902696
    * */
    @Data
    public class TemplateData {
        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        private String value;//,,依次排下去
    //    private String color;//字段颜色(微信官方已废弃,设置没有效果)
    }
    

    到这里请求推送的数据就组装好了,解下来我们去实现推送功能。
    奥不对,还有一个重要的字段需要获取到:access_token

    access_token的获取

    /*
        * 获取access_token
        * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
        * */
        public String getAccess_token(String appid, String appsecret) {
            //获取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
            return accessToken.getAccess_token();
        }
    

    这次是真正的可以来请求微信服务器来实现消息推送了

    /*
        * 微信小程序推送单个用户
        * */
        public String pushOneUser(String openid, String formid) {
    
    
            //获取access_token
            String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                    "?access_token=" + access_token;
    
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用户openid
            wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
            wxMssVo.setForm_id(formid);//formid
    
    
            Map<String, TemplateData> m = new HashMap<>(5);
    
            //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
            TemplateData keyword1 = new TemplateData();
            keyword1.setValue("新下单待抢单");
            m.put("keyword1", keyword1);
    
            TemplateData keyword2 = new TemplateData();
            keyword2.setValue("这里填下单金额的值");
            m.put("keyword2", keyword2);
            wxMssVo.setData(m);
    
            TemplateData keyword3 = new TemplateData();
            keyword3.setValue("这里填配送地址");
            m.put("keyword3", keyword3);
            wxMssVo.setData(m);
    
            TemplateData keyword4 = new TemplateData();
            keyword4.setValue("这里填取件地址");
            m.put("keyword4", keyword4);
            wxMssVo.setData(m);
    
            TemplateData keyword5 = new TemplateData();
            keyword5.setValue("这里填备注");
            m.put("keyword5", keyword5);
            wxMssVo.setData(m);
    
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            log.error("小程序推送结果={}", responseEntity.getBody());
            return responseEntity.getBody();
        }
    

    openid可以让小程序开发人员给你传过来,也可以自己获取。
    formid需要小程序开发给你传过来,你也可以把formid存到数据库里,什么时候需要直接拿出来用就可以了。
    注意:formid必须和用户openid对应。

    下面贴出来完整代码

    package com.qcl.paotuischool.wechat;
    
    import com.google.gson.Gson;
    import com.qcl.userwechat.bean.AccessToken;
    import com.qcl.utils.ConstantUtils;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * Created by qcl on 2018/9/11.
     * 微信小程序推送服务,
     * 包含获取access_token的服务
     */
    @Service
    @Slf4j
    public class WxPushServiceQcl {
        //用来请求微信的get和post
        @Autowired
        private RestTemplate restTemplate;
    
    
        /*
        * 微信小程序推送单个用户
        * */
        public String pushOneUser(String openid, String formid) {
    
    
            //获取access_token
            String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                    "?access_token=" + access_token;
    
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用户openid
            wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
            wxMssVo.setForm_id(formid);//formid
    
    
            Map<String, TemplateData> m = new HashMap<>(5);
    
            //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
            TemplateData keyword1 = new TemplateData();
            keyword1.setValue("新下单待抢单");
            m.put("keyword1", keyword1);
    
            TemplateData keyword2 = new TemplateData();
            keyword2.setValue("这里填下单金额的值");
            m.put("keyword2", keyword2);
            wxMssVo.setData(m);
    
            TemplateData keyword3 = new TemplateData();
            keyword3.setValue("这里填配送地址");
            m.put("keyword3", keyword3);
            wxMssVo.setData(m);
    
            TemplateData keyword4 = new TemplateData();
            keyword4.setValue("这里填取件地址");
            m.put("keyword4", keyword4);
            wxMssVo.setData(m);
    
            TemplateData keyword5 = new TemplateData();
            keyword5.setValue("这里填备注");
            m.put("keyword5", keyword5);
            wxMssVo.setData(m);
    
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            log.error("小程序推送结果={}", responseEntity.getBody());
            return responseEntity.getBody();
        }
    
        /*
        * 获取access_token
        * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
        * */
        public String getAccess_token(String appid, String appsecret) {
            //获取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
            return accessToken.getAccess_token();
        }
    
    }
    

    在需要做推送的地方调用WxPushServiceQcl类中的pushOneUser方法,并传入openid, formid参数即可。
    在这里插入图片描述
    这是我推送成功后打印的log

    下面来讲小程序端开发需要做些什么

    可以看出,我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。

    在这里插入图片描述

    所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了。

    在这里插入图片描述
    看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样

     <form report-submit='true' >
       <button  form-type='submit'>获取formid</button>
      </form>
    

    所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。
    在这里插入图片描述
    我的小程序是跑腿小程序,消息也主要推送给跑腿员的,而跑腿员点击最多的也就是这两个条目,所以我们就用from组件来伪装这两个条目,让用户在点击的同时就可以收集到用的formid。

     <view class='button_item'>
      <form class="form_item" bindsubmit='gorRunnerLobby' report-submit='true' data-type="1">
       <button class="button" form-type='submit'>
        <text>抢单大厅</text>
        <text class='runner_desc'>(兼职也可月入万元)</text>
       </button>
      </form>
      <view class='right_arrow' />
     </view>
    

    这样就可以在用户点击条目时,收集到用户formid了
    在这里插入图片描述
    由于上面的botton有默认样式,所以我们就通过修改css来去除botton默认样式。

    .button_item {
     width: 100%;
     display: flex;
     flex-direction: row;
     align-items: center;
     padding: 2px 20px;
     background: white;
     border-bottom: 1px solid gainsboro;
    }
    /* 主要通过这里去除botton默认样式 */
    .button {
     width: 100%;
     background: white;
     border: none;
     text-align: left;
     padding: 6px 0px;
     margin: 0px;
     line-height: 1.5;
    }
    
    /* 主要通过这里去除botton边框 */
    .button::after {
     border: none;
    }
    
    /* 用button伪装获取formid */
    
    .form_item {
     width: 100%;
    }
    

    到这里我们小程序端也圆满完成自己的任务了。

    补充知识点

    这样我们java后台和小程序开发就可以开开心心的完成微信小程序的消息推送功能了。

    如果有java或小程序相关的问题可以加我微信交流学习2501902696(备注小程序或java)

    视频讲解:https://edu.csdn.net/course/detail/23750

    展开全文
  • 前面写过一篇云开发实现小程序订阅消息(模板消息推送的文章,《借助云开发实现小程序订阅消息和模板消息推送功能》是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序订阅消息推送的文章。...

    前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,《借助云开发实现小程序订阅消息和模板消息的推送功能》是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序订阅消息推送的文章。

    老规矩先看效果图

    至于如何创建模板消息,如果获取模板id我这节就不再讲解,不知道的同学可以查看我上篇文章《借助云开发实现小程序订阅消息和模板消息的推送功能》里面有详细的讲解。

    今天呢就来重点讲下如何在Java后台编写小程序订阅消息推送的知识。

    其实我很早之前有写过一篇Java实现模板消息推送的,但是小程序后面用订阅消息替换了模板推送,所以我也会根据最新的知识点不定期的更新文章的。

    发送订阅消息三步走

    • 1,拿到用户的openid
    • 2,获取access_token
    • 3,调用小程序消息推送的接口

    一,获取用户的openid

    关于用户openid的获取,我写过很多篇文章了,也有录过视频出来的,还不知道怎么获取的同学,可以取翻看下我之前的文章,或者看下我录制的零基础入门小程序的视频:《5小时零基础入门小程序云开发》 所以这一步不是今天的重点。

    二,获取access_token

    首先来看下access_token是什么,下图是官方给出的

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

    • 看下官方文档,可以知道我们需要用到下面的几个参数

      grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到,我也有录视频教大家如何拿到,如果不知道怎么获取的同学可以取看下我的视频。

    下面就是Java代码的编写了

    我们这里用的是springboot,这里涉及到一个请求小程序官方接口,所以我们这里用了springboot自带的RestTemplate来做网络请求。具体代码如下。

    可以看出代码很简单,就是用RestTemplate来实现一个get请求,这样我们就可以轻松的获取到了access_token。

    注意点

    关于这个access_token,是存在有效期的,来看下官方给出的提示

    所以我要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。由于这里不是本节的重点,我这里只给大家说下原理。

    三,发送消息到小程序

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

    上面的参数都是我们发送消息时需要的。这些参数的定义和设置我在前面的文章里也都讲过了,不知道的同学可以去看下我前面写的这篇文章 《借助云开发实现小程序订阅消息和模板消息的推送功能》

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


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

    推送的Java代码如下


    可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容。。。

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


    我们在浏览器里调用上面接口,可以看到下图所示,这样就代表我们消息推送成功了。

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

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

    对应的两个数据类如下
    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;//推送文字
    
        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;
        }
    }
    

    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发送小程序消息的功能了。完整代码也已经贴给大家了。

    后面我会写更多Java和小程序相关的文章出来,敬请期待

    展开全文
  • 最近需要开发微信和小程序推送功能,需要用java后台实现推送,自己本身java小程序都做,所以就自己动手实现小程序的模版推送功能推送实现思路 1 小程序获取用户openid,收集formid传给java后台 2 java推...

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

    实现思路

    • 1 小程序获取用户openid,收集formid传给java后台
    • 2 java推送消息给指定小程序用户

    老规矩,还是先看效果图

    我的这个是跑腿抢单推送,当用户新下单时,会给跑腿员推送消息。

    下面开始讲解实现步骤

    一,微信小程序管理后台开通模版推送

    这里的模版id很重要,接下来我们推送的都是这个模版。

    二,java后台实现推送所需字段

    • 1 看微信官方推送消息所需要的字段

    • 2 有了官方说明,我门接下来就去拿到官方所需要的这些字段,来组装请求数据就可以了。

    三,下面讲解实现步骤

    我的java后台是基于springboot开发的,如果你不了解spring boot,建议你先去了解下springboot再回来接着学习。 还有RestTemplate是我们java后台做get和post请求必须的,我们和微信服务器交互就用的RestTemplate

    • 1 首先根据官方推送所需字段组装java-bean 这里用到两个javabean
    /*
    * 小程序推送所需数据
    * qcl 微信:2501902696
    * */
    @Data
    public class WxMssVo {
        private String touser;//用户openid
        private String template_id;//模版id
        private String page = "index";//默认跳到小程序首页
        private String form_id;//收集到的用户formid
        private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段
        private Map<String, TemplateData> data;//推送文字
    }
    复制代码
    /*
    * 设置推送的文字和颜色
    * qcl 微信:2501902696
    * */
    @Data
    public class TemplateData {
        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        private String value;//,,依次排下去
    //    private String color;//字段颜色(微信官方已废弃,设置没有效果)
    }
    复制代码

    到这里请求推送的数据就组装好了,解下来我们去实现推送功能。 奥不对,还有一个重要的字段需要获取到:access_token

    access_token的获取

    /*
        * 获取access_token
        * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
        * */
        public String getAccess_token(String appid, String appsecret) {
            //获取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
            return accessToken.getAccess_token();
        }
    复制代码

    这次是真正的可以来请求微信服务器来实现消息推送了

    /*
        * 微信小程序推送单个用户
        * */
        public String pushOneUser(String openid, String formid) {
    
    
            //获取access_token
            String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                    "?access_token=" + access_token;
    
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用户openid
            wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
            wxMssVo.setForm_id(formid);//formid
    
    
            Map<String, TemplateData> m = new HashMap<>(5);
    
            //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
            TemplateData keyword1 = new TemplateData();
            keyword1.setValue("新下单待抢单");
            m.put("keyword1", keyword1);
    
            TemplateData keyword2 = new TemplateData();
            keyword2.setValue("这里填下单金额的值");
            m.put("keyword2", keyword2);
            wxMssVo.setData(m);
    
            TemplateData keyword3 = new TemplateData();
            keyword3.setValue("这里填配送地址");
            m.put("keyword3", keyword3);
            wxMssVo.setData(m);
    
            TemplateData keyword4 = new TemplateData();
            keyword4.setValue("这里填取件地址");
            m.put("keyword4", keyword4);
            wxMssVo.setData(m);
    
            TemplateData keyword5 = new TemplateData();
            keyword5.setValue("这里填备注");
            m.put("keyword5", keyword5);
            wxMssVo.setData(m);
    
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            log.error("小程序推送结果={}", responseEntity.getBody());
            return responseEntity.getBody();
        }
    复制代码

    openid可以让小程序开发人员给你传过来,也可以自己获取。 formid需要小程序开发给你传过来,你也可以把formid存到数据库里,什么时候需要直接拿出来用就可以了。 注意:formid必须和用户openid对应。

    下面贴出来完整代码

    package com.qcl.paotuischool.wechat;
    
    import com.google.gson.Gson;
    import com.qcl.userwechat.bean.AccessToken;
    import com.qcl.utils.ConstantUtils;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * Created by qcl on 2018/9/11.
     * 微信小程序推送服务,
     * 包含获取access_token的服务
     */
    @Service
    @Slf4j
    public class WxPushServiceQcl {
        //用来请求微信的get和post
        @Autowired
        private RestTemplate restTemplate;
    
    
        /*
        * 微信小程序推送单个用户
        * */
        public String pushOneUser(String openid, String formid) {
    
    
            //获取access_token
            String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                    "?access_token=" + access_token;
    
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用户openid
            wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
            wxMssVo.setForm_id(formid);//formid
    
    
            Map<String, TemplateData> m = new HashMap<>(5);
    
            //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
            TemplateData keyword1 = new TemplateData();
            keyword1.setValue("新下单待抢单");
            m.put("keyword1", keyword1);
    
            TemplateData keyword2 = new TemplateData();
            keyword2.setValue("这里填下单金额的值");
            m.put("keyword2", keyword2);
            wxMssVo.setData(m);
    
            TemplateData keyword3 = new TemplateData();
            keyword3.setValue("这里填配送地址");
            m.put("keyword3", keyword3);
            wxMssVo.setData(m);
    
            TemplateData keyword4 = new TemplateData();
            keyword4.setValue("这里填取件地址");
            m.put("keyword4", keyword4);
            wxMssVo.setData(m);
    
            TemplateData keyword5 = new TemplateData();
            keyword5.setValue("这里填备注");
            m.put("keyword5", keyword5);
            wxMssVo.setData(m);
    
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            log.error("小程序推送结果={}", responseEntity.getBody());
            return responseEntity.getBody();
        }
    
        /*
        * 获取access_token
        * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
        * */
        public String getAccess_token(String appid, String appsecret) {
            //获取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
            return accessToken.getAccess_token();
        }
    
    }
    复制代码

    在需要做推送的地方调用WxPushServiceQcl类中的pushOneUser方法,并传入openid, formid参数即可。

    这是我推送成功后打印的log

    下面来讲小程序端开发需要做些什么

    可以看出,我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。

    所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了。

    看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样

     <form report-submit='true' >
       <button  form-type='submit'>获取formid</button>
      </form>
    复制代码

    所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。

    我的小程序是跑腿小程序,消息也主要推送给跑腿员的,而跑腿员点击最多的也就是这两个条目,所以我们就用from组件来伪装这两个条目,让用户在点击的同时就可以收集到用的formid。

     <view class='button_item'>
      <form class="form_item" bindsubmit='gorRunnerLobby' report-submit='true' data-type="1">
       <button class="button" form-type='submit'>
        <text>抢单大厅</text>
        <text class='runner_desc'>(兼职也可月入万元)</text>
       </button>
      </form>
      <view class='right_arrow' />
     </view>
    复制代码

    这样就可以在用户点击条目时,收集到用户formid了

    由于上面的botton有默认样式,所以我们就通过修改css来去除botton默认样式。

    .button_item {
     width: 100%;
     display: flex;
     flex-direction: row;
     align-items: center;
     padding: 2px 20px;
     background: white;
     border-bottom: 1px solid gainsboro;
    }
    /* 主要通过这里去除botton默认样式 */
    .button {
     width: 100%;
     background: white;
     border: none;
     text-align: left;
     padding: 6px 0px;
     margin: 0px;
     line-height: 1.5;
    }
    
    /* 主要通过这里去除botton边框 */
    .button::after {
     border: none;
    }
    
    /* 用button伪装获取formid */
    
    .form_item {
     width: 100%;
    }
    复制代码

    到这里我们小程序端也圆满完成自己的任务了。

    补充知识点

    这样我们java后台和小程序开发就可以开开心心的完成微信小程序的消息推送功能了。

    如果有java或小程序相关的问题可以加我微信交流学习2501902696(备注小程序或java)

    转载于:https://juejin.im/post/5b9760375188255c54428e8c

    展开全文
  • 其实我之前有写过一篇:《springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码》 但是有同学反应这篇文章里的代码太繁琐,接入也比较麻烦。今天就来给大家写个精简版的,基本上只需要几行代码,就...

    视频讲解地址:https://edu.csdn.net/course/play/23750/268139

    我们在做小程序开发时,消息推送是不可避免的。今天就来教大家如何实现小程序消息推送的后台和前台开发。源码会在文章末尾贴出来。

    其实我之前有写过一篇:《springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码》 但是有同学反应这篇文章里的代码太繁琐,接入也比较麻烦。今天就来给大家写个精简版的,基本上只需要几行代码,就能实现小程序模版消息推送功能。

    老规矩先看效果图
    在这里插入图片描述
    这是我们最终推送给用户的模版消息。这是用户手机微信上显示的推送消息截图。

    本节知识点

    1,java开发推送后台
    2,springboot实现推送功能
    3,小程序获取用户openid
    4,小程序获取fromid用来推送

    先来看后台推送功能的实现

    只有下面一个简单的PushController类,就可以实现小程序消息的推送
    在这里插入图片描述
    再来看下PushController类,你没看错,实现小程序消息推送,就需要下面这几行代码就可以实现了。
    在这里插入图片描述
    由于本推送代码是用springboot来实现的,下面就来简单的讲下。我我们需要注意的几点内容。
    1,需要在pom.xml引入一个三方类库(推送的三方类库)
    在这里插入图片描述
    pom.xml的完整代码如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.qcl</groupId>
        <artifactId>wxapppush</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>wxapppush</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!--微信小程序模版推送-->
            <dependency>
                <groupId>com.github.binarywang</groupId>
                <artifactId>weixin-java-miniapp</artifactId>
                <version>3.4.0</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    其实到这里我们java后台的推送功能,就已经实现了。我们只需要运行springboot项目,就可以实现推送了。
    下面贴出完整的PushController.java类。里面注释很详细了。

    package com.qcl.wxapppush;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import cn.binarywang.wx.miniapp.api.WxMaService;
    import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
    import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
    import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
    import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
    import me.chanjar.weixin.common.error.WxErrorException;
    
    /**
     * Created by qcl on 2019-05-20
     * 微信:2501902696
     * desc: 微信小程序模版推送实现
     */
    @RestController
    public class PushController {
    
        @GetMapping("/push")
        public String push(@RequestParam String openid, @RequestParam String formid) {
            //1,配置小程序信息
            WxMaInMemoryConfig wxConfig = new WxMaInMemoryConfig();
            wxConfig.setAppid("wx7c54942dfc87f4d8");//小程序appid
            wxConfig.setSecret("5873a729c365b65ab42bb5fc82d2ed49");//小程序AppSecret
    
            WxMaService wxMaService = new WxMaServiceImpl();
            wxMaService.setWxMaConfig(wxConfig);
    
            //2,设置模版信息(keyword1:类型,keyword2:内容)
            List<WxMaTemplateData> templateDataList = new ArrayList<>(2);
            WxMaTemplateData data1 = new WxMaTemplateData("keyword1", "获取老师微信");
            WxMaTemplateData data2 = new WxMaTemplateData("keyword2", "2501902696");
            templateDataList.add(data1);
            templateDataList.add(data2);
    
            //3,设置推送消息
            WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder()
                    .toUser(openid)//要推送的用户openid
                    .formId(formid)//收集到的formid
                    .templateId("eDZCu__qIz64Xx19dAoKg0Taf5AAoDmhUHprF6CAd4A")//推送的模版id(在小程序后台设置)
                    .data(templateDataList)//模版信息
                    .page("pages/index/index")//要跳转到小程序那个页面
                    .build();
            //4,发起推送
            try {            wxMaService.getMsgService().sendTemplateMsg(templateMessage);
            } catch (WxErrorException e) {
                System.out.println("推送失败:" + e.getMessage());
                return e.getMessage();
            }
            return "推送成功";
        }
    }
    

    看代码我们可以知道,我们需要做一些配置,需要下面信息
    1,小程序appid
    2,小程序AppSecret(密匙)
    3,小程序推送模版id
    4,用户的openid
    5,用户的formid(一个formid只能用一次)

    下面就是小程序部分,来教大家如何获取上面所需的5个信息。

    1,appid和AppSecret的获取(登录小程序管理后台)
    在这里插入图片描述
    2,推送模版id
    在这里插入图片描述
    3,用户openid的获取,可以看下面的这篇文章,也可以看源码,这里不做具体讲解
    小程序开发如何获取用户openid
    4,获取formid
    在这里插入图片描述
    看官方文档,可以知道我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。

    所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了

    在这里插入图片描述
    看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样

      <form report-submit='true' >
       <button  form-type='submit'>获取formid</button>
      </form>
    

    所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。

    下面简单写个获取formid和openid的完整示例,方便大家学习

    效果图
    在这里插入图片描述
    我们要做的就是点击获取formid按钮,可以获取到用户的formid和openid,正常我们开发时,是需要把openid和formid传给后台的,这里简单起见,我们直接用获取到的formid和openid实现推送功能

    下面来看小程序端的实现代码

    1,index.wxml
    在这里插入图片描述
    2,index.js
    在这里插入图片描述

    到这里我们小程序端的代码也实现了,接下来测试下推送。

    formid:  6ee9ce80c1ed4a2f887fccddf87686eb
    openid o3DoL0Uusu1URBJK0NJ4jD1LrRe0
    

    在这里插入图片描述
    可以看到我们用了上面获取到的openid和formid做了一次推送,显示推送成功

    在这里插入图片描述
    在这里插入图片描述

    到这里我们小程序消息推送的后台和小程序端都讲完了。

    这里有两点需要大家注意

    1,推送的openid和formid必须对应。
    2,一个formid只能用一次,多次使用会报一下错误。

    {"errcode":41029,"errmsg":"form id used count reach limit hint: [ssun8a09984113]"}
    

    这里就不单独贴出源码下载链接了,大家感兴趣的话,可以私信我,或者在底部留言,我会把源码下载链接贴在留言区。
    单独找我要源码也行(微信2501902696)

    编程小石头,码农一枚,非著名全栈开发人员。分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑。

    源码链接:https://github.com/qiushi123/wxapppush

    视频讲解地址:https://edu.csdn.net/course/play/23750/268139

    展开全文
  • 微信小程序 消息推送功能实现详解

    万次阅读 多人点赞 2018-09-05 19:30:57
    小程序开发中,如果想实现:用户发给小程序消息以及开发者需要的事件推送,在小程序项目中,我们想要实现这样一个功能, 比如我们小程序中的客服功能,我不想要使用小程序后台的在线客服功能,但我又想实现客服...
  • 上一节给大家将了借助云开发实现小程序支付功能,... 我们借助java后台虽然也能轻松的实现消息推送。但是呢?用java开发后台推送,必须要搭建服务器,学习java代码,部署java代码当然你就是做java开发的,或者学习...
  • 话不多说,直接上代码 实体类SendTemplateMessage public class SendTemplateMessage{ private String touser; //接收者(用户)的 ... //所需下发的模板消息的id private String page; //点击模板卡片后的跳...
  • //必须与在小程序后台->开发->开发配置->消息推送中填写的token一致, String token = "mytoken996" ; String [ ] arr = new String [ ] { token , timestamp , nonce } ; String result = ...
  • java开发小程序和微信消息推送后台

    千人学习 2019-04-12 16:26:16
    本课程将带领大家使用java实现微信公号和... 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3,微信公号模版推送功能的实现 4,小程序推送实现 5,入门小程序开发 6,搭建自己的后台服务器
  • 小程序消息推送及客服(JAVA后台)

    千次阅读 热门讨论 2019-06-12 10:43:03
    小程序客服及消息推送开发(后台JAVA) 最近公司在做小程序,涉及到客服及消息推送,简单的记录下开发过程及心得 客服 小程序自带的有客服功能只需要开启就行了. 选择开启后即可使用. 消息推送 首先在开发 ...
  • 实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/template-message/templateMessage.send.html 一、官方给...
  • 核心代码只有下面几行,即可轻松实现微信模版消息推送 //1,配置 WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage(); wxStorage.setAppId("wx77bb69292323a000"); ...
  • 微信小程序 消息推送功能实现

    千次阅读 2019-11-15 15:24:07
    小程序开发中,如果想实现:用户发给小程序消息以及开发者需要的事件推送,在小程序项目中,我们想要实现这样一个功能, 比如我们小程序中的客服功能,我不想要使用小程序后台的在线客服功能,但我又想实现客服...
  • Java后台+微信小程序实现推送 “服务通知”

    万次阅读 热门讨论 2019-05-10 16:17:34
    java+微信小程序发送服务通知
  • 在微信的官网上查询到,绑定在同一个微信开放者平台上,则会生成一个unionId,这个unionId在小程序端和在微信公众号端都是一样的,所以我们拿这个来实现向微信公众号推送模板消息的功能。 前期准备: 微信公众号:...
  • 其实我之前有写过一篇:《springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码》 但是有同学反应这篇文章里的代码太繁琐,接入也比较麻烦。今天就来给大家写个精简版的,基本上只需要几行代码,就...
  • 第三篇 用小程序给用户推送服务消息 ...小程序消息推送机制有两种一种是统一模板消息推送一种是客服消息,本章主要介绍在Java端向指定用户推送指定模板的消息。 模板推送又分为两种一种是用小...
  • 一.开发前准备 微信模板消息发送API (建议多看) ...1. ConfirmTemplate(推送接口) package com.zero.jimu.utils.pushMessage; import com.google.gson.Gson; import org.apache.ht...
  • JAVA实现企业微信的消息推送

    千次阅读 2020-07-20 11:50:34
    JAVA实现企业微信的消息推送(自建小应用) 【需求】将外部事件消息发送至企业微信,所在成员可以根据消息进行事件处理。 【实现流程】管理员在企业微信中自建小程序,将小程序的ID和微信的access_token作为接入连接...
  • 微信小程序之订阅消息推送JAVA开发

    万次阅读 多人点赞 2020-01-08 11:31:02
    2019年10月份微信发布了模板消息整改公告由模板消息更改为订阅消息: 具体公告地址:https://developers.weixin.qq.com/community/develop/doc/00008a8a7d8310b6bf4975b635a401?blockType=1 (悄悄告诉大家,大家...
  • * @param touser 用户openid,可以是小程序的openid,也可以是公众号的openid * @param appid 公众号appid * @param template_id 公众号模板消息模板id * @param url 公众号模板消息所要跳转的url * @param ...
  • Java实现小程序的订阅消息

    千次阅读 2019-12-24 11:08:58
    最近听说,小程序的模板消息即将下线,当时正好再做小程序的模板消息这一块,于是乎,去研究了一下小程序的订阅消息。今天就和大家分享一下,我做订阅消息的一些经验,希望能帮助到大家。注:后端用的SpringBoot。 ...
  • 得益于不同平台对websocket协议的广泛实现,它为跨多种平台的实时网络应用程序开发提供了极大的方便。 关于具体的websocket原理及应用场景,可以看这篇文章:https://www.goeasy.io/articles/673.html 下面我将...
  • 002java实现微信模版消息推送 本节知识点 1,注册微信公号测试账号 2,获取测试账号的用户openid 3,接入微信推送sdk 4,实现微信推送 课程中用到的网址和文件 1,微信官方注册测试账号:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,156
精华内容 21,662
关键字:

java实现小程序消息推送

java 订阅