OkHttp3使用證書發(fā)起請(qǐng)求

OkHttp3使用證書發(fā)起請(qǐng)求

最近在對(duì)接微信支付功能,微信所有接口都采用okHttp3請(qǐng)求,但是申請(qǐng)退款接口需要證書才能調(diào)用,那如何使用證書發(fā)起請(qǐng)求以及證書如何獲取,先看一下微信開發(fā)文檔

  1. 在微信支付接口中,涉及資金回滾的接口會(huì)使用到API證書,包括退款、撤銷接口。商家在申請(qǐng)微信支付成功后,收到的相應(yīng)郵件后,可以按照指引下載API證書,也可以按照以下路徑下載:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶中心-->賬戶設(shè)置-->API安全 。證書文件說明如下:
證書附件 描述 使用場(chǎng)景 備注
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)境中使用:
證書附件 描述 使用場(chǎng)景 備注
證書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
  1. 使用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)
  2. API證書安全

    • 證書文件不能放在web服務(wù)器虛擬目錄,應(yīng)放在有訪問權(quán)限控制的目錄中,防止被他人下載;
    • 建議將證書文件名改為復(fù)雜且不容易猜測(cè)的文件名;
    • 商戶服務(wù)器要做好病毒和木馬防護(hù)工作,不被非法侵入者竊取證書文件。
  3. 商戶回調(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ù)陌踩?。所以微信支付建議商戶提供給微信支付的各種回調(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)求了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 應(yīng)屆畢業(yè)生或者剛剛參加工作不久的人,總是喜歡問自己也問別人一個(gè)問題:應(yīng)該堅(jiān)守北上廣還是應(yīng)該安心待在故鄉(xiāng)小城?堅(jiān)守北...
    錦肆1994閱讀 256評(píng)論 1 2
  • 姓名:魏正君《六項(xiàng)精進(jìn)》第270期感謝2組公司:綿陽大北農(nóng)農(nóng)牧科技有限公司【日精進(jìn)打卡第330天】【知~學(xué)習(xí)】背誦...
    莫心莫肺閱讀 76評(píng)論 0 0
  • 去外婆家,恰巧碰上表弟的外婆,也就是舅媽的媽。 一見門我就禮貌的打了聲招呼,她也很客氣的回應(yīng)我。六十多歲的年紀(jì),聲...
    嬉媚閱讀 1,315評(píng)論 0 6

友情鏈接更多精彩內(nèi)容