最近小程序需求一个签名加密,要把请求参数按键值排序并转化为字符串,然后进行MD5加密。

      //时间戳
var timestamp = (Date.parse(new Date()))/1000;//签名验证
var key = '服务端给的';
var json = {
signTime: timestamp,
versionNumber: that.data.versionNumber,
title: name,
idcard: cardnum,
limit: that.data.limit,
page: that.data.page,
}
//json转换为数组并按键值升序排列再转化为字符串
let { keys, values, entries } = Object;
let dataArr = [];
//json的每个属性和值添加到数组
for (let [key, value] of entries(json)) {
dataArr.push([key + value]);
}
var newStr = dataArr.sort().join(""); //数组排序并转化为字符串
console.log(newStr);
var sign = key + newStr + key;
sign = MD5(sign).toUpperCase(); //MD5加密并转为大写
console.log(sign);

思路是先把json格式的数据的每项参数和属性都添加到一个数组,然后把数组排序,再转为字符串,最后进行MD5加密。

后来觉得有点麻烦,直接新建数组,然后排序转为字符串,再进行MD5加密。

      var arr = ['signTime' + timestamp, 'versionNumber' + that.data.versionNumber,
'title' + that.name, 'idcard' + that.cardnum, 'limit' + that.data.limit, 'page' + that.data.page];
var newArr = [];
for (var i = 0; i < arr.length; i++){
newArr.push(arr[i]);
}
console.log(newArr);
var newStr = newArr.sort().join(""); //数组排序并转化为字符串
console.log(newStr);
var sign = key + newStr + key;

现在基本所有接口都要签名,所以直接写了一个简单全局的方法,方便调用。

全局方法:

makeSign:function (obj) {
var key = '你的key';
var timestamp = (Date.parse(new Date()))/1000;
var versionNumber = 'app-v1';
obj["versionNumber"] = versionNumber;
obj["signTime"] = timestamp;
let { keys, values, entries } = Object;
let dataArr = [];
//obj的每个属性和值添加到数组
for (let [key, value] of entries(obj)) {
dataArr.push([key + value]);
}
var newStr = dataArr.sort().join(""); //数组排序并转化为字符串
var sign = key + newStr + key;
sign = MD5(sign).toUpperCase(); //MD5加密并转为大写
return sign;
}

调用:

var obj = {
//必传参数 具体看公司规定
}
obj.sign = app.makeSign(obj); //把签名添加到obj里
var data = obj;
//获取分类信息
wx.request({
url: api.wx.Url,
data: data,
method: 'Get',
header: { 'content-type': 'application/x-www-form-urlencoded' }, // 设置请求的 header
success: (res) => {
console.log(res);
......
}
})

大神的通用方法:

const upperFirst = function (word) {
return word[].toUpperCase() + word.slice();
}
const isType = function (obj, type) {
return type
? toString.call(obj) === '[object ' + upperFirst(type) + ']'
: toString.call(obj).match(/(?![\[object ]).*(?=\])/i)[].toLowerCase();
};
const getSign = function (params) {
if (!params) {
params = {}
}
var bandParam = "key";
var versionNumber = "web-v1";
params["versionNumber"] = versionNumber;
params["signTime"] = (new Date().getTime() / ).toFixed();
var newData = Object.keys(params).sort();
var sign = bandParam; for (let key of newData) {
var item = params[key];
if (isType(item, "array") || isType(item, "object" || key == "sign")) {
return;
}
sign += key + item;
} sign += bandParam;
params["sign"] = MD5(sign).toUpperCase();
return params;
}

调用:

data: getSign({
//必填参数
}),

小程序签名MD5加密的更多相关文章

  1. 微信小程序引入md5.js

    今天给大家安利一下微信小程序引入md5.js的方法,不多说 md5.js在下面 直接复制到项目的utils/md5.js即可 /* * A JavaScript implementation of t ...

  2. java独立小程序实现AES加密和解密

    一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...

  3. [开源]入坑Qt,我的第一个小程序:MD5计算器

    版权声明 --------- 本文仅在知乎与博客园发布.开发者为szx0427 MFC和Win32搞了好几年了,也算是懂了个皮毛,但是一直觉得用这两者开发软件都很麻烦,需要将大量的代码花费在UI等地方 ...

  4. Flutter 接口签名MD5加密

    第一步 更新pubspec.yaml crypto: ^+ 第二步 先引入头文件: import 'dart:convert'; import 'package:convert/convert.dar ...

  5. 微信小程序des加密、PHP des解密

    最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 引用的插件为tripledes.js,https://github.com/Favour1111in/h ...

  6. 微信小程序学习指南

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  7. 微信小程序 微信支付

    微信小程序前端自处理: //时间戳 timeStamp() { return parseInt(new Date().getTime() / 1000) + '' }, //随机数 randomStr ...

  8. md5加密、Des加密对称可逆加密、RSA非对称可逆加密、https单边验证、银行U盾双边认证

    1.md5不可逆的加密方式,加密成一个32位的字符串.算法是公开的,任何语言的加密结果都是一样的.总有可能是重复的.     用途:             (1)防止明文存储:可以用作密码加密    ...

  9. 3、Android应用程序签名及发布

    一.问个问题,为何我们需要签名以及版本控制? 程序做好了,我们要放到Market上进行商业发布. 二.发布步骤 [准备发布] 1)移除log , 设置版本编号和名称. 2)签名,通过ADT工具. 3) ...

随机推荐

  1. ubuntu下后台服务的管理

    注册后台服务后都有脚本存在/lib/systemd/system路径下 如mysql为mysql.service 被service管理的进程被杀掉还是会重启的 应使用service XXX stop停 ...

  2. Vim键盘图-红色圈标记为重点

  3. airflow--调度研究

    1.从调度到airflow ETL,是英文 Extract,Transform,Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端 ...

  4. MySQL数据库有几种索引?分别是什么?

        5种索引     1.主键索引     2.唯一索引     3.普通索引     4.全文索引     5.联合索引

  5. mysql 执行sql语句执行问题

    SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...

  6. [HNOI2008] 越狱 快速幂

    [HNOI2008] 越狱 快速幂 水.考虑不发生越狱的情况:即宗教相同的都不相邻,一号任意放\(m\)种宗教的人,此后\(n-1\)个房间都放与上一个宗教不同的人,有\(m-1\)种,所以共有\(m ...

  7. 3-自定义构造方法和description方法

    http://www.cnblogs.com/mjios/archive/2013/04/19/3031412.html -自定义构造方法和description方法 1 默认的构造方法是什么?有什么 ...

  8. POJ 1051 Jury Compromise ——(暴力DP)

    题目不难,暴力地dp一下就好,但是不知道我WA在哪里了,对拍了好多的数据都没找出错误= =.估计又是哪里小细节写错了QAQ..思路是用dp[i][j]表示已经选了i个,差值为j的最大和.转移的话暴力枚 ...

  9. mlflow ui 启动报错No such file or directory: 'gunicorn': 'gunicorn'

    1.mlflow ui 启动报错,信息如下: [root@localhost mlflow]# mlflow ui /usr/local/python3/lib/python3./importlib/ ...

  10. oracle insert into 多条数据

    mysql : insert into tablename (column1,column2) values ('aa','bb'), ('dd','cc'), ('ee','ff'); oracle ...