3

この wsdlから SoapUI によって生成されたこの xml があります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:safetypay:mws:api:messages">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:CommunicationTestRequest>
         <urn:ApiKey>?</urn:ApiKey>
         <urn:RequestDateTime>?</urn:RequestDateTime>
         <urn:Signature>?</urn:Signature>
      </urn:CommunicationTestRequest>
   </soapenv:Body>
</soapenv:Envelope>

それは問題なく動作しますが、PHP のクライアントである SoapClient で作成すると失敗します...エラーが発生するのは、わずかに異なるためであることがわかりました。 )。SoapClient の xml は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <CommunicationTestRequest>
            <RequestDateTime>2012-04-17T23:21:54</RequestDateTime>
            <ApiKey>XXXXX</ApiKey>
            <Signature>XXXXX</Signature>
        </CommunicationTestRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

3 つの主な相違点は次のとおりです。 1) 定義では、SoapClient によって生成されたコードには、これが欠けています: xmlns:urn="urn:safetypay:mws:api:messages" 2) SoapUI によって生成された xml には、soapenv がありますが、 SoapClient によって生成されたものは SOAP-ENV です。3) SoapUI では、各子の前に urn がありますが、SoapClient はそうではありません。

私はほぼ一日中、構成の変更とオブジェクトから配列への逆方向の移動に費やしてきました (以前は他の wsdl で動作していたため)、インターネットでの調査では何も得られませんでした...私の間違いは何ですか?

リクエストはこれです:

$std = new RequestDateTime();
$std->RequestDateTime = date ( 'Y-m-d\TH:i:s', time () );
$std->ApiKey = SafetyPaySoap::API_KEY_SAND;
$std->Signature = SafetyPaySoap::SIG_KEY_SAND;
$this->_wsdl->CommunicationTest($std);

SoapClientの構成はこれです

$config = array ();
$config ['exceptions'] = true;
$config ['trace'] = true;
$config ['cache_wsdl'] = WSDL_CACHE_NONE;
$config ['soap_version'] = SOAP_1_1;
parent::SoapClient ( $url . '?wsdl', $config );

編集: このエラーを修正できました。__doRequest メソッドを書き直す必要がありました。次のようになります。

public function __doRequest($request, $location, $action, $version, $one_way = null) {
    $request = str_ireplace("<{$this->_method}Request>", "<{$this->_method}Request xmlns='urn:safetypay:mws:api:messages'>", $request);
    return parent::__doRequest ( $request, $location, $action, $version, $one_way );
}

だから、私がやっていることは、要求に名前空間を追加することです。それにより、このxmlが生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <CommunicationTestRequest xmlns='urn:safetypay:mws:api:messages'>
            <ApiKey>XXXX</ApiKey>
            <RequestDateTime>2012-04-18T20:22:51</RequestDateTime>
            <Signature>XXXXX</Signature>
        </CommunicationTestRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4

1 に答える 1

1

urn: は、実際には XML 名前空間です。SoapClient のドキュメントを見ると、ターゲット名前空間を構成配列の「uri」エントリとして渡すようです。以下を試して、それが違いを生むかどうかを確認する価値があるかもしれません.

$config = array();
$config['uri'] = "urn:safetypay:mws:api:messages";
// your other configurations
parent::SoapClient('https://mws2.safetypay.com/sandbox/express/ws/v.2.4/MerchantWS.asmx?wsdl', $config);
于 2012-04-17T23:46:53.813 に答える