php
  • web-services
  • soap
  • wsdl
  • 2013-07-25 124 views 1 likes 
    1

    我看遍了所有堆栈溢出,只发现了几个相关的线程,但他们没有解决我的问题。此外,对于它的价值,这是一个名为Estes的LTL运输公司,我正试图让这个工作通过。肥皂web服务不工作(PHP)

    下面是我使用的代码:

    
    
        $url = "http://www.estes-express.com/rating/ratequote/services/RateQuoteService?wsdl"; 
        $username = 'un'; 
        $password = 'pw'; 
    
        $client = new SoapClient($url); 
    
        //Prepare SoapHeader parameters 
        $cred = array( 
         'user'  => $username, 
         'password' => $password 
        ); 
    
        $headers = new SoapHeader('http://ws.estesexpress.com/ratequote', 'auth', $cred); 
        $client->__setSoapHeaders($header); 
    
        $params = array( 
         "requestID"   => "20131724", 
         "account"   => "9252066", 
         "originPoint"  => array('countryCode' => 'US', 'postalCode' => "43537"), 
         "destinationPoint" => array('countryCode' => 'US', 'postalCode' => "43460"), 
         "payor"    => 'S', 
         "terms"    => 'PPD', 
         "stackable"   => 'N', 
         "baseCommodities" => array('commodity' => array('class' => "55", 'weight' => "500")) 
        ); 
    
        $return = $client->getQuote(array("rateRequest"=>$params)); 
    
        return $return; 
    
    

    这是我得到的回应: [客户] SOAP的错误:编码:对象有没有 '请求ID' 属性

    任何帮助,这将是伟大的!

    PS。我已经尝试将它们放入stdClass()对象中,但没有结果。另外,如果你想检查它们,他们的WSDL在代码中。

    编辑: 这里的要求应该是什么样子的转储:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rat="http://ws.estesexpress.com/ratequote" xmlns:rat1="http://ws.estesexpress.com/schema/2012/12/ratequote"> 
        <soapenv:Header> 
         <rat:auth> 
         <rat:user>xxxxx</rat:user> 
         <rat:password>xxxxxx</rat:password> 
         </rat:auth> 
        </soapenv:Header> 
        <soapenv:Body> 
         <rat1:rateRequest> 
         <rat1:requestID>20131724</rat1:requestID> 
         <rat1:account>9252066</rat1:account> 
         <rat1:originPoint> 
          <rat1:countryCode>US</rat1:countryCode> 
          <rat1:postalCode>43537</rat1:postalCode> 
          <!--Optional:--> 
          <rat1:city>Maumee</rat1:city> 
          <!--Optional:--> 
          <rat1:stateProvince>OH</rat1:stateProvince> 
         </rat1:originPoint> 
         <rat1:destinationPoint> 
          <rat1:countryCode>US</rat1:countryCode> 
          <rat1:postalCode>23237</rat1:postalCode> 
          <rat1:stateProvince>VA</rat1:stateProvince> 
         </rat1:destinationPoint> 
         <rat1:payor>S</rat1:payor> 
         <rat1:terms>PPD</rat1:terms> 
         <rat1:stackable>N</rat1:stackable> 
         <rat1:baseCommodities> 
          <!--1 to 99 repetitions:--> 
          <rat1:commodity> 
           <rat1:class>50</rat1:class> 
           <rat1:weight>100</rat1:weight> 
          </rat1:commodity> 
         </rat1:baseCommodities> 
         </rat1:rateRequest> 
        </soapenv:Body> 
    </soapenv:Envelope> 
    
    +0

    看起来你的'getQuote'函数有什么问题似乎完全明显。你能得到你所有的params/header的转储并分享这些吗? –

    +0

    您是否检查此帖:http://stackoverflow.com/questions/7269268/soap-error-encoding-object-has-no-recordid-property –

    +0

    Anup,不幸的是,它并没有解决问题。 itcouldevenbeaboat我在我的问题中编辑了我的值,以显示实际值并添加了一个请求示例。 –

    回答

    1

    这抓住了我出来那天,太:由称为SoapClients应该包括预期中的参数正文中最外面的XML标签,在本例中为rateRequest,因为它是根据WSDL中的描述自动生成的。相反,您需要传递一个包含中的每个参数()外部标记的结构(数组或对象)。

    所以你的情况,你只需要更改此设置:

    $return = $client->getQuote(array("rateRequest"=>$params)); 
    

    这样:

    $return = $client->getQuote($params); 
    

    另外,作为粘贴也是你的代码中有你定义$headers但随后引用一个错字$header。 A live demo with both changes反而显示“用户身份验证失败。”错误(大概是因为你明智不能给我们你真正的登录细节!)

    +0

    谢谢一堆IMSoP!这正是问题所在,他们碰巧在WS上给了我一个soapFault“一般错误”的权重上限;)。 –

    0

    如果有人仍然有这个问题,为了得到这个工作,我不得不将$ params变成一个对象或否则我会收到一个错误,“对象属性不存在”

    $params = new stdClass(); 
    $params->requestID = "20131724"; 
    $params->account = "123456"; 
    $params->originPoint = array('countryCode' => 'US', 'postalCode' => "43537"); 
    $params->destinationPoint = array('countryCode' => 'US', 'postalCode' => "43460"); 
    $params->payor = "S"; 
    $params->terms = "PPD"; 
    $params->stackable = "N"; 
    $params->baseCommodities = array('commodity' => array('class' => "55", 'weight' => "100")); 
    
    $return = $client->getQuote($params); 
    
    相关问题