# 加签验签

## 密钥分发

在开始接入前, 您首先需要生成RSA密钥对，保留好私钥并将公钥交给PayKKa平台相关对接人员。

生产密钥分发流程：todo待定

## 构造签名串

签名串一共有五行，每一行为一个参数。结尾以`\n` （换行符，ASCII编码值为0x0A）结束，不包括最后一行。

`注意：签名串的结构规则：每行一个元素，该行元素若是缺省不用传，但是换行符需要，保持结构不变。始终遵循一行一个元素，没有元素，还是得换行，最后一个元素除外`

```text
请求路径\n
请求时间戳(timestamp)\n
请求随机串(nonce)\n
商户号\n
请求报文主体
```

### 请求或响应不包含报文主体

```text
请求路径\n
请求时间戳(timestamp)\n
请求随机串(nonce)\n
商户号
```

### 请求的资源不涉及商户号

可以不用传商户号，但是换行符还是需要

```text
请求路径\n
请求时间戳(timestamp)\n
请求随机串(nonce)\n
\n
请求报文主体
```

### 文件上传的加签验签

文件上传的加签验签方式与其他基于文本的API不同, 在计算签名时使用的body为meta的json字符串

```text
请求路径\n
请求时间戳(timestamp)\n
请求随机串(nonce)\n
商户号\n
请求meta的json字符串
```

## 计算签名值

绝大多数编程语言提供的签名函数支持对签名数据进行签名。强烈建议客户调用该类函数，使用客户私钥对待签名串进行`SHA256withRSA`
签名，并对签名结果进行`Base64编码`得到签名值。

## 设置HTTP头

- 在所请求内容归属于商户的情况下, 需要设置`X-Merch-Id`请求头, 内容是 **Paykka跨境收款开放平台** 分配的**商户号** (
生成方式)
- 请求通过HTTP`Authorization`头来传递签名, 其内容是一个经过`URLEncode`的`JSON`对象, 包含以下字段:


| key | 格式 | 说明 |
|  --- | --- | --- |
| sign_type | String | 签名方式(SHA256_WITH_RSA) |
| timestamp | String | 请求生成时的毫秒时间戳值(Milliseconds since Unix Epoch) |
| nonce | String(6-32) | 请求生成时, 随机生成的字符串, 用于请求防重 |
| key_id | String | 平台侧分配的密钥id, 对应客户 |
| signature | String | 请求签名 |