hejianhao
2026-03-25 820f6b98d2afe5c7d7d125e755e1ac1a1e615832
fix: 修复GET请求签名生成逻辑

GET请求的签名生成中content参数未正确排序和拼接,导致与服务器端签名校验失败。新增sortAndJoinObj函数专门处理对象排序和拼接,并在GET请求分支中使用该函数确保签名一致性。
1个文件已修改
17 ■■■■■ 已修改文件
src/utils/tools.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/tools.ts
@@ -93,6 +93,15 @@
  return `${date}_${r}`
}
// 对象排序并且排序后使用&连接
export function sortAndJoinObj(obj: Record<string, any> = {}): string {
  if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return '';
  return Object.keys(obj)
    .sort()
    .map(key => `${key}=${obj[key]}`)
    .join('&');
}
/**
 * 定义对象排序方法
 */
@@ -114,7 +123,6 @@
export function makeSign(method, params, content, secret = _XP_SECRET) {
  let sign = '';
  let parm = '';
  params = objectSort(params);
  for (const i in params) {
    const j = params[i];
@@ -126,7 +134,12 @@
  if (content && String(content) !== '{}') {
    content_MD5 = MD5.hex(JSON.stringify(objectSort(content, { keyUpperCase: false }))); // content 也要排序,避免中间平台的干扰,例如 小红书 iOS 端发送的请求顺序就和我们传入的不一致
  }
  const ass = `${method}&${parm}&${content_MD5}`;
  let ass = ''
  if (method == 'POST') {
    ass = `${method}&${parm}&${content_MD5}`;
  } else {
    ass = `${method}&${parm}&${content && Object.keys(content).length > 0 ? sortAndJoinObj(content) + '&' : ''}`;
  }
  const afterUtf8 = utf8Encode(ass);
  // const third = crypto.createHmac('sha256', secret).update(afterUtf8).digest('hex');
  // console.log('crypto---------------------------');