# 签名方法

# 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-SHA256HMAC-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-SHA256RSA-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 签名过期。