Hoyo 提供原廠都沒有的測試工具
--
下載綠界串接文件
需要下載 「全方位金流 API 技術文件」以及「PHP SDK」
撰寫文件時為 2018-6-29 , API 文件版本 5.1.17
--
流程
雖然金流 API 文件第 2 章有交易流程說明,可是第一次使用看懂的機率是極低的,所以 Hoyo 另外整理為
- 送出一個訂單表單送到「介接路徑」
- 準備接收綠界付款結果的資訊
--
訂單表單
網頁表單 - f.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"/> <title></title> <style> label{ display: block; } </style> </head> <body> <form id="idFormAioCheckOut" method="post" action="Ecpay.php"> <label>動作 (Action):<input type="text" name="ServiceURL" value="https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5" class="form-control"/></label> <label>編號 (MerchantTradeNo): <input type="text" name="MerchantTradeNo" value="oikidA0000001" class="form-control"/> 不可重複使用。英數字大小寫混合 </label> <label class="col-xs-12">時間 (MerchantTradeDate): <input type="text" name="MerchantTradeDate" value="2017/06/30 00:00:00" class="form-control"/> yyyy/MM/dd HH:mm:ss </label> <label class="col-xs-12">類型 (PaymentType): <input type="text" name="PaymentType" value="aio" class="form-control"/> aio </label> <label class="col-xs-12">金額 (TotalAmount): <input type="text" name="TotalAmount" value="29999" class="form-control"/> 請帶整數,不可有小數點 僅限新台幣 金額不可為 0 元 CVS&BARCODE 最低限制為 30 元,最高限制為 30,000 元 </label> <label class="col-xs-12">描述 (TradeDesc): <input type="text" name="TradeDesc" value="Desc" class="form-control"/> </label> <label class="col-xs-12">名稱 (ItemName): <input type="text" name="ItemName" value="A#B" class="form-control"/> 商品名稱以符號 # 分 </label> <label class="col-xs-12">回傳網址 (ReturnURL): <input type="text" name="ReturnURL" value="http://tn.sly-ha.com.tw/demo/hoyo/ECPay.php" class="form-control"/> </label> <label class="col-xs-12">付款方式 (ChoosePayment): <input type="text" name="ChoosePayment" value="ALL"/> Credit:信用卡及 AndroidPay AndroidPay: AndroidPay WebATM:網路 ATM ATM:自動櫃員機 CVS:超商代碼 BARCODE:超商條碼 ALL:不指定 </label> <input type="hidden" name="MerchantID" value="2000132" /> <input type="hidden" name="HashKey" value="5294y06JbISpM5x9" /> <input type="hidden" name="HashIV" value="v77hoKGq4kWxNNIS" /> <button type="submit" class="btn btn-default">綠界線上支付</button> </form> </body> </html> |
- MerchantTradeNo : 訂單編號,一個編號只能用一次,所以針對實際情況不能直接將網站的訂單編號送出,必須使用一個對應的變動編號,這個問題後面再討論
- ReturnURL : 必須要可以對外訪問的網址,所以沒有自己的網站是不能接線上支付 (沒有意義)
- MerchantID : 測試的商家 value 都要根據 API 文件設定
- HashKey 同上
- HashIV 同上
送給 PHP 計算 CheckMacValue - Ecpay.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php require_once 'ECPay.Payment.Integration.php'; $obj = new \ECPay_AllInOne(); //服務參數 $obj->ServiceURL = $_POST['ServiceURL']; $obj->HashKey = $_POST['HashKey']; $obj->HashIV = $_POST['HashIV']; $obj->MerchantID = $_POST['MerchantID']; // $obj->Send['MerchantTradeNo'] = $_POST['MerchantTradeNo']; $obj->Send['MerchantTradeDate'] = $_POST['MerchantTradeDate']; $obj->Send['PaymentType'] = $_POST['PaymentType']; $obj->Send['TotalAmount'] = (int)$_POST['TotalAmount']; $obj->Send['TradeDesc'] = $_POST['TradeDesc']; $obj->Send['ReturnURL'] = $_POST['ReturnURL']; $obj->Send['ChoosePayment'] = $_POST['ChoosePayment']; $obj->Send['CreditInstallment'] = $_POST['CreditInstallment']; //訂單的商品資料 array_push($obj->Send['Items'], array( 'Name' => 'aaa', 'Price' => 100, 'Currency' => "元", 'Quantity' => (int)"1" ) ); //產生訂單(auto submit至ECPay) //$obj->CheckOut(); $Response = (string)$obj->CheckOutString(); echo $Response; // 自動將表單送出 echo '<script>document.getElementById("__ecpayForm").submit();</script>'; |
- PHP 的作用只有計算 CheckMacValue 這個值之後附加到表單再送到綠界
- 送出之後的所有錯誤綠界都會清楚的回應
--
接收付款結果資訊
payEcpay.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php require_once 'ECPay.Payment.Integration.php'; // 將 post 資料轉成字串 儲存 SaveData $String = print_r( $_POST, true ); file_put_contents( '/tmp/ECPay.txt', $String, FILE_APPEND ); define( 'ECPay_MerchantID', '2000132' ); define( 'ECPay_HashKey', '5294y06JbISpM5x9' ); define( 'ECPay_HashIV', 'v77hoKGq4kWxNNIS' ); // 重新整理回傳參數。 $arParameters = $_POST; foreach ($arParameters as $keys => $value) { if ($keys != 'CheckMacValue') { if ($keys == 'PaymentType') { $value = str_replace('_CVS', '', $value); $value = str_replace('_BARCODE', '', $value); $value = str_replace('_CreditCard', '', $value); } if ($keys == 'PeriodType') { $value = str_replace('Y', 'Year', $value); $value = str_replace('M', 'Month', $value); $value = str_replace('D', 'Day', $value); } $arFeedback[$keys] = $value; } } // 計算出 CheckMacValue $CheckMacValue = ECPay_CheckMacValue::generate( $arParameters, ECPay_HashKey, ECPay_HashIV ); // 必須要支付成功並且驗證碼正確 if ( $_POST['RtnCode'] =='1' && $CheckMacValue == $_POST['CheckMacValue'] ){ // // 要處理的程式放在這裡,例如將線上服務啟用、更新訂單資料庫付款資訊等 // } // 接收到資訊回應綠界 echo '1|OK'; |
- 根據回傳格式說明,至少要成功支付以及驗證碼正確才進行後續處理,否則可能是造假回傳資訊
--
模擬綠界回傳表單
可以自己設計表單模擬綠界回傳送出資訊,方便接收除錯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"/> <title></title> </head> <body> <form action="payEcpay.php" method="post"> <input type="text" name="CheckMacValue" value="82843FAB05F04943B6777A1502D2BDCF"/> <input type="text" name="CustomField1" value=""/> <input type="text" name="CustomField2" value=""/> <input type="text" name="CustomField3" value=""/> <input type="text" name="CustomField4" value=""/> <input type="text" name="MerchantID" value="2000132"/> <input type="text" name="MerchantTradeNo" value="ABC1530014538"/> <input type="text" name="PaymentDate" value="2018/06/26 20:05:00"/> <input type="text" name="PaymentType" value="Credit_CreditCard"/> <input type="text" name="PaymentTypeChargeFee" value="0"/> <input type="text" name="RtnCode" value="1"/> <input type="text" name="RtnMsg" value="paid"/> <input type="text" name="SimulatePaid" value="0"/> <input type="text" name="StoreID" value=""/> <input type="text" name="TradeAmt" value="2600"/> <input type="text" name="TradeDate" value="2018/06/26 20:02:19"/> <input type="text" name="TradeNo" value="1806262002197261"/> <button type="submit">s</button> </form> </body> </html> |
--
綠界回傳資訊
使用 print_r($_POST); 把回傳資訊展開大概就是長這樣
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Array ( [MerchantID] => 2000132 [MerchantTradeNo] => ABC1486720783 [PayAmt] => 1000 [PaymentDate] => 2017/02/10 18:00:29 [PaymentType] => Credit_CreditCard [PaymentTypeChargeFee] => 50 [RedeemAmt] => 0 [RtnCode] => 1 [RtnMsg] => 交易成功 [SimulatePaid] => 0 [TradeAmt] => 1000 [TradeDate] => 2017/02/10 17:59:49 [TradeNo] => 1702101759496095 [CheckMacValue] => 35409F1AAF0509FC055BAE340899F6BBB37AE303D49B3C00CCF264A0645E5DFD ) |
--
33,168 total views, 4 views today
您好,真的謝謝您的分享!!!
因為自學的初學者,有一些觀念還不是很清楚。能否想請教一下~
在接收付款資訊的payEcpay.php頁面。
其他的像TradeNo,StoreExpireDate等等,是不是都可以透過以下的方式抓取:
$TradeNo=$_POST[TradeNo']; //綠界的交易編號
$StoreExpireDate=$_POST['StoreExpireDate']; //超商繳費截止時間
$vAccount=$_POST['vAccount']; //ATM繳費虛擬帳號
$TradeNo、$TradeAmt等變數,目的用來做資料庫的記錄及儲存....。
可以,其實綠界就是根據我們設定的回傳網址送回「一個表單」給我們,是 POST 過來的
我在更新一個回傳「長的樣子」,這樣就可以知道會回傳哪些資訊
版主您好,謝謝您的回覆!!!
透由您的分享教學,很開心OrderResultURL、ClientRedirectURL客戶端畫面都正常顯示出訂單資訊。
另外,想再請教您一下,自己在ReturnURL遇到的bug。
您提供的範例ReturnURL,我有修改測試一下:
---------------------------------------------------------------------------------------------------------------
...前面都一樣,省略沒有貼出來。
// 計算出 CheckMacValue
$CheckMacValue = ECPay_CheckMacValue::generate( $arParameters, ECPay_HashKey, ECPay_HashIV );
//★★★★★★回傳資訊列表★★★★★★我自己加的.....
$MerchantID = $_POST['MerchantID']; //特店編號
$MerchantTradeNo = $_POST['MerchantTradeNo']; //特店交易編號 我方自己產生的訂單編號
$RtnCode = $_POST['RtnCode']; //付款狀態 成功是1
$RtnMsg = $_POST['RtnMsg']; //付款狀態描述
$TradeNo = $_POST['TradeNo']; //綠界的交易編號
$TradeAmt = $_POST['TradeAmt']; //交易金額
$PaymentDate = $_POST['PaymentDate']; //付款成功時間
$PaymentType = $_POST['PaymentType']; //付款方式
$PaymentTypeChargeFee = $_POST['PaymentTypeChargeFee']; //通路費(綠界收取)
$TradeDate = $_POST['TradeDate']; //交易時間 訂單成立時間
// 必須要支付成功並且驗證碼正確
if ( $_POST['RtnCode'] =='1' && $CheckMacValue == $_POST['CheckMacValue'] ){
//★★★★★★更新資料庫★★★★★★
$sql_query = "UPDATE `notifytest` SET ";
$sql_query .= "`notify02`='付款成功' ";
$sql_query .= "WHERE `MerchantTradeNo`=".$MerchantTradeNo; //訂單編號
mysql_query($sql_query);
}
// 接收到資訊回應綠界
echo '1|OK';
-----------------------------------------------------------------------------------------------------------------
★★問題:
就是在『付款成功/或失敗』後更新資料庫的部分。
請問一下,我這樣子做法有錯誤嗎?
因為有實際測式一筆信用卡刷卡(有付款成功),但是資料表無法成功更新欄位值。
想詢問請教一下,是不是有可能漏掉什麼重點了??
★★備註:
但如果我把訂單編號改成不是變數,是直接一個字串,就可以成功對應、更新資料庫。
$sql_query = "UPDATE `notifytest` SET ";
$sql_query .= "`notify02`='付款成功' ";
$sql_query .= "WHERE `MerchantTradeNo`=.'Test387451254' "; //訂單編號
mysql_query($sql_query);
不好意思,如果是我自己php不熟的問題,我再研究一下。
如果說有串接上的重點沒抓到,還煩請版主能指點一下了!!!!!! 萬分感謝!!!!!!!!
版主,謝謝您~我有重新改寫一下更新的程式碼後就沒有問題了。
版主您好:
我目前遇到的問題是,OrderResultURL、ClientRedirectURL都沒有作用
甚至連ClientBackURL也無效
另外,能否就payECpay.php的部分詢問您,
我應該要如何才能夠抓得到值呢
你應該是在 php 裡忘了類似以下這樣的程式了
$obj->Send['ClientRedirectURL'] = $_POST['ClientRedirectURL'];
至於綠界回傳 ReturnURL 設定的網址該如何方便的知道回傳值,可以在回傳接收程式的最上面加上以下程式,將 $_POST 儲存成檔案,方便觀察
file_put_contents( '/tmp/ECPay_'.uniqid('', true) .'.txt', print_r( $_POST, true ) );
先提供一個測試工具,你可以先用用看
https://hoyo.idv.tw/?a=Tools/EcPay
版主您好,
第一次串金流如發問過於簡單煩請見諒!!
問題如下,
我照您的教學依序寫了
order-test.html(即您的範例f.html)及ecpay.php
就很單純的第一步我就失敗了!!
也就是把表單送到ecpay.php這頁,不知為何就是會出現ECPay/ECPaySPCheckOut_PHP的頁面!!
有實際的網址嗎?不方便公開可以 mail 給我 pc@hoyo.idv.tw
出現的是 ECPay 的 PHP 原始碼?還是.... ?
版主您好
首先感謝您的教學文,受益良多 謝謝您 !
我也遇到了類似的問題,請指教
我參考您的範例
我改寫了一部分,使 "MerchantTradeNo" 用時間去組成
Q1:
我的測試碼 在 http://www.wlyen.url.tw/ec/f.php
這邊送出還是會報 CheckMacValue Error.
Q2:
simu.php 是模擬綠界回傳表單 http://www.wlyen.url.tw/ec/simu.php
我將收到的內容 var_dump(); 呈現
ReturnURL 我還是不太瞭解
謝謝您
Q1. CheckMacValue Error. 的錯誤必須看原始碼的輸出驗證才會知道是錯在哪?可以把最後一行「送出表單」的 echo 指令註解即可觀察
Q2. ReturnURL 是綠界可以把交易後的結果「即時」告訴你,就可以不去綠界的後台查詢交易結果,例如是販售線上服務,那在交易成功之後即可馬上開通服務,不須人工去綠界後台查帳後才開通
請問大大,使用woocommerce購物車模組外掛後,所產生的訂單編號是特店的訂單編號
可不可以不要特店的編號,只要綠界內建的訂單編號就好呢
另外超商付款是預設4大超商都能繳款,能不能把OK超商繳款給取消,留其它三家呢
1. 還是需要自己網站的訂單編號,這有關系統結構設計,想一下同時有兩張金流付款,你怎麼知道哪張對應哪張?
2. 我沒去仔細看過,不過超商付款的廠商越多是越有利,因為不需要我們自己接洽,你不想用 OK 不代表你網站付款的消費者就不用,這是很無聊的糾結問題
因為我是自己寫php去串接
沒有用綠界的sdk
目前可以正常產生出訂單
但是現在卡在接收付款結果通知這邊
不太清楚付款結果通知那部分的CheckMacValue需要串接起哪些參數在進行UrlEncode和sha256雜湊
一直對不上他post過來的CheckMacValue
不知道大大有沒有方法解決
https://www.ecpay.com.tw/Content/files/ecpay_011.pdf
第 43 頁就有非常完整的說明
先按照 PDF 說明一步一步的跟著做 並且產出相同的結果 最後套到自己的接收程式這樣應該就可以了
您好,想請教您一些問題!謝謝
我有串接綠界金流,目前卡在"超商代碼""超商條碼"
無法自訂手續費金額~
例如:商品金額99元,實際支付99元,但綠界會扣除手續費30元
實際我的到帳只有69元,我能在哪裡自動加上產品金額+手續費金額上去呢?
研究了好久
那必須在自己的購物車程式內修改
當網友選擇超商支付時,程式必須「額外」加上手續費,這樣才是最後訂單的總金額
版主你好,請問在進入他們測試網站打完信用卡以及驗證碼之後都是顯示信用卡付款失敗是正常的嗎?
測試環境只能使用測試信用卡號進行刷卡測試
版主您好,想請問使用信用卡的定期定額的功能,參數要如何帶到綠界,套用版主原先的程式碼增加以下幾行,但綠界似乎接收不到,會變成普通的信用卡刷卡,不知道正確方式該如何帶,感謝您!
$obj->Send['PeriodAmount'] = $_POST['TotalAmount'];
$obj->Send['PeriodType'] = $_POST['PeriodType'];
$obj->Send['Frequency'] = $_POST['Frequency'];
$obj->Send['ExecTimes'] = $_POST['ExecTimes'];
提供實際使用案例參考
$TradeNo = "ABC".time();
$obj->Send['MerchantTradeNo'] = $TradeNo; //訂單編號
$obj->Send['MerchantTradeDate'] = date('Y/m/d H:i:s'); //交易時間
$obj->Send['PaymentType'] = 'aio';
$obj->Send['TotalAmount'] = (int)$Payment['Price']; //交易金額 Price
$obj->Send['TradeDesc'] = 'OiKID 兒童線上學英語課程'; //交易描述
$obj->Send['ReturnURL'] = ECPay_ReturnURL; //付款完成通知回傳的網址
$obj->Send['ChoosePayment'] = 'Credit'; //
$obj->SendExtend['CreditInstallment'] = (string)$Payment['ECPay_Term'];
$obj->SendExtend['InstallmentAmount'] = (int)$Payment['Price'];
版主大大 你好: 很感謝你分享這篇文章 不好意思, 我想請教一下
http://aming.idv.tw/green/f.html 後發生 CheckMacValue Error.
我有把最後一步注解起來, 不好意思, 想請教一下 Checkmacvalue 發生問題要去哪調整呢?
貼上你的 Ecpay.php 來看看,一般都是 $obj->Send 變數少了才會導致 CheckMacValue 計算不吻合
版主您好:
非常謝謝您的分享,但我依序完成但在測試的過程發現,試著用印出來的參數卻只是得到Array ( )並無其它資訊,也無法執行「if ( $_POST['RtnCode'] =='1' && $CheckMacValue == $_POST['CheckMacValue'] )」這一段程式,不知道您是否方便賜教可能在哪裡出了差錯呢?
如果問題是接收綠界回傳的程式話,不是使用自己的模擬回傳表單當然無法 print 出來,這段流程是 Server 對 Server 的背景運作,不是在網頁上可以看到的,可以使用以下程式將回傳資訊存成檔案
$String = print_r( $_POST, true );
file_put_contents( __DIR__ .'/SaveData/ECPay-'.uniqid('', true) .'.txt', $String );
也有更新到程式內
版主您好:
非常謝謝您的回覆,也就是說如果我將"ReturnURL"及"ClientBackURL"都指向同一個網頁時,當使用者按下「返回商店」連接到"ClientBackURL"時會出現無法執行「if ( $_POST[‘RtnCode’] ==’1′ && $CheckMacValue == $_POST[‘CheckMacValue’] )」這一段程式的錯誤是正常對嗎?
因為在撰寫過程沒辦法確認資料是不是真的有回傳,所以想說利用"ClientBackURL"來檢示一下,看樣子是要利用檔案檢示才行了。
有沒有JSP跟JAVA的教學==不要PHP
綠界 API 有支援 Java ,請自行查閱及 Google
Ecpay.php跟payEcpay.php有沒有.jsp或servlet的寫法==?
請自行 Google 喔
[…] 其他參考文章:Hoyo 教你串金流 – 綠界 […]
嗨,版主
請教測試的資料如MerchantID、HashKey、HashIV是要向綠界申請,還是直接用你上面的值即可?如果要申請的話,該怎麼申請,謝謝你的回復。
測試時根據測試文件設定,正式的資料須料註冊為正式商家才有。正式的註冊請直接洽詢綠界,他們有客服可以直接回答疑問
版主直接把 merchant ID 和 hash 直接放在網頁上的方式這樣不好吧.. 這些key應該要放在後端
實際上都只是表單送出,該如何處理當然是自己的選擇。選擇從後端加工後再轉送也是可以,不過「付款」有必要嗎?
況且,綠界的 API 是公開的,每個人都可以閱讀,每個人都知道該送出哪些欄位,前端隱藏有啥用?
請問版主,
「// 接收到資訊回應綠界
echo '1|OK';」
這個echo '1|OK' 綠界是會自動判讀的嗎?
因為我用後台的虛擬atm付款,「出現模擬付款訊息已送出,並未收到正確認訊息”1|OK”,請檢查您的接收程式」這段話
也有用log檔確認$CheckMacValue是正確的,也有收到RtnCode為1的訊息,以及if ( $_POST['RtnCode'] =='1' && $CheckMacValue == $_POST['CheckMacValue'] )內的內容都是有讀取到的,但是綠界就是無法讀到echo '1|OK',想請問我是漏掉了那裡呢???謝謝您的回覆
那個 if 是我們自己的邏輯判斷,要怎麼判斷是有效、真實的回傳是我們自己的事
不過站在綠界的角度就是我要收到回傳,所以 echo 是放在最後面,而且是一定會執行
這篇資料很舊,不過我去看了一下最新的文件還是使用相同的判斷,所以理論上邏輯是一樣的