接入指南
签名生成
open_v2 要求所有请求进行签名。服务器会在收到请求后进行签名的验证。如果签名验证不通过,将会拒绝处理请求,并返回401 Unauthorized。
服务器baseurl:
https://shop.lebai.ltd/api
准备
- 第三方开发者需要拥有一个乐白开发者
appid
和密钥appkey
,请联系乐白技术获取,请保护好自己的密钥appkey
。
构造签名串
- 签名串一共有6个参数。用字符串 "\n" 拼接,包括最后一行。
appkey\nHTTP请求方法\nURL\n请求时间戳\n请求随机串\n请求报文主体\n
第一个,appkey
第二个,获取HTTP请求的方法(
GET
,POST
)
POST
- 第三个,获取请求的绝对URL,并去除baseurl后得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有'?'和对应的查询字符串。
/open_v2/test/aaa?a=b
- 第四个,获取发起请求时的系统当前时间戳,即格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数,作为请求时间戳。服务器会拒绝处理很久之前发起的请求,请保持自身系统的时间准确。
1710733030849
- 第五个,生成一个请求随机串,可参见生成随机数算法。建议16-32位。
LQ79HONZUPLX3520WPWUCYFUKXXDH7
第六个,获取请求中的请求报文主体(request body)。
- 请求方法为GET时,报文主体为空。
- 当请求方法为POST时,请使用真实发送的JSON报文。
按照前述规则,构造的请求签名串示例为:
1d118fe7848d61a133ee44856fefc9f9\nPOST\n/open_v2/test/aaa?a=b\n1710733030849\nLQ79HONZUPLX3520WPWUCYFUKXXDH7\n{"a": 1}\n
计算签名值
绝大多数编程语言提供的签名函数支持对签名数据进行签名。强烈建议开发者调用该类函数,对签名串进行SHA256签名,并对签名结果进行Base64编码得到签名值。
sign=base64(sha256(签名串))
设置HTTP头
请求通过HTTP authorization头来传递签名。
1.appid
2.请求随机串nonce_str
3.ts
4.签名值sign
注:以上四项签名信息,无顺序要求。
authorization 头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)
appid="TEST",ts="1710733030849",nonce_str="LQ79HONZUPLX3520WPWUCYFUKXXDH7",sign="YTYyMWIzMzM5YTEzMDRiMTNiYzQ0Y2RlNGQ4MjBmNDA1MjM5OTQ3NTZhZTc1MDczN2I0YzVkNDU2YzA5MjhkNQ=="
接口返回
- response code:
400
, response body:{"code": 400, "message": "Bad Request"}
签名验证参数异常 - response code:
401
, response body:{"code": 401, "message": "Unauthorized"}
签名验证不通过 - response code:
402
, response body:{"code": 402, "message": "Sign expired"}
签名过期 - response code:
403
, response body:{"code": 403, "message": "Forbidden"}
签名通过,权限不够拒绝请求
验证举例
- GET
签名串:
1d118fe7848d61a133ee44856fefc9f9\nGET\n/open_v2/test/aaa?a=b\n1710733256066\nZFH6GERBFJCI3SMX90XW68CXC9FAJ7\n\n
签名:
ODM3OTE2NTBkNzY2YTBiNmNiNWFiYmJkMTNjNTBlYzJiNWRjOGQ4M2RlNWE5MjNlZTA1YTZkMTdkNmQ0MzRkMA==
请求头authorization:
appid="TEST",ts="1710733256066",nonce_str="ZFH6GERBFJCI3SMX90XW68CXC9FAJ7",sign="ODM3OTE2NTBkNzY2YTBiNmNiNWFiYmJkMTNjNTBlYzJiNWRjOGQ4M2RlNWE5MjNlZTA1YTZkMTdkNmQ0MzRkMA=="
- POST
签名串:
1d118fe7848d61a133ee44856fefc9f9\nPOST\n/open_v2/test/aaa?a=b\n1710733030849\nLQ79HONZUPLX3520WPWUCYFUKXXDH7\n{"a": 1}\n
签名:
YTYyMWIzMzM5YTEzMDRiMTNiYzQ0Y2RlNGQ4MjBmNDA1MjM5OTQ3NTZhZTc1MDczN2I0YzVkNDU2YzA5MjhkNQ==
请求头authorization:
appid="TEST",ts="1710733030849",nonce_str="LQ79HONZUPLX3520WPWUCYFUKXXDH7",sign="YTYyMWIzMzM5YTEzMDRiMTNiYzQ0Y2RlNGQ4MjBmNDA1MjM5OTQ3NTZhZTc1MDczN2I0YzVkNDU2YzA5MjhkNQ=="
测试接口
以下GET 和 POST接口仅用于测试签名逻辑,没有实际功能, 返回code=0表示签名逻辑没问题
GET /open_v2/test/aaa
return {"code": 0}
POST /open_v2/test/aaa
request json: {"a": 1}
return {"code": 0}