微信公众号——微信公众号实现发送模板消息

发布时间:2024年01月10日

准备工作

在调用微信接口获取AccessToken时,需要使用到微信公众号的appidappsecret,获取方式如下:

1.已有公众号

已有公众号: 有属于自己的公众号账户,登录微信公众平台(https://mp.weixin.qq.com),在左侧菜单栏下方的设置与开发中的基本配置菜单中即可获取;
在这里插入图片描述
在这里插入图片描述

1.2获取 模板消息ID

找不到的话,就在新功能上面去添加;
在这里插入图片描述
在这里插入图片描述

2、公众平台接口调试示例

示例地址:[https://mp.weixin.qq.com/debug/cgi-bin/apiinfo]在这里插入图片描述

2. 测试公众号

测试公众号: 如果没有现成的公众号账户,或者只是测试公众号功能,可从微信提供测试环境(http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo)中获取appidappsecret
在这里插入图片描述
登录后进去的首页,往下滑,能够找到模板消息接口
在这里插入图片描述

1.创建模板

点开新增测试模板之后,会有一个弹出框。可以看到有标题和内容。
在这里插入图片描述
这里说明了参数要求
参数需以{{开头,以.DATA}}结尾

2.编写模板内容

在这里插入图片描述
标题是不需要参数的,只能写死。
但是内容就是这样写,内容可以根据自己需要,填写自己所定义的参数。后续使用的话也是一 一对应的。

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失效。

2、Java代码实现

使用到的依赖

		<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>

配置Yaml

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;
    }

}

文章来源:https://blog.csdn.net/weixin_45816407/article/details/135500288
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。