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

語言: 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:管理證書,根據提示操作即可,具體參考:http://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安全--->管理證書頁,可以看到證書的序列號,或者訪問證書解析網站: http://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 = "http://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

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