实现发送微信订阅消息

@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,"张三");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值