一篇文章講明白微信支付,適合第一次接通微信支付的同學

語言: CN / TW / HK

微信的支付文檔,看似很全,實際則特別分散。可能在公司裏微信支付的工具類和相關參數已經有人告知或者寫好了,大部分同學儘管調用就可以了,但是對於剛上手想0-1接通微信支付,還是有很多困難的。這篇文章一次性講清v3版本的API支付

1.maven依賴

<dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.6</version> </dependency>

2.微信支付基本參數解釋

1.MACHID:微信支付商户號,參數經常也表示為merchantId

2.privateKeyPath:商户API證書的路徑(文章下面會細講API證書)

3.API_SERIAL_NO:也被稱作merchantSerialNumber,是API證書的序列號(下面會細講怎麼獲得)

4.certPath:wechatPayCertificatesFromPath()方法需要的參數,可以理解為微信支付平台證書,這個和API證書是不一樣的

5.callback_url:微信支付回調咱們系統的接口地址,回調接口會返回用户的支付結果,具體看微信的回調接口文檔

6.APPID:這個指微信公眾號或者小程序的appid,微信支付必須要有公眾號或者小程序(目前必須是這樣的)

簡單介紹完這些參數後,開始詳細解釋這些參數是從哪裏獲取的

1.MACHID



2.privateKeyPath:管理證書,根據提示操作即可,具體參考:https://kf.qq.com/faq/161222NneAJf161222U7fARv.html 



根據上述操作生成證書,下載到本地是一個證書壓縮包,解壓後,壓縮包裏面的內容是這樣的:





public static final String privateKeyPath = "/Users/camel/cert/1610157505_20230310_cert/apiclient_key.pem";//API證書密鑰路徑,指的就是這個證書裏的apiclient_key.pem路徑

3.商户證書序列號的獲取

public static final String API_SERIAL_NO = "xxxxxxxxxxC9203xxxxxx6C632";

賬户中心--->API安全--->管理證書頁,可以看到證書的序列號,或者訪問證書解析網站: https://myssl.com/cert_decode.html ,上傳文件選擇圖3中的apiclient_cert.pem證書









4.微信平台證書生成

public static final String certPath = "/Users/camel/cert/1610157505_20230310_cert/file/wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem";

•下載微信支付平台證書方法微信支付平台證書下載工具微信支付平台證書下載工具説明:在這裏下載 CertificateDownloader.jar 文件,按照裏面的文檔操作即可

•注意:我的操作説明,我是把下載好的 CertificateDownloader.jar 文件,放在瞭解壓證書的目錄裏(圖3)。這樣我取mchPrivateKeyFilePath這個值的時候就可以直接寫證書文件名,不用寫路徑了。

官方完整命令如:

java -jar CertificateDownloader.jar -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath} -c ${wechatpayCertificateFilePath}

我的實際操作命令如下:就會生成圖3中多出來的file文件夾,/Users/camel/cert/1610157505_20230310_cert/file/wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem,wechatpay_5A4BE90F6551D7F8CD853CB65016E005237849E9.pem就是微信支付平台證書,也是程序真正需要的

java -jar CertificateDownloader.jar -k DS123409248345546565773 -m 361015805 -f apiclient_key.pem -s A533C708A66E0E4282549D40C1CAA96B -o file

5.callback_url,微信支付結果的回調地址配置地方:



至此,微信支付的相關底層參數介紹完畢

6.以二維碼支付為例,測試demo如下

``` //下面的靜態參數要仔細看下面的解釋,否則只會調用別人寫好的方法,壓根學不會0-1接入微信支付 public static final String MACHID = "1610xxxx"; public static final String APPID = "wx9aa9xxx7fxxxxxx"; public static final String API_SERIAL_NO = "xxxxxxxxxxC9203xxxxxx6C632"; public static final String privateKeyPath = "/Users/camel/cert/1610157505_20230310_cert/apiclient_key.pem"; public static final String certPath = "/Users/camel/cert/1610157505_20230310_cert/file/wechatpay_5A4BE90F6.pem"; public static final String callback_url = "https://xxxxxx.com/wx/callback";

public static void main(String[] args) { try { // 初始化商户配置,在實際業務中,config最好全局變量創建一次就好,頻繁創建config會報異常 RSAConfig config = new RSAConfig.Builder() .merchantId(MACHID) // 使用 com.wechat.pay.java.core.util 中的函數從本地文件中加載商户私鑰,商户私鑰會用來生成請求的簽名 .privateKeyFromPath(privateKeyPath) .merchantSerialNumber(API_SERIAL_NO) .wechatPayCertificatesFromPath(certPath) .build(); // 初始化服務 NativePayService service = new NativePayService.Builder().config(config).build(); String orderNumber = IdGeneratorUtils.genDateUniqueId("MA", 16); log.info("orderNumber={}", orderNumber); PrepayRequest request = new PrepayRequest(); Amount amount = new Amount(); amount.setCurrency("CNY"); amount.setTotal(1); request.setAmount(amount); request.setDescription("測試下單001"); request.setOutTradeNo(orderNumber); request.setNotifyUrl(callback_url); request.setAppid(APPID); request.setMchid(MACHID); PrepayResponse response=service.prepay(request); log.info("result={}", JsonTools.object2Json(response)); } catch (HttpException e) { // 發送HTTP請求失敗 log.error("1111111={}", e); // 調用e.getHttpRequest()獲取請求打印日誌或上報監控,更多方法見HttpException定義 } catch (ServiceException e) { // 服務返回狀態小於200或大於等於300,例如500 log.error("222222222={}", e.getResponseBody()); // 調用e.getResponseBody()獲取返回體打印日誌或上報監控,更多方法見ServiceException定義 } catch (MalformedMessageException e) { // 服務返回成功,返回體類型不合法,或者解析返回體失敗 log.error("3333333333={}", e);

        // 調用e.getMessage()獲取信息打印日誌或上報監控,更多方法見MalformedMessageException定義
    } catch (Exception e) {
        log.error("未知異常:{}", e);
    }


}

```

上述簡單的代碼,就可以實現微信的預下單,response會返回二維碼的微信鏈接(咱們需要用第三方二維碼工具,將微信鏈接轉成二維碼),response返回結果如下:

{ "code_url": "weixin://wxpay/bizpayurl?pr=AQAsbYzzz" } //需要用第三方二維碼生成工具weixin://wxpay/bizpayurl?pr=AQAsbYzzz生成二維碼,在此不做贅述,生成的二維碼文件返回給前端,或者前端根據code_url生成二維碼展示到頁面上,然後就可以掃碼支付了 生成二維碼的方法可以參考我的另一篇文章:JAVA生成二維碼

更多豐富的支付邏輯基本都和這個差不多,可以參考下邊demo

微信支付DEMO

至此,微信支付的介紹完畢,希望能幫到部分同學