@Data
@NoArgsConstructor
@AllArgsConstructor
public class WxMssVO {
/**
* 用户openid
*/
private String touser;
/**
* 订阅消息模版id
*/
private String template_id;
/**
* 默认跳到小程序首页
*/
private String page = "pages/index/index";
/**
* 推送文字
*/
private Map<String, TemplateData> data;
}
@Slf4j
@Component
public class PushMessageUtils{
/**
* 获取Access_Token
*
* @return Access_Token
*/
public static String getAccessToken() {
AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
accessTokenDTO.setKey("client_credential");
AccessTokenVO accessTokenVO = pushMessageUtils.accessTokenMapper.getAccessToken("client_credential");
//accessToken的有效期是7200(秒),我设定的是超过7000就更新一次数据库
if (ObjectUtil.isNotEmpty(accessTokenVO)) {
long between = DateUtil.between(accessTokenVO.getTime(), new Date(), DateUnit.SECOND);
if (between > 7000) {
String accessToken = PushMessageUtils.accessToken();
accessTokenDTO.setAccessToken(accessToken);
pushMessageUtils.accessTokenMapper.updateAccessToken(accessTokenDTO);
return accessToken;
} else {
return accessTokenVO.getAccessToken();
}
}
String accessToken = PushMessageUtils.accessToken();
accessTokenDTO.setAccessToken(accessToken);
pushMessageUtils.accessTokenMapper.saveAccessToken(accessTokenDTO);
return accessToken;
}
public static String accessToken() {
String getAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
String appId = "appid";
String secret = "secret";
Map<String, Object> map = new HashMap<>();
map.put("grant_type", "client_credential");
map.put("appid", appId);
map.put("secret", secret);
HttpResponse response = HttpRequest.get(getAccessTokenUrl).form(map).execute();
JSONObject jsonObject = JSONObject.parseObject(response.body());
return jsonObject.getString("access_token");
}
/**
* 消息拼接模板
*
* @param openIds 发送消息open_id
* @param parameterMap 参数map
* @param templateId 模板id
* @return List<WxMssVo> 推送消息的参数封装
*/
public static List<WxMssVO> template(List<String> openIds,
Map<String, Object> parameterMap,
String templateId) {
List<WxMssVO> result = new ArrayList<>();
for (String openId : openIds) {
WxMssVO wxMssVo = new WxMssVO();
Map<String, TemplateData> templateDataMap = new HashMap<>(12);
// touser
wxMssVo.setTouser(openId);
wxMssVo.setTemplate_id(templateId);
// data
for (int i = 0; i < parameterMap.size(); i++) {
for (String key : parameterMap.keySet()) {
templateDataMap.put(key, new TemplateData(parameterMap.get(key)));
}
}
wxMssVo.setData(templateDataMap);
result.add(wxMssVo);
}
return result;
}
/**
* 小程序推送通知HttpClient
*
* @param wxMssVo 请求体
* @return responseBody
*/
public static void request4sendMessage(WxMssVO wxMssVo) {
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+ getAccessToken();
HttpResponse execute = HttpRequest.post(url)
.body(JSONObject.toJSONString(wxMssVo))
.execute();
log.info("推送通知成功,请求参数:{} 收件人:{} 返回信息:{}", wxMssVo, wxMssVo.getTouser(), execute);
}
}
public static void teamplateMessage(List<String> openIds,String name) {
Map<String, Object> map = new HashMap<>(10);
//受邀请人
map.put("name1",name);
// 状态
map.put("thing4", "接受");
// 备注
map.put("thing5", "同意了您的挑战");
List<WxMssVO> template = template(openIds, map, "模板id");
template.forEach(PushMessageUtils::request4sendMessage);
}
}
测试
@Test
public void testMessage(){
String openId="";
List<String> openIds =new ArrayList<>();
openIds.add(openId);
PushMessageUtils.teamplateMessage(openIds,"张三");
}