要进行接口入参的MD5加密,您可以按照以下步骤进行操作:
- 将需要加密的参数按照指定的格式拼接起来,例如使用 "&" 作为分隔符。
- 对拼接后的字符串进行MD5加密,可以使用JavaScript的
md5()函数或者其他语言的MD5加密库。 - 将加密后的字符串作为接口请求的参数传递给后端,例如将其放在HTTP请求的查询参数中。
定义了一个函数isJSONString,用于判断一个值是否为JSON字符串。
可根据后台验签规则使用
const isJSONString = value => typeof value === 'string' && value.startsWith('{')
定义了一个函数filterParams,用于过滤掉参数中的pageNum和pageSize字段,并返回过滤后的参数对象
可以过滤掉不参与验签的参数值,可与后台沟通验签规则使用
const filterParams = params => {
const filteredParams = {}
for (const key in params) {
if (params.hasOwnProperty(key) && key !== 'pageNum' && key !== 'pageSize') {
filteredParams[key] = params[key]
}
}
return filteredParams
}
定义了一个函数sortObject,用于对对象进行排序,并返回排序后的对象
加密的参数需要先进行排序
const sortObject = obj => {
//对象排序封装
const sortedKeys = Object.keys(obj).sort()
const sortedObj = {}
for (const key of sortedKeys) {
sortedObj[key] = obj[key]
}
return sortedObj
}
定义了一个函数encryptParams,用于对参数进行加密。
- 在encryptParams函数中,首先调用filterParams函数过滤掉参数中的pageNum和pageSize字段。
- 然后获取参数对象的所有键,并对键进行排序。
- 创建一个空对象encodedParams,用于存储加密后的参数。
- 遍历排序后的键,获取对应的值。
- 判断值是否为空,如果不为空则进行进一步处理。
- 如果值为对象或JSON字符串,则进行相应的处理,如对值进行排序或解析(后台为int类型,默认所有参数不加双引号或者单引号,所以前端做了处理,去掉引号,保持统一)。
- 将处理后的值存储到encodedParams对象中。
- 根据encodedParams对象生成参数字符串paramString,其中每个键值对都进行了URL编码。
- 将config.lbsSignkey也加入到paramString中。
- 使用md5算法对paramString进行加密,并使用base64算法进行编码。
- 返回加密后的签名sign和参数字符串paramString
const encryptParams = parameters => {
parameters = filterParams(parameters)
const sortedKeys = Object.keys(parameters).sort()
const encodedParams = {}
for (const key of sortedKeys) {
const value = parameters[key]
if ((value !== null && value !== undefined && value !== '' && value.length !== 0 && value !== {}) || value === 0) {
if (typeof value === 'object' || (isJSONString(value) && typeof value !== 'number')) {
if (isJSONString(value)) {
value = JSON.parse(value)
} else {
value = sortObject(value)
}
value = `${JSON.stringify(value)}`.replace(/["']/g, '')
}
encodedParams[key] = value
}
}
const paramString =
Object.entries(encodedParams)
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
.join('&') + `&key=${encodeURIComponent(config.lbsSignkey)}`
const sign = md5Libs.base64(md5Libs.md5(paramString)).toUpperCase()
return {sign,paramString}
}
总结:验签过程需前后端一起及时沟通联调,避免前后对应不上,如有错误或者改进地方欢迎大家留言,谢谢!