微信支付V3接口接入

微信支付升級V3接口總結(jié):

主要步驟如下:

  1. 首先需要獲取所需要的證書讹语、私鑰甫题、秘鑰等信息
  2. 簡化加簽驗(yàn)簽符欠,使用微信提供的支付sdk工具
  3. 根據(jù)sdk demo中的實(shí)例蛹批,提供所需要的信息仰泻,使用微信提供的http方法進(jìn)行接口請求

一荆陆、獲取證書、私鑰集侯、秘鑰等信息

開發(fā)需要讓運(yùn)營聯(lián)系財(cái)務(wù)在微信后臺對V3秘鑰的獲取和證書的下載被啼,具體教程請參考:

證書:https://kf.qq.com/faq/161222NneAJf161222U7fARv.html

秘鑰:https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html

通過如上步驟之后會(huì)獲取到如下信息: 商戶號帜消、apiKey3 APIv3 密鑰、apiclient_cert.pem浓体、apiclient_key.pem泡挺、apiclient_cert.p12、證書使用說明.txt

二命浴、獲取微信支付sdk

sdk對應(yīng)的github地址:https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient

maven依賴:

<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-apache-httpclient</artifactId>
    <version>0.2.3</version>
</dependency>

創(chuàng)建加密后的HttpClient:

WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
        .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
        .withWechatPay(wechatpayCertificates);
// ... 接下來娄猫,你仍然可以通過builder設(shè)置各種參數(shù),來配置你的HttpClient

// 通過WechatPayHttpClientBuilder構(gòu)造的HttpClient生闲,會(huì)自動(dòng)的處理簽名和驗(yàn)簽
HttpClient httpClient = builder.build();

// 后面跟使用Apache HttpClient一樣
HttpResponse response = httpClient.execute(...);

參數(shù)說明:

  • merchantId商戶號媳溺。

  • merchantSerialNumber商戶API證書的證書序列號。

  • merchantPrivateKey商戶API私鑰碍讯,如何加載商戶API私鑰請看常見問題褂删。

  • wechatpayCertificates微信支付平臺證書。你也可以使用后面章節(jié)提到的“自動(dòng)更新證書功能”冲茸,而不需要關(guān)心平臺證書的來龍去脈屯阀。

merchantSerialNumber為證書序列號需要通過命令獲取: openssl x509 -in apiclient_cert.pem -noout -serial 命令進(jìn)行獲取

merchantPrivateKey通過apiclient_key.pem文件獲取,注意需要對證書內(nèi)容進(jìn)行清洗轴术,具體代碼如下:

/**
   * 獲取私鑰难衰。
   *
   * @param filename 私鑰文件路徑  (required)
   * @return 私鑰對象
   */
public static PrivateKey getPrivateKey(String filename) throws IOException {
  String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
  try {
    String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
        .replace("-----END PRIVATE KEY-----", "")
        .replaceAll("\\s+", "");
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(
        new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
  } catch (NoSuchAlgorithmException e) {
    throw new RuntimeException("當(dāng)前Java環(huán)境不支持RSA", e);
  } catch (InvalidKeySpecException e) {
    throw new RuntimeException("無效的密鑰格式");
  }
}

wechatpayCertificates是最難理解,我也沒理解明白逗栽,大概意思是為了讓商戶自己來完成證書的自動(dòng)更新和自動(dòng)下載盖袭,但是首次使用的不是財(cái)務(wù)同學(xué)從微信商戶后臺下載下來的apiclient_key.pem或者apiclient_cert.p12,需要我們手動(dòng)的下載一次彼宠,微信提供了下載證書的jar包CertificateDownloader.jar鳄虱,

下載地址為:https://github.com/EliasZzz/CertificateDownloader/releases

使用說明參考:https://github.com/wechatpay-apiv3/CertificateDownloader

具體命令: java -jar CertificateDownloader.jar -k 76a5e**************9eccd3arh66 -m --mchid=122*****801 -f --privatekey=apiclient_key.pem -s --serialno=4B2882**********************CD03 -o --output=newCerDir

// 在第一次一般用不到這個(gè)參數(shù)選項(xiàng) -c apiclient_cert.pem

此時(shí)會(huì)在newCerDir下載到新的證書,至此凭峡,我們HttpClient所需要的所有參數(shù)都已經(jīng)獲取成功拙已。

三、參考微信sdk中提供的demo請求示例為:

PrivateKey privateKey = getPrivateKey("$filePath");
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                    .withMerchant("12*****801", "4B********CD03", privateKey)
                    .withWechatpay(Arrays.asList(getCertificate(new FileInputStream(new File("${filePath}/newCerDir/wechatpay_22A***********0733515.pem")))));

URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/merchant/fund/balance/BASIC");
            HttpGet httpGet = new HttpGet(uriBuilder.build());
            httpGet.addHeader("Accept", "application/json");
            httpGet.addHeader("Content-type","application/json; charset=utf-8");

HttpClient httpClient = builder.build();
HttpResponse response = httpClient.execute(httpGet);

response.getEntity()

參考的文檔比較多的摧冀,比較詳細(xì)的文檔為:https://developers.weixin.qq.com/community/develop/article/doc/000cca8440c6a0dca61a3efb053c13
再次鳴謝作者倍踪,和此文檔差異的地方是,本文使用的是微信提供的java SDK這種比較簡單的方式索昂,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末建车,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椒惨,更是在濱河造成了極大的恐慌缤至,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件康谆,死亡現(xiàn)場離奇詭異领斥,居然都是意外死亡错洁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門戒突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屯碴,“玉大人,你說我怎么就攤上這事膊存〉级” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵隔崎,是天一觀的道長今艺。 經(jīng)常有香客問我,道長爵卒,這世上最難降的妖魔是什么虚缎? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钓株,結(jié)果婚禮上实牡,老公的妹妹穿的比我還像新娘。我一直安慰自己轴合,他們只是感情好创坞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著受葛,像睡著了一般题涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上总滩,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天纲堵,我揣著相機(jī)與錄音,去河邊找鬼闰渔。 笑死席函,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澜建。 我是一名探鬼主播向挖,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炕舵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跟畅,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤咽筋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徊件,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸攻,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒜危,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睹耐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辐赞。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖硝训,靈堂內(nèi)的尸體忽然破棺而出响委,到底是詐尸還是另有隱情,我是刑警寧澤窖梁,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布赘风,位于F島的核電站,受9級特大地震影響纵刘,放射性物質(zhì)發(fā)生泄漏邀窃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一假哎、第九天 我趴在偏房一處隱蔽的房頂上張望瞬捕。 院中可真熱鬧,春花似錦舵抹、人聲如沸山析。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笋轨。三九已至,卻和暖如春赊淑,著一層夾襖步出監(jiān)牢的瞬間爵政,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工陶缺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钾挟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓饱岸,卻偏偏與公主長得像掺出,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子苫费,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容