iT邦幫忙

0

PHP的SOAP串接金流

  • 分享至 

  • xImage

各位好
小弟目前遇到一個問題
日前要串接銀行的金流,提出的是用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的
還請版上的大大幫忙看一下了,萬分感謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-08-19 10:06:43
最佳解答

只有抓到值,卻沒有對應的標籤

如果有抓到值的話
因為資料的結構不同
要用 XML (一層一層)的方式取得值
而不是
一般 array (key-value) 的方式

試試看這篇

breakgod iT邦新手 2 級 ‧ 2022-08-19 11:00:47 檢舉

謝謝你,看過這篇,茅塞頓開!!!

有幫助就好

方便請教是那家的金流嗎?
這年頭還在用 SOAP

我要發表回答

立即登入回答