Aliexpress API签名算法JavaScript实现:无法生成合规签名
无法生成符合Aliexpress API规范的签名(获取Access Token场景)
我正在尝试生成Aliexpress API的合法签名以获取Access Token,正确签名应能让接口返回Access Token、Refresh Token及用户凭证,但目前生成的签名始终不符合平台标准。
按文档步骤操作:获取app_key、timestamp、sign_method,以及存在localStorage中的code参数;将参数按字母顺序排序后拼接成无空格字符串,编码后用CryptoJS以app_secret为密钥生成签名,但结果与文档示例不符:
- 文档示例签名:
D13F2A03BE94D9AAE9F933FFA7B13E0A5AD84A3DAEBC62A458A3C382EC2E91EC - 我生成的签名:
FA09CDF0AA01015E5CF20B05234D25BA00203952EA00D86EEDA7A199D3483725
我的实现代码:
const generateSign = () => { const code = localStorage.getItem("authCode"); const params = { app_key: appKey, timestamp: timestamp, sign_method: sign_method, code: code, }; console.log(params); const sortedParams = Object.keys(params) .sort() .reduce((acc, key) => { acc[key] = params[key]; return acc; }, {}); console.log(sortedParams); let concatenatedString = ""; for (const key in sortedParams) { concatenatedString += `${key}${sortedParams[key]}`; } const apiName = "/auth/token/security/create"; concatenatedString = apiName + concatenatedString; console.log(concatenatedString); const encodedString = encodeURIComponent(concatenatedString); console.log(encodedString); const hash = CryptoJS.HmacSHA256(encodedString, appSecret); console.log(hash); const signature = hash.toString(CryptoJS.enc.Hex).toUpperCase(); console.log(signature); return signature; };
问题排查与修正方案
1. 核心错误:不必要的URL编码
Aliexpress API要求直接对原始UTF-8字符串进行HMAC-SHA256签名,不需要使用encodeURIComponent编码。你当前的编码操作会改变字符串的原始字节内容,导致哈希结果完全偏离预期。
2. API路径拼接位置可能错误
部分API规范要求将API路径拼接在参数字符串的末尾而非开头,需核对Aliexpress文档中签名生成的具体步骤,调整拼接顺序。
3. 参数排序与拼接优化
当前排序逻辑没问题,但可以简化拼接过程,避免冗余的对象转换:直接对排序后的参数名数组进行映射拼接即可。
修正后的代码
const generateSign = () => { const code = localStorage.getItem("authCode"); const params = { app_key: appKey, timestamp: timestamp, sign_method: sign_method, code: code, }; // 按参数名ASCII升序排序 const sortedKeys = Object.keys(params).sort(); // 拼接成key+value的无分隔符字符串 let concatenatedString = sortedKeys.map(key => `${key}${params[key]}`).join(''); // 按文档要求调整API路径的拼接位置,此处假设需放在末尾 const apiName = "/auth/token/security/create"; concatenatedString += apiName; // 直接使用原始字符串生成签名,无需编码 const hash = CryptoJS.HmacSHA256(concatenatedString, appSecret); const signature = hash.toString(CryptoJS.enc.Hex).toUpperCase(); console.log(signature); return signature; };
额外验证要点
- 确保
timestamp格式完全符合文档要求(如UTC时区、yyyy-MM-dd HH:mm:ss格式,无多余字符) - 确认
sign_method的值与文档一致(通常为hmac_sha256,注意大小写) - 检查
appSecret是否正确,无空格、换行符或拼写错误 - 用文档提供的示例参数代入代码,验证是否能生成示例签名,以此排查参数本身的问题
内容的提问来源于stack exchange,提问作者Matt Rowley
相关产品推荐
相关产品推荐

