JAVA 微信 API v3 wechatpay-apache-httpclient 踩坑【對賬文件為例】

【wechatpay-apache-httpclient】官網(wǎng):
https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient
這個點一定要清晰(即:不需要自己去是生成簽名)

image.png

以JSAPI為例

【JSAPI支付】官網(wǎng)地址:
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_6.shtml

項目目錄:

image.png

工具類【W(wǎng)echatPayUtil】代碼 :

  /**
   *  APP_ID(公眾號/小程序等)
   */
  private static final String APP_ID = "xxxx";
  /**
   * 商戶號 (微信商戶平臺可以獲取)
   */
  private static final String MERCHATN_ID = "xxx";
  /**
   * API_V3  (微信商戶平臺配置)
   */
  private static final String API_V3 = "xxxx";
  /**
   * 私鑰 (微信商戶平臺配置)
   */
  private static final String PRIVATE_KEY_PATH = "ice/channel_config/wechat/apiclient_key.pem";
  /**
   * 證書路徑 (自行設(shè)置)
   */
  private static final String CERT_PATH = "ice/channel_config/wechat/apiclient_cert.pem";
  /**
   * 證書序列號(微信商戶平臺配置) 
   */
  private static final String CERT_ID = "xxxxxx";

/**
   * 初始化  clientBuilder和證書管理器
   *
   * @return com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder
   * @author xxxx
   * @date 2022-11-25
   */
  public static WechatPayHttpClientBuilder initClientBuilder() throws IOException, GeneralSecurityException, HttpCodeException, NotFoundException {
    // 讀取證書及私鑰
    Resource resourcePrivateKey = new FileSystemResource(new File(PRIVATE_KEY_PATH));
    PrivateKey privateKey = PemUtil.loadPrivateKey(resourcePrivateKey.getInputStream());
    Resource resourceCert = new FileSystemResource(new File(CERT_PATH));
    X509Certificate cert = PemUtil.loadCertificate(resourceCert.getInputStream());
    // 微信證書管理器 
    CertificatesManager certificatesManager = CertificatesManager.getInstance();
    certificatesManager.putMerchant(
      MERCHATN_ID, 
      new WechatPay2Credentials(
        MERCHATN_ID, 
        new PrivateKeySigner(CERT_ID, privateKey)
      ), 
      API_V3.getBytes(StandardCharsets.UTF_8)
    );
    Verifier verifier = certificatesManager.getVerifier(MERCHATN_ID);
    // 初始化
    WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
            .withMerchant(MERCHATN_ID, CERT_ID, privateKey)
            .withWechatPay(Collections.singletonList(cert))
            .withValidator(new WechatPay2Validator(verifier));
    return builder;
  }

以對賬文件下載為例進行測試

對賬文件下載,根據(jù)官網(wǎng)說明:


image.png

JSAPI對賬文件下載API文檔官網(wǎng):https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_8.shtml
請求頭【Accept: application/json】必須要設(shè)置润歉,不設(shè)置會報錯吵取;【Content-Type: application/json】測試發(fā)現(xiàn)可以不設(shè)置

image.png

下面這個地方看起來像是要進行簽名后再發(fā)起請求藕夫,但是實際上使用【wechatpay-apache-httpclient】的時候并不需要(工具類自己會簽名)昌屉,別被誤導了


image.png

【測試代碼】

public static void main(String[] args) throws Exception {

    // 交易賬單申請 https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2022-11-23
    CloseableHttpClient applyClient = WechatPayUtil.initClientBuilder().build();
    // 初始化請求
    HttpGet applyHttpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2022-11-23");
    // 請求頭設(shè)置 官方說明:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay2_0.shtml
    applyHttpGet.addHeader("Accept", "application/json");
    applyHttpGet.addHeader("Content-type", "application/json; charset=utf-8");
    // 發(fā)起請求
    CloseableHttpResponse applyResponse = applyClient.execute(applyHttpGet);
    // 結(jié)果轉(zhuǎn)換為Map
    String applyResponseEntityStr = EntityUtils.toString(applyResponse.getEntity());
    System.out.println(">>>>>>>>>【對賬文件申請】響應結(jié)果:" + applyResponseEntityStr);
    Map applyResponseMap = new ObjectMapper().readValue(applyResponseEntityStr, Map.class);
    applyClient.close();
    applyResponse.close();

    // 交易賬單下載
    String downloadUrl = (String) applyResponseMap.get("download_url");
   CloseableHttpClient downloadClient = WechatPayUtil.initClientBuilder().withValidator(response -> true).build();
    HttpGet downloadHttpGet = new HttpGet(downloadUrl);
    // 請求頭設(shè)置 官方說明:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay2_0.shtml
    downloadHttpGet.addHeader("Accept", "application/json");
    downloadHttpGet.addHeader("Content-type", "application/json; charset=utf-8");
    // 發(fā)起請求
    CloseableHttpResponse downloadResponse = downloadClient.execute(downloadHttpGet);
    // 結(jié)果轉(zhuǎn)換為String
    String downloadResponseEntityStr = EntityUtils.toString(downloadResponse.getEntity());
    System.out.println(">>>>>>>>>【交易賬單下載-string】響應結(jié)果:");
    System.out.println(downloadResponseEntityStr);
    // 結(jié)果轉(zhuǎn)換為List<String>
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(EntityUtils.toByteArray(downloadResponse.getEntity()))));
    List<String> resultList = bufferedReader.lines().collect(Collectors.toList());
    System.out.println(MessageFormat.format(">>>>>>>>>【交易賬單下載-List<String>】響應結(jié)果:總計【{0}】條",resultList.size()));
    resultList.forEach(System.out::println);
    downloadClient.close();
    downloadResponse.close();
  }

【測試結(jié)果】

【對賬交易文件申請】返回結(jié)果:

【對賬文件申請】響應結(jié)果:{"download_url":"https://api.mch.weixin.qq.com/v3/billdownload/file?token=om9r_WnzFUSMg24K4PYrtC7_byEZrIlmsMOJ8y7u_JPJP0D1F2AC_U6rtLAIsjlm","hash_type":"SHA1","hash_value":"f9ecef7bc7429e89b83e5ec4742b2699c74b5a11"}

【對賬交易文件下載】返回結(jié)果:(返回數(shù)據(jù)中丸凭,敏感數(shù)據(jù)已被替換為對應中文)

>>>>>>>>>【交易賬單下載-string】響應結(jié)果:
交易時間,公眾賬號ID,商戶號,特約商戶號,設(shè)備號,微信訂單號,商戶訂單號,用戶標識,交易類型,交易狀態(tài),付款銀行,貨幣種類,應結(jié)訂單金額,代金券金額,微信退款單號,商戶退款單號,退款金額,充值券退款金額,退款類型,退款狀態(tài),商品名稱,商戶數(shù)據(jù)包,手續(xù)費,費率,訂單金額,申請退款金額,費率備注
`2022-11-23 15:21:15,`公眾賬號ID,`商戶號,`0,`,`4200001642202211233962981879,`1595316481882824704,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 15:11:51,`公眾賬號ID,`商戶號,`0,`,`4200001661202211230109762244,`1595314109068582912,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 19:24:25,`公眾賬號ID,`商戶號,`0,`,`4200001666202211235431097357,`1595377702036283392,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.03,`0.00,`0,`0,`0.00,`0.00,`,`,`h001用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.03,`0.00,`
總交易單數(shù),應結(jié)訂單總金額,退款總金額,充值券退款總金額,手續(xù)費總金額,訂單總金額,申請退款總金額
`3,`0.05,`0.00,`0.00,`0.00000,`0.05,`0.00

>>>>>>>>>【交易賬單下載-List<String>】響應結(jié)果:總計【6】條
交易時間,公眾賬號ID,商戶號,特約商戶號,設(shè)備號,微信訂單號,商戶訂單號,用戶標識,交易類型,交易狀態(tài),付款銀行,貨幣種類,應結(jié)訂單金額,代金券金額,微信退款單號,商戶退款單號,退款金額,充值券退款金額,退款類型,退款狀態(tài),商品名稱,商戶數(shù)據(jù)包,手續(xù)費,費率,訂單金額,申請退款金額,費率備注
`2022-11-23 15:21:15,`公眾賬號ID,`商戶號,`0,`,`4200001642202211233962981879,`1595316481882824704,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 15:11:51,`公眾賬號ID,`商戶號,`0,`,`4200001661202211230109762244,`1595314109068582912,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 19:24:25,`公眾賬號ID,`商戶號,`0,`,`4200001666202211235431097357,`1595377702036283392,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.03,`0.00,`0,`0,`0.00,`0.00,`,`,`h001用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.03,`0.00,`
總交易單數(shù),應結(jié)訂單總金額,退款總金額,充值券退款總金額,手續(xù)費總金額,訂單總金額,申請退款總金額
`3,`0.05,`0.00,`0.00,`0.00000,`0.05,`0.00
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末福扬,一起剝皮案震驚了整個濱河市腕铸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忧换,老刑警劉巖恬惯,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亚茬,居然都是意外死亡酪耳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門刹缝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碗暗,“玉大人,你說我怎么就攤上這事梢夯⊙粤疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵颂砸,是天一觀的道長噪奄。 經(jīng)常有香客問我,道長人乓,這世上最難降的妖魔是什么勤篮? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮色罚,結(jié)果婚禮上碰缔,老公的妹妹穿的比我還像新娘。我一直安慰自己戳护,他們只是感情好金抡,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腌且,像睡著了一般梗肝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铺董,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天统捶,我揣著相機與錄音,去河邊找鬼柄粹。 笑死,一個胖子當著我的面吹牛匆绣,可吹牛的內(nèi)容都是我干的驻右。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼崎淳,長吁一口氣:“原來是場噩夢啊……” “哼堪夭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤森爽,失蹤者是張志新(化名)和其女友劉穎恨豁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爬迟,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡橘蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了付呕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片计福。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖徽职,靈堂內(nèi)的尸體忽然破棺而出象颖,到底是詐尸還是另有隱情,我是刑警寧澤姆钉,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布说订,位于F島的核電站,受9級特大地震影響潮瓶,放射性物質(zhì)發(fā)生泄漏陶冷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一筋讨、第九天 我趴在偏房一處隱蔽的房頂上張望埃叭。 院中可真熱鬧,春花似錦悉罕、人聲如沸赤屋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类早。三九已至,卻和暖如春嗜逻,著一層夾襖步出監(jiān)牢的瞬間涩僻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工栈顷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逆日,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓萄凤,卻偏偏與公主長得像室抽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靡努,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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