微信https请求工具类

时间:2023-03-09 01:05:29
微信https请求工具类

工作中用到的微信https请求工具类。

package com.gxgrh.wechat.tools;

import com.gxgrh.wechat.wechatapi.service.SystemApiService;
import org.apache.http.HttpConnection;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import javax.net.ssl.*;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map; /**发送https请求的工具类
* Created by Administrator on 2016/9/27.
*/
@Component
public class HttpTool { @Autowired
private IoTool ioTool; private static final Logger logger = LogManager.getLogger(HttpTool.class); /**
* 忽视证书HostName
*/
private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslsession) {
System.out.println("WARNING: Hostname is not matched for cert.");
return true;
}
}; /**
* Ignore Certification
*/
private static TrustManager ignoreCertificationTrustManger = new X509TrustManager(){
private X509Certificate[] certificates;
public void checkClientTrusted(X509Certificate certificates[],
String authType) throws CertificateException {
if (this.certificates == null) {
this.certificates = certificates;
}
}
public void checkServerTrusted(X509Certificate[] ax509certificate,
String s) throws CertificateException {
if (this.certificates == null) {
this.certificates = ax509certificate;
}
}
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return new java.security.cert.X509Certificate[0];
}
}; public String sendSSLGetMethod(String urlString) throws Exception{
String repString = null;
InputStream is = null;
HttpsURLConnection connection = null;
try { URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf);
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
is.close();
is = null;
}
if(null != connection){
connection.disconnect();
}
}
return repString;
} public String sendSSLPostMethod(String urlString,String postData) throws Exception{
String repString = null;
InputStream is = null;
HttpsURLConnection connection = null;
try { URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("content-type","text/json");
connection.setRequestProperty("content-length",String.valueOf(postData.getBytes().length));
connection.getOutputStream().write(postData.getBytes("utf-8"));
connection.getOutputStream().flush();
connection.getOutputStream().close();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf);
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
is.close();
is = null;
}
if(null != connection){
connection.disconnect();
}
}
return repString;
} /**
* 上传文件到微信服务器
* @param urlString 上传的目标url
* @param filePath 文件路路径
* @Param formDataName 表单id
* @return
* @throws Exception
*/
public String sendSSLMutiPartFormData(String urlString,String filePath,String formDataName) throws Exception{
String repString = null;
InputStream is = null;
OutputStream out = null;
HttpsURLConnection connection = null;
final String BOUNDARYSTR = ""+System.currentTimeMillis();
final String BOUNDARY = "--"+BOUNDARYSTR+"\r\n";
try{
File file = new File(filePath);
if(!file.exists() || !file.isFile()){
String errorMsg = "文件["+filePath+"]不存在。无法上传。";
logger.error(errorMsg);
throw new Exception(errorMsg);
}
URL url = new URL(urlString);
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
// 设置请求头信息
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-type", "multipart/form-data;boundary=" + BOUNDARYSTR);
StringBuilder sb = new StringBuilder();
sb.append(BOUNDARY);
sb.append("Content-Disposition: form-data;name=\""+formDataName+"\";filename=\""
+ file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
out = new DataOutputStream(connection.getOutputStream());
// 输出表头
out.write(head);
// 文件正文部分
// 把文件已流文件的方式 推入到url中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = bis.read(bufferOut,0,1024)) != -1) {
out.write(bufferOut, 0, bytes);
}
bis.close();
byte[] foot = ("\r\n--" + BOUNDARYSTR + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
out.write(foot);
out.flush();
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf);
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
}catch(Exception ex){
logger.error(ex.getMessage());
ex.printStackTrace();
}finally {
if(null != is){
is.close();
is = null;
}
if(null != connection){
connection.disconnect();
}
}
return repString;
} /**
*
* @param urlString
* @return
*/
public Map<String,Object> sendSSLGetDownloadMedia(String urlString){
String fileName = null;
byte[] repData = null;
InputStream is = null;
Map<String,Object> resultInfo = null;
HttpsURLConnection connection = null;
try { URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf); /**从以下头部数据解析出文件名
* Content-disposition: attachment; filename="MEDIA_ID.jpg"
*/
String contentDisposition = connection.getHeaderField("Content-disposition");
if(contentDisposition != null){
String[] contentDispositionArray = contentDisposition.split(";");
for(String content:contentDispositionArray){
if(content.contains("filename")){
String[] contentArry = content.split("=");
fileName = contentArry[1];
fileName = fileName.replaceAll("\"","");
}
}
}
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repData = this.ioTool.getByteArrayFromInputStream(is);
resultInfo = new HashMap<String,Object>();
resultInfo.put("fileName",fileName);
resultInfo.put("data",repData);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
} }
if(null != connection){
connection.disconnect();
}
}
return resultInfo;
} /**
*
* @param urlString
* @param postData
* @return
*/
public Map<String,Object> sendSSLPostDownloadMedia(String urlString, String postData){
String fileName = null;
byte[] repData = null;
InputStream is = null;
Map<String,Object> resultInfo = null;
HttpsURLConnection connection = null;
try{
URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("content-type","text/json");
connection.setRequestProperty("content-length",String.valueOf(postData.getBytes().length));
connection.getOutputStream().write(postData.getBytes("utf-8"));
connection.getOutputStream().flush();
connection.getOutputStream().close();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf); /**从以下头部数据解析出文件名
* Content-disposition: attachment; filename="MEDIA_ID.jpg"
*/
String contentDisposition = connection.getHeaderField("Content-disposition");
String[] contentDispositionArray = contentDisposition.split(";");
for(String content:contentDispositionArray){
if(content.contains("filename")){
String[] contentArry = content.split("=");
fileName = contentArry[1];
fileName = fileName.replaceAll("\"","");
}
}
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repData = this.ioTool.getByteArrayFromInputStream(is);
resultInfo = new HashMap<String,Object>();
resultInfo.put("fileName",fileName);
resultInfo.put("data",repData);
}catch (Exception ex){
logger.error(ex.getMessage());
ex.printStackTrace();
}finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
}
}
if(null != connection){
connection.disconnect();
}
}
return resultInfo; } /**
*
* @param urlString
* @return
*/
public String sendGetMethod(String urlString){
String repString = null;
InputStream is = null;
URLConnection connection = null;
try { URL url = new URL(urlString);
connection = url.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
} }
}
return repString;
} /**
*
* @param urlString
* @param postData
* @return
*/
public String sendPostMethod(String urlString, String postData){
String repString = null;
InputStream is = null;
URLConnection connection = null;
try { URL url = new URL(urlString);
connection = url.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("content-type","text/json");
connection.getOutputStream().write(postData.getBytes("utf-8"));
connection.getOutputStream().flush();
connection.getOutputStream().close();
connection.getOutputStream().close();
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
} }
}
return repString;
} /**
* 判断某个请求是否是异步的
* @param request
* @return
*/
public boolean isAsynchronousRequest(HttpServletRequest request){ //Jquery的ajax请求默认会加上这个头部
String jQueryAjaxHeader = request.getHeader("x-requested-with");
//原生js使用ajax请加上一个头部参数请求头部:XMLHttpRequest.setRequestHeader("RequestType","AJAX");
String customAjaxHeader = request.getHeader("RequestType");
if(( Validate.isString(jQueryAjaxHeader) && jQueryAjaxHeader.equals("XMLHttpRequest"))
|| (Validate.isString(customAjaxHeader) && customAjaxHeader.equals("AJAX")) ){
return true;
}
return false;
}
}

主要难点是微信需要https请求。工具类里另外还封装了post方法上传素材,post方法下载素材,get方法下载素材。

直接拷贝代码会有错误,主要是logger部分的代码和还有IoTool工具类,可以自己修改下。