目录
前言
公众号消息模板推送有很多便利,尤其是针对小程序的消息提醒,具有及时性,准确性等有优势,还可以点击进入小程序当然更加适配小程序的有专门的小程序订阅消息,这个之后再列举。
介绍
这里注意申请的公众号
必须是服务号
才能开通模板消息功能,另外申请模板消息的时候要选择正确适用的行业,因为选择完行业之后的模板都是关于这个行业的。
关于使用规则,请注意:
-
所有
服务号
都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限; - 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
- 在所选择行业的模板库中选用已有的模板进行调用;
- 每个账号可以同时使用25个模板。
- 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在 MP 登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号 MP 后台开发者中心页面中标明的数字为准。
准备操作
1.申请服务号并进行微信认证。
2.再新增功能里开通模板消息,选择适用的行业。
3.配置基本信息 开发者ID,密钥,ip白名单 这里注意要填写ip白名单,测试的时候,如果使用本地测试需要把本地的ip放到微信公众平台的白名单中才可以测试成功。
服务器地址:支持http 80 https 443 用于获取code的授权页面的访问地址
代码
//配置类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "gzh")
public class WxMpProperties {
/**
* 公众号appId
*/
private String appId;
/**
* 公众号appSecret
*/
private String secret;
}
//配置类
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.utils.StringUtil;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Configuration
public class WxConfig {
private final WxMpProperties wxMpProperties;
@Autowired
private RedisTemplate redisTemplate;
/**
* 构造注入
*
* @param wxMpProperties
*/
WxConfig(WxMpProperties wxMpProperties) {
this.wxMpProperties = wxMpProperties;
}
/**
* 微信客户端配置存储
*
* @return
*/
@Bean
public WxMpConfigStorage wxMpConfigStorage() {
WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
// 公众号appId
configStorage.setAppId(wxMpProperties.getAppId());
// 公众号appSecret
configStorage.setSecret(wxMpProperties.getSecret());
// 公众号Token
configStorage.setToken(getToken());
return configStorage;
}
/**
* 声明实例
*
* @return
*/
@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
}
public String getToken() {
Object accessToken1 = redisTemplate.opsForValue().get("AccessToken");
if (null != accessToken1) {
String accessToken = (String) redisTemplate.opsForValue().get("AccessToken");
if (accessToken != null) {
return accessToken;
}
}
String s = HttpUtils.sendGet(" https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxMpProperties.getAppId() + "&secret=" + wxMpProperties.getSecret(), null);
System.out.println(s);
Map<String, Object> map = JSON.parseObject(s);
System.out.println(map);
if (StringUtil.isNullOrEmpty(map.get("access_token"))) {
return null;
}
String access_token = map.get("access_token").toString();
//官方返回的access_token有效时间为2小时=7200秒 这里存到redis 7000秒
redisTemplate.opsForValue().set("AccessToken", access_token, 7000, TimeUnit.SECONDS);
return access_token;
}
public static void main(String[] args) {
String s = HttpUtils.sendGet(" https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa19e546e72ba4e71&secret=8efa42dfd859601d5800d75f725a739e", null);
System.out.println(s);
Map<String, Object> map = JSON.parseObject(s);
System.out.println(map);
}
}
//发送通知
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.utils.DateTool;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@RequestMapping("app/MessagePushController")
public class MessagePushController {
/**
* 微信消息推送
*/
private final WxMsgPush wxMsgPush;
/**
* 微信公众号API的Service
*/
private final WxMpService wxMpService;
/**
* 构造注入
*/
MessagePushController(WxMsgPush wxMsgPush, WxMpService wxMpService) {
this.wxMsgPush = wxMsgPush;
this.wxMpService = wxMpService;
}
@RequestMapping("toWxMessage")
public AjaxResult toWxMessage(){
String openId = null;
openId="oZN0p6z6Ad7D2jBYWjoTqsdj5Q8c";//用户openid
// 发送模板消息接口
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
// 接收者openid
.toUser(openId)
// 模板id
.templateId("DP_W_VaO6hHvnS02HquweCj3K4765f42SygSJP_ke9w")
// 模板跳转链接
// .url("http://www.baidu.com")
.build();
// 添加模板数据
templateMessage.addData(new WxMpTemplateData("first","标题"))
.addData(new WxMpTemplateData("keyword1", "1"))
.addData(new WxMpTemplateData("keyword2", "2"))
.addData(new WxMpTemplateData("keyword3", "3"))
.addData(new WxMpTemplateData("remark",""));
String msgId = null;
try {
// 发送模板消息
msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
e.printStackTrace();
}finally {
}
return null;
}
注意:上述配置类中获取的token是有时效的所以可以把他放到redis缓存里,这样需要的时候从redis里拿,空的时候再获取放入redis。里面用到的openid为公众号授权获取到的用户id,获取公众号openid方式如下:前端提供code
String url = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", "wx3453a1546e72ba4e71", "3455435dfhdfhd", code);
// String url = String.format(拼接的路径, appId, secret, code);
// 远程调用微信获取openId
String str = HttpUtils.sendGet(url, null);
JSONObject json = JSON.parseObject(str);
String errcode = json.getString("errcode");
if (errcode != null)
return AjaxResult.error("调用错误:" + errcode);
String openid = json.getString("openid");
if (StringUtil.isEmpty(openid))
return AjaxResult.error("获取openid错误:" + errcode);
System.out.println("openid:" + openid);
官方开发文档附上:
模板消息 | 微信开放文档 (qq.com)
附:人们常说拼尽全力才活成一个普通人,你又拼出几分。
版权声明:本文为Mr_likes原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。