微信公众号发送小程序消息java_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...

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

老规矩先看效果图

4fac799aa370d15adba3a0ced58b2054.png

至于如何创建模板消息,如果获取模板id我这节就不再讲解,不知道的同学可以查看我上篇文章《借助云开发实现小程序订阅消息和模板消息的推送功能》里面有详细的讲解。

今天呢就来重点讲下如何在Java后台编写小程序订阅消息推送的知识。

其实我很早之前有写过一篇Java实现模板消息推送的,但是小程序后面用订阅消息替换了模板推送,所以我也会根据最新的知识点不定期的更新文章的。

发送订阅消息三步走

1,拿到用户的openid

2,获取access_token

3,调用小程序消息推送的接口

一,获取用户的openid

关于用户openid的获取,我写过很多篇文章了,也有录过视频出来的,还不知道怎么获取的同学,可以取翻看下我之前的文章,或者看下我录制的零基础入门小程序的视频:《5小时零基础入门小程序云开发》 所以这一步不是今天的重点。

二,获取access_token

首先来看下access_token是什么,下图是官方给出的

5549210f56d5f9ba0ddbab385525f073.png

其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。所以下面先讲下如果获取access_token

看下官方文档,可以知道我们需要用到下面的几个参数

8e0af7912b0c554a8d4a9f44ed779d23.png

grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到,我也有录视频教大家如何拿到,如果不知道怎么获取的同学可以取看下我的视频。

下面就是Java代码的编写了

我们这里用的是springboot,这里涉及到一个请求小程序官方接口,所以我们这里用了springboot自带的RestTemplate来做网络请求。具体代码如下。

3ae6a07df1ba03019cbbc1442c0f6bc9.png

可以看出代码很简单,就是用RestTemplate来实现一个get请求,这样我们就可以轻松的获取到了access_token。

注意点

关于这个access_token,是存在有效期的,来看下官方给出的提示

623655a005b839919f23fd922ee6f133.png

所以我要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。由于这里不是本节的重点,我这里只给大家说下原理。

三,发送消息到小程序

我们通过上面第二步,成功的获取到了access_token。下面就要调用小程序官方为我们提供的发送消息的接口了。先看下官方文档。

e84fab5368f966834fbfd880b4f71fcf.png

上面的参数都是我们发送消息时需要的。这些参数的定义和设置我在前面的文章里也都讲过了,不知道的同学可以去看下我前面写的这篇文章 《借助云开发实现小程序订阅消息和模板消息的推送功能》

这里需要注意的一点是,我们要给用户发送消息,就必须引导用户授权,就是下面这个图

ca509fa5b8463489c1a07f4bcfc6e607.png

因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。

推送的Java代码如下

c4aafd4f521b8e4779d7e370a8aa5a69.png

可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容。。。

这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了。

d5235216d502a823957ecef053360fae.png

我们在浏览器里调用上面接口,可以看到下图所示,这样就代表我们消息推送成功了。

084e78aac4b1576dfff6e0559ef0e3c7.png

下面我把完整的代码贴出来给到大家。

package com.qcl.demo;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.GetMapping;

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;

/**

* 作者:编程小石头

* 发送小程序订阅消息

*/

@RestController

public class SendWxMessage {

/*

* 发送订阅消息

* */

@GetMapping("/pushOneUser")

public String pushOneUser() {

return push("o3DoL0WEdzcJ20AVJg1crP96gbjM");

}

public String push(String openid) {

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(openid);//用户的openid(要发送给那个用户,通常这里应该动态传进来的)

wxMssVo.setTemplate_id("CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU");//订阅消息模板id

wxMssVo.setPage("pages/index/index");

Map m = new HashMap<>(3);

m.put("thing1", new TemplateData("小程序入门课程"));

m.put("thing6", new TemplateData("杭州浙江大学"));

m.put("thing7", new TemplateData("第一章第一节"));

wxMssVo.setData(m);

ResponseEntity responseEntity =

restTemplate.postForEntity(url, wxMssVo, String.class);

return responseEntity.getBody();

}

@GetMapping("/getAccessToken")

public String getAccessToken() {

RestTemplate restTemplate = new RestTemplate();

Map params = new HashMap<>();

params.put("APPID", "wx7c54942dfc87f4d8"); //

params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49"); //

ResponseEntity 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();

JSONObject object = JSON.parseObject(body);

String Access_Token = object.getString("access_token");

String expires_in = object.getString("expires_in");

System.out.println("有效时长expires_in:" + expires_in);

return Access_Token;

}

}

对应的两个数据类如下

WxMssVo用来封装请求官方接口的参数

package com.qcl.demo;

import java.util.Map;

/*

* 小程序推送所需数据

* 编程小石头

* */

public class WxMssVo {

private String touser;//用户openid

private String template_id;//订阅消息模版id

private String page = "pages/index/index";//默认跳到小程序首页

private Map 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 getData() {

return data;

}

public void setData(Map data) {

this.data = data;

}

}

TemplateData 用来定义消息的内容

package com.qcl.demo;

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;

}

}

到这里我们就可以完整的实现Java发送小程序消息的功能了。完整代码也已经贴给大家了。

后面我会写更多Java和小程序相关的文章出来,敬请期待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值