2

スタック オーバーフロー全体を調べたところ、関連するスレッドが 2 つしか見つかりませんでしたが、問題は解決しませんでした。また、価値のあることとして、これは私がこれを機能させようとしているEstesという名前のLTLキャリアです.

私が使用しているコードは次のとおりです。



    $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;

これが私が得ている応答です: [Client] SOAP-ERROR: Encoding: object has no 'requestID' property

これに関するどんな助けも素晴らしいでしょう!

PS。私はすでにそれらを stdClass() オブジェクトに入れようとしましたが、結果はありません。また、確認したい場合は、WSDL がコードに含まれています。

EDITED: リクエストがどのように見えるべきかのダンプは次のとおりです:

<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>
4

2 に答える 2

2

これは先日も気になりました。呼び出された SoapClients によって期待されるパラメーターには、ボディ内の最も外側の XML タグを含めないrateRequestでください。この場合、これは WSDL の記述に基づいて自動的に生成されるためです。代わりに、その外側のタグで定義された各パラメーターを含む構造 (配列またはオブジェクト) を渡す必要があります。

したがって、あなたの場合、これを変更するだけです:

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

これに:

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

ちなみに、貼り付けたコードには、定義$headersしてから参照する場所にもタイプミスがあります$header。両方の変更を含むライブ デモでは、代わりに「ユーザー認証に失敗しました」と表示されます。過ち (おそらく、あなたが実際のログイン情報を私たちに教えないように賢明だったからでしょう!)

于 2013-07-25T22:27:17.533 に答える