接入前準備
注意:操作過程中產生的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
微信支付 APIv3 Java SDK
微信支付 APIv3 Java SDK,裡面有詳細說明
github 地址:https://github.com/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";
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));
}
}
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 是不一樣的。