• 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 }
  • 相关阅读:
    对自己负责~~
    继续负责
    问题的一天
    1个月=22年
    刚才写的没显示?
    布置任务
    心情很糟
    考试结束
    没有负责哈
    php获取任意时间的时间戳
  • 原文地址:https://www.cnblogs.com/rgqancy/p/WeiXinWeChatTemplateMessage.html
Copyright © 2020-2023  润新知