/**
* @param data json字符串字节流
* @desc 用于生成签名拼接字符串QueryString。
* 1.按ASCII码从小到大排序,空键/值和空字符串不参与组串
* 2.统一使用UTF8进行编码签名,防止编码方式或特殊字符不兼容问题
* 3.签名原始串中,字段名和字段值都采用原始值,即不进行URL Encode
* 4.注意整形、浮点型数据参与签名方式(如:浮点数3.10体现为3.1、0.0体现为0)
* 5.内嵌JSON或ARRAY解析拼接需转字符串且按紧凑方式,即内嵌各K/V或值之间不应有空格或换行符等等
* 6.内部值中嵌套对象中空值或空字符串不做任何处理(即保留),空值统一使用null
* 7.内部值中的嵌套对象键值属性保持原有顺序,不做特殊排序处理
*/
function buildSignQueryString(params) {
var keys = Object.keys(params).sort()
var queryString = "";
keys.forEach((key,index) => {
var val = params[key];
if (key == undefined || key ==null || key.length == 0 || val == undefined || val==null || val.length == 0) {
return
}
if (queryString.length > 0) {
queryString += "&"
}
queryString += key + "="
switch(typeof(val)) {
case "object": queryString += JSON.stringify(val,(k,v)=>typeof v==='undefined'?null:v);break;
default: queryString += val;break;
}
})
return queryString;
}
验证JS参数对象
var params = {
"d":"中华人民共和国",
"b":2.12345678,
"a":1,
"e":[
1,
2.12345678,
true,
"中华人民共和国",
{
"e4":"中化人民共和国",
"e2":2.12345678,
"e3":true,
"e1":1,
"e5":[],
"e6":undefined
},
undefined
],
"c":true,
"f":{
"f4":"中化人民共和国",
"f2":2.12345678,
"f3":true,
"f1":1,
"f6":undefined,
"f5":{
"f5_1":1,
"f5_2":2.12345678,
"f5_3":true,
"f5_5":[],
"f5_6":undefined,
"f5_4":"中化人民共和国"
}
}
}
验证输出:
console.log(buildSignQueryString(params))
输出结果如下:
a=1&b=2.12345678&c=true&d=中华人民共和国&e=[1,2.12345678,true,"中华人民共和国",{"e4":"中化人民共和国","e2":2.12345678,"e3":true,"e1":1,"e5":[],"e6":null},null]&f={"f4":"中化人民共和国","f2":2.12345678,"f3":true,"f1":1,"f6":null,"f5":{"f5_1":1,"f5_2":2.12345678,"f5_3":true,"f5_5":[],"f5_6":null,"f5_4":"中化人民共和国"}}