美文网首页
PHP http_build_query 转换数组参数中含特殊符

PHP http_build_query 转换数组参数中含特殊符

作者: HongXunPan | 来源:发表于2020-06-29 19:52 被阅读0次

背景

工作中经常需要对接第三方系统,经常遇到 curl 参数报错异常的问题。

curl post 传递参数

$url = 'xxx.kangxuanpeng.com/xx/server';
$data = ['param' => 'test'];

$ch = curl_init($url);
$head_array = array('application/x-www-form-urlencoded');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($req_array));
curl_setopt($ch, CURLOPT_HTTPHEADER, $head_array);
$response = curl_exec($ch);

参数经过 http_build_query() 转换成 key 对应 value 值的绑定发送到第三方,问题就在于 http_build_query() 进行的符号加密。

问题定位

如果参数无特殊符号, http_build_query()正常加密:

$param = ['param' => 'test', 'blog' => 'HongXunPan'];

echo http_build_query($param);
//param=test&blog=HongXunPan

但是如果参数中有特殊参数的话,就不一样了:

$param = ['param' => 'test','blog' => 'HongXunPan', 'url' => 'https://blog.kangxuanpeng.com/','time' => '2020-06-18 22:00:00'];

echo http_build_query($param);
//param=test&blog=HongXunPan&url=https%3A%2F%2Fblog.kangxuanpeng.com%2F&time=2020-06-18+22%3A00%3A00

然而恰好是对 / 符号的转换,第三方系统无法识别。

解决方法

问题找到了就很好定位了,只需要自己实现一个方法手动进行拼接即可。

function transferArrayToSignString($req_array)
{
    $str = '';
    foreach ($req_array as $key => $value) {
        if ($str != '') {
            $str .= '&';
        }
        $str .= $key.'='.$value;
    }
    return $str;
}

大功告成:

$param = ['param' => 'test','blog' => 'HongXunPan', 'url' => 'https://blog.kangxuanpeng.com/','time' => '2020-06-18 22:00:00'];

echo http_build_query($param);
//param=test&blog=HongXunPan&url=https%3A%2F%2Fblog.kangxuanpeng.com%2F&time=2020-06-18+22%3A00%3A00
echo transferArrayToSignString($param);
//param=test&blog=HongXunPan&url=https://blog.kangxuanpeng.com/&time=2020-06-18 22:00:00

相关文章

  • PHP http_build_query 转换数组参数中含特殊符

    背景 工作中经常需要对接第三方系统,经常遇到 curl 参数报错异常的问题。 curl post 传递参数 参数经...

  • http_build_query

    PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)...

  • php http_build_query() 函数参数值是url

    http_build_query http_build_query() 函数可以将数组转换成 URL-encode...

  • es6三个点...

    ... 展开运算符 (作用:数组与参数的相互转换) 用于函数调用 1.将数组转为参数function filter...

  • PHP冷知识

    http_build_query use:将数组转化成url参数 $_SERVER["REQUEST_TIME_F...

  • http_build_query用法

    http_build_query (PHP 5) http_build_query -- 生成 url-encod...

  • ES6语法——数组Array扩展

    一、 扩展运算符 扩展运算符(spread)是三个点(...)。它好比 rest 参数(将多余的参数转换成数组)的...

  • ES6知识点总结(一)

    扩展运算符 概念:将数组或对象转换成参数序列,使用逗号分隔的序列。作用:1、数组、对象的合并;2、函数剩余参数;3...

  • ES6必知必会 (三)—— 数组和对象的拓展

    数组的扩展 1.拓展运算符('...'),它相当于rest参数的逆运算,用于将一个数组转换为用逗号分隔的参数序列;...

  • es6扩展运算符

    简介 扩展运算符,三个点(...)表示。 可以将数组拆分成以逗号分隔的参数序列 应用 数组合并 伪数组转换为真正的...

网友评论

      本文标题:PHP http_build_query 转换数组参数中含特殊符

      本文链接:https://www.haomeiwen.com/subject/tvpafktx.html