飞霜平台签名生成
为保证数据安全和防篡改,所有请求都需要进行签名。
## 签名步骤
### 1、取值
获取所有请求的 `POST` 内容,不包括字节类型参数,如文件、字节流,剔除 `sign` 字段,剔除值为空的参数;
### 2、排序
按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;
### 3、拼接
将排序后的参数与其对应值,组合成 `参数=参数值` 的格式,并且把这些参数用 `&` 字符连接起来,此时生成的字符串为 `待签名字符串`。
### 4、签名
使用 `fiseng_hmac_key` 对 `待签名字符串` 进行 `HMAC-SHA256` 签名,并对签名结果进行 `Base64` 编码得到签名值。<br>注:`fiseng_hmac_key` 会在[订单创建](./Cwwvg4v2)时以参数的形式传递给支付平台,每笔订单值唯一,支付平台需将该值和订单信息一起保存。
## 签名示例
以[订单通知](./YPFjKw2S)接口为例
### 1、取值
```json
{
"fiseng_trade_no": "2022111617221196158",
"method": "fiseng.trade.notify",
"version": "1.0",
"timestamp": "2022-11-16 14:28:08",
"biz_content": "{\"status\":\"PAID\",\"payment_time\":\"2022-11-16 14:28:08\",\"refund_time\":\"\",\"closed_time\":\"\"}",
"sign": ""
}
```
### 2、排序
```json
{
"biz_content": "{\"status\":\"PAID\",\"payment_time\":\"2022-11-16 14:28:08\",\"refund_time\":\"\",\"closed_time\":\"\"}",
"fiseng_trade_no": "2022111617221196158",
"method": "fiseng.trade.notify",
"sign": "",
"timestamp": "2022-11-16 14:28:08",
"version": "1.0"
}
```
### 3、拼接
```text
biz_content={"status":"PAID","payment_time":"2022-11-16 14:28:08","refund_time":"","closed_time":""}&fiseng_trade_no=2022111617221196158&method=fiseng.trade.notify×tamp=2022-11-16 14:28:08&version=1.0
```
### 4、签名
假设 `fiseng_hmac_key` 为:`DTNPFuhEQqJn1XkPoArM38y5KXUH3YDC`,以下为 `PHP` 签名示例代码
```php
<?php
$key = 'DTNPFuhEQqJn1XkPoArM38y5KXUH3YDC';
$string_to_sign = 'biz_content={"status":"PAID","payment_time":"2022-11-16 14:28:08","refund_time":"","closed_time":""}&fiseng_trade_no=2022111617221196158&method=fiseng.trade.notify×tamp=2022-11-16 14:28:08&version=1.0';
// 使用 商户密钥 对 待签名字符串 进行 HMAC-SHA256 签名
$signature = hash_hmac('sha256', $string_to_sign, $key, true);
// 对签名结果进行 Base64 编码得到签名值
$signature = base64_encode($signature);
```
最终生成的签名值为:`dcA/t1Nfdqwa6ygw0bEHGEjvmuclBthzrmHZQUQvacE=`
## 各语言生成签名代码
### PHP
```php
<?php
/**
* 生成签名
* @param array $data 数据
* @param string $sign_key 签名密钥
* @return string
*/
function generate_sign(array $data, string $sign_key): string
{
unset($data['sign']);
ksort($data);
$arr = [];
foreach ($data as $key => $value) {
if (!is_scalar($value) || '' === $value) {
continue;
}
$arr[] = $key . '=' . $value;
}
$string_to_sign = implode('&', $arr);
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $sign_key, true));
return $signature;
}
```