代码之家  ›  专栏  ›  技术社区  ›  Cody Halovich

PHP-在SoapClient中设置命名空间

  •  1
  • Cody Halovich  · 技术社区  · 13 年前

    我对SOAP调用有问题,我认为它与命名空间有关。我从发送到的服务器收到了不正确的响应,这似乎要归功于不正确的SOAP信封和命名空间。

    152     protected function callWithSOAP($xml) {
    153         
    154         try {
    155             $soapClient = new SoapClient($this->mercuryWSDL, array('trace'=>1));
    156         } catch (Exception $e) {
    157             throw new Exception($e->getMessage());
    158         }
    159         
    160         $message = array(
    161             'tran'=> $xml,
    162             'pw'=> $this->mercuryPassword
    163         );      
    164         
    165         // Make SOAP Call
    166         try {
    167             $request = $soapClient->CreditTransaction($message);
    168         } catch (Exception $e) { 
    169             throw new Exception($e->getMessage());
    170         }
    171 
    172         $res = $soapClient->__getLastRequest();
    173         return $res;
    174 
    175         return $request;
    176     }
    

    我在方法签名中输入的XML很好,我已经确认这与服务器预期的相同,特别是出现问题的soap请求。

    以下是我使用SoapClient发送的SOAP请求:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.mercurypay.com">
        <SOAP-ENV:Body>
            <ns1:CreditTransaction>
                <ns1:tran>
                <?xml version="1.0"?>
                <TStream>
                    <Transaction>
                        <MerchantID>******</MerchantID>
                        <TranType>Credit</TranType>
                        <TranCode>FSASale</TranCode>
                        <InvoiceNo>12</InvoiceNo>
                        <RefNo>12</RefNo>
                        <Account>
                            <AcctNo>*******</AcctNo>
                            <ExpDate>****</ExpDate>
                        </Account>
                        <Amount>
                            <Purchase>25</Purchase>
                            <FSAPrescription>25</FSAPrescription>
                        </Amount>
                    </Transaction>
                </TStream>
            </ns1:tran>
            <ns1:pw>xyz</ns1:pw>
        </ns1:CreditTransaction>
    </SOAP-ENV:Body>
    

    但这是它真正期待的。。。我该如何匹配:

    <soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mer="http://www.mercurypay.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
    <mer:CreditTransaction>
    <mer:tran>
    <?xml version="1.0"?>
    <TStream>
      <Transaction>
    <MerchantID>******</MerchantID>
    <TranType>Credit</TranType>
    <TranCode>FSASale</TranCode>
    <InvoiceNo>1</InvoiceNo>
    <RefNo>1</RefNo>
    <Account>
      <AcctNo>************</AcctNo>
      <ExpDate>****</ExpDate>
    </Account>
    <Amount>
      <Purchase>63.54</Purchase>
      <FSAPrescription>63.54</FSAPrescription>
    </Amount>
    </Transaction>
    </TStream>
    </mer:tran>
    <mer:pw>xyz</mer:pw>
    </mer:CreditTransaction>
    </soapenv:Body>
    </soapenv:Envelope>
    

    你会注意到到处都是“mer”。我相信这就是我需要做的,以便从服务器获得正确的响应。请帮帮我,这本应该明天进行测试,但我们刚刚意识到,这件事的反应非常不一致。

    谢谢你能提供的任何帮助,我真的很感激。

    1 回复  |  直到 13 年前
        1
  •  0
  •   hakre    13 年前

    这个 <mer: 命名空间前缀在文档中定义(在 <soapenv:Envelope ... xmlns:mer="http://www.mercurypay.com" ... > ),但不允许使用 the XML declaration <?xml version="1.0"?> 在与文档开头不同的位置。

    这是您正在违反的XML中的一条具体规则,您不能指望它会起作用,因为SOAP是基于XML的。

    看起来你设定的方式 'tran'=> $xml 尤其是什么 $xml 在…的上下文中 $message 截至 CreditTransaction($message) 这是错误的。将数据放入 $xml 以正确的格式,以便可以正确地传递(应用程序的这一部分被隐藏,就像它被隐藏一样——WSDL的源,因此无法提供进一步的信息或提示)。

    推荐文章