OkHttp3使用證書發(fā)起請(qǐng)求
最近在對(duì)接微信支付功能梗顺,微信所有接口都采用okHttp3請(qǐng)求车摄,但是申請(qǐng)退款接口需要證書才能調(diào)用仑鸥,那如何使用證書發(fā)起請(qǐng)求以及證書如何獲取眼俊,先看一下微信開發(fā)文檔
- 在微信支付接口中粟关,涉及資金回滾的接口會(huì)使用到API證書,包括退款澎灸、撤銷接口遮晚。商家在申請(qǐng)微信支付成功后县遣,收到的相應(yīng)郵件后,可以按照指引下載API證書萧求,也可以按照以下路徑下載:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶中心-->賬戶設(shè)置-->API安全 饭聚。證書文件說明如下:
證書附件 | 描述 | 使用場景 | 備注 |
---|---|---|---|
pkcs12格式(apiclient_cert.p12、 | 包含了私鑰信息的證書文件,為p12(pfx)格式箕速,由微信支付簽發(fā)給您用來標(biāo)識(shí)和界定您的身份 | 撤銷盐茎、退款申請(qǐng)API中調(diào)用 | windows上可以直接雙擊導(dǎo)入系統(tǒng),導(dǎo)入過程中會(huì)提示輸入證書密碼字柠,證書密碼默認(rèn)為您的商戶ID(如:10010000) |
- 以下兩個(gè)證書在PHP環(huán)境中使用:
證書附件 | 描述 | 使用場景 | 備注 |
---|---|---|---|
證書pem格式(apiclient_cert.pem) | 從apiclient_cert.p12中導(dǎo)出證書部分的文件窑业,為pem格式,請(qǐng)妥善保管不要泄漏和被他人復(fù)制 | PHP等不能直接使用p12文件鲤氢,而需要使用pem,為了方便您使用卷玉,已為您直接提供 | 您也可以使用openssl命令來自己導(dǎo)出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem) |
證書密鑰pem格式(apiclient_key.pem) | 從apiclient_key.pem中導(dǎo)出密鑰部分的文件相种,為pem格式,請(qǐng)妥善保管不要泄漏和被他人復(fù)制 | PHP等不能直接使用p12文件寝并,而需要使用pem,為了方便您使用蒂破,已為您直接提供 | 您也可以使用openssl命令來自己導(dǎo)出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem |
-
使用API證書
- apiclient_cert.p12是商戶證書文件别渔,除PHP外的開發(fā)均使用此證書文件。
- 商戶如果使用.NET環(huán)境開發(fā)喇伯,請(qǐng)確認(rèn)Framework版本大于2.0稻据,必須在操作系統(tǒng)上雙擊安裝證書apiclient_cert.p12后才能被正常調(diào)用买喧。
- API證書調(diào)用或安裝需要使用到密碼,該密碼的值為微信商戶號(hào)(mch_id)
-
API證書安全
- 證書文件不能放在web服務(wù)器虛擬目錄今缚,應(yīng)放在有訪問權(quán)限控制的目錄中低淡,防止被他人下載蔗蹋;
- 建議將證書文件名改為復(fù)雜且不容易猜測的文件名;
- 商戶服務(wù)器要做好病毒和木馬防護(hù)工作猪杭,不被非法侵入者竊取證書文件胁孙。
-
商戶回調(diào)API安全
- 在普通的網(wǎng)絡(luò)環(huán)境下,HTTP請(qǐng)求存在DNS劫持稠鼻、運(yùn)營商插入廣告、數(shù)據(jù)被竊取熙暴,正常數(shù)據(jù)被修改等安全風(fēng)險(xiǎn)慌盯。商戶回調(diào)接口使用HTTPS協(xié)議可以保證數(shù)據(jù)傳輸?shù)陌踩匝窃怼K晕⑿胖Ц督ㄗh商戶提供給微信支付的各種回調(diào)采用HTTPS協(xié)議。
以上就是微信對(duì)于API證書的說明狞谱,從微信商戶平臺(tái)上可以下載對(duì)應(yīng)的證書禁漓,每個(gè)商戶id都會(huì)對(duì)應(yīng)一個(gè)證書,發(fā)起請(qǐng)求的時(shí)候需要使用對(duì)應(yīng)的證書才可以
- 我們把證書文件 ***.p12文件發(fā)在 resource/assets 目錄下伶跷,創(chuàng)建帶證書的OkHttpClient方法如下:
SSLContext sslContext = getSSLContextByAppKey(appKey);
if (sslContext == null) {
restLogger.info("獲取證書失敗");
return null;
}
OkHttpClient client = new OkHttpClient().newBuilder().sslSocketFactory(sslContext.getSocketFactory()).build();
- 獲取SSLContext的方法如下:
private SSLContext getSSLContextByAppKey(String mchId) {
// 設(shè)置證書路徑
String certPath = String.format("assets/%s.p12", mchId);
// 設(shè)置證書密碼
String certPass = mchId;
// 獲取證書
return getSSLContext(certPath, certPass);
}
private SSLContext getSSLContext(String certPath, String certPass) {
try {
KeyStore clientStore = KeyStore.getInstance("PKCS12");
// 讀取resource下的文件 支持jar方式啟動(dòng)
Resource resource = new ClassPathResource(certPath);
InputStream inputStream = resource.getInputStream();
char[] passArray = certPass.toCharArray();
clientStore.load(inputStream, passArray);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, passArray);
KeyManager[] kms = kmf.getKeyManagers();
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(kms, null, new SecureRandom());
return sslContext;
} catch (Exception e) {
restLogger.info("設(shè)置證書出錯(cuò)");
}
return null;
}
- 按上述方式獲取到的OkHttpClient就就能帶著證書發(fā)起https請(qǐng)求了