Postman需手动对Query参数字典序排序以确保签名正确,Pre-request Script中用pm.request.url.query.all().sort()实现;x-www-form-urlencoded参数需过滤空值及sign后按key排序拼接。

Postman 本身不自动对 Query 参数排序,但很多签名接口(尤其是涉及 sign 计算的)要求参数必须按字母序或 ASCII 序排列,否则后端验签失败。你不能依赖“看起来顺序对了”,得用脚本固化规则。
Pre-request Script 中对 Query 参数做字典序排序
这是最常用、也最可靠的排序方式,适用于 GET 请求的 params 或 POST 请求中以 application/x-www-form-urlencoded 形式提交的参数。
- Postman 的
pm.request.url.query.all()返回的是一个对象数组,每个元素形如{key: "a", value: "1"} - 直接对这个数组调用
.sort()即可按key字典序升序排列 - 排序后必须重新赋值给
pm.request.url.query,否则无效 - 注意:不要在排序前删除
sign—— 如果它已在 Params 列表里,排序时会包含它;但签名计算逻辑里通常要跳过它,这是两回事
const params = pm.request.url.query.all(); params.sort((a, b) => a.key.localeCompare(b.key)); pm.request.url.query = params;
POST 请求 Body 参数排序(x-www-form-urlencoded 场景)
当请求体是 form-data 或 x-www-form-urlencoded 时,request.data 是一个键值对对象(不是数组),需先转成可排序结构。
Postman Mac版是一款专为macOS设计的API开发与测试工具,凭借简洁的界面和强大的功能,深受开发者喜爱。它支持发送各种HTTP请求(GET、POST、PUT等),轻松管理接口集合、环境变量和模拟服务器。Mac用户可享受原生性能、快捷键优化及与系统无缝集成的体验,适用于接口调试、自动化测试和文档生成。无论是个人项目还是团队协作,Postman for Mac都能提升API开发效率,是ma
-
request.data是 Postman 内部对象,类型为Object,不能直接.sort() - 推荐用
Object.keys().sort()获取排序后的 key 数组,再遍历拼接 - 若参数含中文,确保前后端都用 UTF-8 编码,否则
localeCompare可能行为不一致 - 空值参数(
""或undefined)需显式过滤,否则会影响签名结果
const data = pm.request.body.urlencoded;
const keys = Object.keys(data).filter(k => data[k] !== "" && k !== "sign").sort();
let str = "";
for (let i = 0; i < keys.length; i++) {
const k = keys[i];
str += `${k}=${data[k]}&`;
}
str = str.slice(0, -1); // 去掉末尾 &
pm.environment.set("sortedBodyStr", str);
签名场景下排序 + 拼接 + MD5 的典型漏点
排序只是第一步,真正导致 sign 校验失败的,往往是后续环节的隐性差异。
- 拼接时是否保留原始参数值?比如
value="a+b",后端收到的是a+b还是a%2Bb?签名应基于 URL 解码后的原始值(即decodeURIComponent后),而非编码后字符串 - 密钥是拼在拼接串**末尾**还是**开头**?文档写错一个字,整个签名就废
-
CryptoJS.MD5()返回的是大写哈希,而多数接口要求小写,记得加.toLowerCase() - 环境变量里的密钥如果带空格或换行(比如从邮件复制来的),
.trim()必须加 - 时间戳字段(如
timestamp)如果每次请求都要更新,得在排序前注入,否则排序后插入会导致顺序错乱
最易被忽略的是:参数名和参数值的编码一致性。Postman 发送时会自动 URL encode,但签名计算时若没 decode 就拼,或 decode 了两次,都会让哈希值错位。建议签名前统一用 decodeURIComponent 处理所有值,再拼接、再加密。
















