需要注意以下重要规则:
◆ 请求参数参数名ASCII码从小到大排序,签名内容需要UTF-8编码;
◆ 请求Body参数为空时传{},并且data使用{}参与签名;
◆ 请求参数和签名内容需要UTF-8编码;
◆ 回调地址请原样进行签名;
◆ 参数名区分大小写;
签名计算方式:
1、sign生成规则: sha1(time+data+apikey) 2、为了防止请求被伪造、篡改,每一次接口请求都需传入根据本次请求的 3、13位时间戳(毫秒)+body参数(json格式)+apikey(密钥) 4、计算获得的sign(签名)
签名示例(php):
public function sign($post = [], $key ='',$userid = '') { if ($post) { ksort($post); //排序post参数 $post = json_encode($post , JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); } else { $post = "{}"; } $time = time() . rand(100, 999); $header[] = "Content-Type: application/json; charset=utf-8"; //用户密钥 $header[] = "Sign: " . sha1($time . $post . $key); $header[] = "Timestamp: " . $time; //用户ID $header[] = "UserId: " . $userid; return [$post, $header]; }
接口约定(每次请求需传入以下Header参数:):
Header 参数 | 类型 | 是否必填 | 描述 | 示例值 |
---|---|---|---|---|
Sign | string | 是 | 签名 | 20d6ed7224f6ecedda74548aff9cb1a54e5c0033 |
Timestamp | string | 是 | 13位时间戳(毫秒) | 1696645385740 |
UserId | string | 是 | 您的用户接口appid(后台接口为管理员登录账号) | 2uIkTrXNdAFc7OKhbRenzjDtgPoZ6s5C |
接口示例:
以订单查询接口为例,开发者的UserId是2uIkTrXNdAFc7OKhbRenzjDtgPoZ6s5C,apikey是 H0YnuPpcVtx7rQdMTbjN6932s5oDOqFa,请求的参数如下:
Header参数
Sign: 待下方计算 Timestamp: 1696645385740 UserId: 2uIkTrXNdAFc7OKhbRenzjDtgPoZ6s5C
Body参数
{ "day": 10, "external_orderno": "", "ordersn": "D100759082558859640832" }
第一步:将请求Body参数中多个键值对,参数按照参数名的字典升序排列(a-z)。
{"day":10,"external_orderno":"","ordersn":"D100759082558859640832"}
第二步:将 13位时间戳+第一步中排序后的字符串+apikey 拼接得到待签名字符串
1696645385740{"day":10,"external_orderno":"","ordersn":"D100759082558859640832"}H0YnuPpcVtx7rQdMTbjN6932s5oDOqFa
第三步:使用sha1算法加密待加密字符串即为sign
15b8f541eb10e3fbb33efd92c8d52d50ddca0784
第四步:将sign添加到Header参数中
Sign: 15b8f541eb10e3fbb33efd92c8d52d50ddca0784Timestamp: 1696645385740UserId: 2uIkTrXNdAFc7OKhbRenzjDtgPoZ6s5C
需要注意以下重要规则:
◆ 请求参数中有中文时,中文需要经过url编码,但计算签名时不需要;
◆ 请求Body参数为空时data使用{}参与签名;
◆ 参数名区分大小写;