官方文档:
小程序前端:点击进入
小程序服务端:点击进入

一,代码实现(后端)

①定义实体类

package com.saic.fin.system.sendInfo;import lombok.Data;import java.util.Map;@Data
public class WxMsgVo {private String touser;//用户openIdprivate String template_id;//模版idprivate Map<String , TemplateData> data;//推送文字private String page="pages/index/index";//跳转路径 ,默认跳转到小程序首页}
package com.saic.fin.system.sendInfo;public class TemplateData {private String value;public TemplateData(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

②定义HttpUtil类(Get请求)

package com.saic.fin.system.util;import com.alibaba.fastjson.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;public class HttpUtil {public static final String APPID = "";//小程序APPID(小程序ID)public static final String APPSECRET = "";//小程序APPSECRET(小程序秘钥)public static JSONObject doGetJson(String URL) throws IOException {JSONObject jsonObject = null;HttpURLConnection conn = null;InputStream is = null;BufferedReader br = null;StringBuilder result = new StringBuilder();try {//创建远程url连接对象URL url = new URL(URL);//通过远程url连接对象打开一个连接,强转成HTTPURLConnection类conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//设置连接超时时间和读取超时时间conn.setConnectTimeout(15000);conn.setReadTimeout(60000);conn.setRequestProperty("Accept", "application/json");//发送请求conn.connect();//通过conn取得输入流,并使用Reader读取if (200 == conn.getResponseCode()) {is = conn.getInputStream();br = new BufferedReader(new InputStreamReader(is, "UTF-8"));String line;while ((line = br.readLine()) != null) {result.append(line);System.out.println(line);}} else {System.out.println("ResponseCode is an error code:" + conn.getResponseCode());}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (br != null) {br.close();}if (is != null) {is.close();}} catch (IOException ioe) {ioe.printStackTrace();}conn.disconnect();}jsonObject = JSONObject.parseObject(result.toString());return jsonObject;}
}

③验证token过期时间

package com.saic.fin.system.OfficialAccounts;import lombok.Data;@Data
public class AccessToken {private String accessToken;//过期时间 当前系统时间+微信传来的过期时间private Long expiresTime;public AccessToken(String accessToken, String expiresIn) {this.accessToken = accessToken;this.expiresTime = System.currentTimeMillis()+Integer.parseInt(expiresIn)*1000;}/*** 判断token是否过期* @return*/public boolean isExpired(){return System.currentTimeMillis()>expiresTime;}
}

④小程序发送消息

package com.saic.fin.system.sendInfo;import com.alibaba.fastjson.JSONObject;
import com.saic.fin.system.OfficialAccounts.AccessToken;
import com.saic.fin.system.util.AuthUtil;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.Map;/*** 发送小程序订阅消息*/
public class SendWxMessage {public static final String APP_ACCESS_TOKEN_URL= "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+HttpUtil.APPID+"&secret="+HttpUtil.APPSECRET;private static AccessToken at;public static String push(String openid) {RestTemplate restTemplate = new RestTemplate();String accessToken = getToken();//这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken;//拼接推送的模版WxMsgVo wxMsgVo = new WxMsgVo();wxMsgVo.setTouser(openid);//用户的openid(要发送给那个用户)wxMsgVo.setTemplate_id("CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU");//订阅消息模板idwxMsgVo.setPage("pages/index/index");Map<String, TemplateData> m = new HashMap<>(3);m.put("thing1", new TemplateData("课程"));m.put("thing6", new TemplateData("大学"));m.put("thing7", new TemplateData("一节"));wxMsgVo.setData(m);ResponseEntity<String> responseEntity =restTemplate.postForEntity(url, wxMsgVo, String.class);return responseEntity.getBody();}public static String getToken(){if (at == null || at.isExpired()){getAccessToken();}return at.getAccessToken();}/*** 获取token*/private static void getAccessToken() {//发送请求获取tokenJSONObject token = null;try {token = AuthUtil.doGetJson(APP_ACCESS_TOKEN_URL);} catch (Exception e) {e.printStackTrace();}JSONObject jsonObject = token;String accessToken = (String) jsonObject.get("access_token");Integer expiresIn = (Integer) jsonObject.get("expires_in");//创建token对象,并存储at = new AccessToken(accessToken,String.valueOf(expiresIn));}
}

AuthUtil工具类

package com.saic.fin.system.util;import com.alibaba.fastjson.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;/*** 微信授权登录调用Util*/
public class AuthUtil {public static final String APPID = "xxxxxx";//小程序APPID(小程序ID)public static final String APPSECRET = "xxxxxxxxxxx";//小程序APPSECRET(小程序秘钥)public static JSONObject doGetJson(String URL) throws IOException {JSONObject jsonObject = null;HttpURLConnection conn = null;InputStream is = null;BufferedReader br = null;StringBuilder result = new StringBuilder();try {//创建远程url连接对象URL url = new URL(URL);//通过远程url连接对象打开一个连接,强转成HTTPURLConnection类conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//设置连接超时时间和读取超时时间conn.setConnectTimeout(15000);conn.setReadTimeout(60000);conn.setRequestProperty("Accept", "application/json");//发送请求conn.connect();//通过conn取得输入流,并使用Reader读取if (200 == conn.getResponseCode()) {is = conn.getInputStream();br = new BufferedReader(new InputStreamReader(is, "UTF-8"));String line;while ((line = br.readLine()) != null) {result.append(line);System.out.println(line);}} else {System.out.println("ResponseCode is an error code:" + conn.getResponseCode());}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (br != null) {br.close();}if (is != null) {is.close();}} catch (IOException ioe) {ioe.printStackTrace();}conn.disconnect();}jsonObject = JSONObject.parseObject(result.toString());return jsonObject;}
}

微信小程序订阅消息推送(附带后台java代码)相关推荐

  1. 【Node.js】实现微信小程序订阅消息推送功能

    实战项目名称:实现微信小程序订阅消息通知 文章目录 一.实战步骤 1. 登录微信小程序管理端,添加订阅消息模板 2. 定义好需要发送的消息 3.获取小程序的access_token 4. 发起请求,向 ...

  2. Java开发微信小程序订阅消息推送

    使用到开源工具WxJava 这里环境使用到springboot 框架,废话不多说直接上干货. pom.xml引用 <!-- https://mvnrepository.com/artifact/ ...

  3. 微信小程序订阅消息推送-php

    最近在给微信小程序写后端接口,有一个场景是 每天给指定账号推送 小程序消息,这期间踩了不少坑,希望记录下来能帮助导大家. 给小程序用户推送消息,首先需要获取用户的openid,这个是小程序的openi ...

  4. 微信小程序--订阅消息推送

    首先我开发的小程序是一个员工积分系统,分为员工端.管理端.员工端发布的任务 要求推送到对应员工.以下贴一下大概流程代码 1. $this->messagePush($data['task_tit ...

  5. in java中文版百度云 thinking_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...

    前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,<借助云开发实现小程序订阅消息和模板消息的推送功能>是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序 ...

  6. 微信小程序开发—消息推送

    微信小程序的消息推送简单的说就是发送一条微信通知给用户,用户点开消息可以查看消息内容,可以链接进入到小程序的指定页面. 微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单.支付成功.一次 ...

  7. 微信小程序开发消息推送配置教程

    微信小程序开发消息推送配置教程 微信小程序开发消息推送配置这一块网上都是PHP居多,由于用egg.js写了一套验证方法. 第一步:填写服务器配置 登录微信小程序官网后,在小程序官网的"设置- ...

  8. java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...

    我们在做小程序开发时,消息推送是不可避免的.今天就来教大家如何实现小程序消息推送的后台和前台开发.源码会在文章末尾贴出来. 其实我之前有写过一篇:<springboot实现微信消息推送,java ...

  9. 云开发实现小程序订阅消息推送功能

    步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用. 步骤二:请 ...

最新文章

  1. 关于Yii2中CSS,JS文件的引入心得
  2. gridview的buttonfield获取该行的索引值(实例讲解)
  3. 2.4g 无线键鼠对码软件_无线路由器的2.4G和5G同时开速度有影响吗?
  4. 英语影视台词---六、Saving Private Ryan Quotes
  5. nginx訪問php配置,thinkphp5配置nginx访问
  6. Oracle EBS数据定义移植工具:FNDLOAD
  7. 计组之总线:2、总线仲裁(链式查询、计数器查询、独立请求、分布式查询)
  8. JSF和Facelets的lifecircle
  9. python iloc iat_Python Pandas Dataframe.iat[ ]用法及代码示例
  10. android开发模板web,Android开发实践:Android.mk模板
  11. 华中科技计算机基础第五次,华中科技大学c++第5次上机作业
  12. *第6章 判别分析及R使用
  13. 怎么做c语言的子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  14. GNU ARM汇编--(五)中断汇编之嵌套中断处理
  15. mac Sourcetree 账号密码输入错误后, 重新输入的方法
  16. 计算机领域EI和SCI收录期刊、影响因子及国际会议
  17. bartender 10.1破解版|bartender条码打印10.1
  18. 有道词典单词本导入到欧路词典单词本
  19. 减少资源占用 Vista操作系统瘦身大法
  20. 一文搞懂 deconvolution、transposed convolution、sub-­pixel or fractional convolution

热门文章

  1. 北林校赛 北林oj 1332 冰尘君与扑克魔术
  2. java“/”除号意思是:取整 并不会出现小数
  3. POJ 3131 Cubic Eight-Puzzle
  4. word 插多张图片 如何左右分开排版 一行三张图片
  5. AOSP: 下载 android 源码
  6. this关键字 就近原则 构造方法
  7. 小程序-首页小列表查看更多
  8. 莫拉蒂接过法切蒂接力棒
  9. OpenMax在Android上的实现
  10. 这是我真实的,零基础自学编程,找到满意工作的经历。