微信小程序消息推送


 

简介

微信小程序发送消息推送到用户微信上

基础流程

  1.  用户登录 :获取微信提供的openid
  2.  开发者去微信公众平台申请模板:获得模板id
  3. 授权消息推送:在小程序中调用wx.requestSubscribeMessage方法
  4. 成功后将数据保存到后台 消息推送表
  5. 在需要发送消息推送时:查询 消息推送表 如果有,使用 消息推送表 的数据调用接口subscribeMessage.send

实际流程

1.1用户微信登录(缓存opid)
1.2用户普通登录(无opid)


2 消息推送申请
2.1用户授权
2.1.1无opid(弹框要求 微信登录(类似第一步)
2.1.2有opid(继续
2.2获得了授权的模板id和opid
3传输到后台,后台存储到消息推送表,参数:模板id,opid,用户名称,身份证。默认参数:是否发送为N,创建时间,主键 ,发送时间为空
4后台定时器,查询到要发送的用户时,查询消息推送表,修改发送状态为Y,更新发送时间,然后发送微信小程序消息推送

代码

1用户微信小程序登录

wx.login({
        success: res => {
          console.log(res);
          // 发送 res.code 到后台换取 openId, sessionKey, unionId  
          request.post('后台用小程序id和密钥获取Openid的接口.do', {
            code: res.code
          }).then((res) => {
            console.log(res);
            let result = JSON.parse(res.result);
            wx.setStorageSync('openid',result.openid)//缓存openid
            that.setData({
              sessionKey: result.session_key
            })
          });
        }
      })

2 消息推送授权

let templateId = '模板id';
wx.requestSubscribeMessage({
      tmplIds: [templateId],
      success (res) {
        console.log(res);
        if(res.模板id =='reject'){//被拒绝

        }else{//同意
//获取缓存的openid,可能是之前用户登录时存放的
          let opid = wx.getStorageSync('openid');
          //如果有OPID,直接发送
          if(opid){
//执行保存到后台的操作
            that.saveSubMssage(opid,templateId);
          }else{
            
              wx.showToast({
                title: '需要关联微信账号',
                icon: 'success',
                duration: 2000
              })
//和登录授权一样
              wx.login({
                success: res => {
                  console.log(res);
                  // 发送 res.code 到后台换取 openId, sessionKey, unionId  
                  request.post('后台的接口', {
                    code: res.code
                  }).then((res) => {
//得到openid
                    let result = JSON.parse(res.result);
                    wx.setStorageSync('openid',result.openid)
                    opid=res.openid;
//执行保存到后台的操作
                    that.saveSubMssage(opid,templateId);
                  });
                }
              })
            }
        }
      },
      error(res){
        console.log(res);
        wx.showToast({
          title: '授权出现错误',
          icon: 'none',
          duration: 2000
        })
      }
    })
saveSubMssage(openid,tmplIds){
    let that = this;
    request.Post('后台保存消息推送的接口.do', {
      openId: openid,//用户openid
      templateId: tmplIds,//模板id
      userName: encodeURI(that.data.userName),//中文乱码处理
      idCard: that.data.idCard//身份证
    }).then((res) => {
      console.log(res);
      
      wx.showToast({
        title: '授权成功',
        icon: 'success',
        duration: 2000
      })


//退出页面
      setTimeout(function() {
          wx.navigateBack({ changed: true });
      }, 2000);
    });

 

3 后台发送推送信息

public static boolean sendNearRemindMessage(String openId,String serveName,String windowName,String lineNumber,String waitNumber,String msg) throws Exception {

        WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage();

        //跳转小程序页面路径
        subscribeMessage.setPage("pages/index/index");
        //模板消息id
        subscribeMessage.setTemplateId(WxMaConfiguration.templateId);
        //给谁推送 用户的openid (可以调用根据code换openid接口)
        subscribeMessage.setToUser(openId);
        //==========================================创建一个参数集合========================================================
        ArrayList<WxMaSubscribeData> wxMaSubscribeData = new ArrayList<>();

//        订阅消息参数值内容限制说明
//              ---摘自微信小程序官方:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
//        参数类别 	参数说明 	参数值限制 	   说明
//        thing.DATA 	事物 	20个以内字符 	可汉字、数字、字母或符号组合
//        number.DATA 	数字 	32位以内数字 	只能数字,可带小数
//        letter.DATA 	字母 	32位以内字母 	只能字母
//        symbol.DATA 	符号 	5位以内符号 	只能符号
//        character_string.DATA 	字符串 	32位以内数字、字母或符号 	可数字、字母或符号组合
//        time.DATA 	时间 	24小时制时间格式(支持+年月日) 	例如:15:01,或:2019年10月1日 15:01
//        date.DATA 	日期 	年月日格式(支持+24小时制时间) 	例如:2019年10月1日,或:2019年10月1日 15:01
//        amount.DATA 	金额 	1个币种符号+10位以内纯数字,可带小数,结尾可带“元” 	可带小数
//        phone_number.DATA 	电话 	17位以内,数字、符号 	电话号码,例:+86-0766-66888866
//        car_number.DATA 	车牌 	8位以内,第一位与最后一位可为汉字,其余为字母或数字 	车牌号码:粤A8Z888挂
//        name.DATA 	姓名 	10个以内纯汉字或20个以内纯字母或符号 	中文名10个汉字内;纯英文名20个字母内;中文和字母混合按中文名算,10个字内
//        phrase.DATA 	汉字 	5个以内汉字 	5个以内纯汉字,例如:配送中

        WxMaSubscribeData wxMaSubscribeData1 = new WxMaSubscribeData();
        wxMaSubscribeData1.setName("thing1");
        wxMaSubscribeData1.setValue(serveName);
        wxMaSubscribeData.add(wxMaSubscribeData1);

        WxMaSubscribeData wxMaSubscribeData2 = new WxMaSubscribeData();
        wxMaSubscribeData2.setName("thing6");
        wxMaSubscribeData2.setValue(windowName);
        wxMaSubscribeData.add(wxMaSubscribeData2);

        WxMaSubscribeData wxMaSubscribeData3 = new WxMaSubscribeData();
        wxMaSubscribeData3.setName("character_string2");
        wxMaSubscribeData3.setValue(lineNumber);
        wxMaSubscribeData.add(wxMaSubscribeData3);

        WxMaSubscribeData wxMaSubscribeData4 = new WxMaSubscribeData();
        wxMaSubscribeData4.setName("number3");
        wxMaSubscribeData4.setValue(waitNumber);
        wxMaSubscribeData.add(wxMaSubscribeData4);

        WxMaSubscribeData wxMaSubscribeData5 = new WxMaSubscribeData();
        wxMaSubscribeData5.setName("thing5");
        wxMaSubscribeData5.setValue(msg);//"快到您了,请关注窗口和叫号情况"
        wxMaSubscribeData.add(wxMaSubscribeData5);

        //把集合给大的data
        subscribeMessage.setData(wxMaSubscribeData);
        //=========================================封装参数集合完毕========================================================

        try {
            System.out.println(JsonUtil.toJSONString(subscribeMessage));
            //获取微信小程序配置:

            final WxMaService wxService = WxMaConfiguration.getMaService(WxMaConfiguration.appid);
            //进行推送
            wxService.getMsgService().sendSubscribeMsg(subscribeMessage);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.toString());
        }
        return false;
    }

4 微信maven


        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>3.6.0</version>
        </dependency>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340