# Demo项目文件介绍 - 国密版

## 一、目录结构

```
5upay-sdk-Nodejs_gm
├── sm/
│   ├── client/           # 客户国密私钥文件（.sm2 格式），商户需替换为自己的实际证书
│   └── server/           # 平台国密公钥证书，商户不需要更新此文件
├── demo/
│   ├── notify.js         # 异步通知示例
│   └── query.js          # 查询接口示例，其他接口调用方式参考此文件
├── lib/
│   ├── apiSdk.js         # API SDK 实现（国密版）
│   ├── config.js         # 读取配置文件模块
│   ├── cryptoUtils.js    # 国密加密、解密、签名、验签工具模块（SM2/SM3/SM4）
│   └── notifySdk.js      # 异步通知处理模块（国密版）
├── config.json           # 配置文件模板
├── package.json          # npm 包配置文件
└── README.md             # 项目文档
```

## 二、国密算法说明

| 原算法（国际版）        | 国密算法（本版本）        | 用途               |
|-----------------|-----------------|------------------|
| RSA             | SM2             | 非对称加密 / 数字签名     |
| AES-128-ECB     | SM4-ECB         | 对称加密（请求/响应数据）    |
| SHA1 / MD5      | SM3             | 摘要计算（签名前/验签前）    |
| .key / .pem     | .sm2 / .cer     | 私钥 / 公钥证书文件格式    |
| content-type v3.0 | content-type v4.0 | HTTP 请求头版本标识     |

## 三、安装

### 1、下载 Demo 项目文件、解压；

### 2、进入项目目录，安装依赖；

```bash
npm install
```

核心依赖：
- `sm-crypto`：国密算法库，提供 SM2/SM3/SM4 实现
- `axios`：HTTP 客户端

### 3、运行 Demo

进入 demo 目录后，运行示例文件：

```bash
node demo/query.js
node demo/notify.js
```

## 四、配置文件说明

配置文件 `config.json`，配置文件内容示例如下：

```json
{
  "http.content.type.v4": "application/vnd.5upay-v4.0+json",
  "server.public.key.path": "../sm/server/platform_public.cer",
  "clients": {
    "899777075": {
      "path": "../sm/client/899777075.sm2",
      "password": "123456"
    }
  }
}
```

配置项说明：
- `http.content.type.v4`：国密版 HTTP Content-Type，固定为 `application/vnd.5upay-v4.0+json`
- `server.public.key.path`：支付平台国密公钥证书路径（商户只需修改路径，证书文件不要更换）
- `clients`：商户配置，`path` 为 `.sm2` 格式商户私钥文件路径，`password` 为私钥文件密码

注：商户生产应用时需要替换实际的商户号、商户国密私钥证书路径及密码

## 五、证书文件说明

### 商户国密私钥文件（.sm2 格式）

`.sm2` 文件由 `gencert_gm` 工具生成，格式如下：
- 第 1 行：SM2 公钥（未压缩点，HEX 格式，130 字符，带 04 前缀）
- 第 2 行：加密私钥（SM4-CBC + SM3-KDF 加密，HEX 格式）

与国际算法版本的证书转换命令对比：

| 国际算法版本                                             | 国密版本（gencert_gm 工具）        |
|----------------------------------------------------|------------------------------|
| `openssl pkcs12 -in client.pfx -nodes -out client.pem` | 使用 gencert_gm 工具生成 .sm2 文件 |
| `openssl rsa -in client.pem -out private.key`      | 无需额外处理，.sm2 文件直接包含加密私钥       |

### 平台国密公钥证书（.cer 格式）

支持 X.509 DER/PEM 格式或 SM2 公钥 HEX 文本文件。

## 六、接口调用流程

```
请求方向（发送）：
1. 排序请求参数
2. SM3 摘要计算（替代 SHA1）
3. SM2 私钥签名（替代 RSA+MD5 签名），结果写入 hmac 字段
4. 生成随机 SM4 密钥（替代 AES 密钥）
5. SM4-ECB 加密整个请求体（替代 AES-ECB）
6. SM2 公钥加密 SM4 密钥（写入 encryptKey Header，替代 RSA 加密）
7. HTTP POST 发送

响应方向（接收）：
8. SM2 私钥解密响应 encryptKey Header → 得到 SM4 密钥（替代 RSA 解密）
9. SM4-ECB 解密响应 data 字段 → 得到明文（替代 AES 解密）
10. SM3 摘要 + SM2 公钥验签（替代 SHA1 + RSA 验签）
```
