zoukankan      html  css  js  c++  java
  • 微信公众平台开发(1) 通用的工具类CommonUtil

    1、通用的调用微信的方法

    复制代码
     1      /**
     2      * 
     3      * @param requestUrl     接口地址
     4      * @param requestMethod  请求方法:POST、GET...
     5      * @param output         接口入参
     6      * @param needCert       是否需要数字证书
     7      * @return
     8      */
     9     private static StringBuffer httpsRequest(String requestUrl, String requestMethod, String output,boolean needCert)
    10             throws NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException, MalformedURLException,
    11             IOException, ProtocolException, UnsupportedEncodingException {
    12         
    13         
    14         URL url = new URL(requestUrl);
    15         HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
    16         
    17         //是否需要数字证书
    18         if(needCert){
    19             //设置数字证书
    20             setCert(connection);
    21         }
    22         connection.setDoOutput(true);
    23         connection.setDoInput(true);
    24         connection.setUseCaches(false);
    25         connection.setRequestMethod(requestMethod);
    26         if (null != output) {
    27             OutputStream outputStream = connection.getOutputStream();
    28             outputStream.write(output.getBytes("UTF-8"));
    29             outputStream.close();
    30         }
    31 
    32         // 从输入流读取返回内容
    33         InputStream inputStream = connection.getInputStream();
    34         InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    35         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    36         String str = null;
    37         StringBuffer buffer = new StringBuffer();
    38         while ((str = bufferedReader.readLine()) != null) {
    39             buffer.append(str);
    40         }
    41 
    42         bufferedReader.close();
    43         inputStreamReader.close();
    44         inputStream.close();
    45         inputStream = null;
    46         connection.disconnect();
    47         return buffer;
    48     }
    复制代码

    2、获取数字证书。JAVA只需要使用apiclient_cert.p12即可

    复制代码
     1     /**
     2      * 给HttpsURLConnection设置数字证书
     3      * @param connection
     4      * @throws IOException
     5      */
     6     private static void setCert(HttpsURLConnection connection) throws IOException{
     7         FileInputStream instream = null;
     8         try {
     9             KeyStore keyStore = KeyStore.getInstance("PKCS12");
    10             //读取本机存放的PKCS12证书文件
    11             instream = new FileInputStream(new File("certPath")); //certPath:数字证书路径
    12             
    13             //指定PKCS12的密码(商户ID)
    14             keyStore.load(instream, "商户ID".toCharArray());
    15             SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "商户ID".toCharArray()).build();
    16             //指定TLS版本
    17             SSLSocketFactory ssf = sslcontext.getSocketFactory(); 
    18              connection.setSSLSocketFactory(ssf);
    19         } catch (Exception e){
    20             e.printStackTrace();
    21         }finally {
    22             instream.close();
    23         }
    24     }
    复制代码

    3、调用微信接口后,返回数据格式转换

    复制代码
     1 /**
     2      * 如果返回JSON数据包,转换为 JSONObject
     3      * @param requestUrl 
     4      * @param requestMethod
     5      * @param outputStr
     6      * @param needCert
     7      * @return
     8      */
     9     public static JSONObject httpsRequestToJsonObject(String requestUrl, String requestMethod, String outputStr,boolean needCert) {
    10         JSONObject jsonObject = null;
    11         try {
    12              StringBuffer buffer = httpsRequest(requestUrl, requestMethod, outputStr,needCert);
    13             jsonObject = JSONObject.fromObject(buffer.toString());
    14         } catch (ConnectException ce) {
    15             log.error("连接超时:"+ce.getMessage());
    16         } catch (Exception e) {
    17             log.error("https请求异常:"+e.getMessage());
    18         }
    19         
    20         return jsonObject;
    21     }
    22     
    23     /**
    24      * 如果返回xml数据包,转换为Map<String, String>
    25      * @param requestUrl
    26      * @param requestMethod
    27      * @param outputStr
    28      * @param needCert
    29      * @return
    30      */
    31     public static Map<String, String> httpsRequestToXML(String requestUrl, String requestMethod, String outputStr,boolean needCert) {
    32         Map<String, String> result = new HashMap<>();
    33         try {
    34              StringBuffer buffer = httpsRequest(requestUrl, requestMethod, outputStr,needCert);
    35              result = parseXml(buffer.toString());
    36         } catch (ConnectException ce) {
    37             log.error("连接超时:"+ce.getMessage());
    38         } catch (Exception e) {
    39             log.error("https请求异常:"+e.getMessage());
    40         }
    41         return result;
    42     }
    43     
    44     /**
    45      * xml转为map
    46      * @param xml
    47      * @return
    48      */
    49     @SuppressWarnings("unchecked")
    50     public static Map<String, String> parseXml(String xml)  {
    51         Map<String, String> map = new HashMap<String, String>();
    52         try {
    53             Document document = DocumentHelper.parseText(xml);
    54             
    55             Element root = document.getRootElement();
    56             List<Element> elementList = root.elements();
    57     
    58             for (Element e : elementList){
    59                 map.put(e.getName(), e.getText());
    60             }
    61         } catch (DocumentException e1) {
    62             // TODO Auto-generated catch block
    63             e1.printStackTrace();
    64         }
    65         return map;
    66     }
    复制代码

    4、微信回调系统,将回调结果转换为map类型。支付通知等场景使用

    复制代码
     1 public static Map<Object, Object> parseXml(HttpServletRequest request) 
     2      {
     3         // 解析结果存储在HashMap
     4         Map<Object, Object> map = new HashMap<Object, Object>();
     5         try {
     6             InputStream inputStream;
     7             
     8                 inputStream = request.getInputStream();
     9             
    10             // 读取输入流
    11             SAXReader reader = new SAXReader();
    12             Document document = reader.read(inputStream);
    13             System.out.println(document);
    14             // 得到xml根元素
    15             Element root = document.getRootElement();
    16             // 得到根元素的所有子节点
    17             List<Element> elementList = root.elements();
    18          
    19             // 遍历所有子节点
    20             for (Element e : elementList)
    21                 map.put(e.getName(), e.getText());
    22          
    23             // 释放资源
    24             inputStream.close();
    25             inputStream = null;
    26         } catch (IOException e1) {
    27             // TODO Auto-generated catch block
    28             e1.printStackTrace();
    29         } catch (DocumentException e1) {
    30             // TODO Auto-generated catch block
    31             e1.printStackTrace();
    32         }
    33         return map;
    34     }
    复制代码

    5、普通javabean转换为排序SortedMap<Object,Object>,及签名。因微信签名要求按照accsii排序(升序)

    复制代码
     1 /** 
     2      * 将一个 JavaBean 对象转化为一个  Map 
     3      * @param bean 要转化的JavaBean 对象 
     4      * @return 转化出来的  Map 对象 
     5      * @throws IntrospectionException 如果分析类属性失败 
     6      * @throws IllegalAccessException 如果实例化 JavaBean 失败 
     7      * @throws InvocationTargetException 如果调用属性的 setter 方法失败 
     8      */   
     9     @SuppressWarnings({ "rawtypes"})   
    10     public static SortedMap<Object,Object> convertBean(Object bean) { 
    11         SortedMap<Object,Object> returnMap = new TreeMap<Object,Object>();  
    12         try {
    13             Class type = bean.getClass();   
    14             BeanInfo beanInfo = Introspector.getBeanInfo(type);
    15             PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();   
    16             for (int i = 0; i< propertyDescriptors.length; i++) {   
    17                 PropertyDescriptor descriptor = propertyDescriptors[i];   
    18                 String propertyName = descriptor.getName();   
    19                 if (!propertyName.equals("class")) {   
    20                     Method readMethod = descriptor.getReadMethod();   
    21                     Object result = readMethod.invoke(bean, new Object[0]);   
    22                     if (result != null) {   
    23                         returnMap.put(propertyName, result);   
    24                     } else {   
    25                         returnMap.put(propertyName, "");   
    26                     }   
    27                 }   
    28             }   
    29         } catch (IntrospectionException e) {
    30             e.printStackTrace();
    31         } catch (IllegalAccessException e) {
    32             e.printStackTrace();
    33         } catch (IllegalArgumentException e) {
    34             e.printStackTrace();
    35         } catch (InvocationTargetException e) {
    36             e.printStackTrace();
    37         }  
    38         return returnMap;   
    39     } 
    40 
    41 
    42 /**
    43       * 生成签名
    44       * @param parameters
    45       * @return
    46       */
    47      public static String createSgin(SortedMap<Object,Object> parameters)
    48      {
    49          StringBuffer sb = new StringBuffer();  
    50             Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)  
    51             Iterator it = es.iterator();  
    52             while(it.hasNext()) {  
    53                 Map.Entry entry = (Map.Entry)it.next();  
    54                 String k = (String)entry.getKey();  
    55                 Object v = entry.getValue();  
    56                 if(null != v && !"".equals(v)   
    57                         && !"sign".equals(k) && !"key".equals(k)) {  
    58                     sb.append(k + "=" + v + "&");  
    59                 }  
    60             }  
    61             sb.append("key=" + wxConfig.getWxKey());  
    62             String sgin=MD5.sign(sb.toString());
    63             return sgin;
    64      }
    复制代码
    复制代码
     1 /**
     2          * 获取ip地址
     3          * @param request
     4          * @return
     5          */
     6         public static String getIpAddr(HttpServletRequest request) {  
     7             InetAddress addr = null;  
     8             try {  
     9                 addr = InetAddress.getLocalHost();  
    10             } catch (UnknownHostException e) {  
    11                 return request.getRemoteAddr();  
    12             }  
    13             byte[] ipAddr = addr.getAddress();  
    14             String ipAddrStr = "";  
    15             for (int i = 0; i < ipAddr.length; i++) {  
    16                 if (i > 0) {  
    17                     ipAddrStr += ".";  
    18                 }  
    19                 ipAddrStr += ipAddr[i] & 0xFF;  
    20             }  
    21             return ipAddrStr;  
    22         }
    复制代码

    6、其他一些辅助类、方法

    复制代码
     1 /**
     2  * 获得指定长度的随机字符串
     3  * @author Administrator
     4  *
     5  */
     6 public class StringWidthWeightRandom {
     7     private int length = 32;  
     8     private char[] chars = new char[]{
     9         '0','1','2','3','4','5','6','7','8','9',
    10         'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
    11         'A','B','V','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
    12     };  
    13     private Random random = new Random();  
    14     
    15     //参数为生成的字符串的长度,根据给定的char集合生成字符串  
    16     public String getNextString(int length){      
    17           
    18         char[] data = new char[length];  
    19           
    20         for(int i = 0;i < length;i++){  
    21             int index = random.nextInt(chars.length);  
    22             data[i] = chars[index];  
    23         }  
    24         String s = new String(data);  
    25         return s;  
    26     }
    27 
    28     public int getLength() {
    29         return length;
    30     }
    31 
    32     public void setLength(int length) {
    33         this.length = length;
    34     }  
    35 }
    复制代码
    复制代码
     1 public class UtilDate {
     2     
     3     /** 年月日时分秒(无下划线) yyyyMMddHHmmss */
     4     public static final String dtLong                  = "yyyyMMddHHmmss";
     5     
     6     /** 完整时间 yyyy-MM-dd HH:mm:ss */
     7     public static final String simple                  = "yyyy-MM-dd HH:mm:ss";
     8     
     9     /** 年月日(无下划线) yyyyMMdd */
    10     public static final String dtShort                 = "yyyyMMdd";
    11     
    12     
    13     /**
    14      * 返回系统当前时间(精确到毫秒),作为一个唯一的订单编号
    15      * @return
    16      *      以yyyyMMddHHmmss为格式的当前系统时间
    17      */
    18     public  static String getDateLong(){
    19         Date date=new Date();
    20         DateFormat df=new SimpleDateFormat(dtLong);
    21         return df.format(date);
    22     }
    23     
    24     /**
    25      * 获取系统当前日期(精确到毫秒),格式:yyyy-MM-dd HH:mm:ss
    26      * @return
    27      */
    28     public  static String getDateFormatter(){
    29         Date date=new Date();
    30         DateFormat df=new SimpleDateFormat(simple);
    31         return df.format(date);
    32     }
    33     
    34     /**
    35      * 获取系统当期年月日(精确到天),格式:yyyyMMdd
    36      * @return
    37      */
    38     public static String getDate(){
    39         Date date=new Date();
    40         DateFormat df=new SimpleDateFormat(dtShort);
    41         return df.format(date);
    42     }
    43     
    44     
    45     
    46 }
    复制代码
    复制代码
     1 public class MD5 {
     2     public static String sign(String str){
     3         MessageDigest md5;
     4         String sgin = "";
     5         try {
     6             md5 = MessageDigest.getInstance("MD5");
     7             md5.reset();
     8             md5.update(str.getBytes("UTF-8"));
     9             sgin = byteToStr(md5.digest()).toUpperCase();
    10         } catch (NoSuchAlgorithmException e) {
    11             e.printStackTrace();
    12         } catch (UnsupportedEncodingException e) {
    13             e.printStackTrace();
    14         }
    15         return sgin;
    16     }
    17     
    18     /**
    19      * 将字节数组转换为十六进制字符串
    20      * 
    21      * @param byteArray
    22      * @return
    23      */
    24     public static String byteToStr(byte[] byteArray) {
    25         String strDigest = "";
    26         for (int i = 0; i < byteArray.length; i++) {
    27             strDigest += byteToHexStr(byteArray[i]);
    28         }
    29         return strDigest;
    30     }
    31 
    32     /**
    33      * 将字节转换为十六进制字符串
    34      * 
    35      * @param btyes
    36      * @return
    37      */
    38     public static String byteToHexStr(byte bytes) {
    39         char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    40         char[] tempArr = new char[2];
    41         tempArr[0] = Digit[(bytes >>> 4) & 0X0F];
    42         tempArr[1] = Digit[bytes & 0X0F];
    43 
    44         String s = new String(tempArr);
    45         return s;
    46     }
    47     
    48 }
    复制代码
  • 相关阅读:
    分享几个原生javascript面向对象设计小游戏
    原生javascript模仿win8等待进度条。
    微信公众平台入门开发教程.Net(C#)框架
    AsyncDelegate
    Lock
    BackgroundWorker
    Thread
    深拷贝-浅拷贝
    WindowsService
    事件本质
  • 原文地址:https://www.cnblogs.com/jpfss/p/9772059.html
Copyright © 2011-2022 走看看