PHP 拼 URL 参数,别手写一串 ?a=1&b=2
接口签名、搜索参数、数组筛选条件,都不建议手拼查询字符串。统一用 http_build_query(),再把编码规则和参数顺序说清楚。
业务参数 → 排序和规范化 → http_build_query() → 选择编码规则 → 发送请求或参与签名
联调第三方接口时,经常会遇到“参数看起来一样,签名就是对不上”。很多时候不是密钥错了,而是查询字符串拼法不一致:空格被编码成 + 或 %20,数组下标有没有带上,参数顺序有没有固定,都会影响结果。
接口联调现场:同一个关键词,签名串不一样

比如搜索词是“红色 鞋”,客户端拼出来是 keyword=红色+鞋,服务端文档要求的是 keyword=红色%20鞋。业务值一样,但参与签名的字符串不一样,验签就会失败。
• 默认 http_build_query() 使用 PHP_QUERY_RFC1738,空格会变成 +。
• 如果对方要求 RFC3986,就传 PHP_QUERY_RFC3986。
• 签名前先固定参数排序,别依赖数组原始顺序。
接口签名比的是字符串,不是你脑子里的参数对象。
排查时可以把“签名前原始字符串”打出来,别只打印数组。数组看着一样,最终 query 未必一样。
编码规则对比:PHP_QUERY_RFC3986 什么时候用

http_build_query() 的第四个参数可以指定编码类型。默认是 PHP_QUERY_RFC1738,空格编码为 +;用 PHP_QUERY_RFC3986 时,空格编码为 %20。
http_build_query($params, '', '&', PHP_QUERY_RFC3986);
• 支付、开放平台、OAuth 签名,经常会明确要求编码规则。
• 文档没写清楚时,用抓包对比对方示例更靠谱。
• 同一个项目里要封装统一方法,不要每处自己拼。
编码规则不统一,签名排查会非常绕。
这类问题最烦的是肉眼看参数都对,只有把原始签名串逐字符对比,才能看到差异。
数组参数:让 http_build_query() 处理嵌套结构

筛选条件里经常有数组,比如 tags、filters、价格区间。手拼很容易漏掉下标或括号,接收端解析出来结构就变了。用 http_build_query() 至少能保证规则一致。
$params = [
'tags' => ['new', 'hot'],
'filters' => ['price' => ['min' => 100]],
];
• 嵌套数组可以交给 http_build_query() 展开。
• 参与签名时,建议先按接口约定排序。
• 如果对方不支持 PHP 风格数组,要按对方规则转成重复参数或逗号字符串。
数组参数最怕半手工,规则一乱就很难对齐。
联调前最好确认数组参数格式,不要默认对方能理解 tags[0] 这种写法。
接收端解析:parse_str() 要写到结果数组里

接收回调或解析 query 时,可以用 parse_str()。更稳的写法是传第二个参数,把结果放进数组里,再从数组读取字段。这样变量来源清楚,也避免变量名到处散。
parse_str($query, $params); $page = $params['page'] ?? 1;
• 不要让解析结果变成一堆局部变量,维护时很难追。
• 解析后还要做类型和范围校验,不要直接信任 query。
• PHP 8 起,parse_str() 的结果参数已经是必填要求。
查询字符串解析完,只是输入数据,还不是业务参数。
把构建和解析都收进工具函数,后面接支付、搜索、开放平台接口时会省很多时间。真正需要盯紧的是:编码、排序、数组格式,这三个点不统一,问题就会反复冒出来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











