當把要發送的數據準備好之后,接下來是要寫https請求,把它發送給微信服務器需要抓取異常,并處理好異常
寫一個HttpClientUtil類
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import com.yxht.core.common.tools.LoadProperties;
import com.yxht.core.modules.WechatPay.client.TenpayHttpClient;
/**
* Http客戶端工具類<br/>
* 這是內部調用類,請不要在外部調用。
* @author miklchen
*
*/
public class HttpClientUtil {
/**
* 發送請求(微信支付用,發紅包等等)
* @param url
* @param params
* @return
* @throws Exception
*/
public static String sendHttpsUrl(String sendUrl, String params) throws Exception{
String jsonStr = "";
String certificate_path = "d\:\\rootca.pem"; //信任庫證書
String keystore_path = "d\:\\apiclient_cert.p12"; //密鑰庫證書
String password = "xxxxxxxx"; //商戶號,也是加載證書的密碼
// 聲明SSL上下文
SSLContext sslContext = null;
// 實例化主機名驗證接口
sslContext = getSSLContext(password, keystore_path, certificate_path);
if (sslContext != null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext
.getSocketFactory());
}
URL url = new URL(sendUrl);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
//設置套接工廠
con.setSSLSocketFactory(sslContext.getSocketFactory());
OutputStreamWriter writer = new OutputStreamWriter(
con.getOutputStream(), "UTF-8");
writer.write(params);
writer.flush();
writer.close();
InputStream in = con.getInputStream();
BufferedReader db = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String tmp = "";
while ((tmp = db.readLine()) != null) {
jsonStr += tmp;
}
return jsonStr;
}
/**
* 獲得SSLSocketFactory.
* @param password
* 密碼
* @param keyStorePath
* 密鑰庫路徑
* @param trustStorePath
* 信任庫路徑
* @return SSLSocketFactory
* @throws Exception
*/
public static SSLContext getSSLContext(String password,
String keyStorePath, String trustStorePath) throws Exception {
// 實例化密鑰庫
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
// 獲得密鑰庫
KeyStore keyStore = getKeyStore(password, keyStorePath);
// 初始化密鑰工廠
keyManagerFactory.init(keyStore, password.toCharArray());
// 實例化信任庫
// TrustManagerFactory trustManagerFactory = TrustManagerFactory
// .getInstance(TrustManagerFactory.getDefaultAlgorithm());
// // 獲得信任庫
// KeyStore trustStore = getKeyStore(password, trustStorePath);
// // 初始化信任庫
// trustManagerFactory.init(trustStore);
// 實例化SSL上下文
SSLContext ctx = SSLContext.getInstance("TLS");
// 初始化SSL上下文
ctx.init(keyManagerFactory.getKeyManagers(),
null, null);
// 獲得SSLSocketFactory
return ctx;
}
/**
* 獲得KeyStore.
* @param keyStorePath
* 密鑰庫路徑
* @param password
* 密碼
* @return 密鑰庫
* @throws Exception
*/
public static KeyStore getKeyStore(String password, String keyStorePath)
throws Exception {
// 實例化密鑰庫
KeyStore ks = KeyStore.getInstance("PKCS12");
// 獲得密鑰庫文件流
FileInputStream is = new FileInputStream(keyStorePath);
// 加載密鑰庫
ks.load(is, password.toCharArray());
// 關閉密鑰庫文件流
is.close();
return ks;
}
}
有些import的沒用,可以刪掉,只要程序代碼沒有報錯的地方就行。
到這里,如果發送請求,會失敗,它會說你沒有安裝證書,到商戶平臺上去下載證書,文檔里有說明
下載后一共有4個證書,至少需要密鑰庫證書apiclient_cert.p12,因為信任庫證書rootca.pem我不會用(哪位大神會用教教我),
文檔里也說了信任庫證書不用也行,證書安裝請仔細研究文檔,代碼上面已經寫好了。
最后最后,,請發送請求吧!??!
聲明:工具類代碼參考微信支付開發的demo,有些自己做了小改動。
PS:需要引入http相關jar包,httpcore-4.2.3.jar,httpmine-4.2.3.jar,httpclient-4.2.3.jar,httpclient-cache-4.2.3.jar。一樣,