精华内容
下载资源
问答
  • 微信小程序推送模板消息功能,基于springboot ,包含前端和后端全流程
  • 主要介绍了python实现小程序推送页面收录脚本,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 最近需要开发微信和小程序推送功能,需要用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和小程序相关的文章出来,敬请期待

    展开全文
  • 微信小程序推送模板消息

    万次阅读 多人点赞 2018-07-24 18:08:34
    今天KingYiFan给大家分享一下小程序模板消息推送: 根据微信小程序最新机制:2019年10月份微信发布了最新模板消息整改公告,由模板消息更改为订阅消息,模板消息将于2020年1月10日下线,下线后这篇文章将失效。最新...

    今天KingYiFan给大家分享一下小程序模板消息推送:


    根据微信小程序最新机制:2019年10月份微信发布了最新模板消息整改公告,由模板消息更改为订阅消息,模板消息将于2020年1月10日下线,下线后这篇文章将失效。最新微信订阅消息文章已发布,请大家移步:https://blog.csdn.net/weixin_39984161/article/details/103888343

    公告如下:

    file

     

    什么是微信模板推送呢?
    废话不多说先上一张熟悉图
    活动行

    你们有没有收到这些通知。顿时是不是觉得活动性感觉很牛掰。

    what?? 感觉好牛逼的样子。

    今天就来教大家怎么实现。

    老规矩先甩一下微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF
    我是一个很懒的人从来不看微信官方文档,写的太笼统(完全看不懂~~~)。

    原来我用这个玩意用的老疯狂了。天天给我喜欢的女孩推送,我喜欢你。哈哈哈 比如xxx是女神了。哈哈哈
    确实做一个程序员确实能给女朋友很多浪漫的地方。为了保护我家女神隐私哈哈哈,我就不上图了。 等你们学会可以自己给女朋友退送表白信息哦。。


    原来可以随便推,只要知道用户openid 就能无限制推,推到把小程序封了。。。
    --------普及一下微信推送的好处。
    微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单、支付成功。一次只能发一条,当然可以通过某种方法发送多条,KingYiFan就不在这里赘述了。下面就介绍一下如何推送消息。

    微信现在改成了只有用户点了小程序,然后生成一个fromId 该死的fromId 也就是用户不点你小程序按钮,就不会推送。好尴尬。并且这个fromId既然是一个按钮。。我靠微信真的是太坑了。。。

    来吧上教程吧。。。

    一、准备工作

    首先,在微信小程序后台开通消息推送功能,并添加消息模板。可以从模板库选择模板也可以创建一个模板,模板添加之后,模板ID我们接下来要用的。
    

    插一个小小的话题。。。。
    昨天我发了微信支付,有人问我微信小程序后台管理系统怎么进入。。。。。。
    晕。。。。。这都不知道,你让我还能说什么呢。。。。
    悄悄告诉你,当时KingYiFan也当时没找到,该死的微信隐藏的太深了。。。


    注册小程序,我这就不赘述了。然后直接在微信公众平台登录就可以了。公众号也能登录,小程序也能登录。
    哈哈哈哈哈~~ 是不是很扯,马爸爸说小程序是未来的趋势。。怎么不给他们开一个独立的平台。后来我给马爸爸发了一封邮件,马爸爸说 小龙给忘了。。哈哈哈哈哈 上面纯属瞎说啊。。

    废话不多说。开始之前打个广告吧。下面的是KingYiFan的小程序。纯属GitHub拉去的。反正这个小程序很牛逼
    微信小程序


    这是微信小程序登录后台管理系统。
    (别问我为什么叫彩狼阁~~)

    找到模板消息。

    新建一个模板。。。

    然后点击提交----

    就变成了这个样子。。一点要把模板id保存到钱包里,丢了就不能和KingYiFan一起装逼了

    好了,大家一定要看好 我要开始装逼(▼へ▼メ)了

    纳尼,刚刚有人问我,appid怎么获取?

    好咱们继续哈。。
    刚刚说了半天fromId 这么牛逼的字符串,要获取呢?
    --下面是微信说的
    在需要触发消息推送的页面添加提交表单的事件。目的是得到formID,formID是消息推送时必须的参数。

    <form name='pushMsgFm' report-submit='true' bindsubmit='getFormID'>
          <button form-type="submit" class="zan-btn zan-btn--large zan-btn--danger payButton">有本事点我啊~~~</button>
        </form>
    

    以上代码中“getFormID”是提交表单时触发的事件。

    getFormID: function (e) {
             this.setData({
        formId: e.detail.formId
            })
        }
    

    三下五除二就把fromId获取了 是不是感觉懵逼。为什么腾讯获取fromId放到from表单提交里。
    因为fromId 是from的儿子啊哈哈哈哈~~~
    好了,不闹了,这是微信防止恶意给用户推送信息骚扰客户。具体为什么表单 我也不知道····


    是不是上面的都没有看懂呢,就要开始下面了,如果你是小程序开发人员肯定能看懂,如果你和KingYiFan一样是后台程序猿,就把上面代码扔给前段工程师就好了。别问为什么,他一定会感谢你。

    先来看看微信官方的API
    接口地址-请求方式

    你们是不是想问我access_token是什么鬼。哈哈哈哈 这个给你们扔一个APi文档你们看看就明白了就是一个微信调取APi凭证,一会给你们分享一个工具类 直接用就行。。

    看看API参数

    还有废弃参数,这又是什么鬼。。。来吧让你们看一些熟悉的东西。

        /**
         * @throws @author: KingYiFan
         * @Title: main别问我为什么这么LOW 还用main方法,我只想告诉你main方法是最牛逼的方法没有之一
         * @Description: 测试推送
         * @param:  args
         * @return: void
         */
        public static void main(String[] args) {
            //封装了推送实体类,别问我为什么一直封装,java三特性 继承 封装 多态
            com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplate tem = new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplate();
            //模板id 刚刚获取废了很成时间 如果还不会,我觉得你应该放弃java了
            tem.setTemplateId("_yPJaTTc7zmPliitwUm0VY4wjRRvuVOdk57tA1Nggw0");
            //推送给哪位神仙。 这个是openId 不是UnionID 如果是unionId肯定推送不过去。
            tem.setToUser("oHi8u5dZc6whcGp8DpUv7h-iM12g");
            //fromId 这个炒鸡重要,没有他百分百推送不成功,fromId+openId 才能推送
            tem.setForm_id("679293f4f93c31e15d1f14dcf3f77d5a");
            //用户点击之后调到小程序哪个页面 找你们前段工程师提供即可
            tem.setPage("pages/welcome/welcome");
            //有封装了一个实体类 哈哈哈 这个是模板消息参数
            List<com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam> paras = new ArrayList<com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam>();
            //这个是满参构造 keyword1代表的第一个提示  红包已到账这是提示 #DC143C这是色值不过废弃了
            com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam templateParam = new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam(
                    "keyword1", "红包已到账", "#DC143C");
            //装进小参数结合中
            paras.add(templateParam);
            //我就不嘚瑟了 省点劲直接扔进去算了哈哈哈哈哈~~~~
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword2", "刘骞", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword3", "0.02元", "#DC143C"));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword4", "成功成为您店铺的会员", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword5", "卓志海", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword6", "暂无推荐店铺", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword7", "红包已到您app账户,请尽快查询", "#0000FF"));
    
            //这里写的挺恶心的,不想抽取工具了。直接转换时间戳把
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date temp = new Date();
            String str = "";
            str = sdf.format(temp);
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword8", str, ""));
            //然后把所有参数扔到大的模板中
            tem.setTemplateParamList(paras);
            //模板需要放大的关键词,不填则默认无放大
            tem.setEmphasis_keyword("keyword1.DATA");
            //获取token凭证。
            Token token = com.jiaewo.house.wxxcx.util.CommonUtil.getToken();
            String accessToken = token.getAccessToken();
            //最后一步请求接口哈哈哈  推送成功
            boolean result1 = com.jiaewo.house.wxxcx.util.CommonUtil.sendTemplateMsg(accessToken, tem);
            if (result1) {
                System.err.println("推送成功");
            } else {
                System.err.println("推送失败");
            }
        }
    

    是不是感觉炒鸡简单。。。。。没错哈哈哈哈。。。

    来继续甩代码和工具类---

    /**
         * @ClassName: Template
         * @Description:小程序微信推送模版model
         * @author: KingYiFan
         * @date: 2018年3月5日 下午4:17:25
         */
        public class wxsmallTemplate {
    
        // 消息接收方
        private String toUser;
        // 模板id
        private String templateId;
        // 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
        private String page;
    
        // 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
        private String form_id;
    
        // 模板内容字体的颜色,不填默认黑色 【废弃】
        private String color;
        // 模板需要放大的关键词,不填则默认无放大
        private String emphasis_keyword;
    
        // 参数列表
        private List<wxsmallTemplateParam> templateParamList;
    
        public String getToUser() {
            return toUser;
        }
    
        public void setToUser(String toUser) {
            this.toUser = toUser;
        }
    
        public String getTemplateId() {
            return templateId;
        }
    
        public void setTemplateId(String templateId) {
            this.templateId = templateId;
        }
    
        public String getPage() {
            return page;
        }
    
        public void setPage(String page) {
            this.page = page;
        }
    
        public String getForm_id() {
            return form_id;
        }
    
        public void setForm_id(String form_id) {
            this.form_id = form_id;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public String getEmphasis_keyword() {
            return emphasis_keyword;
        }
    
        public void setEmphasis_keyword(String emphasis_keyword) {
            this.emphasis_keyword = emphasis_keyword;
        }
    
        public List<wxsmallTemplateParam> getTemplateParamList() {
            return templateParamList;
        }
    
        public void setTemplateParamList(List<wxsmallTemplateParam> templateParamList) {
            this.templateParamList = templateParamList;
        }
    
        public String toJSON() {
            StringBuffer buffer = new StringBuffer();
            buffer.append("{");
            buffer.append(String.format("\"touser\":\"%s\"", this.toUser)).append(",");
            buffer.append(String.format("\"template_id\":\"%s\"", this.templateId)).append(",");
            buffer.append(String.format("\"page\":\"%s\"", this.page)).append(",");
            buffer.append(String.format("\"form_id\":\"%s\"", this.form_id)).append(",");
    
            buffer.append("\"data\":{");
            wxsmallTemplateParam param = null;
            for (int i = 0; i < this.templateParamList.size(); i++) {
                param = templateParamList.get(i);
                // 判断是否追加逗号
                if (i < this.templateParamList.size() - 1) {
    
                    buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"},", param.getName(),
                            param.getValue(), param.getColor()));
                } else {
                    buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"}", param.getName(),
                            param.getValue(), param.getColor()));
                }
    
            }
            buffer.append("},");
            buffer.append(String.format("\"emphasis_keyword\":\"%s\"", this.emphasis_keyword));
            buffer.append("}");
            return buffer.toString();
        }
        }
        /**  
         * @Title:  Token.java   
         * @Package com.jiaewo.house.entity    
         * @author: 家小二-风清扬   
         * @date:   2018年3月5日 下午4:39:38   
         * @version V1.0 
     */
    package com.jiaewo.house.entity;
    
    /**
     * @ClassName: Token
     * @Description:微信凭证实体类
     * @author: 家小二-风清扬
     * @date: 2018年3月5日 下午4:39:51
     * 
     * @Copyright: 2018 www.jiajiao2o.com Inc. All rights reserved.
     *             注意:本内容仅限于北京赢在路上科技有限公司内部传阅,禁止外泄以及用于其他的商业目
     */
    public class Token {
    
        // 接口访问凭证
        private String accessToken;
        // 凭证有效期,单位:秒
        private int expiresIn;
    
        public String getAccessToken() {
            return accessToken;
        }
    
        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }
    
        public int getExpiresIn() {
            return expiresIn;
        }
    
        public void setExpiresIn(int expiresIn) {
            this.expiresIn = expiresIn;
        }
    
    }
    

    参数Bean

    /**
         * @ClassName: TemplateParam
         * @Description:微信推送模版model
         * @author: KingYiFan
         * @date: 2018年3月5日 下午4:16:33
         */
        public class wxsmallTemplateParam {
        // 参数名称
        private String name;
        // 参数值
        private String value;
        // 颜色  废弃了哎。。。。。。。。。。。。。。。。。。。
        private String color;
    
        public wxsmallTemplateParam(String name, String value, String color) {
            this.name = name;
            this.value = value;
            this.color = color;
        }
    
        public wxsmallTemplateParam(String name, String value) {
            this.name = name;
            this.value = value;
    
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
        }
    

    获取接口访问凭证获取token

    /**
         * 获取接口访问凭证
         *
         * @param appid
         *            凭证
         * @param appsecret
         *            密钥
         * @return
         */
        public static Token getToken() {
            Token token = null;
            String requestUrl = token_url.replace("APPID", appID).replace("APPSECRET", secret);
            // 发起GET请求获取凭证
            JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    
            if (null != jsonObject) {
                try {
                    token = new Token();
                    token.setAccessToken(jsonObject.getString("access_token"));
                    token.setExpiresIn(jsonObject.getInt("expires_in"));
                } catch (JSONException e) {
                    token = null;
                    // 获取token失败
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"),
                            jsonObject.getString("errmsg"));
                }
            }
            return token;
        }
    

    推送消息 请求腾讯API

    public static boolean sendTemplateMsg(String token,
                com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplate template) {
    
            boolean flag = false;
    
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", token);
    
            net.sf.json.JSONObject jsonResult = httpsRequest(requestUrl, "POST", template.toJSON());
            System.err.println(template.toJSON());
            if (jsonResult != null) {
                Integer errorCode = jsonResult.getInt("errcode");
                String errorMessage = jsonResult.getString("errmsg");
                if (errorCode == 0) {
                    flag = true;
                } else {
                    System.out.println("模板消息发送失败:" + errorCode + "," + errorMessage);
                    flag = false;
                }
            }
            return flag;
        }
    

    剧终。。。。

    花絮··

    疑问1:用户只有点了生成fromId是不是才能推送?

    答:对没错,还有一种方法就是用户支付成功 prepay_id 用户支付成功可以连续推送三次哦!

    疑问2:怎么才能给用户无限制推送?

    答:目前微信是不支持的,不过KingYiFan想了一个歪点子,那就是吧所有按钮都弄成表单钮,然后用户点了,存起来。记住哈。fromId只有7天有效期,如果不用就浪费了。用完就没用了


    彩蛋开始哈哈哈。。原创 转载请说明出处

    KingYiFan教你无限制给用户推送消息KingYiFan教你无限制给用户推送消息

    1.封装小程序页面,诱导用户点击按钮,然后生成fromId

    2.把fromId存入数据库 然后设置一个有效期 起始时间 和过期时间。

    3.比如想给用户推送广告,在把fromId拿出来 直接推送。推送完删除。

    PS:只要用户点击就保存数据库别嫌多。越多就代表能和用户推无数条


    来吧给大家画一个流程图吧。


    上面就是一套完整的微信小程序推送流程,有什么不懂就联系我。


    鼓励作者写出更好的技术文档,就请我喝一瓶哇哈哈哈哈哈哈哈。。
    微信:

    支付宝:


    感谢一路支持我的人。。。。。
    Love me and hold me
    QQ:69673804(16年老号)
    EMAIL:69673804@qq.com
    友链交换
    如果有兴趣和本博客交换友链的话,请按照下面的格式在评论区进行评论,我会尽快添加上你的链接。


    网站名称:KingYiFan’S Blog
    网站地址:http://blog.cnbuilder.cn
    网站描述:年少是你未醒的梦话,风华是燃烬的彼岸花。
    网站Logo/头像:http://blog.cnbuilder.cn/upload/2018/7/avatar20180720144536200.jpg

     

    展开全文
  • springboot项目之小程序推送

    千次阅读 2018-12-25 17:21:56
    解释: 简单的说就是用户登陆过小程序那便可以,将自己想要推送的内容发送到用户的微信当中,微信当中有一个叫服务通知的东西,推送的内容会在上面显示。 上面这种消息模板是在微信公众平台–&amp;gt;功能–&...

    该篇文章主要讲的是后台如何对小程序登录的用户进行通知。

    ps:由于开发时间和写文章时间间隔过久,细节上的可能不是很详细,但是会把整体功能,以及代码实现贴上来。
    通知效果:
    在这里插入图片描述
    解释: 简单的说就是用户登陆过小程序那便可以,将自己想要推送的内容发送到用户的微信当中,微信当中有一个叫服务通知的东西,推送的内容会在上面显示。
    上面这种消息模板是在微信公众平台–>功能–>模板消息下面配置的,具体模板显示内容可以调整。

    1. 推送必须的东西
    在这里插入图片描述
    首先呢这两个一个叫小程序Id一个叫小程序密钥这两个是可以在微信公众平台查到的。
    接下来有三个url这个是发送推送消息必不可少的,第一个url是获取小程序全局唯一后台接口调用凭据;第二个接口是微信小程序推送接口,第三个接口是简单讲就是获取openId。然后微信开发者公众平台开发接口目录如下:微信公众平台开放接口

    //获取access_token
    private final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";
    //推送url
    private final static String PUSH_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=";
    //根据code换取openId
    //本接口应在后端服务器调用
    private final static String CODE_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=";
    

    以上这5个算是准备工作吧,然后接下来就是正式进入推送了。

    2. 首先我们创建一个获取openId的工具类
    根据官方文档和摸索一下,这个获取openId还是很简单的。
    官方上的解释是: 登录凭证校验。通过 wx.login() 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
    也就是说上面说的第三个接口,通过把code传递到后台,然后通过后台调用第三个接口,便可以获取我们想得到接口,具体代码如下:

    //获取小程序codeid换取openid
    	public static String getOpenId(String codeId) {
    		String url = CODE_URL + APP_ID + "&secret=" + SECRET + "&js_code=" + codeId + "&grant_type=authorization_code";
    		PrintWriter out = null;
    		BufferedReader in = null;
    		String line;
    		StringBuffer sb = new StringBuffer();
    		try {
    			URL realUrl = new URL(url);
    			// 打开和URL之间的连接
    			URLConnection conn = realUrl.openConnection();
    
    			// 设置通用的请求属性 设置请求格式
    			//设置返回类型
    			conn.setRequestProperty("contentType", "text/plain");
    			//设置请求类型
    			conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
    			//设置超时时间
    			conn.setConnectTimeout(1000);
    			conn.setReadTimeout(1000);
    			conn.setDoOutput(true);
    			conn.connect();
    			// 获取URLConnection对象对应的输出流
    			out = new PrintWriter(conn.getOutputStream());
    			// flush输出流的缓冲
    			out.flush();
    			// 定义BufferedReader输入流来读取URL的响应    设置接收格式
    			in = new BufferedReader(
    					new InputStreamReader(conn.getInputStream(), "UTF-8"));
    			while ((line = in.readLine()) != null) {
    				sb.append(line);
    			}
    			JSONObject jsonObject = JSONObject.parseObject(sb.toString());
    			return jsonObject.get("openid").toString();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		//使用finally块来关闭输出流、输入流
    		finally {
    			try {
    				if (out != null) {
    					out.close();
    				}
    				if (in != null) {
    					in.close();
    				}
    			} catch (IOException ex) {
    				ex.printStackTrace();
    			}
    		}
    		return null;
    	}
    

    这样我们就换取用户的唯一标识 openId,具体上面的代码可以直接复用也比较简单就不多啰嗦了。

    3. 接下来呢我们就要获取access_token(本接口应在后端服务器调用)
    关于access_token的官方解释: 获取小程序全局唯一后台接口调用凭据(access_token)。调用各后台接口时都需使用 access_token,开发者需要进行妥善保存。
    看官方的解释我们不难理解,access_token是调用微信后台接口比不可少的东西。注意事项官方也很明确的写出来了如下:在这里插入图片描述
    获取access_token工具类如下:

    
    public static JSONObject getAccessToken() {
    		String url = ACCESS_TOKEN_URL + "appid=" + APP_ID + "&secret=" + SECRET;
    		PrintWriter out = null;
    		BufferedReader in = null;
    		String line;
    		StringBuffer sb = new StringBuffer();
    		try {
    			URL realUrl = new URL(url);
    			// 打开和URL之间的连接
    			URLConnection conn = realUrl.openConnection();
    
    			// 设置通用的请求属性 设置请求格式
    			//设置返回类型
    			conn.setRequestProperty("contentType", "text/plain");
    			//设置请求类型
    			conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
    			//设置超时时间
    			conn.setConnectTimeout(1000);
    			conn.setReadTimeout(1000);
    			conn.setDoOutput(true);
    			conn.connect();
    			// 获取URLConnection对象对应的输出流
    			out = new PrintWriter(conn.getOutputStream());
    			// flush输出流的缓冲
    			out.flush();
    			// 定义BufferedReader输入流来读取URL的响应    设置接收格式
    			in = new BufferedReader(
    					new InputStreamReader(conn.getInputStream(), "UTF-8"));
    			while ((line = in.readLine()) != null) {
    				sb.append(line);
    			}
    			// 将获得的String对象转为JSON格式
    			JSONObject jsonObject = JSONObject.parseObject(sb.toString());
    			return jsonObject;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		//使用finally块来关闭输出流、输入流
    		finally {
    			try {
    				if (out != null) {
    					out.close();
    				}
    				if (in != null) {
    					in.close();
    				}
    			} catch (IOException ex) {
    				ex.printStackTrace();
    			}
    		}
    		return null;
    	}
    

    解释已经很详细了,最后再说一些细节的操作先把工具类放出来。

    4.推送工具类 (本接口应在后端服务器调用)
    推送的具体实现具体的参数啊,还是查看官方文档再次不多赘述了。模板消息推送官方解释
    代码如下:

    /**
     * 推送工具类
     * @author 柚子
     * @date 2018/12/25
     * @param params 推送消息内容
     * @param accessToken 
     * @return boolean
     */
    public static boolean setPush(String params, String accessToken) {
    		boolean flag = false;
    		String url = PUSH_URL + accessToken;
    		OutputStream outputStream = null;
    		InputStreamReader inputStreamReader = null;
    		InputStream inputStream = null;
    		BufferedReader bufferedReader = null;
    		HttpsURLConnection connection = null;
    		try {
    			// 创建URL对象
    			URL realUrl = new URL(url);
    			// 打开连接 获取连接对象
    			connection = (HttpsURLConnection) realUrl.openConnection();
    			// 设置请求编码
    			connection.addRequestProperty("encoding", "UTF-8");
    			// 设置允许输入
    			connection.setDoInput(true);
    			// 设置允许输出
    			connection.setDoOutput(true);
    			connection.setRequestMethod("POST");
    			connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
    			// 当outputStr不为null时向输出流写数据
    			if (null != params) {
    				outputStream = connection.getOutputStream();
    				// 注意编码格式
    				outputStream.write(params.getBytes("UTF-8"));
    				outputStream.close();
    			}
    			// 从输入流读取返回内容
    			inputStream = connection.getInputStream();
    			inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    			bufferedReader = new BufferedReader(inputStreamReader);
    			String str = null;
    			StringBuffer buffer = new StringBuffer();
    			while ((str = bufferedReader.readLine()) != null) {
    				buffer.append(str);
    			}
    			JSONObject jsonObject = JSONObject.parseObject(buffer.toString());
    			int errorCode = jsonObject.getInteger("errcode");
    			String errorMessage = jsonObject.getString("errmsg");
    			if (errorCode == 0) {
    				flag = true;
    			} else {
    				logger.info("模板消息发送失败:" + errorCode + "," + errorMessage);
    				flag = false;
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			// 依次关闭打开的输入流
    			try {
    				connection.disconnect();
    				bufferedReader.close();
    				inputStreamReader.close();
    				inputStream.close();
    				// 依次关闭打开的输出流
    				outputStream.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return flag;
    	}
    

    请求数据的示例在官网当中是有的,json形式的数据也就是对应params参数,accessToken参数我们是通过传递进来的当然也可以写死。
    5.最后的实现描述
    关于推送的实现的描述:
    代码如下所示:

    /**
    	 * 功能描述
    	 *
    	 * @param openId     小程序openId
    	 * @param formId     小程序formId
    	 * @param title      通知标题
    	 * @param content    通知内容
    	 * @return boolean
    	 * @author youzi
    	 * @date 2018/12/14
    	 */
    	private boolean pushNoticeUtil(String openId, String formId, String title,String content) {
    		logger.info("pushNoticeUtil方法开始");
    		//缓存access_token
    		if (redisUtils.get("access_token") == null || redisUtils.get("access_token").toString() == "") {
    			JSONObject jsonObject = getAccessToken();
    			if (jsonObject.get("expires_in") != null && jsonObject.get("expires_in").toString() != ""
    					&& Integer.parseInt(jsonObject.get("expires_in").toString()) == 7200) {
    				redisUtils.set("access_token", jsonObject.get("access_token"), 2 * 60 * 60L);
    			}
    		}
    		JSONObject jsonObject1 = new JSONObject();
    		jsonObject1.put("touser", openId);
    		// DINING_TEMPLATE 模板Id  微信公众平台添加模板时生成的ID
    		jsonObject1.put("template_id", DINING_TEMPLATE);
    		jsonObject1.put("form_id", formId);
    		JSONObject jsonObject2 = new JSONObject();
    		JSONObject jsonObject3 = new JSONObject();
    		jsonObject3.put("value", title);
    		jsonObject2.put("keyword1", jsonObject3);
    		jsonObject3 = new JSONObject();
    		jsonObject3.put("value", content);
    		jsonObject2.put("keyword2", jsonObject3);
    		jsonObject1.put("data", jsonObject2);
    		boolean pushResult = setPush(jsonObject1.toString(), redisUtils.get("access_token"));
    		logger.info("pushNoticeUtil方法结束:推送结果" + pushResult);
    		return pushResult;
    	}
    

    疑问: formId是什么? 简单的将就是小程序发送请求传递的一个东西,作用是用户发送消息模板消息,具体的获取官方文档如下:获取formId
    只是简单的解释一下可能不是很清楚,但是只要知道想要推送消息,那就必须要formId。
    整体流程:
    首先微信小程序登录,登录我们会获取到openId,将其和自己后台登录绑定到一起这样我们就可以保存下来openId用来推送,然后我们在小程序登录的时候模拟发送请求获取多个formId,将获取到的formId和openId保存到数据库表中,但是要注意formId是有时效性的如果时效了,推送也会推送不到用户。
    然后我们便可以准备推送了,推送时我们可以先获取accessToken,将accessToken 放进redis里面设置过期时间,如果过期了我们重新获取,否则不需要重新获取,官方的建议也是如此。然后组装我们的推送数据,具体的组装数据需要根据模板确定,但是形式上是一样,然后调用推送此时便可以发现推送成功了。
    最后: 如果还有疑问的话大家可以联系我,一起探讨一下qq704273004,谢谢。

    展开全文
  • //发送模板消息 需要注意的是openid需为触发当前事件人的openid,不然收不到推送消息 wx.request({ url: 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send? access_token=access_...
  • TP5之微信小程序推送模板消息

    千次阅读 2018-09-28 15:35:22
    TP5之微信小程序推送模板消息 1.获取formId并且存储起来,获取formId方法见:https://blog.csdn.net/u010481239/article/details/78239121 2.后端触发后根据openId与formId是否可用推送模板消息,下面是根据付款后推...
  • 最近需要开发微信和小程序推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下小程序的模版推送功能推送。 实现思路 1 小程序获取用户openid,收集formid传给java后台 2 java...
  • 小程序推送代码到远程库

    千次阅读 2019-08-22 18:07:24
    微信开发者工具推送小程序代码到码云仓库 1.打开微信开发者工具右上角版本管理 2.打开左侧设置,在设置中配置远程库的地址,你的远程库用户名,密码 3.推送代码到远程库(这里我使用的是码云仓库) 远程库的地址添加到...
  • 微信小程序的消息推送简单的说就是发送一条微信通知给用户,用户点开消息可以查看消息内容,可以链接进入到小程序的指定页面。 一、准备工作 首先,在微信公众平台开通消息推送功能,并添加消息模板。可以从模板库...
  • Created with Raphaël 2.1.2从微信小程序后台创建模板获取access_token拼接微信teamplatedata发送到微信推送消息 收集form_id 有时我们需要A用户操作后对B用户推送模板消息这是就需要前台收集form_id以便保存用...
  • thinkphp5 微信小程序推送模板消息

    千次阅读 2019-05-11 15:12:30
     $template_id = '登录微信小程序上创建模板消息的模板秘钥';  $res = $this->send_template($wx['openid'],$template_id,$d['formid'],$data,$d['id'],$d['orderid'],2,1,$page);  return json_encode(array('...
  • 小程序推送消息 formId

    千次阅读 2019-02-15 18:21:48
    介绍:小程序的 from_id 要在用户发生操作的时候才能产生,所以我们可以用以下方法来做 (手动触发,保存formID,后台接收保存在数据库里)   什么是formId formId是小程序可以向用户发送模板消息的通行证,简单...
  • 小程序推送代码至码云

    千次阅读 2019-12-16 17:45:32
    一、怎么上传代码到码云仓库 ...   ...2、打开微信开发者工具客户端 --- 版本管理 --- 初始化Git仓库 -- 默认初始化就可以 ...8、点击推送,之后进入码云,...强制推送即可,刷新码云,项目也更新,之后操作不做细说了
  • 这里是微信官方微信文档,请详细观看 后端推送官方文档 如何调第三方微信接口 后端推送调微信第三方接口的详情操作
  • 微信小程序 推送模板教程 附源码

    千次阅读 2018-08-17 16:14:10
    首先模板推送 需要准备一些材料 准备材料:1)公众号|小程序,添加选择的模板消息,2)在设置&gt;开发设置页面,开通消息模板功能;如:   如果还没模板素材的 请新建一个 根据自己的需求去 模板库里面选择  ...
  • 总的来说,小程序推送消息并不难,也仅仅是几个接口而已。现在改版为 订阅消息 后,那接入起来就更加方便了。再过一个月,你们使用小程序的时候可能就会收到各种的弹窗提醒你们是否要授权xxx模板消息。 不知道大家看...
  • 近日公司要进行小程序开发,姑且担任开发一职. 首先对标题的解释,由于对组件以及功能进行熟悉以及初稿编写,appId以及小程序密钥使用个人的,之后提示appID没有发送模板消息权限错误提示内容{ "errcode" 48001, " ...
  • 以支付为例,效果图如下 ...这样就完成了订单支付完成直接推送消息,小程序前端不需要任何处理 errcode: 41028, errmsg: "invalid form id hint :解决办法------》小程序真机调试 代码参考转载  ...
  • 微信小程序消息推送

    2018-05-28 09:15:19
    微信小程序推送消息给用户,如用户支付成功、订单提交成功,推送成功消息。可以通过消息进入小程序特定页面。
  • 确实,完成一个小程序推送后端很简单,可能只需要几行代码! 但!小程序的access_token维持、上千万推送队列实现、推送数据结果统计等等的功能,可不是个人开发者短时间内能完成的! 我们更希望,开发者们能把重...
  • 首先进行小程序 推送模板的配置 step 1 : 登录小程序 点击右边的开发菜单 step 2 :在点击右边开发设置 下面有一个消息推送 根据相对应的提示完成配置 (配置的url: 启用并设置消息推送配置后,用户发给小程序的消息...
  • 本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot ...4,小程序推送的实现 5,入门小程序开发 6,搭建自己的后台服务器
  • 小程序开发之推送订阅消息

    千次阅读 2020-03-20 09:09:53
    小程序推送消息 本文介绍的是未关联公众号的小程序推送订阅消息的方法,订阅消息会直接推送给微信的“服务通知”这个订阅号。纯前端代码,仅供参考~ 订阅消息实现步骤: 1)获取用户的openid和access_token(openid...
  • 微信小程序 消息推送功能实现详解

    万次阅读 多人点赞 2018-09-05 19:30:57
    小程序开发中,如果想实现:用户发给小程序的消息以及开发者需要的事件推送,在小程序项目中,我们想要实现这样一个功能, 比如我们小程序中的客服功能,我不想要使用小程序后台的在线客服功能,但我又想实现客服...
  • 其实我之前有写过一篇:《springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码》 但是有同学反应这篇文章里的代码太繁琐,接入也比较麻烦。今天就来给大家写个精简版的,基本上只需要几行代码,就...
  • 其实我之前有写过一篇:《springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码》 但是有同学反应这篇文章里的代码太繁琐,接入也比较麻烦。今天就来给大家写个精简版的,基本上只需要几行代码,就...
  • 主要为大家详细介绍了PHP实现小程序批量通知推送,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 133,796
精华内容 53,518
关键字:

小程序推送