java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能
其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送。之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作。
需要你既要会小程序端开发,又要会Java端开发,还要会web网页端开发。还要懂得小程序公众号后台操作,还要自己去申请消息模板,自己配置appid,模板id,模板内容。就是因为怕大家一上来被这么多问题吓到,所以一直没有搞点餐系统的消息推送。
老规矩,先看效果图
我们今天就以排号入座为例,当排号等位的用户被叫号时,会给用户发送一条微信订阅消息。就是在管理点击下图的可入座时,发送订阅消息给用户。
至于如何创建模板消息,如果获取模板id我这节就不再讲解,不知道的同学可以查看我上篇文章《借助云开发实现小程序订阅消息和模板消息的推送功能》里面有详细的讲解。
今天呢就来重点讲下如何在Java后台编写小程序订阅消息推送的知识。
其实我很早之前有写过一篇Java实现模板消息推送的,但是小程序后面用订阅消息替换了模板推送,所以我也会根据最新的知识点不定期的更新文章的。
发送订阅消息三步走
1,拿到用户的openid
2,获取access_token
3,调用小程序消息推送的接口
一,获取用户的openid
关于用户openid的获取,我写过很多篇文章了,也有录过视频出来的,还不知道怎么获取的同学,可以取翻看下我之前的文章,或者看下我录制的零基础入门小程序的视频:《5小时零基础入门小程序云开发》 所以这一步不是今天的重点。
我们点餐系统里前面的排号功能讲解里也已经成功的存入了我们的openid到数据库了。
二,获取access_token
首先来看下access_token是什么,下图是官方给出的
其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。所以下面先讲下如果获取access_token
- 看下官方文档,可以知道我们需要用到下面的几个参数
grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到,我也有录视频教大家如何拿到,如果不知道怎么获取的同学可以去看下我的视频。
这里需要注意的是,AppSectet一定要记好,要不然每次都要重置。
下面就是Java代码的编写了
我们这里用的是springboot,这里涉及到一个请求小程序官方接口,所以我们这里用了springboot自带的RestTemplate来做网络请求。具体代码如下。
可以看出代码很简单,就是用RestTemplate来实现一个get请求,这样我们就可以轻松的获取到了access_token。获取到的access_token返回数据如下图。
请求上面代码,返回的数据如下。
注意点
关于这个access_token,是存在有效期的,来看下官方给出的提示
所以我要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。由于这里不是本节的重点,我这里只给大家说下原理。
三,发送消息到小程序
我们通过上面第二步,成功的获取到了access_token。下面就要调用小程序官方为我们提供的发送消息的接口了。先看下官方文档。
上面的参数都是我们发送消息时需要的。这些参数的定义和设置我在前面的文章里也都讲过了,不知道的同学可以去看下我前面写的这篇文章 《借助云开发实现小程序订阅消息和模板消息的推送功能》
这里需要注意的一点是,我们要给用户发送消息,就必须引导用户授权,就是下面这个图
因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。
推送的Java代码如下
可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容。。。
这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了。
我们在浏览器里调用上面接口,可以看到下图所示,这样就代表我们消息推送成功了。
这里要注意,我们要把openid和一些参数动态的获取到,然后封装到模板里。
所以接下来继续改造我们的推送代码
我们既然要获取一些用户的信息,比如openid,桌号,排队开始时间等,我们一个个传进来就有些太麻烦了,所以最简单的方式,就是把排号表里对应的id拿过来。所以我们只需要知道用户当前排号的id,就可以拿到所有需要的信息。
改造后的发送订阅消息的方法如下:
这个时候,如果我们直接调用发送,会报下面这个错误。
仔细看下错误,就可以知道,我们的模板id不正确,所以,我们要配置我们自己的模板id。我们可以去小程序后台获取到我们自己的模板id。
填入我们的模板id后,还会报下面的错误。
上面的这个错误,就是因为我们在小程序端没有做授权。所以授权这一步也必不可少的。而这个授权应该在用户点击取号的时候,就应该弹出来询问用户授权的。
下面我把小程序端的代码和注意事项也和大家说下
我们在用户取号时,不仅要请求取号接口,还要获取用户授权。
这个模板id为了方便管理,我写在了app.js里了,方便全局使用。
其实小程序端只需要做这些就可以了,无非在取号时,我们要把模板id传给后台,存到数据库,方便后台Java后台调用消息发送时使用。
最后,我再把Java的完整代码贴出来给到大家
调用订阅消息推送
package com.qcl.push;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.qcl.bean.Paihao;
import com.qcl.global.GlobalConst;
import com.qcl.repository.PaihaoRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
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;/*** 作者:编程小石头* 发送小程序订阅消息*/
@Service
@Slf4j
public class SendWxMessage {@Autowiredprivate PaihaoRepository repository;//发送订阅消息public String pushOneUser(Integer id) {Paihao paihao = repository.findById(id).orElse(null);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(paihao.getOpenid());//用户的openid(要发送给那个用户,通常这里应该动态传进来的)wxMssVo.setTemplate_id(paihao.getTemplateid());//订阅消息模板idwxMssVo.setPage("pages/index/index");//封装模板消息内容。必须和你申请的小程序模板格式一模一样。Map<String, TemplateData> m = new HashMap<>(2);//A小桌,B大桌String num = (paihao.getType() == 1 ? "B" : "A") + paihao.getNum();m.put("phrase1", new TemplateData("您可入座啦"));m.put("character_string5", new TemplateData(num));wxMssVo.setData(m);ResponseEntity<String> responseEntity =restTemplate.postForEntity(url, wxMssVo, String.class);log.info("推送返回的信息 ={}", responseEntity.getBody());return responseEntity.getBody();}//获取AccessTokenpublic String getAccessToken() {RestTemplate restTemplate = new RestTemplate();Map<String, String> params = new HashMap<>();params.put("APPID", GlobalConst.APPID); //这里替换成你的appidparams.put("APPSECRET", GlobalConst.APPSECRET); //这里替换成你的appsecretResponseEntity<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();AccessToken object = new Gson().fromJson(body, AccessToken.class);log.info("返回的AccessToken={}", object);String Access_Token = object.getAccess_token();return Access_Token;}
}
WxMssVo类
package com.qcl.push;import java.util.Map;/** 小程序推送所需数据* 编程小石头* */
public class WxMssVo {private String touser;//用户openidprivate String template_id;//订阅消息模版idprivate 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.push;import lombok.Data;/** 编程小石头* 用来封装订阅消息内容* */
@Data
public class TemplateData {private String value;//public TemplateData(String value) {this.value = value;}}
AccessToken类
package com.qcl.push;
import lombok.Data;
/*** 作者:编程小石头* 微信返回的Access_Token对应的bean*/
@Data
public class AccessToken {private String access_token;private String expires_in;
}
到这里就完整的讲解完,排号等位时微信消息推送功能了。后面我也会录制视频出来《点餐系统,java后台+点餐小程序》
java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能相关推荐
- 微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ
微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ 一.获取用户信息 1.首先我们需要了解什么是微信用户的OpenID 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密 ...
- 一图了解App跳转微信小程序关注公众号,推送消息
一图了解App跳转微信小程序关注公众号,推送消息:
- 使用微信小程序新的订阅消息接口,主动推送。
小程序订阅消息,昨天刚上线,今天就体验了一下,遇到不少问题,不过还好都解决了. 首先:你需要在小程序后台,选择一个模板,和公众号差不多,不过这里一定要注意,选择模板和你的类目有关系,只出现你类目相关的 ...
- wx小程序,前端公众号推送消息
wx小程序,前端引导用户关注公众号推送消息 第一步: 在小程序登录后,请求后台得到返回是否关注公众号字段(如果有关注后台是有unionID的),将该字段存入storage中,在首页处拿来判断显隐' 引 ...
- java发送qq邮箱_Java 发送QQ邮箱邮件
如果需要提供用户名和密码给e-mail服务器来达到用户认证的目的,你可以通过如下设置来完成: props.put("mail.smtp.auth", "true" ...
- Java发送QQ邮件问题Could not connect to SMTP host: smtp.qq.com, port: 465(内附完整代码)
邮件发送失败,本地测试可以,部署到服务器就不行. 之前就碰到这个问题,解决办法就是把port端口改成587,然后注释这一段 MailSSLSocketFactory sf = new MailSSLS ...
- java读取qq邮箱_java获取qq邮箱中的好友列表
评论 # re: java获取qq邮箱中的好友列表 2009-05-07 20:56 咖啡@可乐 # re: java获取qq邮箱中的好友列表 2009-05-08 09:07 EverestSnow ...
- java发送get请求_java发送http get请求的两种方法(总结)
长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset) thro ...
- 微信小程序消息推送功能开发(java实现)
先好好把官方文档看一看,链接https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push ...
最新文章
- [linux内核][linux中断]——软中断机制
- 最新版IntelliJ IDEA 15开发Java Maven项目
- 补天白帽大会:无处不在的无线电攻击
- pip导包CalledProcessError: Command '('lsb_release', '-a')'异常处理
- modelsim-altera
- php5.3 with-mysql centos_Centos编译搭建php7让php5.3和php7兼容共存教程
- windows下替代SSH,Xshell软件的mobaxterm
- ASP.NET页面刷新的几种方法
- openCV实现车牌号识别
- power bi数据分析_设置Power BI数据网关
- 录音自动上传到服务器,怎么实现手机录音之后,将录音的音频文件上传到服务器上...
- Ural_1671. Anansi's Cobweb(并查集)
- Unity做360度全景预览,效果类似pano2vr导出的效果或720云做的效果
- CentOS8 解决SSH Secure Shell 报错 Algorithm negotiation failes
- 自定义控件从入门到轻生之---初尝禁果
- 有赞基于Flutter的移动端跨平台App架构实践
- python实现图书管理系统(带gui)
- ORB-SLAM2系列第一章——简介
- RFID,RC522教程
- ktkkt的视频怎么下载
热门文章
- java业务类_Java_业务层开发
- 国考计算机专业生报名人数,近四成岗位随便挑!2020年国考,这类专业招录人数接近一万...
- linux redis 数据迁移,redis cluster 迁移数据
- 针织物染色常见的6大问题
- Halcon 学习总结——邮票目录检测(stamp_catalogue)
- 用python语言实现反恐精英基础版-案例
- 阿里云图数据库GDB公测,高度连接数据查询效率提升10倍
- 指定JDK版本运行Tomcat
- 创新与创业的良性共存 又拍云Open Talk NO.20开讲
- 获得一个日期在当周是否有节日并返回日期