PHP-curl模拟POST请求、微信公众号上传素材文件

2021-03-22 21:24 阅读:2126
    /**
     * 模拟post请求
     * @param string $url 请求地址
     * @param string|array $data 请求数据
     * @param bool $decode 是否decode返回数据
     * @param array $header
     * @param bool $ssl 是否开启ssl
     * @return bool|mixed
     */
    public static function _requestPost($url, $data, $decode = true, $header = [], $ssl = true)
    {
        $hadFile = false;
        //curl完成
        $curl = curl_init();
        //设置curl选项,可用于上传公众号素材
        if (is_array($data) && isset($data['media'])){
            $value = $data['media'];
            if (class_exists('\CURLFile')) {
                curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
                $data['media'] = new CURLFile(realpath(ltrim($value, '@')));
                $hadFile = true;
            } elseif (defined('CURLOPT_SAFE_UPLOAD')) {
                curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false);
                $hadFile = true;
            }
        }
        if (!$hadFile && is_array($data)) $data = json_encode($data,JSON_UNESCAPED_UNICODE);

        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_URL, $url);//URL
        $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';
        curl_setopt($curl, CURLOPT_USERAGENT, $user_agent);//user_agent,请求代理信息
        curl_setopt($curl, CURLOPT_AUTOREFERER, true);//referer头,请求来源
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间
        //SSL相关
        if ($ssl) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//禁用后cURL将终止从服务端进行验证
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//检查服务器SSL证书中是否存在一个公用名(common name)。
        }
        // 处理post相关选项
        curl_setopt($curl, CURLOPT_POST, true);// 是否为POST请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);// 处理请求数据
        // 处理响应结果
        curl_setopt($curl, CURLOPT_HEADER, false);//是否处理响应头
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//curl_exec()是否返回响应结果
        // 发出请求
        $response = curl_exec($curl);
        if (false === $response) {
            echo '<br>', curl_error($curl), '<br>';
            return false;
        }
        curl_close($curl);
        $forms = stripslashes(html_entity_decode($response));
        if ($decode) $forms = json_decode($forms, TRUE);
        return $forms;
    }

参数解读:

参数名类型描述必填可选值
$urlstring请求地址网络请求地址
$datastring|array请求数据请求数据
$decodebool是否返回格式化后的数据false
$headerarray自定义header内容数组
$sslbool是否开启sslfalse

使用示例:

public function test()
{
       $ext_url = 'api地址';
       $param = array(
            'expire_seconds' => 3600,
        );
        $result = ClassName::_requestPost($ext_url, $param);
}

文中的ClassName请替换为自己的文件类名

示例只有一个,其他的请自行实验

{{commentTotal}} 条评论

{{item.nickname}}
{{item.create_date}}
{{item.content}}
- 上拉或点击加载更多 -
- 加载中 -
- 没有更多了 -
- 本文链接 -