各位好
小弟目前遇到一個問題
日前要串接銀行的金流,提出的是用soap來串接
銀行會發request,夾帶一包xml的資料過來
我方server接收到,要去解析這xml的資料
在處理完後,還要response回去一包xml
我有網路上先了解過soap和wsdl
但沒有很深入的概念
也有找到範例來看與實作(https://gist.github.com/umidjons/f3de2533c51495a9c557)
略有些概念,但這是client直接發送至server,沒有夾帶xml的
有想要找有夾帶xml的範例來研究
但大部分的文章的code拿來用都會有部分問題或wsdl的檔案失連
小弟資質較愚味,需要一些範例來參考
依樣畫葫廬,從中吸收到我需要的零件,再組裝出我要寫的程式
目前的構想是藉由curl來夾帶xml發request
(https://www.codefixup.com/how-to-post-soap-envelope-xml-request-from-php/)
並且我在server時,用$postdata = file_get_contents("php://input");
來接收傳遞來的資料
不過這方法就無法好好去解析xml的資料了
程式碼如下:
client.php
<?php
$data = '<?xml version = "1.0" encoding = "UTF-8"?>
<inputMessage>
<ns0:BankCollStatusAdviseRq xmlns:ns0 = "http://ns.tcb.com.tw/XSD/TCB/BC/Message/BankCollStatusAdviseRq/01">
<ns0:SeqNo>00000000</ns0:SeqNo>
<ns0:TxnCode>ARROWAPAN095912 </ns0:TxnCode>
<ns0:RqUID>20120525006320192401</ns0:RqUID>
<ns0:BillId>0008981236500040</ns0:BillId>
<ns0:BillNum></ns0:BillNum>
<ns0:TrnSign>+</ns0:TrnSign>
<ns0:CollInfo>
<ns0:CollId>006</ns0:CollId>
<ns0:CollSubId>0009997717000185</ns0:CollSubId>
<ns0:PostedDt>2012-05-25</ns0:PostedDt>
<ns0:CurAmt>
<ns0:Amt>1000</ns0:Amt>
<ns0:CurCode>TWD</ns0:CurCode>
</ns0:CurAmt>
<ns0:OrigDt>2012-05-25</ns0:OrigDt>
<ns0:OrigTm>13:38:02</ns0:OrigTm>
<ns0:CSPRefId>0063201924000001</ns0:CSPRefId>
<ns0:TrnType>2</ns0:TrnType>
<ns0:TrnSrc>G</ns0:TrnSrc>
<ns0:TrnDesc></ns0:TrnDesc>
</ns0:CollInfo>
<ns0:SettlementInfo>
<ns0:SettlementId>0063201924</ns0:SettlementId>
<ns0:CustAcctId>006000999776**7758*</ns0:CustAcctId>
<ns0:CustName></ns0:CustName>
<ns0:Memo></ns0:Memo>
</ns0:SettlementInfo>
</ns0:BankCollStatusAdviseRq>
<headers>
<Header.PartyInfo>
<ns0:PartyInfo xmlns:ns0 = "http://www.tibco.com/namespaces/bc/2002/04/partyinfo.xsd">
<from>
<name>BANK006</name>
</from>
<to>
<name>TCB</name>
</to>
<operationID>BankColl/1.0/BankCollStatusAdvise</operationID>
<operationType>syncRequestResponse</operationType>
<transactionID>20120525006320192401</transactionID>
</ns0:PartyInfo>
</Header.PartyInfo>
</headers>
<ns0:_configData xmlns:ns0 = "http://tibco.com/namespaces/tnt/plugins/soap">
<endpointURL>https://dev.admin.roombook.com.tw/automsgclient_tc.php?wsdl</endpointURL>
<soapAction>/BankColl</soapAction>
</ns0:_configData>
</inputMessage>
';
$url = "http://localhost:8080/test/soap/demo2/server.php";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$headers = array(
"Content-Type: application/soap+xml",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);
?>
server.php
<?php
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
header($_SERVER["SERVER_PROTOCOL"]." 405 Method Not Allowed", true, 405);
exit;
}
$postData = trim(file_get_contents('php://input'));
echo "<pre>";print_r($postData);echo "</pre>";
libxml_use_internal_errors(true);
$xml = simplexml_load_string($postData);
if($xml === false) {
header($_SERVER["SERVER_PROTOCOL"]." 400 Bad Request", true, 400);
foreach(libxml_get_errors() as $xmlError) {
echo $xmlError->message . "\n";
}
exit;
}
?>
上述程式碼中,就無法完全解析出xml的資料,只有抓到值,卻沒有對應的標籤
不知是要用什麼方法才會抓到完整的資料呢?希望會是array,有key-value的
還請版上的大大幫忙看一下了,萬分感謝