# 签名方法
# 1 请求结构
# 1.1 通信协议
高灯云 API 的所有接口均通过 HTTPS 进行通信,提供高安全性的通信通道。
# 1.2 请求方法
仅支持的 HTTP 请求 POST
方法, Content-Type 类型必须为 application/json
。
# 1.3 字符编码
均使用UTF-8编码。
# 2 签名参数
签名参数是用于标识用户和接口签名的参数,如非必要,在每个接口单独的接口文档中不再对这些参数进行说明,但每次请求均需要携带这些参数,才能正常发起请求。
签名参数包含三个部分:公共参数
、URL路径
、业务参数 payload
。
# 2.1 公共参数
参数名称 | 类型 | 必选 | 描述 | 示例 |
---|---|---|---|---|
algorithm | String | 是 | 签名算法,支持 RSA-SHA256 和 HMAC-SHA256 ,区分大小写 | HMAC-SHA256 |
appkey | String | 是 | 应用ID | gd_abcdefghijklmn |
nonce | Integer | 是 | 6位随机数字 | 398888 |
timestamp | Integer | 是 | 秒级时间戳,过期时间5分钟 | 1590719810 |
# 2.2 URL路径
URL路径为业务接口请求的URI,首字符必须为 /
,例如:请求 /invoice/v1
。
# 2.3 业务参数 payload
payload 为 json 格式业务数据,即POST 请求中 Content-Type:application/json
类型的 Body 。
# 3 签名方法
# 3.1 对签名参数排序
首先对公共参数
按参数名的字典序( ASCII 码)升序排序。
# 3.2 拼接签名原文字符串
此步骤生成签名原文字符串。
将把上一步排序好的 公共参数
格式化成 参数名称=参数值
的形式,如对 algorithm 参数,其参数名称为 "algorithm" ,参数值为 "HMAC-SHA256" ,因此格式化后就为 algorithm=HMAC-SHA256
。
然后将格式化后的各个参数用 "|" 拼接在一起,然后再拼接 URL路径
、业务参数 payload
,依然使用 "|" 拼接,最终生成的签名原文字符串为:
algorithm=签名算法|appkey=应用ID|nonce=随机数字|timestamp=时间戳|URL路径|业务参数payload
例如:
algorithm=HMAC-SHA256|appkey=gd_abcdefghijklmn|nonce=398888|timestamp=1590719810|/invoice/v1|{"name":"高灯云"}
# 3.3 生成签名串 signature
此步骤生成签名串。 首先使用 HMAC-SHA256
或 RSA-SHA256
算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64
进行编码,即可获得最终的签名串。
# 3.3.1 HMAC-SHA256
签名密钥由高灯云提供。
生成签名具体代码如下,以 PHP 语言为例:
$secretKey = 'Gu5t9xGARNpq86cd98joQYCN3EXAMPLE';
$srcStr = 'algorithm=HMAC-SHA256|appkey=gd_abcdefghijklmn|nonce=398888|timestamp=1590719810|/invoice/v1|{"name":"高灯云"}';
$signStr = base64_encode(hash_hmac('sha256', $srcStr, $secretKey, true));
echo $signStr;
最终得到的签名串为:
oyMBmowH9N7dqItUq9tAY3xXVQRxsmSidKbSyyskrI4=
# 3.3.2 RSA-SHA256
签名私钥、验签公钥由高灯云提供。
生成签名具体代码如下,以 PHP 语言为例:
$privateKey='
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuw4T755fepEyXTM66pzf6nv8NtnukQTMGnhmBFIFHp/P2vEp
xjXUBBDUpzKkVFR3wuK9O1FNmRDAGNGYC0N/9cZNdhykA1NixJfKQzncN31VJTmN
qJNZW0x7H9ZGoh2aE0zCCZpRlC1Rf5rL0SVlBoQkn/n9LnYFwyLLIK5/d/y/NZVL
6Z6Lcyvga0zRajamLIjY0Dy/8YIwVV6kaSsHeRv2cOB03eam6gbhLGIz/l8wuJhI
n1rOyJLQ36IOJymbbNmcC7+2hEQJP40qLvH7hZ1LaAkgQUHjfi8RvH2T1Jmce7XG
PxCoEd0yfeFz+pL1KeSWNey6cL3N5hJZE8EntQIDAQABAoIBAGim1ayIFK8EMQNH
uDyui/Aqcc9WWky0PGTK23irUsXxb1708gQ89WNY70Cj6qBrqZ1VMb3QHPP4FSFN
kh0rJJoi2g+ssm5R5r5KlhTKeFRrQInVC1Y3KhUUUwZa4aWtnhgSJ7Urq1yVhjU4
K7PVkhH1OHBwcp/d1Bd6jd65AgPkY63P+WpcARJkClmQ1RhgoRwThyJdpKrV4/gO
ha0AUGlJNRNvRwiZxP0zaI5C8RdrG96SnVpeYOcD0z/M1HVlkoYMXsXLKttwLfpK
88Igtm6ZJwRpfuMF5VA+9hHaYGCBdGz0B/rMp2fc+EtrOavYQGrWIWi2RL1Qk6Rt
BUyeTgECgYEA9anj4n/cak1MT+hbNFsL31mJXryl1eVNjEZj/iPMztpdS15CmFgj
Kjr9UuintjSiK7Is43nZUWWyP1XQjRhVi2uP7PRIv92QNl/YteWD6tYCInJHKe2J
QqYyZrElezsdayXb5DK6bi1UIYYji90g79N7x6pOR0UnQNQUXTv+Y8ECgYEAwuzl
6Ez4BSXIIL9NK41jfNMa73Utfl5oO1f6mHM2KbILqaFE76PSgEeXDbOKdcjCbbqC
KCGjwyPd+Clehg4vkYXTq1y2SQGHwfz7DilPSOxhPY9ND7lGbeNzDUK4x8xe52hd
MWKdgqeqCK83e5D0ihzRiMah8dbxmlfLAOZ3sPUCgYEA0dT9Czg/YqUHq7FCReQG
rg3iYgMsexjTNh/hxO97PqwRyBCJPWr7DlU4j5qdteobIsubv+kSEI6Ww7Ze3kWM
u/tyAeleQlPTnD4d8rBKD0ogpJ+L3WpBNaaToldpNmr149GAktgpmXYqSEA1GIAW
ZAL11UPIfOO6dYswobpevYECgYEApSosSODnCx2PbMgL8IpWMU+DNEF6sef2s8oB
aam9zCi0HyCqE9AhLlb61D48ZT8eF/IAFVcjttauX3dWQ4rDna/iwgHF5yhnyuS8
KayxJJ4+avYAmwEnfzdJpoPRpGI0TCovRQhFZI8C0Wb+QTJ7Mofmt9lvIUc64sff
GD0wT/0CgYASMf708dmc5Bpzcis++EgMJVb0q+ORmWzSai1NB4bf3LsNS6suWNNU
zj/JGtMaGvQo5vzGU4exNkhpQo8yUU5YbHlA8RCj7SYkmP78kCewEqxlx7dbcuj2
LAPWpiDca8StTfEphoKEVfCPHaUk0MlBHR4lCrnAkEtz23vhZKWhFw==
-----END RSA PRIVATE KEY-----
';
$srcStr = 'algorithm=RSA-SHA256|appkey=gd_abcdefghijklmn|nonce=398888|timestamp=1590719810|/invoice/v1|{"name":"高灯云"}';
openssl_sign($srcStr, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$signStr = base64_encode($signature);
echo $signStr;
最终得到的签名串为:
EHOn2Tyo++dRktC1FhNl1jRgMgXWsCbi8GpzFR6pmzRvf4ESwdLQD1kLwlS5FzxJ3d+xG3/URXpoUbJfLLQIdw3hp0iY4M+F5WrxpAKfzgMGMDnPFeiGqkfksEQeunSZvc0f3ZzzBBVj0VvR2M8jT3buy3T5TV94cozQ/V2KO2ATxBWXvDgU8jVha9AayAYjYGSYCSr0QovXoorr3PMXXr5wZylGoZx0SphozkZY8VTE9o/AWyspi3JzP8uRZxlBYsAQO8er11CA+DjnD0ffJLc7gM3E3FkodI1RNc7II+fC/6UtAn/RZRP773g50fRIB1IecFkjStEHznbTD6fW2g==
# 4 签名请求
# 4.1 生成签名请求字符串
签名请求字符串包含两部分,公共参数
和 签名串
。
将把排序
好的 公共参数
格式化成 参数名称=参数值
的形式,加上signature=签名串
,用 "," (英文半角逗号) 拼接在一起。
algorithm=签名算法,appkey=应用ID,nonce=随机数字,timestamp=时间戳,signature=签名串
例如:
algorithm=HMAC-SHA256,appkey=gd_abcdefghijklmn,nonce=398888,timestamp=1590719810,signature=oyMBmowH9N7dqItUq9tAY3xXVQRxsmSidKbSyyskrI4=
# 4.2 传递签名请求字符串
将上一步生成的签名请求字符串,放在 Authorization
字段中,通过 Http header
方法,向服务器发起请求。
# 5 签名错误码
返回结果中如果code字段不为0,并出现以下错误码,则表示签名失败。
错误码 | 错误信息 | 错误描述 |
---|---|---|
-1001 | Missing Authorization | 缺少Authorization错误。 |
-1002 | Invalid Authorization | 签名错误。 |
-1003 | Invalid Algorithm | 签名算法错误。 |
-1004 | Missing Parameter | 缺少参数错误。 |
-1005 | Invalid Parameter | 参数错误。 |
-1006 | Signature Expired | 签名过期。 |