Java使用HTTPClient4.3开发的公众平台消息模板的推送功能

代码引用,参考文章:http://www.cnblogs.com/feiyun126/p/4778556.html,表示感谢!

  1 package com.yuanchuangyun.cyb.manager.busniess.impl;
  2 
  3 
  4 import java.io.IOException;
  5 import java.net.SocketTimeoutException;
  6 import java.net.URI;
  7 import java.nio.charset.StandardCharsets;
  8 import java.security.GeneralSecurityException;
  9 import java.security.cert.CertificateException;
 10 import java.security.cert.X509Certificate;
 11 import java.util.ArrayList;
 12 import java.util.List;
 13 import java.util.Map;
 14 import java.util.Map.Entry;
 15 import java.util.Set;
 16 
 17 import javax.net.ssl.SSLContext;
 18 import javax.net.ssl.SSLException;
 19 import javax.net.ssl.SSLSession;
 20 import javax.net.ssl.SSLSocket;
 21 
 22 import org.apache.commons.io.IOUtils;
 23 import org.apache.commons.lang.StringUtils;
 24 import org.apache.http.Consts;
 25 import org.apache.http.HttpEntity;
 26 import org.apache.http.HttpResponse;
 27 import org.apache.http.NameValuePair;
 28 import org.apache.http.client.HttpClient;
 29 import org.apache.http.client.config.RequestConfig;
 30 import org.apache.http.client.config.RequestConfig.Builder;
 31 import org.apache.http.client.entity.UrlEncodedFormEntity;
 32 import org.apache.http.client.methods.CloseableHttpResponse;
 33 import org.apache.http.client.methods.HttpGet;
 34 import org.apache.http.client.methods.HttpPost;
 35 import org.apache.http.conn.ConnectTimeoutException;
 36 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 37 import org.apache.http.conn.ssl.SSLContextBuilder;
 38 import org.apache.http.conn.ssl.TrustStrategy;
 39 import org.apache.http.conn.ssl.X509HostnameVerifier;
 40 import org.apache.http.entity.ContentType;
 41 import org.apache.http.entity.StringEntity;
 42 import org.apache.http.impl.client.CloseableHttpClient;
 43 import org.apache.http.impl.client.HttpClients;
 44 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 45 import org.apache.http.message.BasicNameValuePair;
 46 import org.apache.http.util.EntityUtils;
 47 import org.json.JSONException;
 48 import org.json.JSONObject;
 49 
 50 
 51 /**
 52  * 依赖的jar包有:commons-lang-2.6.jar、httpclient-4.3.2.jar、httpcore-4.3.1.jar、commons-io-2.4.jar
 53  * @author Renguoqiang
 54  *
 55  */
 56 public class WeiXinTemplateMessageService {
 57 
 58     public static final int connTimeout=10000;
 59     public static final int readTimeout=10000;
 60     public static final String charset="UTF-8";
 61     private static HttpClient client = null;
 62     
 63     static {
 64         PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
 65         cm.setMaxTotal(128);
 66         cm.setDefaultMaxPerRoute(128);
 67         client = HttpClients.custom().setConnectionManager(cm).build();
 68     }
 69     
 70     public static String postParameters(String url, String parameterStr) throws ConnectTimeoutException, SocketTimeoutException, Exception{
 71         return post(url,parameterStr,"application/x-www-form-urlencoded",charset,connTimeout,readTimeout);
 72     }
 73     
 74     public static String postParameters(String url, String parameterStr,String charset, Integer connTimeout, Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception{
 75         return post(url,parameterStr,"application/x-www-form-urlencoded",charset,connTimeout,readTimeout);
 76     }
 77     
 78     public static String postParameters(String url, Map<String, String> params) throws ConnectTimeoutException,  
 79      SocketTimeoutException, Exception {
 80          return postForm(url, params, null, connTimeout, readTimeout);
 81      }
 82     
 83     public static String postParameters(String url, Map<String, String> params, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,  
 84     SocketTimeoutException, Exception {
 85          return postForm(url, params, null, connTimeout, readTimeout);
 86      }
 87       
 88     public static String get(String url) throws Exception {  
 89         return get(url, charset, null, null);  
 90     }
 91     
 92     public static String get(String url, String charset) throws Exception {  
 93         return get(url, charset, connTimeout, readTimeout);  
 94     } 
 95 
 96     /** 
 97      * 发送一个 Post 请求, 使用指定的字符集编码. 
 98      *  
 99      * @param url 
100      * @param body RequestBody 
101      * @param mimeType 例如 application/xml "application/x-www-form-urlencoded" a=1&b=2&c=3
102      * @param charset 编码 
103      * @param connTimeout 建立链接超时时间,毫秒. 
104      * @param readTimeout 响应超时时间,毫秒. 
105      * @return ResponseBody, 使用指定的字符集编码. 
106      * @throws ConnectTimeoutException 建立链接超时异常 
107      * @throws SocketTimeoutException  响应超时 
108      * @throws Exception 
109      */  
110     public static String post(String url, String body, String mimeType,String charset, Integer connTimeout, Integer readTimeout) 
111             throws ConnectTimeoutException, SocketTimeoutException, Exception {
112         HttpClient client = null;
113         HttpPost post = new HttpPost(url);
114         String result = "";
115         try {
116             if (StringUtils.isNotBlank(body)) {
117                 HttpEntity entity = new StringEntity(body, ContentType.create(mimeType, charset));
118                 post.setEntity(entity);
119             }
120             // 设置参数
121             Builder customReqConf = RequestConfig.custom();
122             if (connTimeout != null) {
123                 customReqConf.setConnectTimeout(connTimeout);
124             }
125             if (readTimeout != null) {
126                 customReqConf.setSocketTimeout(readTimeout);
127             }
128             post.setConfig(customReqConf.build());
129 
130             HttpResponse res;
131             if (url.startsWith("https")) {
132                 // 执行 Https 请求.
133                 client = createSSLInsecureClient();
134                 
135                 HttpGet httpGet = new HttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxxxxxxxxxxxxxx&secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxx");
136                 HttpResponse responseGet = client.execute(httpGet);
137                 //System.out.println(responseGet);
138                 String responseText = EntityUtils.toString(responseGet.getEntity(), StandardCharsets.UTF_8);
139                 //System.out.println(responseText);
140                 httpGet.releaseConnection();
141                 String access_token = "";
142                 access_token = responseText.replaceAll("(?s).*access_token":"", "").replaceAll("(?s)","expires_in.*", "");
143                 System.out.println("access_token:"+access_token);
144                 
145                 post.setURI(new URI(post.getURI()+access_token));
146                 
147                 res = client.execute(post);
148             } else {
149                 // 执行 Http 请求.
150                 client = WeiXinTemplateMessageService.client;
151                 res = client.execute(post);
152             }
153             result = IOUtils.toString(res.getEntity().getContent(), charset);
154         } finally {
155             post.releaseConnection();
156             if (url.startsWith("https") && client != null&& client instanceof CloseableHttpClient) {
157                 ((CloseableHttpClient) client).close();
158             }
159         }
160         return result;
161     }  
162     
163     
164     /** 
165      * 提交form表单 
166      *  
167      * @param url 
168      * @param params 
169      * @param connTimeout 
170      * @param readTimeout 
171      * @return 
172      * @throws ConnectTimeoutException 
173      * @throws SocketTimeoutException 
174      * @throws Exception 
175      */  
176     public static String postForm(String url, Map<String, String> params, Map<String, String> headers, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,  
177             SocketTimeoutException, Exception {  
178   
179         HttpClient client = null;  
180         HttpPost post = new HttpPost(url);  
181         try {  
182             if (params != null && !params.isEmpty()) {  
183                 List<NameValuePair> formParams = new ArrayList<org.apache.http.NameValuePair>();  
184                 Set<Entry<String, String>> entrySet = params.entrySet();  
185                 for (Entry<String, String> entry : entrySet) {  
186                     formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));  
187                 }  
188                 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, Consts.UTF_8);  
189                 post.setEntity(entity);  
190             }
191             
192             if (headers != null && !headers.isEmpty()) {  
193                 for (Entry<String, String> entry : headers.entrySet()) {  
194                     post.addHeader(entry.getKey(), entry.getValue());  
195                 }  
196             }  
197             // 设置参数  
198             Builder customReqConf = RequestConfig.custom();  
199             if (connTimeout != null) {  
200                 customReqConf.setConnectTimeout(connTimeout);  
201             }  
202             if (readTimeout != null) {  
203                 customReqConf.setSocketTimeout(readTimeout);  
204             }  
205             post.setConfig(customReqConf.build());  
206             HttpResponse res = null;  
207             if (url.startsWith("https")) {  
208                 // 执行 Https 请求.  
209                 client = createSSLInsecureClient();  
210                 res = client.execute(post);  
211             } else {  
212                 // 执行 Http 请求.  
213                 client = WeiXinTemplateMessageService.client;  
214                 res = client.execute(post);  
215             }  
216             return IOUtils.toString(res.getEntity().getContent(), "UTF-8");  
217         } finally {  
218             post.releaseConnection();  
219             if (url.startsWith("https") && client != null  
220                     && client instanceof CloseableHttpClient) {  
221                 ((CloseableHttpClient) client).close();  
222             }  
223         }  
224     } 
225     
226     
227     
228     
229     /** 
230      * 发送一个 GET 请求 
231      *  
232      * @param url 
233      * @param charset 
234      * @param connTimeout  建立链接超时时间,毫秒. 
235      * @param readTimeout  响应超时时间,毫秒. 
236      * @return 
237      * @throws ConnectTimeoutException   建立链接超时 
238      * @throws SocketTimeoutException   响应超时 
239      * @throws Exception 
240      */  
241     public static String get(String url, String charset, Integer connTimeout,Integer readTimeout) 
242             throws ConnectTimeoutException,SocketTimeoutException, Exception { 
243         
244         HttpClient client = null;  
245         HttpGet get = new HttpGet(url);  
246         String result = "";  
247         try {  
248             // 设置参数  
249             Builder customReqConf = RequestConfig.custom();  
250             if (connTimeout != null) {  
251                 customReqConf.setConnectTimeout(connTimeout);  
252             }  
253             if (readTimeout != null) {  
254                 customReqConf.setSocketTimeout(readTimeout);  
255             }  
256             get.setConfig(customReqConf.build());  
257   
258             HttpResponse res = null;  
259   
260             if (url.startsWith("https")) {  
261                 // 执行 Https 请求.  
262                 client = createSSLInsecureClient();  
263                 res = client.execute(get);  
264             } else {  
265                 // 执行 Http 请求.  
266                 client = WeiXinTemplateMessageService.client;
267                 res = client.execute(get);  
268             }  
269   
270             result = IOUtils.toString(res.getEntity().getContent(), charset);  
271         } finally {  
272             get.releaseConnection();  
273             if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) {  
274                 ((CloseableHttpClient) client).close();  
275             }  
276         }  
277         return result;  
278     }  
279     
280     
281     /** 
282      * 从 response 里获取 charset 
283      *  
284      * @param ressponse 
285      * @return 
286      */  
287     @SuppressWarnings("unused")  
288     private static String getCharsetFromResponse(HttpResponse ressponse) {  
289         // Content-Type:text/html; charset=GBK  
290         if (ressponse.getEntity() != null  && ressponse.getEntity().getContentType() != null && ressponse.getEntity().getContentType().getValue() != null) {  
291             String contentType = ressponse.getEntity().getContentType().getValue();  
292             if (contentType.contains("charset=")) {  
293                 return contentType.substring(contentType.indexOf("charset=") + 8);  
294             }  
295         }  
296         return null;  
297     }  
298     
299     
300     
301     /**
302      * 创建 SSL连接
303      * @return
304      * @throws GeneralSecurityException
305      */
306     private static CloseableHttpClient createSSLInsecureClient() throws GeneralSecurityException {
307         try {
308             SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
309                         public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {
310                             return true;
311                         }
312                     }).build();
313             
314             SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
315                 @Override
316                 public boolean verify(String arg0, SSLSession arg1) {
317                     return true;
318                 }
319 
320                 @Override
321                 public void verify(String host, SSLSocket ssl)
322                         throws IOException {
323                 }
324 
325                 @Override
326                 public void verify(String host, X509Certificate cert)
327                         throws SSLException {
328                 }
329 
330                 @Override
331                 public void verify(String host, String[] cns,
332                         String[] subjectAlts) throws SSLException {
333                 }
334             });
335 
336             return HttpClients.custom().setSSLSocketFactory(sslsf).build();
337             
338         } catch (GeneralSecurityException e) {
339             throw e;
340         }
341     }
342     
343     public static void main(String[] args) {  
344         try {
345             JSONObject jsonParam = new JSONObject();  
346             try {
347                 jsonParam.put("touser","o8cOBwvAJTSPbOhOInWlb7GYdKuA");
348                 jsonParam.put("template_id","yke5zUpgAolH5FzxIj8OuzX_qQ2jAEVpFWpzkU7a59c");
349                 jsonParam.put("url","http://weixin.qq.com/download");
350                 jsonParam.put("data","{}");
351             } catch (JSONException e) {
352                 System.out.println(e);
353                 e.printStackTrace();
354             }
355             String jsonStr = jsonParam.toString();
356             
357             String str= post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=",jsonStr,"application/json", "UTF-8", 10000, 10000);
358             System.out.println(str);
359         } catch (ConnectTimeoutException e) {
360             // TODO Auto-generated catch block
361             e.printStackTrace();
362         } catch (SocketTimeoutException e) {
363             // TODO Auto-generated catch block
364             e.printStackTrace();
365         } catch (Exception e) {
366             // TODO Auto-generated catch block
367             e.printStackTrace();
368         }
369     }
370 }
原文地址:https://www.cnblogs.com/rgqancy/p/WeiXinWeChatTemplateMessage.html