微信支付v3介面的 官方 Java SDK

2022-11-03 15:01:08
囉嗦幾句:微信支付v3版介面麻煩嗎?在對接微信支付v3介面時,本來是一件很簡單的事情,其實微信支付v3介面並不是很複雜,但是微信團隊的管理很混亂,給我們開發者帶來了巨大的麻煩。

微信支付v3版介面對接麻煩-問題出在了哪?

  • 其一:微信支付的版本較多,沒有形成一個統一管理說明;
  • 其二:微信v3支付,沒有一個完整的說明檔案,檔案都很分散;
  • 其三:微信支付官方檔案看似很詳細,其實很多關鍵點都沒說明白,新手看著就很頭疼;

下面詳細的說一下微信支付v3介面的開發

這個版本整合微信官方檔案,以微信小程式開發為基礎,大家按步驟點開連結檢視操作。

對接微信支付API v3

前提:商戶號已註冊好,準備就緒。
  • 接入前準備
    注意:操作過程中產生的APIv3祕鑰記錄下來,有的後面會用到。 例如 API v3祕鑰:B3AQsC17C6UFooIRCAaXRUvaq8PInN60
    微信商戶平臺接入說明檔案
    [微信商戶平臺](https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml)

    說明:這個是小程式版,如果是其他平臺可以在左側找對應目錄
    注意:這個流程走下來你會拿到一個壓縮檔案類似下圖

    圖:這個壓縮檔案裡有三個證書(解壓後如下圖),三個證書檔案拷貝到你的開發平臺裡,使用方式繼續往下看

  • 掃碼進入商戶平臺的入口
    微信商戶平臺
    [微信商戶平臺](https://pay.weixin.qq.com)
    說明:使用管理者的微信掃碼進入,進入後臺根據上面的說明進行操作。如果沒有註冊可以直接走註冊流程。註冊流程這裡不講解。

  • 掃碼小程式後臺的入口
    微信小程式後臺
    [微信小程式後臺](https://mp.weixin.qq.com/)
    注意:如果沒有申請小程式可以進入這裡看怎麼申請
    申請小程式說明

  • 小程式後臺開通微信支付並繫結商戶平臺說明
    小程式後臺開通微信支付並繫結商戶平臺說明
    [小程式後臺開通微信支付並繫結商戶平臺說明](https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml)
    注意:檢視說明中最後的【5.設定應用】進行操作

  • 獲取商戶API證書序列號(merchantSerialNumber)
    進入證書檢視網站
    [進入證書檢視網站](https://myssl.com/cert_decode.html)

    說明:上傳證書檔案:apiclient_cert.pem,點選檢視證書,裡面會有個序列號,複製出來。下載微信支付平臺證書會用到。
    例如:
    證書序列號:54776TTTF8F77EXXX3641FAB5F940FII11C65347

  • 下載微信支付平臺證書方法
    微信支付平臺證書下載工具
    [微信支付平臺證書下載工具](https://github.com/wechatpay-apiv3/CertificateDownloader)
    說明:在這裡下載 CertificateDownloader.jar 檔案,按照裡面的檔案操作即可
    注意:我的操作說明,我是把下載好的 CertificateDownloader.jar 檔案,放在瞭解壓證書的目錄裡。這樣我取mchPrivateKeyFilePath這個值的時候就可以直接寫證書檔名,不用寫路徑了。

官方完整命令如:

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

我的操作例如:

java -jar CertificateDownloader.jar -k B3AQsC17C6UFooIRCAaXRUvaq8PInN60 -m 1901174254 -f apiclient_key.pem -s 54776TTTF8F77EXXX3641FAB5F940FII11C65347 -o file

注意:1.操作前 CertificateDownloader.jar 和 apiclient_key.pem 檔案在同一個目錄 。並且在這個目錄中進入cmd命令工具。cmd命令工具中顯示的目錄就是CertificateDownloader.jar所在目錄。
例如:

檔案-CertificateDownloader.jar 路徑:D:\WXCertUtil\cert\CertificateDownloader.jar
檔案-apiclient_key.pem 路徑:D:\WXCertUtil\cert\apiclient_key.pem
cmd中路徑:D:\WXCertUtil\cert>

注意:2.命令中 -o file 只是個資料夾,命令執行後會在下面路徑中生成一個微信支付平臺證書檔案。把這個證書也複製到你的平臺中,和上面三個證書放在一個位置方便管理。
例如:
D:\WXCertUtil\cert\file\wechatpay_3A4AF69999DF01F39BB08C21C1C29B6AA17C074N.pem

至此,所有微信支付v3的準備工作已就緒,接下來,使用微信官方SDK開發接入微信支付v3。

Java平臺接入微信支付v3介面

更多平臺看官方檔案

微信支付 APIv3 Java SDK
微信支付 APIv3 Java SDK,裡面有詳細說明
github 地址:https://github.com/wechatpay-apiv3/wechatpay-java
注意:開發可以根據這裡的說明操作就好了,下面我寫一下可能大家不理解的點。

com.github.wechatpay-apiv3:wechatpay-java

程式碼中的設定-例如:

  /** 商戶號 */
  public static String merchantId = "1901174254";
  /** 商戶API私鑰路徑 */
  public static String privateKeyPath = "apiclient_key.pem";
  /** 商戶證書序列號 */
  public static String merchantSerialNumber = "54776TTTF8F77EXXX3641FAB5F940FII11C65347";
  /** 微信支付平臺證書路徑 */
  public static String wechatPayCertificatePath = "wechatpay_3A4AF69999DF01F39BB08C21C1C29B6AA17C074N.pem";
  /** 微信支付 APIv3 金鑰 */
  /** 如果微信支付平臺證書,已經下載好了,apiV3Key 就不需要了 */
  public static String apiV3Key = "B3AQsC17C6UFooIRCAaXRUvaq8PInN60";

如果微信支付平臺證書,已經下載好了,github裡這個程式碼就不用看了。

package com.wechat.pay.java.service;

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAConfig;
import com.wechat.pay.java.service.certificate.CertificateService;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.List;

/** 下載微信支付平臺證書為例 */
public class QuickStart {

  /** 商戶號 */
  public static String merchantId = "";
  /** 商戶API私鑰路徑 */
  public static String privateKeyPath = "";
  /** 商戶證書序列號 */
  public static String merchantSerialNumber = "";
  /** 微信支付平臺證書路徑 */
  public static String wechatPayCertificatePath = "";
  /** 微信支付 APIv3 金鑰 */
  public static String apiV3Key = "";

  public static void main(String[] args) {
    Config config =
        new RSAConfig.Builder()
            .merchantId(merchantId)
            .privateKeyFromPath(privateKeyPath)
            .merchantSerialNumber(merchantSerialNumber)
            .wechatPayCertificatesFromPath(wechatPayCertificatePath)
            .build();
    CertificateService certificateService = new CertificateService.Builder().config(config).build();
    List<X509Certificate> certificates =
        certificateService.downloadCertificate(apiV3Key.getBytes(StandardCharsets.UTF_8));
  }
}

支付的第一步:微信支付前需要拿到預支付id(prepayId),才能支付,所有支付的第一步是預支付

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
import com.wechat.pay.java.service.payments.jsapi.model.Payer;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;

public class JsapiExample {
  public static void main(String[] args) {
    Config config =
        new RSAConfig.Builder()
            .merchantId(merchantId)
            .privateKeyFromPath(privateKeyPath)
            .merchantSerialNumber(merchantSerialNumber)
            .wechatPayCertificatesFromPath(wechatPayCertificatePath)
            .build();

    JsapiService service = new JsapiService.Builder().config(config).build();

    PrepayRequest request = new PrepayRequest();
    Amount amount = new Amount();
    amount.setTotal(100);
    request.setAmount(amount);
    request.setAppid("wxa9d9651ae******");
    request.setMchid("190000****");
    request.setDescription("測試商品標題");
    request.setNotifyUrl("https://notify_url");
    request.setOutTradeNo("out_trade_no_001");
    Payer payer = new Payer();
    payer.setOpenid("oLTPCuN5a-nBD4rAL_fa********");
    request.setPayer(payer);

    PrepayResponse response = service.prepay(request);
    System.out.println(response.getPrepayId());
  }
}

還需要知道的:微信平臺給的使用者openid,並不是一個使用者的唯一ID,不能多個小程式同時使用。也就是說,在小程式A中拿到的使用者openid 和 在小程式B中拿到的使用者openid 是不一樣的。