SDK和开发工具(国密)

更新时间:2024.12.25

为了便于开发者使用国密,微信支付提供了 Java SDK 和一系列开发工具。

Java SDK

微信支付 Java SDK(wechatpay-java)已支持国密。

安装

Gradle 项目

在你的构建文件中加入以下依赖

1implementation 'com.github.wechatpay-apiv3:wechatpay-java:0.2.1'
2implementation 'com.github.wechatpay-apiv3:wechatpay-java-shangmi:0.2.1'

Maven 项目

在你的 POM 文件中加入以下依赖

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  /** 国密的商户API私钥路径 */
11  public static String privateKeyPath = "";
12  /** 国密的商户API证书序列号 */
13  public static String merchantSerialNumber = "";
14  /** 国密的微信支付平台证书路径 */
15  public static String wechatPayCertificatePath = "";
16  /** 微信支付 APIv3 密钥 */
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}

更多信息请参考 shangmi/README.md

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进制公钥。