引言 关于access_token

小程序发通知需要获取获取小程序全局唯一后台接口调用凭据(access_token)。调用绝大多数后台接口时都需使用 access_token,后面会进行使用redis的存取。

但是急于求成加上先去看了小马如何获取openId,打算使用前端发过来的code获取access_token,这确实是一个获取access_token的方法,照着这个去查找找到了微信小程序官网文档,按照里面的接口介绍,通过前端获取的code实现了获取。在此之间我并不知道access_token是会过期的,后面又了解到前端不能发起定时任务,在微信小程序官方文档中又看到了用AppID和AppSecret获取access_token

官方链接如下:auth.getAccessToken | 微信开放文档

于是我们可以在自己定义的定时任务中实现在需要发送消息通知之前的10秒内(时间上可以接近一点)获取,同时,除了可以用定时任务来自动更新access_token,access_token的有效期为2h,也需要弄一个报错之后可以调用的主动方法获取最新的access_token并存进redis中。

发送通知可参考参考官网文档:templateMessage.send | 微信开放文档

于是我们发现,小程序发送消息通知需要很多的组成,比如OpenId,access_token,template_id(模板id)等,于是我们可以将其封装为一个专门的类。

@Data
public class WxMssVo {//小程序用户的OpenIdprivate String touser;//模板idprivate String template_id;//跳转首页private String page;//接口凭证private String access_token;//请求路径private String request_url;//放置数据private HashMap<String, Object> map = new HashMap<>(3);}

用小程序的AppID和AppSecret获取access_token(一般有效期为2min,需要与后面的定时任务结合使用,实现不间断的刷新获取最新可用的access_token)。

 /*** 根据AppID和AppSecret获取最新可用的AccessToken* @return*/public static String getAccessToken() throws IOException {
//        https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETString appid = PropUtils.getProp("APPID");String appsecret = PropUtils.getProp("APPSECRET");//构建url,用于向微信服务器请求用户的openIdStringBuffer url = new StringBuffer("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&");url.append("appid=").append(appid).append("&secret=").append(appsecret);//向微信的服务器发送Get请求HttpClient client = HttpClientBuilder.create().build();HttpGet httpGet = new HttpGet(url.toString());HttpResponse httpResponse = client.execute(httpGet);HttpEntity result = httpResponse.getEntity();String resultStr = EntityUtils.toString(result);System.out.println(resultStr);JSONObject resultJsonObject = JSONUtil.parseObj(resultStr);String accessToken = (String) resultJsonObject.get("access_token");return accessToken;}

通过输出resultStr 可以得到一个{"access_token":"长字符串","expires_in":7200}的access_token信息

小程序的AppID和AppSecret在发布小程序的官方网页获取对应信息

这些都是不变的,我们可以将其存进resousce下的appconfig.properties

通过书写一个PropUtil来获取

public class PropUtils {private static Properties properties;static {properties = new Properties();}public static String getProp(String key) throws IOException {//读取配置文件ClassPathResource classPathResource = new ClassPathResource("appconfig.properties");properties = PropertiesLoaderUtils.loadProperties(classPathResource);return properties.getProperty(key);}
}

发送模板信息

//发送模板消息public static String sendTemplateMessage(WxMssVo wxMssVo) {String info = "";try {//创建连接URL url = new URL(wxMssVo.getRequest_url());HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestMethod("POST");connection.setUseCaches(false);connection.setInstanceFollowRedirects(true);connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");connection.setRequestProperty("Content-Type", "utf-8");connection.connect();//POST请求DataOutputStream out = new DataOutputStream(connection.getOutputStream());JSONObject obj = new JSONObject();//设置参数//不可缺失 缺失会出现invalid openid rid//putOpt 等效于当两个参数都为非空时;除此之外什么都不做。put(name, value)obj.putOpt("touser", wxMssVo.getTouser());//不可缺失 缺失出现invalid template_idobj.putOpt("template_id", wxMssVo.getTemplate_id());obj.putOpt("page", wxMssVo.getPage());JSONObject jsonObject = new JSONObject();//发送自定义数据Set<Map.Entry<String, Object>> entries = wxMssVo.getMap().entrySet();for (Map.Entry<String, Object>entry:entries){JSONObject dataInfo = new JSONObject();dataInfo.putOpt("value", entry.getValue());jsonObject.putOpt(entry.getKey(), dataInfo);}obj.putOpt("data", jsonObject);System.out.println(obj.toString());out.write(obj.toString().getBytes());out.flush();out.close();//读取响应BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String lines;StringBuffer sb = new StringBuffer("");while ((lines = reader.readLine()) != null) {lines = new String(lines.getBytes(), "utf-8");sb.append(lines);}info = sb.toString();System.out.println(sb);reader.close();// 断开连接connection.disconnect();} catch (Exception e) {e.printStackTrace();}return info;}

创建测试类

  @Testpublic void publishModelMessage(){WxMssVo wxMssVo = new WxMssVo();//设置模板idwxMssVo.setTemplate_id("");String accessToken=null;try {//设置openIdwxMssVo.setTouser("");
//            设置accessTokenaccessToken=WXUtils.getAccessToken();} catch (IOException e) {e.printStackTrace();}
//        设置小程序 跳转首页wxMssVo.setPage("pages/index/index");wxMssVo.setRequest_url("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken);
//        将模板中的值一一赋值 发送到小程序的数据要转化为json格式 可以使用下面的方法直接拼接成JSONObject/*  JSONObject jsonObject = new JSONObject();JSONObject dataInfo = new JSONObject();dataInfo.putOpt("value", TimeUtils.getNowTime());jsonObject.putOpt("time5", dataInfo);
*/
//        使用map结合模板 后续再加遍历拼接成JSONObjectHashMap<String, Object> map = new HashMap<>(3);//根据模板写值  map.put("time",TimeUtils.getNowTime());map.put("thing1","下班打卡");wxMssVo.setMap(map);WXUtils.sendTemplateMessage(wxMssVo);}

发送请求

没有权限用户,返回错误,需要每一次都设置权限(企业版才不需要)比较容易出现

小程序发送通知需要传递json数据,订阅号的模板对于每⼀个字段的类型都有特别要求,例如这个模板中的“通知”字段是叫time5.DATA,那么你在后端调取微信的时候也必须使用这个名字,而且对于类型也有一定的限制。

首先,我们看看小程序模板大概的样子

这时,我们就需要设置成data->time5->value(替换为值)这样的json格式传值。

传值之后容易出现数据不合法,需要参考参数值内容限制说明

 参数类别  参数说明              参数值限制    说明
  thing.DATA    事务            20个以内字符   可汉字、数字、字母或符号组合
number.DATA    数字            32位以内数字       只能数字,可带小数
 letter.DATA    字母             32位以内字母                只能字母
 symbol.DATA     符号               5位以内符号                只能符号
 character_string.DATA    字符串     32位以内数字、字母或符号    可数字、字母或符号组合
 time.DATA    时间   24小时制时间格式(可以为年月日),支持时间段;两个时间点之间用~连接 (如2022-09-27 19:31:28或19:38)
date.DATA     日期   年月日格式(支持加24小时制时间和时间段),两个时间点之间用~连接     如2022年9月27日,2022年9月27日 19:31
amount.DATA     金额 一个货币符号+10位以内纯数字,可带小数,结尾可带元  ¥8.8
phone_number.DATA    电话号码    17位以内数字、符号

如11122223333,+86-1111-11111111

car_number.DATA  车牌  8位以内,第一位与最后一位可为汉字,其余为字母或数字 车牌号 :如粤A8888Z桂
name.DATA  姓名  10字以内纯汉字或20个以内纯字母或符号 小明
phrase.DATA 汉字 5个字以内汉字  点赞的都帅

成功结果

总结

在实现不同外部接口的调用时,应多去看相对应的使用文档,积极搜索相同需求下不同的实现方法,再搭配上业务需求,实现特定功能。下期将更新基于SchedulingConfigurer实现多定时任务来实现定时的发送下班请求。

实现微信小程序定时发送通知(1)发送请求篇相关推荐

  1. uni-app 微信小程序客服聊天和发送页面卡片功能

    微信小程序客服聊天和发送页面卡片功能实现步骤如下: (一):首先登录微信公众平台 :https://mp.weixin.qq.com/ 登录成功后找到----->功能-----> 客服-- ...

  2. 实现微信小程序编译和运行环境系列(初始篇)

    实现微信小程序编译和运行环境系列(初始篇) 前言 最近一段时间在研究实现微信小程序和小游戏编译打包和运行环境平台开发 目前基本可以支持微信基础库2.8.2功能迭代了 所以想通过记录分享一下自己的认知过 ...

  3. 微信小程序购物商城系统开发系列-工具篇

    微信小程序购物商城系统开发系列-工具篇 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操 ...

  4. 视频教程-30小时微信小程序从入门到精通课程-基础篇-微信开发

    30小时微信小程序从入门到精通课程-基础篇 8年IT开发经验,6年IT教育经验,喜欢把复杂逻辑用简单的表述传达给学生,传授编程知识,讲述生活故事 曹圣捷 ¥12.00 立即订阅 扫码下载「CSDN程序 ...

  5. php 发送微信请求失败的原因,微信小程序模拟正常 真机服务器请求出错

    微信小程序中出现最多的一个问题,就是真机跟本地不同:我简单列举一些我发现的原因,给大家参考,大家也可以把自己发现的东西回复给我,给我参考: 本地看不到数据,就先让本地能看到数据,再看本帖.... 1: ...

  6. 微信小程序-滚动消息通知

    写在前面: 这次我主要想总结一下微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组件在小程序中是滑块视图容器. 我们通过vertical属性(默认为false,实现默认左 ...

  7. 微信小程序下发消息通知

    话不多说,先熟悉微信小程序官网操作逻辑实现:(别搞错了!) https://developers.weixin.qq.com/miniprogram/dev/framework/open-abilit ...

  8. 微信小程序公告滚动通知

    微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组件在小程序中是滑块视图容器. 通过vertical属性(默认为false,实现默认左右滚动)设置为true来实现上下滚动 ...

  9. 微信小程序 | 如何使用wx.request发送文件?

    微信小程序不提供fromdata对象,以至于提交的表单里面没有办法包含文件,只能提交表单里面的文本字段,找了一下发现有大佬造好了轮子: https://github.com/zlyboy/wx-for ...

最新文章

  1. sklearn SVM(支持向量机)模型使用RandomSearchCV获取最优参数及可视化​​​​​​​
  2. webgl坐标转换_WebGL 坐标系统
  3. Linux的僵尸进程产生原因及解决方法
  4. 更新node最新版本方法和 npm install -g n 运行错误
  5. 删除 终端服务器,终端服务器命令更改 - Windows Server | Microsoft Docs
  6. linux 常用命令及操作
  7. 【转】DBMS_STATS.GATHER_TABLE_STATS详解
  8. c语言怎么运行出星星,C语言打印星星的问题
  9. 最小二乘法和极大似然估计
  10. js复制到剪贴板html5,移动端web 复制到剪贴板 怎么实现?
  11. NOI / 2.1基本算法之枚举 1809:两倍
  12. c语言 谭浩强第五版第五章习题第17题 乒乓球比赛
  13. doris ODBC 连接 mysql 外部表
  14. 南理工计算机科学与工程学院,周俊龙 - 南京理工大学 - 计算机科学与工程学院...
  15. AIR开发ios游戏总结
  16. 【高等数学】02 函数的特性,有界性,无界性,单调性,奇偶性,周期性,反函数,复合函数
  17. Java实现用户异地登陆踢人操作
  18. 创业穷途,我要加入丐帮
  19. 高中计算机辗转相除法,高中数学的辗转相除法问题
  20. 1094 谷歌的招聘

热门文章

  1. IOS原声二维码条形码扫描实现
  2. 诸暨市第七届“身边的道德模范”中 爱心助残协会何君平会长风采
  3. 2005年1月7日0:34:06
  4. 读书笔记之-《数据化管理:洞悉零售及电子商务运营》
  5. 算法系列之十七:日历生成算法-中国公历(格里历)(上)
  6. 企业绩效管理体系优化方案
  7. 节选自《白衣飘飘的年代:宋朝那些有趣的人和事》(重庆大学出版社)
  8. 毛驴之死”献给辛勤加班的程序猿
  9. [Dubbo3.0.8源码解析系列]-12-全局视野来看Dubbo3.0.8的服务启动生命周期
  10. 智能车打工日记(三)一些小细节