const formatTime = date => { const year = date.getFullYear() const month = date.getMonth() + 1 const day = date.getDate() const hour = date.getHours() const minute = date.getMinutes() const second = date.getSeconds() return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') } const formatNumber = n => { n = n.toString() return n[1] ? n : '0' + n } const getTypeSn = url => { let type_sn = '' if (url.indexOf('type_sn') != -1 && url.indexOf('bonusex') != -1) { let arr = url.split('&') arr.some(item => { if (item.indexOf('type_sn') != -1) { type_sn = item.split('=')[1] return true } }) } return type_sn } function getUrlPrefixAndParams(url) { // 用JS拿到URL,如果函数接收了URL,那就用函数的参数。如果没传参,就使用当前页面的URL let params = url.split('?'); let prefix = params[0]; if(params.length < 2) { return [prefix, {}]; } var queryString = params[1]; // 用来存储我们所有的参数 var obj = {}; // 如果没有传参,返回一个空对象 if (!queryString) { return obj; } // stuff after # is not part of query string, so get rid of it queryString = queryString.split('#')[0]; // 将参数分成数组 var arr = queryString.split('&'); for (var i = 0; i < arr.length; i++) { // 分离成key:value的形式 var a = arr[i].split('='); // 将undefined标记为true var paramName = a[0]; var paramValue = typeof (a[1]) === 'undefined' ? true : a[1]; // 如果调用对象时要求大小写区分,可删除这两行代码 paramName = paramName.toLowerCase(); if (typeof paramValue === 'string') paramValue = paramValue.toLowerCase(); // 如果paramName以方括号结束, e.g. colors[] or colors[2] if (paramName.match(/\[(\d+)?\]$/)) { // 如果paramName不存在,则创建key var key = paramName.replace(/\[(\d+)?\]/, ''); if (!obj[key]) obj[key] = []; // 如果是索引数组 e.g. colors[2] if (paramName.match(/\[\d+\]$/)) { // 获取索引值并在对应的位置添加值 var index = /\[(\d+)\]/.exec(paramName)[1]; obj[key][index] = paramValue; } else { // 如果是其它的类型,也放到数组中 obj[key].push(paramValue); } } else { // 处理字符串类型 if (!obj[paramName]) { // 如果如果paramName不存在,则创建对象的属性 obj[paramName] = paramValue; } else if (obj[paramName] && typeof obj[paramName] === 'string') { // 如果属性存在,并且是个字符串,那么就转换为数组 obj[paramName] = [obj[paramName]]; obj[paramName].push(paramValue); } else { // 如果是其它的类型,还是往数组里丢 obj[paramName].push(paramValue); } } } return [prefix,obj]; } var RSA = require('./wx_rsa.js') function strsign(str) { var privateKey = `-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC/iOf91VYX6XN05rFI7sHPJq2cnGr47hODFfWfhFw7z8ueTwGI w7ynzLUTArCWIDuEdH8sm9Tob4Jcl1CixWo8ToVJv+CtoZyNRP/vMz22NAlOTrK+ AvbMVh7WOuroE8fjuFt3uAsWE3x5/guhLomCdg1iYoPjm6YXfAjxWBcy8QIDAQAB AoGAPqIPcxMrVyBxL/4sZTQmTo5QYZFI7eQ0nz40FxjabHi0Fi2xy75uV9T6NaBA jKc3r0XFPJos0mF8mLimlsPFzCe/wgugPH0gXZVHixH034rLqxJ83lLGpdiv5/lg ABY/k1J3J6mLRKggk/vXOI1ZH4pOxTcY23IqPadu0Cg82MECQQDpVrOfd5Jwcrkh TlZyIqYYSpWcvujFMarsYT/tzZV1Wkwhx2wZfMbd3y6i5q1z1B7wLd/cCfHwLyw7 jVEID9oJAkEA0iLe22YtoZs6n1yva6lcideqNB8KmvGej2IaHUkrH+tYd/sMXRKQ xcSFfSZz1gT4QsXF/ndVXXci2WnF2yrrqQJAacBXrCA/CCOWb9fXKec2K7Ax2lZT nHuEIZl5pccUw5jnBDAjd/GrF4c81auCVQp/8w53dHw1YEug2mSTovm8MQJACYNo oXgrwrA7ZDGXA4HEXb00yG1LVp5vtkATvJWubSCDfdMQyTno8fsmq/bMsbjB4IwB nbabV8LoAf3G5lg4GQJBAIkaDL+qe1ijVN+JGaqb1zCITeoVIoarlRWQye8Iga9b Qi8P5Ft7oXIglYjOvBYC0rbnn037LIK/fqB1cP6OBow= -----END RSA PRIVATE KEY-----` var sign_rsa = RSA.KEYUTIL.getKey(privateKey); console.log(sign_rsa) var hashAlg = 'sha1'; let sig = sign_rsa.signString(str, hashAlg); sig = RSA.hex2b64(sig); // hex 转 b64 return sig; } function isEmpty(val) { if(val == '') { return true; } if(val == null) { return true; } if(val == undefined) { return true; } return false; } function arrsign(map) { let keys = new Array() for (let key of Object.keys(map)) { keys.push(key) } keys.sort(); let content = '' let i = 0; keys.forEach(key => { let val = map[key]; val = '' + val if (false === isEmpty(val) && "@" != val.substr(0, 1)) { if (i == 0) { content += '' + key + "=" + encodeURI(val); } else { content += "&" + key + "=" + encodeURI(val); } i++; } }); console.log('content:', content); return strsign(content); } module.exports = { getTypeSn: getTypeSn, formatTime: formatTime, parseAppjump: getUrlPrefixAndParams, strsign: strsign, arrsign: arrsign }