Java微信公众号推送模版消息的方法示例

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

要在Java中向微信公众号推送模板消息,首先需要确保我们已经有了微信公众号,并且已经设置了模板消息权限和模板ID。模板消息是一种向用户发送通知的服务,广泛用于订单状态更新、服务提示等场景。
下面,我将具体介绍如何使用Java结合微信官方提供的API来实现模板消息的推送。这通常涉及几个步骤:获取access_token、组装模板消息数据、发送哀求。
第一步:准备工作


  • 微信公众号配置:确保我们的公众号已经开通模板消息功能,并创建了相应的模板。
  • 引入依赖:我们可能需要使用HTTP客户端库,如Apache HttpClient或OkHttp。这里我们使用Apache HttpClient。
    在我们的pom.xml中添加依赖(如果使用Maven):
    1. <dependency>  
    2.     <groupId>org.apache.httpcomponents</groupId>  
    3.     <artifactId>httpclient</artifactId>  
    4.     <version>4.5.13</version>  
    5. </dependency>
    复制代码
第二步:获取Access Token

微信公众号API的调用大多需要Access Token,这是一个临时票据,用于调用接口的身份验证。
  1. import org.apache.http.client.methods.HttpGet;  
  2. import org.apache.http.impl.client.CloseableHttpClient;  
  3. import org.apache.http.impl.client.HttpClients;  
  4. import org.apache.http.util.EntityUtils;  
  5.   
  6. public class WeChatUtil {  
  7.   
  8.     private static final String APP_ID = "我们的AppID";  
  9.     private static final String APP_SECRET = "我们的AppSecret";  
  10.     private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}";  
  11.   
  12.     public static String getAccessToken() throws Exception {  
  13.         String url = TOKEN_URL.replace("{}", APP_ID).replace("{}", APP_SECRET);  
  14.         HttpGet request = new HttpGet(url);  
  15.         CloseableHttpClient httpClient = HttpClients.createDefault();  
  16.         String result = httpClient.execute(request, httpResponse ->  
  17.                 EntityUtils.toString(httpResponse.getEntity()));  
  18.         // 解析JSON获取access_token,这里假设已经通过某种方式(如Jackson, Gson)解析  
  19.         // 这里简单用String.split()模拟解析  
  20.         String[] parts = result.split(",");  
  21.         for (String part : parts) {  
  22.             if (part.contains("access_token")) {  
  23.                 String[] tokenParts = part.split(":");  
  24.                 return tokenParts[1].trim().replace(""", "");  
  25.             }  
  26.         }  
  27.         return null;  
  28.     }  
  29. }
复制代码
第三步:发送模板消息
  1. import org.apache.http.client.methods.HttpPost;  
  2. import org.apache.http.entity.StringEntity;  
  3. import org.apache.http.message.BasicHeader;  
  4. import org.apache.http.util.EntityUtils;  
  5.   
  6. public class TemplateMessageSender {  
  7.   
  8.     public static void sendTemplateMessage(String accessToken, String toUserOpenId, String templateId, String url, Map<String, TemplateData> data) throws Exception {  
  9.         String json = "{"touser":"" + toUserOpenId + "","template_id":"" + templateId + "","url":"" + url + "","data":{";  
  10.         for (Map.Entry<String, TemplateData> entry : data.entrySet()) {  
  11.             json += """ + entry.getKey() + "":{"value":"" + entry.getValue().getValue() + "","color":"" + entry.getValue().getColor() + ""},";  
  12.         }  
  13.         if (!json.endsWith(",")) {  
  14.             json = json.substring(0, json.length() - 1);  
  15.         }  
  16.         json += "}}";  
  17.   
  18.         String messageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;  
  19.         HttpPost request = new HttpPost(messageUrl);  
  20.         request.setHeader(new BasicHeader("Content-Type", "application/json; charset=UTF-8"));  
  21.         request.setEntity(new StringEntity(json, "UTF-8"));  
  22.   
  23.         CloseableHttpClient httpClient = HttpClients.createDefault();  
  24.         String result = httpClient.execute(request, httpResponse ->  
  25.                 EntityUtils.toString(httpResponse.getEntity()));  
  26.         System.out.println("发送结果: " + result);  
  27.     }  
  28.   
  29.     static class TemplateData {  
  30.         private String value;  
  31.         private String color;  
  32.   
  33.         // 构造器、getter和setter省略  
  34.     }  
  35. }
复制代码
第四步:调用发送模板消息的方法

在完成了WeChatUtil类用于获取access_token和TemplateMessageSender类用于发送模板消息后,我们需要在我们的应用逻辑中调用这些方法。以下是一个示例,展示如何整合这些步骤来发送模板消息。
首先,确保我们有一个包罗模板消息数据的Map,此中键是模板中定义的字段名,值是TemplateData对象(包罗具体的值和可选的颜色)。
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.   
  4. public class WeChatTemplateMessageExample {  
  5.   
  6.     public static void main(String[] args) {  
  7.         try {  
  8.             // 获取access_token  
  9.             String accessToken = WeChatUtil.getAccessToken();  
  10.             if (accessToken == null) {  
  11.                 System.out.println("获取access_token失败");  
  12.                 return;  
  13.             }  
  14.   
  15.             // 准备模板消息数据  
  16.             Map<String, TemplateMessageSender.TemplateData> data = new HashMap<>();  
  17.             data.put("first", new TemplateMessageSender.TemplateData("这是第一条消息", "#173177"));  
  18.             data.put("keyword1", new TemplateMessageSender.TemplateData("这是关键词1的内容", "#173177"));  
  19.             data.put("keyword2", new TemplateMessageSender.TemplateData("这是关键词2的内容", "#173177"));  
  20.             data.put("remark", new TemplateMessageSender.TemplateData("这是备注信息", "#173177"));  
  21.   
  22.             // 发送模板消息  
  23.             String toUserOpenId = "用户的OpenID";  
  24.             String templateId = "我们的模板ID";  
  25.             String url = "点击后跳转的链接";  
  26.             TemplateMessageSender.sendTemplateMessage(accessToken, toUserOpenId, templateId, url, data);  
  27.   
  28.             System.out.println("模板消息发送成功");  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.             System.out.println("发送模板消息失败:" + e.getMessage());  
  32.         }  
  33.     }  
  34. }
复制代码
留意事项


  • 安全性:在现实应用中,应避免将APP_ID和APP_SECRET硬编码在代码中,可以通过配置文件或环境变量等方式来管理。
  • 错误处理:上述示例中的错误处理非常简朴,仅打印了堆栈跟踪和错误消息。在生产环境中,我们可能需要更复杂的错误处理逻辑,比如重试机制、日志记录等。
  • HTTP客户端:示例中使用了Apache HttpClient,但我们也可以选择其他HTTP客户端库,如OkHttp、Retrofit等。
  • JSON解析:示例中使用了简朴的字符串操纵来模拟JSON解析,但在现实开发中,我们应该使用专门的JSON库(如Jackson、Gson)来解析和构建JSON数据。
  • 模板ID和OpenID:确保模板ID和用户的OpenID是正确的,并且模板ID与我们要发送的数据字段相匹配。
  • API限制:微信对API调用有频率限制,请确保我们的应用不会超出这些限制。
通过上述步骤,我们应该能够在Java中成功地向微信公众号发送模板消息。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表