前兩天說明了ReturnURL、OrderResultURL
這兩種是屬於「交易完成」後回傳
今天來說說PaymentInfoURL與ClientRedirectURL
這兩種是專屬於「非即時付款」方式回傳的URL
非即時付款有哪些?
ATM、CVS(超商代碼)、BARCODE(超商條碼)、無卡分期這四種
非即時付款方式,會讓消費者先進行取號
例如
選擇ATM付款後,綠界會回傳一組虛擬帳號
並傳送至你的PaymentInfoURL與ClientRedirectURL
PaymentInfoURL與ClientRedirectURL收到綠界回傳的帳號後
再自行於網站前端畫面顯示ATM帳號
消費者取得ATM繳款帳號後,至ATM櫃員機進行繳費
等銀行確認付款完成,綠界會再回傳付款結果通知至ReturnURL、OrderResultURL
這樣有清楚[ReturnURL、OrderResultURL]和[PaymentInfoURL、ClientRedirectURL]的差別了嗎
還沒付款,只是先取得付款帳號會回傳到[PaymentInfoURL、ClientRedirectURL]
交易完成,不管成功或失敗,就會回傳到[ReturnURL、OrderResultURL]
小提醒,非即時付款的交易結果通知不支援OrderResultURL
弄清楚這兩大類的差異後
今天我們來細說PaymentInfoURL、ClientRedirectURL吧
PaymentInfoURL、ClientRedirectURL這兩者的關係和ReturnURL、OrderResultURL有點像
一個是後端接收(Server): PaymentInfoURL
一個是前端接收(Client): ClientRedirectURL
為了方便說明,下面會主要以消費者「選擇ATM付款方式」進行解釋
那我們開始吧!
當消費者選擇ATM付款,綠界會以後端回傳方式
回傳一組ATM虛擬帳號至[PaymentInfoURL]
實際操作一次
先寫一個接收回傳的程式
<?php
// 接收回傳
try {
date_default_timezone_set('Asia/Taipei');
// 參數寫入檔案
if(true)
{
$sLog_Path = __DIR__.'/PaymentInfoURL'. date('Ymd') .'.log' ; // LOG路徑
$sLog = '+++++++++++++++++++++++++++++++++++++++ 接收回傳參數 ' . date('Y-m-d H:i:s') . ' ++++++++++++++++++++++++++++++++++++++++++++' . "\n";
$fp=fopen($sLog_Path, "a+");
fputs($fp, $sLog);
fclose($fp);
$sLog_File = file_get_contents("php://input")."\n";
$fp=fopen($sLog_Path, "a+");
fputs($fp, $sLog_File);
fclose($fp);
}
echo '1|OK' ;
}
catch (Exception $e) {
if(true)
{
$sLog_Path = __DIR__.'/sample_payment_return'. date('Ymd') .'.log' ; // LOG路徑
$sLog = '+++++++++++++++++++++++++++++++++++++++ 接收回傳參數(ERROR) ' . date('Y-m-d H:i:s') . ' ++++++++++++++++++++++++++++++++++++++++++++' . "\n";
$fp=fopen($sLog_Path, "a+");
fputs($fp, $sLog);
fclose($fp);
$sLog_File ='0|'.$e->getMessage(). "\n";
$fp=fopen($sLog_Path, "a+");
fputs($fp, $sLog_File);
fclose($fp);
}
}
?>
用ngrok對外
https://1acd-211-23-76-78.ngrok-free.app/hi/PaymentInfoURL.php
完成取號
綠界就會回傳ATM繳費帳號到你的[PaymentInfoURL]
+++++++++++++++++++++++++++++++++++++++ 接收回傳參數 2024-09-09 10:12:16 ++++++++++++++++++++++++++++++++++++++++++++
BankCode=007&ExpireDate=2024/09/12&MerchantID=3002607&MerchantTradeNo=ECPaytest1725847915&PaymentType=ATM_FIRST&RtnCode=2&RtnMsg=Get VirtualAccount Succeeded&TradeAmt=100&TradeDate=2024/09/09 10:12:15&TradeNo=2409091011583905&vAccount=1057642568427609&StoreID=&CustomField1=&CustomField2=&CustomField3=&CustomField4=&CheckMacValue=605027D9FABB1F6ABE67A79D0F5C77490B0B4ED591DEF942E5455FD75280D423
收到之後記得驗算[CheckMacValue]是否相符(站內付2.0不用)
確認無誤後還要記得回傳1|OK
不然一樣會觸發綠界的重發機制哦
當消費者選擇ATM付款,綠界會以前端回傳方式
回傳一組ATM虛擬帳號,並同時「自動」轉跳至[ClientRedirectURL]
實際操作一次
先寫一個接收回傳的前端程式
也就是你希望消費者返回你網站時想要看到的頁面
並處理接收到的payload
可以這樣寫:
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>訂單確認</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.container {
background-color: #fff;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
text-align: center;
}
h1 {
color: #4CAF50;
}
</style>
</head>
<body>
<div class="container">
<h1>我們已經收到你的訂單</h1>
<?php
// 接收來自 POST 請求的資料
$bankCode = isset($_POST['BankCode']) ? htmlspecialchars($_POST['BankCode']) : '無資料';
$vAccount = isset($_POST['vAccount']) ? htmlspecialchars($_POST['vAccount']) : '無資料';
// 顯示接收到的資料
echo "<p>銀行代碼: $bankCode</p>";
echo "<p>銀行帳號: $vAccount</p>";
?>
</div>
</body>
</html>
之後用ngrok對外
https://1acd-211-23-76-78.ngrok-free.app/hi/ClientRedirectURL.php
完成取號後,綠界就會協助轉跳至你的[ClientRedirectURL]並回傳取號結果囉
是不是很簡單呢
以上就是今天介紹的PaymentInfoURL與ClientRedirectURL
有任何問題都可以下面留言分享唷
我們明天見