You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:45:09