API授权验证#
公共参数#
参数 | 必填 | 说明 |
---|
appKey | Yes | 创建账户时生成的AppKey |
signature | Yes | 请求参数md5值,生成规则见下文 |
timestamp | Yes | 请求时间戳(UNIX 时间戳),单位:毫秒 2024/01/01 00:00:00 -> 1704038400000 注意:时间戳至发送请求的过程需要小于10秒 |
signature数字签名生成规则#
1.将所有请求参数和创建账户时生成的appSecret
按照自然顺序排序(A~Z升序)例如接口除公共参数之外需要提交name
和 age
两个参数,首先按字母自然顺序进行排序,得到的顺序如下:appSecret=544bc1cfce21xz04fff65477ca7a0d17
2.创建签名字符串,以"key=value"
+ "&"
(连接符)+ "key=value"
的方式连接所有参数
age=42&appKey=100088&name=小龙&appSecret=544bc1cfce21xz04fff65477ca7a0d17×tamp=1704038400000
3.创建签名,使用MD5算法
加密步骤2
创建的字符串 signature = MD5("age=42&appKey=100088&name=小龙&appSecret=544bc1cfce21xz04fff65477ca7a0d17×tamp=1704038400000")
signature = 1b34047c8ae64fbb7beefb6c2247d814
appSecret为商户密钥,仅用于签名,请勿将appSecret明文暴露在请求参数中。
代码示例#
<?php
function generateSignature($params, $secret) {
// 将密钥(appSecret)添加到参数中
$params['appSecret'] = $secret;
// 按键名排序
ksort($params);
// 构建签名字符串
$signatureBase = http_build_query($params, '', '&');
// 使用MD5加密
$signature = md5($signatureBase);
return $signature;
}
// 示例参数
$params = [
'name' => '小龙',
'age' => '42',
'timestamp' => '1704038400000',
'appKey' => '100088'
];
// 生成数字签名
$secret = '544bc1cfce21xz04fff65477ca7a0d17';
$signature = generateSignature($params, $secret);
// appSecret为商户密钥,签名后需移除,不做为参数提交
unset($params['appSecret']);
echo "Generated Signature: " . $signature;
?>
import hashlib
from collections import OrderedDict
def generate_signature(params, secret):
# 将密钥(appSecret)添加到参数中
params['appSecret'] = secret
# 按键名排序
sorted_params = OrderedDict(sorted(params.items()))
# 构建签名字符串
signature_base = '&'.join(f"{key}={value}" for key, value in sorted_params.items())
# 使用MD5加密
signature = hashlib.md5(signature_base.encode('utf-8')).hexdigest()
return signature
# 示例参数
params = {
'name': '小龙',
'age': '42',
'timestamp': '1704038400000',
'appKey': '100088'
}
# 生成数字签名
secret = '544bc1cfce21xz04fff65477ca7a0d17'
signature = generate_signature(params, secret)
// appSecret为商户密钥,签名后需移除,不做为参数提交
del params['appSecret']
print("Generated Signature:", signature)
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"sort"
"strings"
)
func generateSignature(params map[string]string, secret string) string {
// 将密钥(appSecret)添加到参数中
params["appSecret"] = secret
// 获取所有键,并按自然顺序排序
keys := make([]string, 0, len(params))
for k := range params {
keys = append(keys, k)
}
sort.Strings(keys)
// 构建签名字符串
var signatureBase strings.Builder
for _, k := range keys {
signatureBase.WriteString(k)
signatureBase.WriteString("=")
signatureBase.WriteString(params[k])
signatureBase.WriteString("&")
}
// 移除最后一个"&"
signatureStr := signatureBase.String()
signatureStr = signatureStr[:len(signatureStr)-1]
// 使用MD5加密
hasher := md5.New()
hasher.Write([]byte(signatureStr))
signature := hex.EncodeToString(hasher.Sum(nil))
return signature
}
func main() {
// 示例参数
params := map[string]string{
"name": "小龙",
"age": "42",
"timestamp": "1704038400000",
"appKey": "100088",
}
// 生成数字签名
secret := "544bc1cfce21xz04fff65477ca7a0d17"
signature := generateSignature(params, secret)
// appSecret为商户密钥,签名后需移除,不做为参数提交
delete(params,"appSecret")
fmt.Println("Generated Signature:", signature)
}
公共响应状态码#
状态码 | 状态 | 说明 | 详细说明 |
---|
10000 | OK | 操作成功 | |
20000 | WARN | 服务错误 | |
20001 | SERVICE_STATUS_WARN | 服务错误 | 服务未开启,请联系管理员 |
20002 | IP_UNAUTHORIZED | ip白名单校验错误 | ip地址未授权,请检查ip白名单配置 |
30000 | FAIL | 操作失败 | |
30001 | BALANCE_DEFAULTED | 操作失败 | 账户余额不足 |
40000 | PARAM_ERROR | 参数错误 | |
40001 | MISS_PARAM | 缺少参数 | |
40001 | MISS_SIGNATURE | 缺少参数 | 缺少签名 |
40002 | INVALID_SIGNATURE | 非法参数 | 无效签名 |
40005 | API_LIMIT_EXCEEDS | API调用频率超限 | 频率异常,请稍后再试 |
40006 | USER_FORBIDDEN | 异常用户 | 用户信息错误,请联系管理员 |