import UTF8 from 'crypto-js/enc-utf8' import sha256 from 'crypto-js/hmac-sha256' const _getHeaderUrl = Symbol('_getHeaderUrl') const secretKey = '018f162e804f945ee6b23aebfa863639'; const signatureUtil={ makeSignPlain(queryStringMap, body, timestamp, nonce) { let signPlain = ''; [...queryStringMap.keys()].sort((a, b) => { if (a.toString().toLowerCase() > b.toString().toLowerCase()) { return 1 } return -1 }).forEach(key => { if (queryStringMap.get(key) !== '') { signPlain += `${key}=${queryStringMap.get(key)}&` } }) if (signPlain.length > 1) { signPlain = signPlain.substring(0, signPlain.length - 1) } if (body) { signPlain += JSON.stringify(body) } signPlain += timestamp.toString() + nonce.toString() // console.log('签名结果:', signPlain) // signPlain = sha256.hmac('018f162e804f945ee6b23aebfa863639', signPlain); signPlain = sha256(signPlain, secretKey).toString(UTF8.Utfd) return signPlain }, getRandom(len = 5) { return parseInt(Math.random() * Math.pow(10, len)) }, getTimeStamp() { return parseInt(new Date().getTime() / 1000) }, IgnoreTransform(a, b) { if (a.toString().toLowerCase() > b.toString().toLowerCase()) { return 1 } return -1 } } export default class HSHttpClient{ // pathData:路由参数 query: 问号参数 body: body参数 constructor(url, pathData = {}, query = {}, body = '') { this.urlParams = new Map() this.realUrl = url this[_getHeaderUrl](pathData) // 处理路由参数 this.newUrl = this.getSignRequestUrl(query, body) // 处理问号参数和body参数 } [_getHeaderUrl](params) { for (let key in params.data) { params.routerUrl = params.routerUrl.replace(key, encodeURIComponent(params.data[key])) this.urlParams.set(key, params.data[key]) } if (params.routerUrl) { this.realUrl = this.realUrl + params.routerUrl + '/' } } getSignRequestUrl(paramsObj, body = '') { let returnUrl = '' let tempParamsUrl = '' if (paramsObj) { for (var key in paramsObj) { tempParamsUrl += `&${key}=${encodeURIComponent(paramsObj[key])}` this.urlParams.set(key, paramsObj[key]) } } let timestamp = signatureUtil.getTimeStamp() let nonce = signatureUtil.getRandom(5) let signaPlain = signatureUtil.makeSignPlain(this.urlParams, body, timestamp, nonce) returnUrl = `${this.realUrl}?timestamp=${timestamp}&nonce=${nonce}&signature=${signaPlain}${tempParamsUrl}` return returnUrl } }