Aliexpress API签名算法和javascript

问题描述 投票:0回答:1

我一直在努力尝试检索正确的签名,以便用于从 Aliexpress API 获取访问令牌。 签名附加到 URL 的末尾,然后,如果签名正确,它会返回访问令牌、刷新令牌、用户凭据等。不幸的是,我无法按照“平台标准”。 我现在很困惑。

我在这段代码中所做的是调用我的

app_key
的参数、时间戳、签名方法和代码(从 URL 检索并存储在本地存储中),对它们进行排序,以便它们按字母顺序排列,将字符串与没有空格,对字符串进行编码,然后使用 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;
};
javascript cryptojs aliexpress
1个回答
0
投票

遵循以下指南:

https://openservice.aliexpress.com/doc/doc.htm?spm=a2o9m.11193531.0.0.3f5e3b532ERUwK&nodeId=27493&docId=118729#/?docId=1366

修正为:

const generateSign = (params: { [key: string]: any }, endpoint: string) => {
    // sort params in alphabetical order 
    const sortedParams = Object.keys(params)
        .sort(
            (a: string, b: string) => a > b ? 1 : -1
        )

    // create concatenated string with sorted params
    let concatenatedString = "";
    for (const key of sortedParams) {
        concatenatedString += `${key}${params[key]}`;
    }
    // concatenate the endpoint at the start
    concatenatedString = endpoint + concatenatedString;

    const appSecret = process.env.ALIEXPRESS_APP_SECRET ?? "";
    // encode the concatenated string
    const hash = CryptoJS.HmacSHA256(concatenatedString, appSecret);
    const signature = hash.toString(CryptoJS.enc.Hex).toUpperCase();

    return signature;
};
© www.soinside.com 2019 - 2024. All rights reserved.