PHP 使用cURL模拟POST请求 参数中含有多维数组

西门桃桃 2020-07-28 PM 107℃ 0条

这是我原来用于模拟POST请求的方法:

public function post_para($url,$para) {
    $postdata = http_build_query($para);
    $opts = array('http' => array( 'method'  => 'POST','header'  => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata));
    $context = stream_context_create($opts);
    $result = file_get_contents($url, false, $context);
    print_r($result);
}

结果使用 https 协议时PHP函数file_get_contents()报错:SSL operation failed

原因:

服务器未正确配置好https证书

解决方案:

方案一:

下载https证书到服务器

服务器 下载这个证书,http://curl.haxx.se/ca/cacert.pem
php.ini 配置
openssl.cafile = "/etc/ssl/certs/cacert.pem"//你实际下载证书的路径
重启 php 即可

方案二:

使用cURL 函数处理 https 的参数,获取文件内容

public function post_para_curl($url, $data = null){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)){
        curl_setopt($curl, CURLOPT_POST, 1);
        //这里要使用http_build_query($data),才可以传多维数组
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
}

方案三:

使file_get_contents()函数跳过https验证

$stream_opts = [
    "ssl" => [
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ]
]; 

$response = file_get_contents("https://xxx.xxx.xxx",false, stream_context_create($stream_opts));

我使用的是第二种cURL的方法,顺便推荐一个可以在线调试PHP代码的网站:PHP代码在线调试

标签: PHP, cURL

非特殊说明,本博所有文章均为博主原创。

评论啦~