Satogate 签名方法
1. 申请安全凭证
在第一次使用 API 之前,请申请安全凭证。安全凭证包括 ApiKey 和 ApiSecret:
- ApiKey 用于标识 API 调用者身份
- ApiSecret 用于加密签名字符串和服务器端验证签名字符串的密钥。
- 用户必须严格保管安全凭证,避免泄露。
注意:每个账号最多可以拥有一对 SecretId/SecretKey。
2. 生成签名串
有了安全凭证ApiKey 和 ApiSecret后,就可以生成签名串了:
假设用户的 ApiKey 和 ApiSecret 分别是:
- ApiKey:
11519269-5e35-****-****-09e355e00f77 - ApiSecret:
0CDE6743F18F3DA********49FD47C1576671FD5
注意:这里只是示例,请根据用户实际申请的 ApiKey 和 ApiSecret 进行后续操作!
请求头(Request Header)信息如下:
| 参数名称 | 中文 | 参数值 |
|---|---|---|
| FP-API-KEY | 商户API KEY | 11519269-5e35---09e355e00f77 |
| FP-SIGN | 商户请求签名串 | zmmjn35mikh6pM3V7sUEuX4wyYM= |
| FP-TIMESTAMP | 请求的发起或签名的时间戳(秒) | 1681973331 |
设请求参数可能如下:
| 参数名称 | 中文 | 参数值 |
|---|---|---|
| Action | 方法名 | DescribeInstances |
| Nonce | 随机正整数 | 11886 |
| Region | 实例所在区域 | ap-guangzhou |
| InstanceIds.0 | 待查询的实例 ID | ins-09dx96dg |
| Offset | 偏移量 | 0 |
| Limit | 最大允许输出 | 20 |
| Version | 接口版本号 | 2017-03-12 |
2.1. 对参数排序
首先对所有请求参数按参数名的字典序( ASCII 码)升序排序。注意:1)只按参数名进行排序,参数值保持对应即可,不参与比大小;2)按 ASCII 码比大小,如 InstanceIds.2 要排在 InstanceIds.12 后面,不是按字母表,也不是按数值。用户可以借助编程语言中的相关排序函数来实现这一功能,如 PHP 中的 ksort 函数。上述示例参数的排序结果如下:
{
'Action' : 'DescribeInstances',
'InstanceIds.0' : 'ins-09dx96dg',
'Limit' : 20,
'Nonce' : 11886,
'Offset' : 0,
'Region' : 'ap-guangzhou',
'Version': '2017-03-12',
}
使用其它程序设计语言开发时,可对上面示例中的参数进行排序,得到的结果一致即可。
2.2. 拼接请求字符串
此步骤生成请求字符串。将把上一步排序好的请求参数格式化成“参数名称=参数值”的形式,如对 Action 参数,其参数名称为 "Action" ,参数值为 "DescribeInstances" ,因此格式化后就为 Action=DescribeInstances 。注意:“参数值”为原始值而非 url 编码后的值。
然后将格式化后的各个参数用"&"拼接在一起,最终生成的请求字符串为:
Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&Version=2017-03-12
2.3. 拼接签名原文字符串
此步骤生成签名原文字符串。签名原文字符串由以下几个参数构成:
- 请求方法: 支持 POST 和 GET 方式,这里使用 GET 请求,注意方法为全大写。
- 请求主机:查看实例列表(DescribeInstances)的请求域名为:cvm.tencentcloudapi.com。实际的请求域名根据接口所属模块的不同而不同,详见各接口说明。
- 请求路径: 当前版本云API的请求路径固定为 / 。
- 请求字符串: 即上一步生成的请求字符串。
签名原文串的拼接规则为:请求方法 + 请求主机 +请求路径 + ? + 请求字符串 + 时间戳。
示例的拼接结果为:
GETapi.satogate.io/getAddress?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3*******&Timestamp=1465185768&Version=2017-03-121681973331
2.4. 生成签名串
此步骤生成签名串。首先使用 HMAC-SHA1 算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64 进行编码,即可获得最终的签名串。
具体代码如下,以 PHP 语言为例:
$apiSecret = '0CDE6743F18F3DA********49FD47C1576671FD5';
$srcStr = 'GETcvm.tencentcloudapi.com/?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3*******&Timestamp=1465185768&Version=2017-03-121681973331';
$macHex = hash_hmac('sha1', $srcStr, $apiSecret, false); // 十六进制字符串
$signStr = base64_encode($macHex);
echo $signStr;
最终得到的签名串为:
zmmjn35mikh6pM3V7sUEuX4wyYM=
使用其它程序设计语言开发时,可用上面示例中的原文进行签名验证,得到的签名串与例子中的一致即可。
3. 发起请求
生成的签名串放置在请求头(Request Header)中,参数名为FP-SIGN。
4. 签名失败
根据实际情况,存在以下签名失败的错误码,请根据实际情况处理。
| 错误代码 | 错误信息 | 错误描述 |
|---|---|---|
| 10027 | Signature expire | 签名过期 |
| 10015 | Api Key not found | Api Key不存在 |
| 10016 | Invalid Signature | 签名错误 |