最近小程序需求一个签名加密,要把请求参数按键值排序并转化为字符串,然后进行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. LINQ to DataSet,对离线数据的Linq支持、AsEnumeable()

    一.DataTable的扩展方法: 1.DataTable转Linq:AsEnumerable 方法 返回IEnumerable<T>对象,其中泛型参数T是DataRow. 此对象可用在 ...

  2. MySQL内存结构

    实际上MySQL内存的组成和Oracle类似,也可以分为SGA(系统全局区)和PGA(程序缓存区). mysql>show variables like "%buffer%" ...

  3. spring timetask 定时任务调度

    作者:Garry1115 定时任务调度即在设置的特定时间执行特定的任务,不需要人工干预. spring timertask spring 自身所带定时任务类,不需要引入第三方jar包,使用方式如下: ...

  4. [hdoj4578][多延迟标记的线段树]

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  5. 一步一步学会preload和prefetch

    preload和prefetch是什么? 我们常说的preload和prefetch,是link标签rel里新增的两种值,用于让浏览器提前加载指定的资源,它们会先被缓存(属于http cache缓存) ...

  6. Codeforces Round #592 (Div. 2)【C题】{补题ING}

    思路:x,y,z肯定不为负数xw+dy=p,直接枚举系数较小的y即可,y的范围:y<w,因为大于w的时候,不如去增加x,这样x+y的和还能保持尽可能小. /* x*w+y*d=p; x*w+(K ...

  7. Vue之合理划分容器组件与展示组件

    Vue之合理划分容器组件与展示组件 时间 2019-06-02 00:30:32  Poetry's Blog 原文  http://blog.poetries.top/2019/06/01/vue- ...

  8. git 远程代码被覆盖

    场景: 解决方法: 第1步. 回退至上一个完整的正确的版本.Git Bash 中输入命令: git reset --hard 1b59cef2a1685c37b7e7b5f2497e055f5e031 ...

  9. python 使用流式游标 读取mysql怎么不会内存溢出

    使用过java读取mysql大数据量的人应该都知道,如果查询时不开游标不设置一次性区大小的话,会一次性的把所有记录都拉取过来再进行后续操作,数据量一大就很容易出现OOM 如果用python去读取mys ...

  10. Java进阶知识26 SSH整合(Struts2、Spring、Hibernate)

    1.我用到的jar包 2.整合实例 2.1.数据库建表语句 create database school; -- 创建数据库 use school; -- 使用school数据库 create tab ...