微信小程序消息推送


简介

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

基础流程

  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)//缓存openidthat.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('后台换取用户id的接口', {code: res.code}).then((res) => {
//得到openidlet 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,//用户openidtemplateId: tmplIds,//模板iduserName: 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 后台保存用户同意消息推送的接口

 @RequestMapping(value="/SaveMessageAuthority.do" ,produces = "application/json;charset=UTF-8")@ResponseBodypublic String SaveMessageAuthority(String openId,String templateId,String userName ,String idCard) throws Exception {try {WeChatMessageAuthorityPO weChatMessageAuthority = new WeChatMessageAuthorityPO();weChatMessageAuthority.setOpenId(openId);weChatMessageAuthority.setTemplateId(templateId);weChatMessageAuthority.setIdCard(idCard);
//            String temp = request.getParameter("studentName");if(StringUtils.isNotEmpty(userName)){userName = java.net.URLDecoder.decode(userName,"UTF-8");weChatMessageAuthority.setUserName(userName);}weChatMessageAuthority.setCreateDate(new Date());weChatMessageAuthority.setIsSend(BaseStaticParameter.NO);iWxMassageAuthorityService.saveOrUpdate(weChatMessageAuthority);}catch (Exception e){e.printStackTrace();return "false";}return "true";}

4 后台发送推送信息

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");//模板消息idsubscribeMessage.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);//把集合给大的datasubscribeMessage.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;}

5 微信maven(微信调用方式可选)

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

6 WxMaConfiguration

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.bean.WxMaMessage;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
import cn.binarywang.wx.miniapp.message.WxMaXmlOutMessage;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.io.File;
import java.util.Map;/*** create by zhaojiong* 22-8-16*/
@Configuration
public class WxMaConfiguration {//叫号public final static String jh_templateId = "
消息模板id";//排队public final static String pd_templateId = "消息模板id";public final static String appid = "按情况填写";public final static String secret = "按情况填写";public final static String token = "按情况填写";public final static String aesKey = "按情况填写";public final static String msgDataFormat = "JSON";
//private static Map<String, WxMaMessageRouter> routers = Maps.newHashMap();private static Map<String, WxMaService> maServices = Maps.newHashMap();
//
//public static WxMaService getMaService(String appid) {WxMaService wxService = maServices.get(appid);if (wxService == null) {throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));}return wxService;}
//public static WxMaMessageRouter getRouter(String appid) {return routers.get(appid);}
//
//@PostConstructpublic void init() {WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();config.setAppid(appid);config.setSecret(secret);config.setToken(token);config.setAesKey(aesKey);config.setMsgDataFormat(msgDataFormat);WxMaService service = new WxMaServiceImpl();service.setWxMaConfig(config);routers.put(appid, this.newRouter(service));maServices.put(appid, service);}
//private WxMaMessageRouter newRouter(WxMaService service) {final WxMaMessageRouter router = new WxMaMessageRouter(service);router.rule().handler(logHandler).next().rule().async(false).content("模板").handler(templateMsgHandler).end().rule().async(false).content("文本").handler(textHandler).end().rule().async(false).content("图片").handler(picHandler).end().rule().async(false).content("二维码").handler(qrcodeHandler).end();return router;}private final WxMaMessageHandler templateMsgHandler = new WxMaMessageHandler() {@Overridepublic WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder().templateId("此处更换为自己的模板id").formId("自己替换可用的formid").data(Lists.newArrayList(new WxMaTemplateData("keyword1", "339208499", "#173177"))).toUser(wxMessage.getFromUser()).build());return null;}};private final WxMaMessageHandler logHandler = new WxMaMessageHandler() {@Overridepublic WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {System.out.println("收到消息:" + wxMessage.toString());service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson()).toUser(wxMessage.getFromUser()).build());return null;}};private final WxMaMessageHandler textHandler = new WxMaMessageHandler() {@Overridepublic WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息").toUser(wxMessage.getFromUser()).build());return null;}};private final WxMaMessageHandler picHandler = new WxMaMessageHandler() {@Overridepublic WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {try {WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", "png",ClassLoader.getSystemResourceAsStream("tmp.png"));service.getMsgService().sendKefuMsg(WxMaKefuMessage.newImageBuilder().mediaId(uploadResult.getMediaId()).toUser(wxMessage.getFromUser()).build());} catch (WxErrorException e) {e.printStackTrace();}return null;}};private final WxMaMessageHandler qrcodeHandler = new WxMaMessageHandler() {@Overridepublic WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {try {final File file = service.getQrcodeService().createQrcode("123", 430);WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);service.getMsgService().sendKefuMsg(WxMaKefuMessage.newImageBuilder().mediaId(uploadResult.getMediaId()).toUser(wxMessage.getFromUser()).build());} catch (WxErrorException e) {e.printStackTrace();}return null;}};}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/69965.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再度警惕!AI“灭霸”要来了?Hinton、Bengio等300余大佬联名上书

来源&#xff1a;机器之心 人工智能存在「灭绝」级别的风险&#xff0c;未来的系统可能像核武器一样致命。本周二&#xff0c;著名的人工智能学者、科技公司创始人团结了起来&#xff0c;发出呼吁。 公开信地址&#xff1a;https://www.safe.ai/statement-on-ai-risk 前有马斯克…

【探索人工智能】我与讯飞星火认知大模型的对话

文章目录 讯飞星火认知大模型的地址概要讯飞星火认知大模型的发展历程讯飞星火认知大模型的主页利用讯飞星火大模型解决一些基本的数学问题讯飞星火认知大模型与OpenAI,ChatGPT没有关系&#xff01;让讯飞星火认知大模型编写传奇代码hello world小结 讯飞星火认知大模型的地址 …

在Ubuntu22.04里安装脉冲星信号处理工具----Pulsar软件包

在Ubuntu22.04安装Pulsar软件包 1.ubuntu 22.04 安装gcc-7、g7&#xff08;用来编译后续软件&#xff09; 1.1 添加镜像&#xff1a; 打开源镜像文件 sudo vim /etc/apt/sources.list在最后一行添加如下内容&#xff1a; deb [archamd64] http://archive.ubuntu.com/ubunt…

6-2. 实战项目:足球运动员分析

足球运动员分析 1. 项目背景 当前&#xff0c;足球运动是最受欢迎的运动之一&#xff08;也可以说没有之一&#xff09;。 我们的任务&#xff0c;就是在众多的足球运动员中&#xff0c;发现统计一些关于足球运动员的共性&#xff0c;或某些潜在的规律。也是好玩。 2. 数据…

【案例】足球运动员分析

文章目录 足球运动员分析案例需求数据集程序实现1. 导入相关库2. 加载相关数据集3. 数据探索与清洗3.1. 缺失值处理3.2. 异常值处理处理3.3. 重复值处理 4. 身高与体重处理5. 运动员身高&#xff0c;体重&#xff0c;评分信息分布6. 左脚与右脚选手在数量上是否存在偏差7. 从球…

足球运动员分析

数据集 数据集 背景&#xff1a; 我们关注足球运动员的如下内容&#xff1a; 足球运动员是否受出生日期的影响&#xff1f;左撇子适合踢足球吗&#xff1f;足球运动员的号码是否与位置有关&#xff1f;足球运动员的年龄与能力具有怎样的关联&#xff1f; 哪些技能会对足球运…

解析波士顿动力Handle机器人背后的技术(附PPT+视频)

[转] http://www.leiphone.com/news/201703/URrR8CG2tmtghNDl.html 导语&#xff1a;Boston Dynamics 在机器人动力方面堪称翘楚&#xff0c;其由双足或多足机器人组成的机器人天团总是时不时能给我们带来惊喜。上周&#xff0c;Boston Dynamics 又发布了一段视频&#xff0c;并…

解析波士顿Handle机器人背后的技术

在斗鱼直播平台&#xff0c;浙大李超博士的公开课分享了关于handle的技术细节&#xff0c;解析波士顿Handle机器人背后的技术&#xff0c;观察敏锐&#xff0c;思路清晰。 内容介绍了波士顿动力公司的历代4足和2足机器人的开发历史。并结合李超的专业重点讲解了腿的细节。 李…

开源四足机器人 附设计图及代码

斯坦福学生机器人俱乐部&#xff08;Stanford Student Robotics club&#xff09;Extreme Mobility 团队最近迎来了一名新成员——一个名为 Stanford Doggo 的四足机器人。这个机器人能跳 1 米多高&#xff0c;还能表演后空翻。与其他四足机器人动辄上万美元的成本不同&#xf…

ROS2机器人笔记21-03-14

ROS会议和活动&#xff1a; 如果对机器人技术感兴趣&#xff0c;但是看不到任何适合兴趣的项目&#xff0c;那么可能还需要考虑将其应用于同级组织中&#xff0c;例如OpenCV和MoveIt&#xff01; 核心是各种应用和ROS2的逐渐普及 GPU运算越来越主流&#xff0c;Nvidia Jetson…

波斯顿动力机器人“特效专辑”

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 公众号 | strongerHuang 波斯顿动力机器人的视频为啥那么火&#xff1f; 首先&#xff0c;他们机器人本身很牛逼&#xff0c;能完成各种高难度动作&#xff0c;拍出来的视频自然很多人关注。 其次&#xff0c;有…

清华2019最新AI发展报告出炉!400页干货,13大领域一文看懂

2019-12-08 20:36:36 当前&#xff0c;人工智能正处在爆发期。我国在人工智能领域的科学技术研究和产业发展起步稍晚&#xff0c;但在最近十余年的时间里抓住了机遇&#xff0c;进入了快速发展阶段。在这个过程中&#xff0c; 技术突破和创造性高端人才对人工智能的发展起着至…

ROS机器人培训基地和暑期学校证书样例

初级工程师证书&#xff08;非高清&#xff09;&#xff1a; 初级师资证书&#xff08;非高清&#xff09;&#xff1a; 为了鼓励学生朋友参与ROS机器人暑期学校&#xff0c;我也参加了并完成了所有任务&#xff0c;证书样本&#xff1a; 2021年&#xff08;非高清&#xff09…

专业的机器人资讯与太空中的ROS

参考&#xff1a;www.therobotreport.com Open Robotics正在与由 Jeff Bezos 创立的亚轨道航天公司Blue Origin和 NASA 合作开发 Space ROS。Space ROS 是 ROS 2 的一个版本&#xff0c;旨在满足航空航天软件在用于任务之前必须满足的验证和确认要求。 机器人操作系统 (ROS) 已…

机器人介绍、应用、前景

机器人介绍、应用、前景 1 介绍1.1 定义1.2 作用1.3 发展历程1.4 分类1.5 三大顾虑1.6 前景 2 种类工业机器臂协作机械臂工业移动机器人复合机器人扫地机器人服务机器人机器狗人形机器人无人机 3 技术3.1 机器人学分类3.2 功能分类3.2.1 感知3.2.2 决策3.2.3 执行AGV减震机构减…

波士顿动力机器人解锁跑酷新技能,凭借感知驱动技术适应技能

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 波士顿动力开发负责人为大家解读了 Atlas 能够快速越过具有一定倾斜度的障碍物、执行快速转身、跳跃等动作背后的技术。 Atlas 机器人首次完成了复杂的障碍赛。 复杂的障碍赛在波士顿动力公司总部二楼…

算法高级(46)-波士顿动力机器人ATLAS

一、引言 如果说阿尔法狗是对人类智力的碾压&#xff0c;那么&#xff0c;波士顿动力研发的机器人&#xff0c;正在挑战的是仿生学。 波士顿动力公司&#xff08;Boston Dynamics&#xff09;一致在专注于机器人的研发&#xff0c;每一次波士顿动力放出视频都会引起网友的围观…

自研机器人控制系统,挑战波士顿动力机器人

自研机器人协调控制系统&#xff0c;挑战部分波士顿动力实验效果 一.系统简介功能使用实验 二.详细实验解读波士顿动力近似试验1&#xff1a;空间定点自定义试验1&#xff1a;太极云手自定义试验2&#xff1a;醉鬼自定义试验3&#xff1a;边转边走自定义试验4&#xff1a;平移自…

客户案例|保险行业借助智能外呼充分结合业务需求和实际应用场景快速筛选客户

保险行业整体仍然延续稳步发展势头&#xff0c;保险产品结构不断优化&#xff1b;人身险行业原保费收入增速有所放缓&#xff1b;受宏观经济不断恢复企稳及非车险政策支持推动影响下&#xff0c;财产险行业保费收入增速有所加快&#xff1b;人身险及财产险公司健康险类产品均呈…

二次元界福音:MakeGirlsMoe创建动漫人物

开源的动漫角色图片生成工具&#xff0c;支持&#xff1a;选择发色、发型、眼睛、皮肤、微笑、风格等等特征生成二次元图片。可自定义生成可爱的二次元头像&#xff0c;二次元界福音。 GitHub网址&#xff1a;https://github.com/makegirlsmoe/makegirlsmoe_web 在线体验&…