銀聯支付用的仍是比較少的,並且開發中也沒接觸多少,不過由於工做項目用銀聯支付能下降費率,因此仍是接入了銀聯支付。本文支付爲銀聯網關和WAP支付接口。javascript
官方網站SDK&DEMO:https://open.unionpay.com/ajweb/product/detail?id=66php
產品API:https://open.unionpay.com/ajweb/product/newProApiShow?proId=1&apiId=63
API文檔https://open.unionpay.com/ajweb/help/api
在開始以前要仔細閱讀官方包裏的說明文件,必要的證書和商戶信息要提早獲取。
實例代碼及步驟:html
修改demo/api_01_gateway/Form_6_2_FrontConsume.php(發送訂單參數,跳轉支付界面)java
<?php
header ( 'Content-type:text/html;charset=utf-8' );
include_once("../../../../include/config.inc.php");
include_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR . './../../sdk/acp_service.php';
/**
* 重要:聯調測試時請仔細閱讀註釋!
*
* 產品:跳轉網關支付產品<br>
* 交易:消費:前臺跳轉,有前臺通知應答和後臺通知應答<br>
* 日期: 2015-09<br>
* 版本: 1.0.0
* 版權: 中國銀聯<br>
* 說明:如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身須要,按照技術文檔編寫。該代碼僅供參考,不提供編碼性能規範性等方面的保障<br>
* 提示:該接口參考文檔位置:open.unionpay.com幫助中心 下載 產品接口規範 《網關支付產品接口規範》,<br>
* 《平臺接入接口規範-第5部分-附錄》(內包含應答碼接口規範,全渠道平臺銀行名稱-簡碼對照表)<br>
* 《全渠道平臺接入接口規範 第3部分 文件接口》(對帳文件格式說明)<br>
* 測試過程當中的若是遇到疑問或問題您能夠:1)優先在open平臺中查找答案:
* 調試過程當中的問題或其餘問題請在 https://open.unionpay.com/ajweb/help/faq/list幫助中心 FAQ 搜索解決方案
* 測試過程當中產生的7位應答碼問題疑問請在https://open.unionpay.com/ajweb/help/respCode/respCodeList輸入應答碼搜索解決方案
* 2) 諮詢在線人工支持: open.unionpay.com註冊一個用戶並登錄在右上角點擊「在線客服」,諮詢人工QQ測試支持。
* 交易說明:1)之後臺通知或交易狀態查詢交易肯定交易成功,前臺通知不能做爲判斷成功的標準.
* 2)交易狀態查詢交易(Form_6_5_Query)建議調用機制:前臺類交易建議間隔(5分、10分、30分、60分、120分)發起交易查詢,若是查詢到結果成功,則不用再查詢。(失敗,處理中,查詢不到訂單都可能爲中間狀態)。也能夠建議商戶使用payTimeout(支付超時時間),過了這個時間點查詢,獲得的結果爲最終結果。
*/
//接收支付數據
$order_data = trim(get_param("orderDa")); //訂單數據
if($order_data == "" ){
$mssage = "數據不能爲空";
showinfo($mssage,'' ,3);
exit;
}
$result_order = json_decode(uc_authcode(base64_decode($order_data), 'DECODE', ADMIN_KEY),true);
//商戶訂單號,商戶網站訂單系統中惟一訂單號,必填
$out_trade_no = $result_order['WIDout_trade_no'];
//付款金額,必填(單位元)
$total_amount = $result_order['WIDtotal_amount'];
//商戶代碼,請改本身的測試商戶號,此處默認取demo演示頁面傳遞的參數
//訂單發送時間
$send_time = date('YmdHis',THIS_DATETIME);
//訂單超時時間
$time_out = date('YmdHis',strtotime('+15 minutes',THIS_DATETIME));
//驗證數據
$pay_md5 = $result_order['infoPy']; //訂單驗證
if($out_trade_no==''){
$mssage = "訂單號不能爲空";
showinfo($mssage,'' ,3);
exit;
}
if($total_amount=='' || $total_amount==0){
$mssage = "訂單金額不能爲空";
showinfo($mssage,'' ,3);
exit;
}
//購買商品
if($result_order['flag']=='paycard'){
//檢測是否有訂單號
$where = " and o_orderid = '".$out_trade_no."' and o_totalprice='".$total_amount."' and o_status=4 ";
$info = get_info($GLOBALS["conn"],"game_order",array(),$where);
if( empty($info) ){
$mssage = "沒有此訂單!";
showinfo($mssage,'' ,3);
exit;
}
//驗證數據
$p_arr = array( 'uid'=>$info['o_playerid'], 'uorder'=>$info['o_orderid'], 'uprice'=>$info['o_totalprice'],);
$p_time = $info['o_addtime'];
$p_key = ADMIN_KEY;
$p_md5 = md5($p_arr.$p_time.$p_key);
if( $p_md5 != $pay_md5 ){
$mssage = "請勿非法操做!";
showinfo($mssage,'' ,3);
exit;
}
}
//申請還款
if($result_order['flag']=='repayment'){
//檢測是否有訂單號
$where = " and l_orderid = '".$out_trade_no."' and l_returnnum='".$total_amount."' and l_status=3 ";
$info = get_info($GLOBALS["conn"],"game_loan_order",array(),$where);
if( empty($info) ){
$mssage = "沒有此訂單!";
showinfo($mssage,'' ,3);
exit;
}
//驗證數據
$p_arr = array( 'uid'=>$info['l_playerid'], 'uorder'=>$info['l_orderid'], 'uprice'=>$info['l_returnnum']);
$p_time = $info['l_addtime'];
$p_key = ADMIN_KEY;
$p_md5 = md5($p_arr.$p_time.$p_key);
if( $p_md5 != $pay_md5 ){
$mssage = "請勿非法操做!";
showinfo($mssage,'' ,3);
exit;
}
}
//記錄要提交的訂單信息到日誌
$log_msg = "訂單內容:" . json_encode($result_order);
sys_log_write_content( $log_msg.__FILE__.__LINE__ ,"pay_log","jsapi");
$params = array(
//如下信息非特殊狀況不須要改動
'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version, //版本號
'encoding' => 'utf-8', //編碼方式
'txnType' => '01', //交易類型
'txnSubType' => '01', //交易子類
'bizType' => '000201', //業務類型
'frontUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontUrl, //前臺通知地址
'backUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl, //後臺通知地址
'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod, //簽名方法
'channelType' => '08', //渠道類型,07-PC,08-手機
'accessType' => '0', //接入類型
'currencyCode' => '156', //交易幣種,境內商戶固定156
//TODO 如下信息須要填寫
'merId' => '', //商戶代碼,請改本身的測試商戶號,此處默認取demo演示頁面傳遞的參數
'orderId' => $out_trade_no, //商戶訂單號,8-32位數字字母,不能含「-」或「_」,此處默認取demo演示頁面傳遞的參數,能夠自行定製規則
'txnTime' => $send_time, //訂單發送時間,格式爲YYYYMMDDhhmmss,取北京時間,此處默認取demo演示頁面傳遞的參數
'txnAmt' => $total_amount*100, //交易金額,單位分,此處默認取demo演示頁面傳遞的參數
// 訂單超時時間。
// 超過此時間後,除網銀交易外,其餘交易銀聯繫統會拒絕受理,提示超時。 跳轉銀行網銀交易若是超時後交易成功,會自動退款,大約5個工做日金額返還到持卡人帳戶。
// 此時間建議取支付時的北京時間加15分鐘。
// 超過超時時間調查詢接口應答origRespCode不是A6或者00的就能夠判斷爲失敗。
'payTimeout' => $time_out
// 請求方保留域,
// 透傳字段,查詢、通知、對帳文件中均會原樣出現,若有須要請啓用並修改本身但願透傳的數據。
// 出現部分特殊字符時可能影響解析,請按下面建議的方式填寫:
// 1. 若是能肯定內容不會出現&={}[]"'等符號時,能夠直接填寫數據,建議的方法以下。
// 'reqReserved' =>'透傳信息1|透傳信息2|透傳信息3',
// 2. 內容可能出現&={}[]"'符號時:
// 1) 若是須要對帳文件裏能顯示,可將字符替換成全角&={}【】「‘字符(本身寫代碼,此處不演示);
// 2) 若是對帳文件沒有顯示要求,可作一下base64(以下)。
// 注意控制數據長度,實際傳輸的數據長度不能超過1024位。
// 查詢、通知等接口解析時使用base64_decode解base64後再對數據作後續解析。
// 'reqReserved' => base64_encode('任意格式的信息均可以'),
//TODO 其餘特殊用法請查看 special_use_purchase.php
);
com\unionpay\acp\sdk\AcpService::sign ( $params );
$uri = com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontTransUrl;
$html_form = com\unionpay\acp\sdk\AcpService::createAutoFormHtml( $params, $uri );
echo $html_form;
?>web
修改demo/api_01_gateway/FrontReceive.php(前臺同步通知)
<?php
include_once("../../../../include/config.inc.php");
include_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR . './../../sdk/acp_service.php';
/**
* 交易說明: 前臺類交易成功纔會發送後臺通知。後臺類交易(有後臺通知的接口)交易結束以後成功失敗都會發通知。
* 爲保證安全,涉及資金類的交易,收到通知後請再發起查詢接口確認交易成功。不涉及資金的交易能夠以通知接口respCode=00判斷成功。
* 未收到通知時,查詢接口調用時間點請參照此FAQ:https://open.unionpay.com/ajweb/help/faq/list?id=77&level=0&from=0
*/
$logger = com\unionpay\acp\sdk\LogUtil::getLogger();
$logger->LogInfo("receive front notify: " . com\unionpay\acp\sdk\createLinkString ( $_POST, false, true ));
//頁面回跳地址
$fail_back_url = WEBPATH_DIR_INC.'enter-query.html';
$succ_back_url = WEBPATH_DIR_INC.'enter-query.html';
//驗籤
if (isset ( $_POST ['signature'] )) {
$result = com\unionpay\acp\sdk\AcpService::validate ( $_POST );
if($result){//驗籤成功
$respCode = $_POST ['respCode'];//應答碼
if($respCode=='00' || $respCode=='A6'){//交易成功
//請在這裏加上商戶的業務邏輯程序代碼
//返回參數
$orderId = $_POST ['orderId'];//商戶訂單號
$totalAmount = $_POST['txnAmt'];//交易金額
$merId = $_POST['merId'];//商戶代碼
$res = 'success';
//判斷支付類型(提現仍是借貸)
$type = substr($orderId,0,2);
//獲取對應訂單信息
if($type=='tx'){
$order_info = get_order_info($orderId);
//驗證訂單數據
if(empty($order_info)){
$res = 'fail';
}
if($totalAmount != $order_info['o_totalprice']*100){
$res = 'fail';
}
}
if($type=='jd'){
$order_info = get_loan_order_info($orderId);
//驗證訂單數據
if(empty($order_info)){
$res = 'fail';
}
if($totalAmount != $order_info['l_returnnum']*100){
$res = 'fail';
}
}
//驗證商戶代碼
//TODO
}else{
$res = 'fail';
}
}else{
$res = 'fail';
}
} else {
$res = 'fail';
}
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>銀聯支付-訂單支付</title>
<script type="text/javascript">
function callpay(){
var res = '<?php echo $res;?>';
if(res=='success'){
var Idiv = document.getElementById("pay_error2");
}else{
var Idiv = document.getElementById("pay_error");
}
Idiv.style.display = "block";
}
//頁面進入即進行支付
window.onload = function(){ callpay(); };
</script>
</head>
<body>
<style>
*{ margin:0; padding:0; background:#e1e1e1;}
#pay_error, #pay_error2{ display:none; width:90%; height:100%; text-align:center; color:#fe5f16; font-size:20px; padding:20px 0; font-weight:bolder; border:1px solid #ccc; margin:0 5%; height:100px; margin-top:50%; border-radius:10px; background:#fff;}
#pay_error p,#pay_error2 p{ background:#fff;}
#pay_error a,#pay_error2 a{ background:#83da49; color:#fff; text-decoration:none; display:block; padding:10px 0; width:60%; margin-left:20%; margin-top:20px;}
</style>
<div id="pay_error">
<p class="p1">支付失敗,請從新完成支付!</p>
<p class="bt"><a href="<?php echo $fail_back_url;?>">肯定</a></p>
</div>
<div id="pay_error2">
<p class="p1">恭喜你,支付成功</p>
<p class="bt"><a href="<?php echo $succ_back_url;?>">肯定</a></p>
</div>
</body>
</html>sql
修改demo/api_01_gateway/BackReceive.php(後臺異步通知)
<?php
include_once("../../../../include/config.inc.php");
include_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR . './../../sdk/acp_service.php';
include_once "Form_6_5_Query.php";
/**
* 交易說明: 前臺類交易成功纔會發送後臺通知。後臺類交易(有後臺通知的接口)交易結束以後成功失敗都會發通知。
* 爲保證安全,涉及資金類的交易,收到通知後請再發起查詢接口確認交易成功。不涉及資金的交易能夠以通知接口respCode=00判斷成功。
* 未收到通知時,查詢接口調用時間點請參照此FAQ:https://open.unionpay.com/ajweb/help/faq/list?id=77&level=0&from=0
*/
$logger = com\unionpay\acp\sdk\LogUtil::getLogger();
$logger->LogInfo("receive back notify: " . com\unionpay\acp\sdk\createLinkString ( $_POST, false, true ));
//驗籤
if (isset ( $_POST ['signature'] )) {
$result = com\unionpay\acp\sdk\AcpService::validate ( $_POST );
if($result){//驗籤成功
$respCode = $_POST ['respCode'];//應答碼
if($respCode=='00' || $respCode=='A6'){//交易成功
//返回參數
$orderId = $_POST ['orderId'];//商戶訂單號
$totalAmount = $_POST['txnAmt'];//交易金額
$merId = $_POST['merId'];//商戶代碼
$txnTime = $_POST['txnTime'];//訂單發送時間
$trade_no = $_POST['queryId'];//銀聯流水號
//發起查詢交易接口
$check_res = check_Trade_Res($orderId,$merId,$txnTime,THIS_DATETIME);
if($check_res=='200'){
//成功
//請在這裏加上商戶的業務邏輯程序代碼
//判斷支付類型(提現仍是借貸)
$type = substr($orderId,0,2);
//獲取對應訂單信息
if($type=='tx'){
$order_info = get_order_info($orderId);
//驗證訂單數據
if(empty($order_info)){
echo 'fail';
return;
}
if($totalAmount != $order_info['o_totalprice']*100){
echo 'fail';
return;
}
}
if($type=='jd'){
$order_info = get_loan_order_info($orderId);
//驗證訂單數據
if(empty($order_info)){
echo 'fail';
return;
}
if($totalAmount != $order_info['l_returnnum']*100){
echo 'fail';
return;
}
}
//驗證商戶代碼
//TODO
//執行成功後的業務程序
if($type=='tx'){
if($order_info['o_status']==4){
//執行業務處理
//取出禮包碼
$sql = "select sysid,gc_code from ".get_table("game_gift_code")." where gc_status=1 limit 1";
$query = $GLOBALS["conn"]->Query($sql);
$value = $GLOBALS['conn']->FetchArray($query);
$up_arr = array(
'o_status' => 1,
'o_trade_no' => $trade_no,
'o_giftcode' => $value['gc_code']
);
$up_where = " and o_orderid='".$orderId."'";
$row = update_record($GLOBALS["conn"],'game_order',$up_arr,array(),$up_where);//更新訂單數據
if($row>0){
$msg = "訂單 ".$orderId." 已支付";
$log_msg = "call back:" . $msg;
sys_log_write_content( $log_msg.__FILE__.__LINE__ ,"pay_log","notify_order_success");
//更新禮包碼狀態
$up_gift = array(
'gc_status'=>2,
'gc_time' => THIS_DATETIME,
'gc_orderid' => $orderId
);
$gift_where = " and sysid=".$value['sysid'];
update_record($GLOBALS["conn"],'game_gift_code',$up_gift,array(),$gift_where);
//更新商品出售數量
/*$where = " and og_sysid='".$orderId."'";
$garr = get_info($GLOBALS['conn'],"game_order_goods",array('og_goodsid'),$where,'',true);
foreach($garr as $k=>$v){
$up_num = array(
'g_sellnum' => 'g_sellnum'+1
);
$num_where = " and g_id='".$v."'";
update_record($GLOBALS['conn'],"game_goods",$up_num,array(),$num_where);//更新商品出售
}*/
//新增用戶消息
$title = '付款成功,請試用後儘快退款';//標題
$content = '您的訂單['.$orderId.']已經付款成功,<br>道具試用後可申請退款退回綁定借記卡,適合現金緊缺的玩家!系統贈送您的遊戲兌換碼:'.$value['gc_code'].',能夠在您的遊戲中進行使用,感謝您的支持!<br>如需幫助,請點擊左上角【幫助】找到您的問題或者聯繫客服進行人工服務,QQ:2013609564';
add_player_msg($order_info['o_playerid'],$title,$content);
}
}
}
if($type=='jd'){
if($order_info['l_status']==3){
//執行業務處理
$up_arr = array(
'l_status' => 4,
'l_trade_no' => $trade_no,
'l_returntime' => THIS_DATETIME
);
$up_where = " and l_orderid='".$orderId."'";
$row = update_record($GLOBALS["conn"],'game_loan_order',$up_arr,array(),$up_where);//更新訂單數據
if($row>0){
$msg = "訂單 ".$orderId." 已支付";
$log_msg = "call back:" . $msg;
sys_log_write_content( $log_msg.__FILE__.__LINE__ ,"pay_log","notify_order_success");
}
}
}
echo "success";
}else{
echo "fail";
}
}else{
echo 'fail';
}
}else{
echo 'fail';
}
} else {
echo 'fail';
}
?>
封裝主動查詢交易結果接口方法
<?php
include_once("../../../../include/config.inc.php");
header ( 'Content-type:text/html;charset=utf-8' );
//include_once $_SERVER ['DOCUMENT_ROOT'] . '/upacp_demo_b2c/sdk/acp_service.php';
/**
* 重要:聯調測試時請仔細閱讀註釋!
*
* 產品:跳轉網關支付產品<br>
* 交易:交易狀態查詢交易:只有同步應答 <br>
* 日期: 2015-09<br>
* 版本: 1.0.0
* 版權: 中國銀聯<br>
* 說明:如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身須要,按照技術文檔編寫。該代碼僅供參考,不提供編碼性能及規範性等方面的保障<br>
* 該接口參考文檔位置:open.unionpay.com幫助中心 下載 產品接口規範 《網關支付產品接口規範》,<br>
* 《平臺接入接口規範-第5部分-附錄》(內包含應答碼接口規範,全渠道平臺銀行名稱-簡碼對照表)<br>
* 測試過程當中的若是遇到疑問或問題您能夠:1)優先在open平臺中查找答案:
* 調試過程當中的問題或其餘問題請在 https://open.unionpay.com/ajweb/help/faq/list幫助中心 FAQ 搜索解決方案
* 測試過程當中產生的7位應答碼問題疑問請在https://open.unionpay.com/ajweb/help/respCode/respCodeList輸入應答碼搜索解決方案
* 2) 諮詢在線人工支持: open.unionpay.com註冊一個用戶並登錄在右上角點擊「在線客服」,諮詢人工QQ測試支持。
* 交易說明: 1)對前臺交易發起交易狀態查詢:前臺類交易建議間隔(5分、10分、30分、60分、120分)發起交易查詢,若是查詢到結果成功,則不用再查詢。(失敗,處理中,查詢不到訂單都可能爲中間狀態)。也能夠建議商戶使用payTimeout(支付超時時間),過了這個時間點查詢,獲得的結果爲最終結果。
* 2)對後臺交易發起交易狀態查詢:後臺類資金類交易同步返回00,成功銀聯有後臺通知,商戶也能夠發起 查詢交易,可查詢N次(不超過6次),每次時間間隔2N秒發起,即間隔1,2,4,8,16,32S查詢(查詢到03,04,05繼續查詢,不然終止查詢)。
* 後臺類資金類同步返03 04 05響應碼及未獲得銀聯響應(讀超時)需發起查詢交易,可查詢N次(不超過6次),每次時間間隔2N秒發起,即間隔1,2,4,8,16,32S查詢(查詢到03,04,05繼續查詢,不然終止查詢)。
*/
function check_Trade_Res($orderId,$merId,$txnTime,$firTime=THIS_DATETIME){
$params = array(
//如下信息非特殊狀況不須要改動
'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version, //版本號
'encoding' => 'utf-8', //編碼方式
'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod, //簽名方法
'txnType' => '00', //交易類型
'txnSubType' => '00', //交易子類
'bizType' => '000000', //業務類型
'accessType' => '0', //接入類型
'channelType' => '07', //渠道類型
//TODO 如下信息須要填寫
'orderId' => $orderId, //請修改被查詢的交易的訂單號,8-32位數字字母,不能含「-」或「_」,此處默認取demo演示頁面傳遞的參數
'merId' => $merId, //商戶代碼,請改本身的測試商戶號,此處默認取demo演示頁面傳遞的參數
'txnTime' => $txnTime,//請修改被查詢的交易的訂單發送時間,格式爲YYYYMMDDhhmmss,此處默認取demo演示頁面傳遞的參數
);
com\unionpay\acp\sdk\AcpService::sign ( $params ); // 簽名
$url = com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->singleQueryUrl;
$result_arr = com\unionpay\acp\sdk\AcpService::post ( $params, $url);
if(count($result_arr)<=0) { //沒收到200應答的狀況
//printResult ( $url, $params, "" );
return;
}
//printResult ($url, $params, $result_arr ); //頁面打印請求應答數據
if (!com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
return '400';
}
if ($result_arr["respCode"] == "00"){
if ($result_arr["origRespCode"] == "00"){
//交易成功
//TODO
//echo "交易成功。<br>\n";
return '200';
} else if ($result_arr["origRespCode"] == "03"
|| $result_arr["origRespCode"] == "04"
|| $result_arr["origRespCode"] == "05"){
//後續需發起交易狀態查詢交易肯定交易狀態
//TODO
//echo "交易處理中,請稍微查詢。<br>\n";
//間隔查詢
ignore_user_abort(1);
set_time_limit(0);
$interval = 60*5;//5分鐘
sleep($interval);
do{
if(THIS_DATETIME-$firTime>60*120){
return '400';
}
check_Trade_Res($orderId,$merId,$txnTime);//再次查詢
}while(true);
} else {
//其餘應答碼作以失敗處理
//TODO
//echo "交易失敗:" . $result_arr["origRespMsg"] . "。<br>\n";
return '400';
}
} else if ($result_arr["respCode"] == "03"
|| $result_arr["respCode"] == "04"
|| $result_arr["respCode"] == "05" ){
//後續需發起交易狀態查詢交易肯定交易狀態
//TODO
//echo "處理超時,請稍微查詢。<br>\n";
//間隔查詢
ignore_user_abort(1);
set_time_limit(0);
$interval = 60*5;//5分鐘
sleep($interval);
do{
if(THIS_DATETIME-$firTime>60*120){
return '400';
}
check_Trade_Res($orderId,$merId,$txnTime);//再次查詢
}while(true);
} else {
//其餘應答碼作以失敗處理
//TODO
//echo "失敗:" . $result_arr["respMsg"] . "。<br>\n";
return '400';
}
}
/**
* 打印請求應答
*
* @param
* $url
* @param
* $req
* @param
* $resp
*/
function printResult($url, $req, $resp) {
echo "=============<br>\n";
echo "地址:" . $url . "<br>\n";
echo "請求:" . str_replace ( "\n", "\n<br>", htmlentities ( com\unionpay\acp\sdk\createLinkString ( $req, false, true ) ) ) . "<br>\n";
echo "應答:" . str_replace ( "\n", "\n<br>", htmlentities ( com\unionpay\acp\sdk\createLinkString ( $resp , false, false )) ) . "<br>\n";
echo "=============<br>\n";
}
---------------------
做者:xxd_hr
原文:https://blog.csdn.net/qq603283912/article/details/78720960 json