我不知道怎么写,但我应该用以下格式发送一个 SOAP 请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:RequestTopup>
<tem:sClientUserName>?</tem:sClientUserName>
<tem:sClientPassword>?</tem:sClientPassword>
<tem:sClientTxID>?</tem:sClientTxID>
<tem:sProductID>?</tem:sProductID>
<tem:dProductPrice>?</tem:dProductPrice>
<tem:sCustomerAccountNumber>?</tem:sCustomerAccountNumber>
<tem:sCustomerMobileNumber>?</tem:sCustomerMobileNumber>
<tem:sEncKey>?</tem:sEncKey>
</tem:RequestTopup>
</soapenv:Body>
</soapenv:Envelope>
我的 php 代码如下:
$opts = array(
'ssl' => array('ciphers' => 'RC4-SHA', 'verify_peer' => false, 'verify_peer_name' => false)
);
$params = array(
'encoding' => 'UTF-8',
'verifypeer' => false,
'verifyhost' => false,
'trace' => 1, 'exceptions' => 1,
"connection_timeout" => 180,
'stream_context' => stream_context_create($opts)
);
$client = new SoapClient("http://xmpl/connect.asmx?WSDL", $params);
$txn_id = "2017021234567";
$result = $client->RequestTopup(
array(
'sClientUserName' => '60123456789',
'sClientPassword' => '123456789',
'sProductID' => '1',
'dProductPrice' => '10',
'sClientTxID' => $txn_id,
'sCustomerAccountNumber' => '60166527234',
'sCustomerMobileNumber' => '60166527234',
'sEncKey' => 'sample_enc',
)
);
echo $client->__getLastRequest();
现在,问题是这会以正确的格式生成 xml,但是将所有 "tem" 替换为 "ns1" 。我很抱歉这么说,但我什至不知道两者之间的区别,谷歌搜索也没有多大帮助。
如果我用 "ns1"请求 xml,这会有什么不同吗?或者我应该像客户端期望的那样将其更改为“tem”?请帮忙。
最佳答案
不应该。命名空间前缀仅引用实际命名空间(xmlns:*
命名空间定义节点中的值)。前缀对于元素节点是可选的,并且可以在每个元素节点上更改。所以 tem:RequestTopup
实际上应该读作 {http://tempuri.org/}RequestTopup
。以下是 3 个示例,它们都解析为 namespace http://tempuri.org/
中具有本地名称 RequestTopup
的节点
<tem:RequestTopup xmlns:tem="http://tempuri.org/"/>
<ns1:RequestTopup xmlns:ns1="http://tempuri.org/"/>
<RequestTopup xmlns="http://tempuri.org/"/>
但是,我已经看到了比我想要的更多的错误实现。它们通常依赖于特定的命名空间前缀而忽略实际的命名空间。
关于php - SOAP 请求中 ns1 和 tem 的不匹配会影响请求吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42248233/