要在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
,并妥善处理错误。 - 微信公众平台可能有消息频率限制,需要注意控制发送频率。