php curl post

问题描述

需要向xx网站提交一个数据,但是java和python那边都成功了,而php不行

问题出现的环境背景及自己尝试过哪些方法

步骤就俩,1 curl get获得token 2 组装数据,提交post,问题出现在第二步上,返回值为空

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)


header("content-type:text/html;charset=utf8");
//复用
$ch = curl_init();
function request($url,$post='',$headers)
{
    global $ch;
    //$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     if($post) {
         curl_setopt($ch, CURLOPT_POST, 1);
         curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
     }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    if($post){
        $data = curl_exec($ch);
        curl_close($ch);
            return $data;
    }
        return curl_exec($ch);
}

$mcId = "mobi02-cdwl-s226";
#获取token
$url = "https://e.pingan.com/pa18shoplife/details/out/ob/qnyc-jynj/quote.jsp";
$headers = array('user-agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36');

$file = request($url,'',$headers);
$from = '<input type="hidden" id="tokenData" name="tokenData" value="';
$end = '">';
$message=explode($from,$file);
$message=explode($end,$message[1]);
$token =  $message[0];

#伪造请求
$url = "https://e.pingan.com/pa18shoplife/engine.ajax?flowId=&reqId=_details_out_ob_qnyc-jynj_quote_jsp_quoteReq4&WT.mc_id=mobi02-cdwl-s226-xqb";
$body = "{\"reflowId\": \"\", \"lifeDatas\": {\"mediaSource\": \"mobi02-cdwl-s226-xqb\", \"tbhuomian\": \"0\", \"yiliaobxj\": \"0\", \"jibingbx\": \"0\", \"jibingSums\": \"0\"}, \"createFlow\": \"true\", \"policyExtendDTO\": {\"businessLine\": \"ob\"}, \"pid\": \"8000002081\", \"appPlanDTO\": [{\"payPeriod\": \"10\", \"sumIns\": \"100000\"}], \"tokenData\": \"". $token . "\", \"insurantDTO\": [{\"birth\": \"2016-04-22\", \"sex\": \"M\"}], \"policyDTO\": {\"paymentType\": \"2\"}, \"insurerDTO\": {\"mobile\": \"15890312027\"}}";
$headers = array('X-Custom-header:stuff','content-type:application/json');
$result = request($url,$body,$headers);
print_r($result);exit();

以下为java请求成功的代码:

    private static void fluent() {
    try {
        String res = Request.Get("https://e.pingan.com/pa18shoplife/details/out/ob/qnyc-jynj/quote.jsp")
                .addHeader("user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36")
                .execute().returnContent().asString();

        JXDocument document = JXDocument.create(Jsoup.parse(res));
        List<JXNode> list = document.selN("//*[@id=\"tokenData\"]");



        String url = "https://e.pingan.com/pa18shoplife/engine.ajax?flowId=&reqId=_details_out_ob_qnyc-jynj_quote_jsp_quoteReq4&WT.mc_id=mobi02-cdwl-s226-xqb";
        String bodys = "{\"reflowId\": \"\", \"lifeDatas\": {\"mediaSource\": \"mobi02-cdwl-s226-xqb\", \"tbhuomian\": \"0\", \"yiliaobxj\": \"0\", \"jibingbx\": \"0\", \"jibingSums\": \"0\"}, \"createFlow\": \"true\", \"policyExtendDTO\": {\"businessLine\": \"ob\"}, \"pid\": \"8000002081\", \"appPlanDTO\": [{\"payPeriod\": \"10\", \"sumIns\": \"100000\"}], \"tokenData\": \""
                + list.get(0).asElement().attr("value") + "\", \"insurantDTO\": [{\"birth\": \"2016-04-22\", \"sex\": \"M\"}], \"policyDTO\": {\"paymentType\": \"2\"}, \"insurerDTO\": {\"mobile\": \"15890312027\"}}";


        StringEntity stringEntity = new StringEntity(bodys, "utf-8");
        String res2 = Request.Post(url)
                .addHeader("X-Custom-header", "stuff")
                .addHeader("content-type", "application/json")
                .version(HttpVersion.HTTP_1_1)
                .bodyString("Important stuff", ContentType.DEFAULT_TEXT)
                .body(stringEntity)
                .execute().returnContent().asString();

        System.out.println("DD" + res2);
    } catch (Exception e) {
        e.printStackTrace();
    }

}




你期待的结果是什么?实际看到的错误信息又是什么?

个人对java不太了解,有没有大佬能看出php部分是有什么问题的

阅读 2.6k
4 个回答

clipboard.png
php 配置下这两个头试下

新手上路,请多包涵

你第二个url第一个参数缺失

https的接口好像 也要特殊配置下。

你试试这个呢?

 function  curl($url,$data,$method,$setcooke=false,$cookie_file=false){
        $ch = curl_init();   //1.初始化
        curl_setopt($ch, CURLOPT_URL, $url); //2.请求地址
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);//3.请求方式
        //4.参数如下
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        //伪装请求来源,绕过防盗
        curl_setopt($ch,CURLOPT_REFERER,"自行填写");
        curl_setopt($ch, CURLOPT_TIMEOUT,30);
        //配置curl解压缩
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Encoding:gzip'));
        curl_setopt($ch, CURLOPT_ENCODING, "gzip");
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0'); //指明以哪种方式进行访问
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        if($method=="POST"){//5.post方式的时候添加数据
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        if($setcooke==true){
            //如果设置要请求的cookie,那么把cookie值保存在指定的文件中
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
        }else{
            //就从文件中读取cookie的信息
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $tmpInfo = curl_exec($ch);

        if (curl_errno($ch)) {
            return curl_error($ch);
        }
        curl_close($ch);
        return $tmpInfo;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题