专属微信公众号消息推送(java版)
前言:专属女朋友的微信推送消息,简单的写个文档。
gitee地址:消息推送
所用框架及Api
- springboot搭建应用
- 天行数据Api(彩虹屁、早安语句、天气)
前置条件
申请微信公众号测试号及微信模板配置
申请一个微信公众号测试号。传送门:测试号申请
扫码登陆注册,注册成功后就会生成微信公号的appID和appsecret
- 需要接收消息的人微信扫码关注 测试号二维码,微信给我们返回我们的openid,这个openid在推送时特别重要。
- 新增消息模板,模板中参数内容必须以".DATA"结尾,否则视为保留字,模板保留符号"{{ }}"; 例如{{date.DATA}}
```tex
我的模板:
{{morning.DATA}}
{{date.DATA}} {{week.DATA}}
城市:{{city.DATA}}
天气:{{weather.DATA}}
最低气温: {{lowest.DATA}}
最高气温: {{highest.DATA}}
降雨概率:{{pop.DATA}}
今日建议: {{tips.DATA}}
今天是我们恋爱的第{{loveDay.DATA}}天
距离我的生日还有{{myBirthday.DATA}}天
距离崽崽生日还有{{babyBirthday.DATA}}天 彩虹屁: {{pipi.DATA}}
```
配置之后就完成了微信公众号的配置
注册一个天行数据API的账户,申请一个接口获取一个自己apiKey。
- 传送门:天行数据注册
- 传送门:天行数据注册
- 我这里用到了3个接口,早安语句、彩虹屁及天气接口,其中天气接口是计次的,在使用完免费次数后扣天豆,具体看接口详细
项目结构
wechatTemplate
|———src # 程序根目录
│ ├── main # 程序源文件目录├── java # JAVA源文件目录├── com ├── wechat ├── template # 包路径├── config # 配置包(微信公众号配置类及天行Api配置类)├── constants # 常量包(api地址类及常量类)├── domain # 实体类包├── service # 接口包├── impl # 实现类├── Task # 定时任务TemplateApplication #启动类├── resource # 资源文件夹目录├── application.yml # 配置文件(微信的appid及其他配置)
│ ├── test # 测试源文件目录├── java # 测试JAVA源文件目录├── com ├── wechat ├── template # 测试包路径TemplateApplicationTests #单元测试启动类
实现逻辑
根据微信公众测试号的appID,appsecret调用微信接口文档获取accessToken
@Overridepublic String getAccessToken(String appId, String appSecret) {String requestUrl = UrlConstant.ACCESS_TOKEN_URL + "appid=" + appId + "&secret=" + appSecret;String resp = HttpUtil.get(requestUrl);JSONObject result = JSONUtil.parseObj(resp);logger.info("获取access_token:" + resp);String token = result.getStr("access_token");logger.info("token:" + token);return token;}
根据accessToken调用微信接口文档获取关注用户,也可写死用户的openId
@Overridepublic List<String> getUserList(String accessToken) {String requestUrl = UrlConstant.GET_USER_LIST+ accessToken;String resp = HttpUtil.get(requestUrl);JSONObject result = JSONUtil.parseObj(resp);logger.info("用户列表:" + resp);JSONArray openIdJsonArray = result.getJSONObject("data").getJSONArray("openid");List<String> openIds = JSONUtil.toList(openIdJsonArray, String.class);return openIds;}
定时任务推送(我设置的是每天早上7点,可自行调整),根据上面新增的模板格式,填充数据,设置模板id、accessToken、openId发送消息。
@Scheduled(cron="0 0 7 * * ? ")private void sendTemplateMsg() throws ParseException {//配置及数据SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");String date = simpleDateFormat.format(new Date());String appId = wechatConfig.getAppId();String appSecret = wechatConfig.getAppSecret();String babyBirthday = wechatConfig.getBabyBirthday();String myBirthday = wechatConfig.getMyBirthday();String loveDay = wechatConfig.getLoveDay();String appKey = tianApiConfig.getAppKey();String area = tianApiConfig.getArea();//获取微信tokenString token = weiXinService.getAccessToken(appId,appSecret);//获取关注用户List<String> userList = weiXinService.getUserList(token);for (String openId : userList) {//发送消息实体WechatSendMsgVo sendMsgVo = new WechatSendMsgVo();//设置模板idsendMsgVo.setTemplate_id(wechatConfig.getTempId());//设置接收用户sendMsgVo.setTouser(openId);Map<String, WechatTemplateVo> map = new HashMap<>();//获取早安语句String zaoAnInfo = weiXinService.getZaoAnInfo(appKey);map.put("morning", new WechatTemplateVo("Baby 早安!"+zaoAnInfo,"#ff6666"));//获取天气WeatherInfo weatherInfo = weiXinService.getWeatherInfo(appKey, area);//日期map.put("date", new WechatTemplateVo(weatherInfo.getDate(),null));//星期map.put("week",new WechatTemplateVo(weatherInfo.getWeek(),null));//城市map.put("city",new WechatTemplateVo(weatherInfo.getArea(),"#9900ff"));//天气map.put("weather",new WechatTemplateVo(weatherInfo.getWeather(),"#CD96CD"));//最低气温map.put("lowest",new WechatTemplateVo(weatherInfo.getLowest(),"#A4D3EE"));//最高气温map.put("highest",new WechatTemplateVo(weatherInfo.getHighest(),"#CD3333"));//降水概率map.put("pop",new WechatTemplateVo(weatherInfo.getPop()+"%","#A4D3EE"));//今日建议map.put("tips",new WechatTemplateVo(weatherInfo.getTips(),"#FF7F24"));//相爱天数int loveDays = fun(loveDay, date);map.put("loveDay",new WechatTemplateVo(loveDays+"","#EE6AA7"));//我的生日int myDay = fun2(myBirthday, date);map.put("myBirthday",new WechatTemplateVo(myDay+"","#EE6AA7"));//宝贝生日int babyDay = fun2(babyBirthday, date);map.put("babyBirthday",new WechatTemplateVo(babyDay+"","#EE6AA7"));//彩虹屁String caiHongPiInfo = weiXinService.getCaiHongPiInfo(appKey);map.put("pipi",new WechatTemplateVo(caiHongPiInfo,"#E066FF"));sendMsgVo.setData(map);JSONObject entries = weiXinService.sendMsg(sendMsgVo,token, openId);}}
配置修改
resource目录下“application.yml”中配置文件修改。
#公众号配置
wechat:appId: 测试号的appIDappSecret: 测试号的appSecrettempId: 测试号的模板idmyBirthday: 自己的生日(1998-10-16)babyBirthday: 女朋友的生日loveDay: 相恋的日子#彩虹屁接口
tianapi:appKey: 天行数据Api的apiKeyarea: 要获取天气的城市
测试
test目录下“TemplateApplicationTests”类,单元测试,可不启动服务,测试代码是否有问题
专属微信公众号消息推送(java版)相关推荐
- 微信公众号消息推送开发(模板消息):点击推送消息跳转到网页或者小程序(三)
需求场景: 点击推送的消息后跳转到小程序中的某个页面,或者跳转到某一个网页上,例如有这样一个需求,在商城平台购买产品后,需要通过公众号给用户推送订单详细并且点击消息可以看到对应的订单详情.以下我将在微 ...
- 微信公众号消息推送流
一.前期准备工作: 1.需要申请私人/公司的测试号-- 参考这篇文章 ,微信公众平台测试帐号申请 - 简书 (jianshu.com) 1.1.需要响应微信发送的Token请求: 注意:这里的端口必须 ...
- java 实现微信公众号消息推送
注册微信公众号 这里主要用测试账号来演示:测试账号注册地址 正式账号注册地址:微信公众平台 设置消息模板 可参考微信公众号文档:微信公众号文档 模板根据需求设置(注意:参数长度不能超出微信规定,否则将 ...
- Java微信公众号消息推送
一.在项目的配置文件中配置公众号信息 # 微信公众号配置 wx:appid: **********secret: **************token: *********************a ...
- 微信公众号消息推送【专属早安】,五分钟快速实现,不会编程也可以 【--网站已修复】
效果演示 提前准备 申请一个微信公众号测试号.地址:测试号申请 扫码登陆注册,注册成功后就会生成微信公号的appID和appsecret.[最后步骤需要] 页面往下滑 有一个测试号二维码,[需要接收消 ...
- 微信公众号-消息推送
********步骤******** 1.登录微信公众号开发平台,进行企业认证. 2.获取appid.appsecret 3.查找相应的接口 *所有的操作都需要带有accessToken *可以先利用 ...
- 尝试开发微信公众号消息推送功能并且和小程序关联
之前写了几篇关于微信小程序的开发实践,总的来说没啥难度,感兴趣的请移步:使用Mpvue配合Weui开发面试题题库微信小程序,并且发布到正式环境,这一次我们来尝试开发一下微信公众号,那么公众号和小程序到 ...
- html消息推送微信,调用微信公众号消息推送
在微信公众号中对指定的已关注的用户进行消息推送 资源下载此资源下载价格为2D币,请先登录 资源文件列表 惟安在线设备数量监控 -/App.config , 458 惟安在线设备数量监控 -/bin/D ...
- 微信公众号消息推送-模板消息发送
先注册一个微信公众号;或者申请接口测试号来进行开发: 接口测试号申请链接: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login ...
最新文章
- CVPR2020 | 真实场景中的玻璃检测,有趣的应用
- 用onerror处理图片获取失败问题
- IOS开发笔记 - 基于SDWebImage的网络图片加载处理
- 云给数据中心带来了什么特性?
- SQL内连接和左连接的区别 - 使用SQLite演示
- 轻量级微服务架构实践之路
- .13-Vue源码之patch(3)(终于完事)
- php mysql需要服务器配置_php服务器配置(php+mysql+iis)步骤
- 程序员应具备的职业素质
- 用python求期望_Python——EM(期望极大算法)教学(附详细代码与注解)
- 修改fstab导致linux无法启动的解决
- iOS Your account already has a valid ios Distribution certificate
- 根据年、月、周、日设置时间节点的日期工具类
- 2021SC@SDUSC sm2算法原理(1)
- tplink无线网卡的linux,ubuntu上tp-link无线网卡驱动安装
- 【摄像头】Global Shutter(全局快门)与Rolling Shutter(卷帘快门)的区别与比较...
- Java栈,队列和循环队列的实现
- linux Guest账户下如何更新默认的python版本
- python蓝牙连接测试_基于python实现蓝牙通信代码实例
- 六度分离(Floyd算法)