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

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

微信的支付文檔,看似很全,實際則特別分散,可能在公司裏經常微信支付的工具類有和相關參數已經有人告知並且寫好了,大部分同學儘管調用就可以了,但是對於剛上手想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:管理證書,根據提示操作即可,具體參考:微信API證書及其密鑰

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

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 YUCONG12340924834535984954958948 -m 1610157505 -f apiclient_key.pem -s 6217F9226ABFACF3B183E6C9203475E3A446C632 -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_5A4BE90F6551D7F8CD853CB65016E005237849E9.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生成二維碼展示到頁面上,然後就可以掃碼支付了
複製代碼

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

微信支付SDK DEMO

 

至此,微信支付結束,希望能幫到大家

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章