登录微信公众平台
地址 : https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
申请 appid ,appsecret
设置模板
通过微信公众平台接口调试工具获取token
获取关注公众号用户的openId
![在这里插入图片描述](https://img-blog.csdnimg.cn/a6054c5ce014443cbbb3e1f850f61c34.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFfMzQxMzU2MTU=,size_20,color_FFFFFF,t_70,g_se,x_1
根据接口文档编写代码
接口文档地址: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
/***
* 微信公众号配置
*/
@Component
@ConfigurationProperties(prefix = "weixin")
@Data
public class WeiXinBase {
/***
* 公众号appId
*/
private String appId;
private String appsecret;
/***
* 消息模板id
*/
private String templateId;
}
/***
* 微信请求参数对象
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WeiXinRequestDTO {
private String touser;
private String template_id;
private String url;
private Min miniprogram;
private Map<String,Word> data;
@Data
class Min{
private String appid;
private String pagepath;
}
@Data
@Builder(toBuilder = true)
public static class Word{
private String value;
private String color;
}
}
/***
* 获取微信请求token
*/
public class AccessTokenUtil {
//token请求地址
private static final String TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token";
/***
* 获取Token
* @param appId
* @param secret
* @return
*/
public static String getAccessToken(String appId,String secret){
Map<String,Object> params = Maps.newHashMap();
params.put("grant_type","client_credential");
params.put("appid",appId);
params.put("secret",secret);
return HttpUtil.get(TOKEN_URL,params);
}
}
/***
* http请求类
*/
public class HttpRequestUtil {
//请求地址
private static String TEMPLATE_URL="https://api.weixin.qq.com/cgi-bin/message/template/send";
/***
* http post请求
* @param t
* @param token
* @param <T>
* @return
*/
public static <T> String postJSON(T t,String token){
try {
HttpResponse execute = HttpUtil.createPost(TEMPLATE_URL + "?access_token=" + token)
.contentType("application/json")
.bearerAuth(token)
.body(new ObjectMapper().writeValueAsString(t))
.execute();
if(execute.isOk()){
return execute.body();
}else {
return null;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
/***
* 发送微信模板消息
*/
@Service
@Slf4j
public class WeiXinTemplateService {
@Resource
private RedisTemplate redisTemplate;
@Resource
private WeiXinBase weiXinBase;
private static final String WEIXIN_TOKEN = "wei:xin:token";
public String send(String content, String openId) {
WeiXinRequestDTO weiXinRequestDTO = WeiXinRequestDTO.builder()
.template_id(weiXinBase.getTemplateId())
.touser(openId)
.build();
Map<String, WeiXinRequestDTO.Word> map = Maps.newHashMap();
map.put("head", WeiXinRequestDTO.Word.builder()
.color("#173177")
.value("购票信息")
.build());
map.put("passenger", WeiXinRequestDTO.Word.builder()
.color("#173177")
.value(content)
.build());
map.put("salseTime", WeiXinRequestDTO.Word.builder()
.value(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
.color("#173177")
.build());
map.put("departTime", WeiXinRequestDTO.Word.builder()
.color("#173177")
.value("2021-09-17 18:30:00")
.build());
map.put("carNo", WeiXinRequestDTO.Word.builder()
.color("#173177")
.value("渝A6666")
.build());
map.put("seatNo", WeiXinRequestDTO.Word.builder()
.color("#173177")
.value(redisTemplate.opsForValue().increment("seatNo").toString())
.build());
weiXinRequestDTO.setData(map);
String accessToken = null;
String json = null;
try {
if (redisTemplate.hasKey(WEIXIN_TOKEN)) {
accessToken = redisTemplate.opsForValue().get(WEIXIN_TOKEN).toString();
log.info("从缓存获取token:{}", accessToken);
} else {
String token = AccessTokenUtil.getAccessToken(weiXinBase.getAppId(), weiXinBase.getAppsecret());
JsonNode access_token = new ObjectMapper().readTree(token).get("access_token");
accessToken = access_token.asText();
redisTemplate.opsForValue().set(WEIXIN_TOKEN, accessToken);
}
if (StringUtils.isNotBlank(accessToken)) {
log.info("token:{}", accessToken);
log.info("请求参数:{}", new ObjectMapper().writeValueAsString(weiXinRequestDTO));
json = HttpRequestUtil.postJSON(weiXinRequestDTO, accessToken);
}
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
}