要在Java中实现向微信公众号推送模板消息,可以使用微信公众平台提供的API。以下是一个基本的步骤概述和示例代码。

1. 获取Access Token

在调用微信API之前,首先需要获取 access_token。这个令牌有效期为2小时,需要定期刷新。

public String getAccessToken(String appId, String appSecret) {
    String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
    String result = sendGetRequest(url);
    JSONObject jsonObject = new JSONObject(result);
    return jsonObject.getString("access_token");
}

2. 构建模板消息内容

根据你希望发送的内容构建模板消息的JSON数据。

public String buildTemplateMessage(String toUser, String templateId, String url, Map<String, String> data) {
    JSONObject messageJson = new JSONObject();
    messageJson.put("touser", toUser);
    messageJson.put("template_id", templateId);
    messageJson.put("url", url);

    JSONObject dataJson = new JSONObject();
    for (Map.Entry<String, String> entry : data.entrySet()) {
        JSONObject valueJson = new JSONObject();
        valueJson.put("value", entry.getValue());
        valueJson.put("color", "#173177");  // 默认颜色,可以自定义
        dataJson.put(entry.getKey(), valueJson);
    }

    messageJson.put("data", dataJson);
    return messageJson.toString();
}

3. 发送模板消息

使用 access_token 和构建的模板消息,通过POST请求发送消息。

public String sendTemplateMessage(String accessToken, String messageJson) {
    String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
    String result = sendPostRequest(url, messageJson);
    return result;
}

4. HTTP请求方法

你可以使用以下简单的HTTP请求方法来发送GET和POST请求。

public String sendGetRequest(String url) {
    try {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("GET");
        connection.connect();
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuilder content = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }
        in.close();
        return content.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public String sendPostRequest(String url, String data) {
    try {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        OutputStream os = connection.getOutputStream();
        os.write(data.getBytes("UTF-8"));
        os.close();
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuilder content = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }
        in.close();
        return content.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

5. 完整示例

整合以上步骤,以下是一个完整的示例:

public class WeChatTemplateMessage {

    private static final String APP_ID = "你的AppId";
    private static final String APP_SECRET = "你的AppSecret";

    public static void main(String[] args) {
        WeChatTemplateMessage weChat = new WeChatTemplateMessage();
        String accessToken = weChat.getAccessToken(APP_ID, APP_SECRET);

        Map<String, String> data = new HashMap<>();
        data.put("first", "您好,您有新的通知");
        data.put("keyword1", "关键字1");
        data.put("keyword2", "关键字2");
        data.put("remark", "点击查看详情");

        String messageJson = weChat.buildTemplateMessage("用户OpenId", "模板Id", "http://example.com", data);
        String result = weChat.sendTemplateMessage(accessToken, messageJson);

        System.out.println("发送结果:" + result);
    }

    // 上述方法都在此处定义...
}

注意事项

  • 在实际生产环境中,需要定期刷新 access_token,并妥善处理错误。
  • 微信公众平台可能有消息频率限制,需要注意控制发送频率。

java 微信公众号推送模版消息_模板消息