js 对象按照键值(不分区大小写)排序,生成签名方法

Posted 瓶子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 对象按照键值(不分区大小写)排序,生成签名方法相关的知识,希望对你有一定的参考价值。

客户需求小程序端用js生成签名,我们按照要求一步一步解决,并且将请求方法封装到一个utils.js里:

第一步:对关联数组按照键名做正序排序。

第二步:拼接字符串 

第三步:将拼接的字符串加上私钥

第四步:将以上字符串MD5加密

 

const md5 = require(‘md5.js‘);
var appsecret ="appsecret ";
var App_Key ="App_Key ";

//字母排序:不区分大小写
function sortCharter(a, b) {
if (a.toString().toUpperCase() > b.toString().toUpperCase()) {
return 1;
}
else if (a.toString().toUpperCase() == b.toString().toUpperCase()) {
return 0;
}
else {
return -1;
}
}
 
function objKeySort(obj) {//排序的函数
var newkey = Object.keys(obj).sort(sortCharter);
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newObj = {};//创建一个新的对象,用于存放排好序的键值对
for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
}
return newObj;//返回排好序的新对象
}
String.prototype.PadLeft = function (len, charStr) {
var s = this + ‘‘;
return new Array(len - s.length + 1).join(charStr, ‘‘) + s;
}
 
//创建sign
function create_sign(data) {
 
console.log("1、排序前create_sign0");
console.log(data);
//1、排序
data = objKeySort(data);
console.log("1、排序后create_sign111");
console.log(data);
//2.拼接
var txt="";
var newkey = Object.keys(data);
for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
txt = txt + newkey[i].length.toString().PadLeft(2, ‘0‘);
txt=txt+"-";
txt = txt + newkey[i];
txt = txt + ":";
//  console.log("for内部===k-v");
console.log(newkey[i]);
console.log(data[newkey[i]]);
txt = txt + data[newkey[i]].toString().length.toString().PadLeft(4,‘0‘);
txt = txt + "-";
txt = txt + data[newkey[i]];
if (i < (newkey.length-1))
{
txt = txt + ";";
}
}
//console.log("for内部===3.追加私钥appsecret");
//3.追加私钥appsecret
// console.log(txt);
// console.log("appsecret=" + appsecret);
txt = txt + appsecret;
//4.md5加密
txt = md5.hex_md5(txt);
return txt;
}

 

以上是关于js 对象按照键值(不分区大小写)排序,生成签名方法的主要内容,如果未能解决你的问题,请参考以下文章

支付总结之签名验证

算法-排序法归类

javajava反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明可用于微信支付 签名生成

字符串ASCII码排序

JS对象数组按照属性值排序并获取最大/小值

环形缓冲区大小和反写阈值