在与第三方 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);
}