签名 sig 计算流程
1. 业务方首先确定待签名参数以及私钥。
2. 业务方将待签名参数进行计算(注意一定要在后台进行计算,避免私钥泄露)
后台计算示例代码
const crypto = require('crypto')const urlencode = require('urlencode')// ************************************// params 为请求加密参数// key 为加密密钥,比如:secretKey// ************************************function sigCode(params: any, key: string) {try {let queryDataTmp = Object.assign({}, params)delete queryDataTmp.sigdelete queryDataTmp.host// 第一步:将所有参数按key进行字典升序排列let paramtmp = Object.keys(queryDataTmp).sort()let parmaSort = ''// 第二步:将重新排序后的参数(key=value)用&拼接起来,得到源串for (const item of paramtmp) {// 对象和数组进行字符串化let itemValue = queryDataTmp[item]let changeType = ['object', 'array']if (changeType.indexOf(typeof itemValue) >= 0) {itemValue = JSON.stringify(itemValue)}parmaSort = parmaSort + item + '=' + itemValue + '&'}parmaSort = urlencode(parmaSort.substr(0, parmaSort.length - 1))// 第三步:使用HMAC-SHA256加密算法,通过密钥(secretKey或appkey)对源串加密const sig = crypto.createHmac('sha256', key).update(parmaSort)return sig.digest('hex')} catch (error) {console.log('codeSig error:', error)return false}}
签名 sig 计算示例过程
请求参数:
{"id": "611f6b5b01af259c18954808","secretId": "ca355ab0019211ecaed0ed79aa4a58cf","users": [{"name": "javinz", "age": 18}],}
排序并且字符串格式化后得到(用&连接每一个参数):
id=611f6b5b01af259c18954808&secretId=ca355ab0019211ecaed0ed79aa4a58cf&users=[{"name":"javinz","age":18}]
urlencode 编码后得到:
id%3D611f6b5b01af259c18954808%26secretId%3Dca355ab0019211ecaed0ed79aa4a58cf%26users%3D%5B%7B%22name%22%3A%22javinz%22%2C%22age%22%3A18%7D%5D
假设加密密钥 key 为:taidc,那么最后得到的 sig 为:
1c55d09921cad5a44de7cc983fe3de4e8ef6d7f98fd054b5335d729eb9ee3534
注意:
您通过哪些参数获得的 sig,在使用 sig 时应传入相同的参数,例如您通过 id、secretId 参数得到了 sig,那么在请求“https://zhihui.qq.com/account/api/auth/token”等接口使用 sig 时也应只传入 id、secretId 参数,不可以多或少传入参数。