Skip to content

接入指南

签名生成

  • 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=="

接口返回

  1. response code: 400, response body: {"code": 400, "message": "Bad Request"} 签名验证参数异常
  2. response code: 401, response body: {"code": 401, "message": "Unauthorized"} 签名验证不通过
  3. response code: 402, response body: {"code": 402, "message": "Sign expired"} 签名过期
  4. 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}

营业执照沪ICP备18041799号-1