SDK和开发工具

更新时间:2023.04.28

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

# Java SDK

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

# 安装

# 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;
2
3import com.wechat.pay.java.core.Config;
4import com.wechat.pay.java.shangmi.SMConfig;
5import com.wechat.pay.java.service.payments.jsapi.JsapiService;
6import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByIdRequest;
7import com.wechat.pay.java.service.payments.model.Transaction;
8
9
10public class QuickStart {
11
12 /** 商户号 */
13 public static String merchantId = "";
14 /** 国密的商户API私钥路径 */
15 public static String privateKeyPath = "";
16 /** 国密的商户API证书序列号 */
17 public static String merchantSerialNumber = "";
18 /** 国密的微信支付平台证书路径 */
19 public static String wechatPayCertificatePath = "";
20 /** 微信支付 APIv3 密钥 */
21 public static String apiV3Key = "";
22
23 public static void main(String[] args) {
24 Config config =
25 new SMConfig.Builder()
26 .merchantId(merchantId)
27 .privateKeyFromPath(privateKeyPath)
28 .merchantSerialNumber(merchantSerialNumber)
29 .addWechatPayCertificateFromPath(wechatPayCertificatePath)
30 .build();
31 JsapiService service = new JsapiService.Builder().config(config).build();
32 QueryOrderByIdRequest request = new QueryOrderByIdRequest();
33 // 设置业务参数
34 request.setMchid("****");
35 request.setTransactionId("420***");
36 Transaction transaction = service.queryOrderById(request);
37 }
38}

更多信息请参考 shangmi/README.md (opens new window)

# Postman 脚本

微信支付 APIv3 Postman 脚本 (opens new window) 已支持国密。

你可以

并参考 国密-商户参数模版 (opens new window) 在环境变量中设置参数

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