java集成微信发送模板消息

登录微信公众平台

地址 : 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值