为了便于开发者使用国密,微信支付提供了 Java SDK 和一系列开发工具。
Java SDK
安装
Gradle 项目
1implementation 'com.github.wechatpay-apiv3:wechatpay-java:0.2.1'
2implementation 'com.github.wechatpay-apiv3:wechatpay-java-shangmi:0.2.1'
Maven 项目
1<dependency>
2 <groupId>com.github.wechatpay-apiv3</groupId>
3 <artifactId>wechatpay-java</artifactId>
4 <version>0.2.1</version>
5</dependency>
6<dependency>
7 <groupId>com.github.wechatpay-apiv3</groupId>
8 <artifactId>wechatpay-java-shangmi</artifactId>
9 <version>0.2.1</version>
10</dependency>
示例代码
先使用 SMConfig
初始化具体的业务服务,再调用服务提供的业务接口。国密的签名、验签会注入请求的各个环节。
1package com.wechat.pay.java.service;
2import com.wechat.pay.java.core.Config;
3import com.wechat.pay.java.shangmi.SMConfig;
4import com.wechat.pay.java.service.payments.jsapi.JsapiService;
5import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByIdRequest;
6import com.wechat.pay.java.service.payments.model.Transaction;
7public class QuickStart {
8
9 public static String merchantId = "";
10
11 public static String privateKeyPath = "";
12
13 public static String merchantSerialNumber = "";
14
15 public static String wechatPayCertificatePath = "";
16
17 public static String apiV3Key = "";
18 public static void main(String[] args) {
19 Config config =
20 new SMConfig.Builder()
21 .merchantId(merchantId)
22 .privateKeyFromPath(privateKeyPath)
23 .merchantSerialNumber(merchantSerialNumber)
24 .addWechatPayCertificateFromPath(wechatPayCertificatePath)
25 .build();
26 JsapiService service = new JsapiService.Builder().config(config).build();
27 QueryOrderByIdRequest request = new QueryOrderByIdRequest();
28
29 request.setMchid("****");
30 request.setTransactionId("420***");
31 Transaction transaction = service.queryOrderById(request);
32 }
33}
Postman 脚本
shangmi
:值为 true
。
mchid
:必填,商户号。
merchant_serial_no
:必填,商户 API 证书序列号。
apiclient_key.pem
:必填,PEM 格式的商户 API 私钥。
pubkey.pem
:必填,PEM 格式的商户 API 国密公钥。
这样便能使用 Postman 发送国密请求了。你不用自行计算签名,脚本会使用国密 SM2 计算签名。
国密工具
我们提供了签名验签和加解密工具,供商户进行本地验证 SM2/SM3/SM4 的计算结果。下载地址如下:
如何从 PEM 文件导出16进制的密钥
国密工具只接收16进制的私钥和公钥。PKCS8 编码的国密私钥 PEM 文件,包含了私钥和公钥。我们需从中提取16进制的私钥和公钥。
openssl 1.1.1 支持了国密私钥证书,我们可以使用它解析私钥 PEM 文件。
1➜ openssl ec -in apiclient_key.pem -text -noout
2read EC key
3Private-Key: (256 bit)
4priv:
5 fd:4f:52:6b:3e:5c:78:31:90:84:50:4c:7f:f7:07:
6 22:1d:be:ab:92:f3:be:1a:db:f0:bd:92:23:8b:0f:
7 51:1f
8pub:
9 04:7b:cd:47:f7:5e:a1:9d:04:c0:a7:2b:4d:a7:0f:
10 57:dd:1b:3f:93:37:cc:5d:d1:24:18:81:b9:13:43:
11 19:39:bf:69:a5:5e:f6:b4:67:10:c7:e1:72:45:23:
12 d0:f6:46:dd:69:4d:24:83:97:6f:6e:85:0d:46:63:
13 78:fa:8b:2f:7e
14ASN1 OID: SM2
如图所见,priv 为16进制私钥,pub 为16进制公钥。