php - 如何在 PHP 上将 urn 添加到 SoapClient?

标签 php web-services soap namespaces wsdl

我有这个由 SoapUI 从 this wsdl 生成的 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>

三个主要区别是: 1) 在定义中,SoapClient 生成的代码缺少以下内容: xmlns:urn="urn:safetypay:mws:api:messages" 2) 在 SoapUI 生成的 xml 中,我有 soapenv,而在 SoapClient 生成的 xml 中,它是 SOAP-ENV 3) 在 SoapUI 中,我在每个 child 之前都有骨灰盒,而 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>

最佳答案

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

关于php - 如何在 PHP 上将 urn 添加到 SoapClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200694/

相关文章:

web-services - 应用服务的固定和预留出站 IP

php - 如何在 PHP 中验证非 wsdl soap

c# - 如何使用 JMeter 测试 WCF Web 服务?

php - PHP解析/语法错误;以及如何解决它们

javascript - Api调用Ajax n秒GET请求

web-services - 在 Web 服务中使用 Code First 时出错 "System.Data.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string."

java - 无法从 Soap 响应中的节点检索文本内容

php - 数组到复选框,根据 MtM 选中一些

php - 在 PHP 中解压缩 LZO 流

java - Web 服务的 android.os.NetworkOnMainThreadException (ksoap)