---
url: "https://pay.weixin.qq.com/doc/v3/merchant/4012076194.md"
title: "APIv3接口使用国家商用密码指引"
doc_id: 4012076194
---

>更新时间：2024.07.25

[微信支付官方Java SDK](https://github.com/wechatpay-apiv3/wechatpay-java) 实现了国密的签名和验签等功能，推荐商户使用。如果商户需自行实现国密的签名和验签等功能，请按照以下接口规则实现。



## 1. 生成国密签名

### 1.1.请求签名

国密请求签名的规则，同国际算法基本一致，仅更改了具体算法。国际算法可参考[签名生成](https://pay.weixin.qq.com/doc/v3/merchant/4012365342.md#%E8%AF%B7%E6%B1%82%E6%8E%A5%E5%8F%A3%E5%90%8E%E7%AB%AF%E7%AD%BE%E5%90%8D)。

### 1.2. 构造待签名的消息

规则不变，仍然是：

```
HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
```

### 1.3. 计算数字签名

对待签名消息使用SM2椭圆曲线公钥密码算法的数字签名算法（SM2Sign with SM3），并对消息签名进行Base64编码，得到签名值。

- 签名格式：RS\_ASN1。

- 签名使用的ID为“1234567812345678”，这是一个16字节的ASCII编码的可见字符串。这个值是标准规定的默认ID值。


### 1.4. 设置HTTP头

Authrization的认证类型使用 WECHATPAY2-SM2-WITH-SM3，替代WECHATPAY2-SHA256-RSA2048，其他保持不变。

### 1.5. HTTP头示例

```
Authorization: WECHATPAY2-SM2-WITH-SM3 mchid="2480467911",nonce_str="fixednonce",timestamp="1636620536",serial_no="157056765AB5A9EEE5D363D0329039A254D5EF49",signature="MEYCIQC9Pab48+YSk12XBmbFOptRwDxbOy/deyz2haXso+UJhAIhAIXMAPRvH1qruowl21i8w/Ahy0/SpQvBrpcl9NGLomeV"
```

## 2. 如何验证国密签名

国密签名验证的规则，同国际算法基本一致，不同点如下：

- 验证算法使用SM2椭圆曲线公钥密码算法的签名验证算法。签名格式RS\_ASN1。

- 新增HTTP头Wechatpay-Signature-Type表示认证类型


国际算法的说明可参考[签名验证](https://pay.weixin.qq.com/doc/v3/merchant/4012365342.md#%E9%AA%8C%E8%AF%81%E7%AD%BE%E5%90%8D)。

## 3. 敏感信息加密

使用SM2椭圆曲线公钥密码算法的公钥加密算法，替代RSA-OAEP。

密文格式：C1C3C2\_ASN1。

## 4. 回调/证书加密

- 使用SM4分组密码算法的 SM4/GCM/NoPadding，替代 AES/GCM/NoPadding。


由于SM4密钥长度的限制，密钥由APIv3密钥通过国密SM3 hash计算生成。SM4密钥取摘要（256bit）的前128bit。

## 5. API各环节使用的算法说明

| RSA算法 | RSA算法 | 国密算法 |
| --- | --- | --- |
| 下载平台证书以及回调通知加解密 | AES-256-GCM<br>（ AES/GCM/NoPadding） | SM4<br>（SM4/GCM/NoPadding） |
| 计算签名值 | 使用商户私钥对待签名串进行SHA256 with RSA签名，并对签名结果进行Base64编码得到签名值 | 使用商户私钥对待签名串进行SM2Sign with SM3签名，并对签名结果进行Base64编码得到签名值<br>签名格式：RS\_ASN1<br>签名使用的ID为“1234567812345678” |
| 设置HTTP头 | 认证类型：WECHATPAY2-SHA256-RSA2048 | 认证类型：WECHATPAY2-SM2-WITH-SM3 |
| 应答认证类型 | 默认RSA<br>（WECHATPAY2-SHA256-RSA2048） | 新增HTTP头Wechatpay-Signature-Type表示认证类型：<br>国密：WECHATPAY2-SM2-WITH-SM3<br>RSA：WECHATPAY2-SHA256-RSA2048 |
| 应答签名验证 | 使用微信支付平台公钥对验签名串和签名进行SHA256 with RSA签名验证 | 使用微信支付平台公钥对验签名串和签名进行SM2Sign with SM3签名验证<br>签名格式：RS\_ASN1 |
| 敏感信息加密 | 加密算法：RSA公钥加密算法<br>填充方案：RSAES-OAEP | 加密算法：SM2公钥加密算法<br>密文格式：C1C3C2\_ASN1 |
| 敏感信息解密 | 使用商户API证书私钥对下行的敏感信息的密文进行RSA解密 | 使用商户私钥对下行的敏感信息的密文进行SM2解密 |