繁体   English   中英

PHP cURL提交到WSDL SOAP环境

[英]PHP cURL submit to WSDL SOAP environment

我从来没有机会提交到WSDL SOAP Web服务,并且遇到了一些问题。 我使用PHP cURL将表单提交给已知的后端拳头,然后提交给WSDL SOAP服务。 第一部分工作正常,因此我将跳过。 我花了三天的大部分时间尝试在Web上找到的各种解决方案,并且在阅读SOAP文档后尝试了自己的解决方案,但是没有运气。

这是我用来提交到WSDL的内容

<?php
    //first cURL POST HERE - works fine
    //second cURL POST BELOW
    $FName          = $_POST['FirstName'];
    $Lname          = $_POST['LastName'];
    $Email          = $_POST['Email'];
    $Phone          = $_POST['Phone1'];
    $soapURL            = "https://something.com/IBWeb/IBDemoManager/IBDemoManager.asmx?wsdl";
    $soapUser           = "USR";
    $soapPassword       = "PWD";
    $hostname           = gethostbyaddr($_SERVER['REMOTE_ADDR']);

    $xml_post_string = '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservices.htdocs.openecry">
                          <soapenv:Header/>
                           <soapenv:Body>
                              <web:demosetup soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                                 <AccessCode xsi:type="xsd:string">G0!=@%fut40</AccessCode>
                                 <NewUserCategoryName xsi:type="xsd:string">OFLDemo</NewUserCategoryName>
                                 <TemplateUserName xsi:type="xsd:string">OFLUser</TemplateUserName>
                                 <CusType xsi:type="xsd:string">Indirect</CusType>
                                 <WLabelID xsi:type="xsd:string">276</WLabelID>
                                 <SCodeID xsi:type="xsd:string"></SCodeID>
                                 <SoftID xsi:type="xsd:string">1</SoftID>
                                 <FName xsi:type="xsd:string">'.$FName.'</FName>
                                 <LName xsi:type="xsd:string">'.$LName.'</LName>
                                 <Email xsi:type="xsd:string">'.$Email.'</Email>
                                 <Phone xsi:type="xsd:string">'.$Phone.'</Phone>
                                 <Address xsi:type="xsd:string"></Address>
                                 <City xsi:type="xsd:string"></City>
                                 <Zip xsi:type="xsd:string"></Zip>
                                 <State xsi:type="xsd:string"></State>
                                 <Country xsi:type="xsd:string"></Country>
                                 <CountryName xsi:type="xsd:string"></CountryName>
                                 <AssetTypes xsi:type="xsd:string">Futures</AssetTypes>
                                 <How xsi:type="xsd:string">OFL webservice</How>
                                 <MoreEmail xsi:type="xsd:string"></MoreEmail>
                                 <RemoteAddr xsi:type="xsd:string">'.$hostname.'</RemoteAddr>
                                 <CampaignID xsi:type="xsd:string"></CampaignID>
                              </web:demosetup>
                           </soapenv:Body>
                        </soapenv:Envelope>';

    $headers = array(
        "Content-type: text/xml;charset=\"utf-8\"",
        "Accept: text/xml",
        "Cache-Control: no-cache",
        "Pragma: no-cache",
        //IS SOAPAction the same as the endpoint "$soapURL"?//
        "SOAPAction: https://something.com/IBWeb/IBDemoManager/IBDemoManager.asmx?wsdl", 
        "Content-length: ".strlen($xml_post_string),
    );

    $url2 = $soapURL;
    $soap_do = curl_init();
      curl_setopt($soap_do, CURLOPT_URL, $url2 );
      curl_setopt($soap_do, CURLOPT_HEADER, false);
      curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 100);
      curl_setopt($soap_do, CURLOPT_TIMEOUT,        100);
      curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
      curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
      curl_setopt($soap_do, CURLOPT_POST,           true );
      curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $xml_post_string);
      curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $headers);
      if(curl_exec($soap_do) === false) {
        $err = 'Curl error: ' . curl_error($soap_do);
        curl_close($soap_do);
        print $err;
      } else {
        $result = curl_exec($soap_do);
        echo '<pre>';
        print_r($result);
        curl_close($soap_do);
        //print 'Operation completed without any errors';
      }

这里只是一些评论:

尝试禁用SSL检查(仅用于测试):

curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 0);

您应该调用curl_close($ch2); 最后。 例:

$output2 = curl_exec($ch2); 

if(curl_errno($ch2))
    echo curl_error($ch2);
} else {
    echo $output2;
}

curl_close($ch2); // <--- close here

您也可以尝试Zend SOAP库

如果您不喜欢CURL,请尝试Guzzle发出HTTP请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM