在调用微信接口获取AccessToken
时,需要使用到微信公众号的appid
及appsecret
,获取方式如下:
已有公众号: 有属于自己的公众号账户,登录微信公众平台(https://mp.weixin.qq.com),在左侧菜单栏下方的设置与开发
中的基本配置
菜单中即可获取;
找不到的话,就在新功能上面去添加;
示例地址:[https://mp.weixin.qq.com/debug/cgi-bin/apiinfo]
测试公众号: 如果没有现成的公众号账户,或者只是测试公众号功能,可从微信提供测试环境(http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo)中获取appid
及appsecret
;
登录后进去的首页,往下滑,能够找到模板消息接口
点开新增测试模板之后,会有一个弹出框。可以看到有标题和内容。
这里说明了参数要求
参数需以{{开头,以.DATA}}结尾
标题是不需要参数的,只能写死。
但是内容就是这样写,内容可以根据自己需要,填写自己所定义的参数。后续使用的话也是一 一对应的。
bug类型:{{bugType.DATA}}
时间:{{date.DATA}}
项目名称:{{projectName.DATA}}
bug名称:{{bugName.DATA}}
优先级:{{sort.DATA}}
AccessToken说明
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>5.8.18</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
<version>5.8.18</version>
</dependency>
wechat:
app-id:
app-secret:
公众号信息配置类
package com.sunseagear.wind.modules.wechat.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Data
public class WechatConfig {
@Value("${wechat.app-id}")
private String appId;
@Value("${wechat.app-secret}")
private String appKey;
}
模板信息配置类
package com.sunseagear.wind.modules.wechat.config;
/**
* 微信模板
*/
public enum WxTemplateType {
WARN("3w4cpULH0vFvMSEj9AO6qu_Uqb7qxpi3Czwc5Gud1BE","bug提醒模板");
private String code;
private String desc;
WxTemplateType(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String code() {
return code;
}
public String desc() {
return desc;
}
}
package com.sunseagear.wind.modules.wechat.service;
import com.sunseagear.common.utils.CacheUtils;
import com.sunseagear.wind.modules.wechat.config.WechatConfig;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import jakarta.annotation.Resource;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Component
public class WeChatService {
private final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";
private final String USER_LIST = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
@Resource
private WechatConfig wechatConfig;
/**
* 获取access_token
* @return
*/
public JSONObject getAccessToken() {
String requestUrl = ACCESS_TOKEN_URL + "appid=" + wechatConfig.getAppId() + "&secret=" + wechatConfig.getAppKey();
String resp = HttpUtil.get(requestUrl);
JSONObject result = JSONUtil.parseObj(resp);
System.out.println("获取access_token:" + resp);
String token = result.getStrEscaped("access_token");
CacheUtils.setCacheObject("WeChatAccessToken", token, 60, TimeUnit.MINUTES);
return result;
}
/**
* 获取用户列表
* @param accessToken
* @return
*/
public JSONObject getUserList(String accessToken) {
String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&next_openid=";
String resp = HttpUtil.get(requestUrl);
JSONObject result = JSONUtil.parseObj(resp);
return result;
}
public JSONObject sendTemplateMsg(HashMap<String, Object> messageMap, String openId,String templateId) {
if (Objects.isNull(CacheUtils.getCacheObject("WeChatAccessToken"))) {
getAccessToken();
}
String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + CacheUtils.getCacheObject("WeChatAccessToken").toString();
Map<String,Object> content=new HashMap<>();
JSONObject data = JSONUtil.createObj();
//value 为需要设置的值 color为字体颜色
data.put("bugType",new JSONObject().put("value",messageMap.get("bugType")));
data.put("date",new JSONObject().put("value",messageMap.get("date")).put("color","#173177"));
data.put("projectName",new JSONObject().put("value",messageMap.get("projectName")).put("color","#173177"));
data.put("bugName",new JSONObject().put("value",messageMap.get("bugName")).put("color","#173177"));
data.put("sort",new JSONObject().put("value",messageMap.get("sort")).put("color","#173177"));
content.put("touser",openId);
if (Objects.nonNull(messageMap.get("url"))) {
content.put("url", messageMap.get("url"));
}
content.put("template_id",templateId);
content.put("data",data);
String resp = HttpUtil.post(requestUrl,new JSONObject(content).toString());
JSONObject result = JSONUtil.parseObj(resp);
return result;
}
}
package com.sunseagear.wind.modules.wechat.controller;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.sunseagear.wind.aspectj.annotation.Log;
import com.sunseagear.wind.modules.wechat.config.WxTemplateType;
import com.sunseagear.wind.modules.wechat.service.WeChatService;
import jakarta.annotation.Resource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
@RestController
@RequestMapping("/wx")
@PreAuthorize("hasAuthority('sys:wechat')")
@Log(title = "用户管理")
public class WeChatController {
@Resource
private WeChatService weChatService;
/**
* 发送模板消息
* @return
*/
@GetMapping( "/sedMsg")
public JSONObject sedMsg(){
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
JSONObject accessToken = weChatService.getAccessToken();
String token=accessToken.getStr("access_token");
//获取用户列表
JSONObject userList = weChatService.getUserList(token);
//获取所有关注用户
JSONArray openids = userList.getJSONObject("data").getJSONArray("openid");
HashMap<String, Object> message = new HashMap<>();
message.put("bugType", "测试bug");
message.put("date", LocalDateTime.now().format(dateTimeFormatter));
message.put("projectName", "唐嘉豪的项目");
message.put("bugName", "唐嘉豪的严重问题,罚款200");
message.put("sort", "致命(10)");
for (Object openid:openids) {
JSONObject resp = weChatService.sendTemplateMsg(message,openid.toString(), WxTemplateType.WARN.code());
}
return null;
}
}