JS对接网关指南

359 阅读1分钟

在项目接口调用处进行请求拦截,统一加上请求头 G-Sign-V1

调用方式:

import { getGSign } from './gateSign.js'
service.interceptors.request.use(
  config => {
    config.headers['G-Sign-V1'] = getGSign()
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

加密gateSign.js如下:

const CryptoJS = require('crypto-js')

const encryptKey = 'eNgWuwpQ84MZVTQbmdtHWTEwYXFibzDNXPSMP+B5VsA=' // 秘钥
const encryptIv = 'tFxRc2Ukj13a7Pj93WQI6w==' // 秘钥

export function argEncryptByDES() {
  if (!localStorage.getItem('name')) {
    return ''
  }
  var time = parseInt(new Date().getTime() / 1000)
  var salt = Math.round(Math.random() * 1000000).toString()
  var version = '1.0.36.0'
  var username = localStorage.getItem('name')
  var appCode = 'shopify'
  const token = getGateToken(salt, time, version, username, appCode)
  // console.log(token, 'token')
  const param = {
    time: time,
    salt: salt,
    token: token,
    appCode: appCode,
    version: version,
    username: username
  }
  const str = JSON.stringify(param)
  const gateKey = encryptKey
  const gateIv = encryptIv
  const encStr = getAesString(str, gateKey, gateIv)
  const sign = getAES(encStr, gateKey, gateIv)
  return sign
}

function getAesString(data, key, iv) {
  var encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Base64.parse(key), { iv: CryptoJS.enc.Base64.parse(iv) })
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}

function getAES(data, key, iv) {
  const macStr = iv + data + ''
  const macHash = CryptoJS.HmacSHA256(macStr, CryptoJS.enc.Base64.parse(key))
  const mac = CryptoJS.enc.Hex.stringify(macHash)
  const json = {
    iv: iv,
    value: data,
    mac: mac
  }
  const jsonStr = JSON.stringify(json)
  var sendStr = btoa(jsonStr)
  return sendStr
}

export function getRandom(num) {
  return Math.floor((Math.random() + Math.floor(Math.random() * 9 + 1)) * Math.pow(10, num - 1))
}

export function getGateToken(salt, time, version, username, appCode) {
  const str = salt.toString() + time.toString() + salt.toString() + username.toString() + version.toString() + appCode.toString() + ''
  return encryptMD5(encryptMD5(str))
}

export function encryptMD5(text) {
  const val = CryptoJS.MD5(text).toString().toLowerCase()
  return val
}

export function aesDecrypt(ciphertext, key, iv) {
  var newKey = CryptoJS.enc.Latin1.parse(atob(key))
  var newIv = CryptoJS.enc.Latin1.parse(atob(iv))
  const decoded = CryptoJS.AES.decrypt(ciphertext, newKey, {
    iv: newIv,
    mode: CryptoJS.mode.CBC,
    adding: CryptoJS.pad.ZeroPadding
  }).toString(CryptoJS.enc.Utf8)
  // console.log('decoded', decoded)
  return decoded
}