利用 http_build_query 字符串拼接生成签名注意事项

在与第三方 api 对接时,我们经常会遇到将传参按照键名进行 ASCII 升序排序,然后 构建 key=value 格式的字符串,并用 & 连接,最终将得到的字符串进行 md5 加密得到签名。

遇到这种场景 在 PHP 语言中我么一般会使用 http_build_query 将传参转换为字符串,但这里有一个点要注意:

http_build_query 生成的是 URL-encode 之后的请求字符串,在 md5 之前要进行 urldecode 操作。除非第三方特殊说明就是要使用 urlencode 形式。

实例代码如下:

/**
* 生成 md5 签名
*/
public function getSign($requestData, $accessKeySecret): string
{
    // 按照键名进行 ASCII 升序排序
    ksort($requestData);
    // 构建 key=value 格式的字符串,并用 & 连接
    $paramString = http_build_query($requestData, '', '&');
    $paramString = urldecode($paramString);
    $signSource = $accessKeySecret . time() . $paramString;
    return md5($signSource);
}