签名算法

签名算法

一.为什么要签名

        为了防止API在调用过程中被恶意者拦截随意篡改,调用API时需要传入签名参数sign,开放平台服务端会根据请求参数对签名进行验证,判断请求参数是否合法


.签名规则

        为了防止API在调用过程中被恶意者拦截随意篡改,调用API时需要传入签名参数sign,开放平台服务端会根据请求参数对签名进行验证,判断请求参数是否合法

    第一步:所有的“params公共参数”与“request Body应用级参数”都需要参与签名计算       第二步:对参与签名的参数,进行排序【对参数名(key)依据ASCII码进行升序排列】。例如:            排序前   access_token,app_key,method,timestamp,v,360buy_param_json
排序后 360buy_param_json,access_token,app_key,method,timestamp,v

第三步:拼接各个“参数名”与“参数值”。形成字符串。
示例: 360buy_param_json{360buy_param_json的值}access_token{access_token的值}app_key{app_key的值}method{method的值}timestamp{timestamp的值}

第四步:在字符串首部和末尾,拼接加入”app_secret“的值(不含app_secret的键)
示例: {appSecret的值}{上一步的生成的字符串值}{appSecret的值}

第五步: 对字符串进行Md5运算,再转为大写,得到签名参数“sign"的值


三.签名示例:

  1.    1.假设现在有如下输入参数

    其中params公共参数如下:
    "method":"jingdong.eclp.master.queryDept", //接口方法名
    "app_key":"sdfe0723kfgd88efgerg38vjhg3", //应用app_key
    "access_token":"grherj3i923hrt9304546543434", //用户授权访问令牌
    "timestamp":"2020-09-23 12:23:45", //请求时间
    "format":"json", //数据格式
    "v":"2.0" //接口版本
    其中request Body应用级参数如下:

    { "360buy_param_json":{ //业务参数封装结构
    "deptNos":"EBU123" //业务参数1
    }
    }

      2.先对输入参数中非空值参数 按照(ascii字典序)进行升序排序,排序结果如下


  2.     "360buy_param_json":{ //业务参数封装结构,其内参数顺序可忽略
    "deptNos":"EBU123" //业务参数1
    }
    "access_token":"grherj3i923hrt9304546543434", //用户授权访问令牌
    "app_key":"sdfe0723kfgd88efgerg38vjhg3", //应用app_key
    "format":"json", //数据格式
    "method":"jingdong.eclp.master.queryDept", //接口方法名
    "timestamp":"2020-09-23 12:23:45", //请求时间
    "v":"2.0" //接口版本

  3. 3.按照keyvalue格式拼接“参数键:与参数值,并拼接各个键值对,示例如下:  

  4. "360buy_param_json{"deptNos":"EBU123"}access_tokengrherj3i923hrt9304546543434app_keysdfe0723kfgd88efgerg38vjhg3formatjsonmethodjingdong.eclp.master.queryDepttimestamp2020-09-23 12:23:45v2.0"

     4.尾部加入app_secret的值,假设app_secret=192006250b4c09247ec02edce69f6a2d,示例如下:     

    "192006250b4c09247ec02edce69f6a2d360buy_param_json{"deptNos":"EBU123"}access_tokengrherj3i923hrt9304546543434app_keysdfe0723kfgd88efgerg38vjhg3formatjsonmethodjingdong.eclp.master.queryDepttimestamp2020-09-23 12:23:45v2.0192006250b4c09247ec02edce69f6a2d"

  5. 5. 对最终形成的字符串进行md5运算,再转为大写,运算结果就是签名值sign

  6. String sign=Md5(str).toUpperCase();

     6. 将签名字段sign插入到请求体body中去