Hoyo 教你串金流 - 綠界

6 月 29, 2018

Hoyo 提供原廠都沒有的測試工具

--

下載綠界串接文件

需要下載 「全方位金流 API 技術文件」以及「PHP SDK」

撰寫文件時為 2018-6-29 , API 文件版本 5.1.17

--

流程

雖然金流 API 文件第 2 章有交易流程說明,可是第一次使用看懂的機率是極低的,所以 Hoyo 另外整理為

  1. 送出一個訂單表單送到「介接路徑」
  2. 準備接收綠界付款結果的資訊

--

訂單表單

網頁表單 - f.html

  • MerchantTradeNo : 訂單編號,一個編號只能用一次,所以針對實際情況不能直接將網站的訂單編號送出,必須使用一個對應的變動編號,這個問題後面再討論
  • ReturnURL : 必須要可以對外訪問的網址,所以沒有自己的網站是不能接線上支付 (沒有意義)
  • MerchantID : 測試的商家 value 都要根據 API 文件設定
  • HashKey 同上
  • HashIV 同上

送給 PHP 計算 CheckMacValue - Ecpay.php

  • PHP 的作用只有計算 CheckMacValue 這個值之後附加到表單再送到綠界
  • 送出之後的所有錯誤綠界都會清楚的回應

--

接收付款結果資訊

payEcpay.php

  • 根據回傳格式說明,至少要成功支付以及驗證碼正確才進行後續處理,否則可能是造假回傳資訊

--

模擬綠界回傳表單

可以自己設計表單模擬綠界回傳送出資訊,方便接收除錯

--

綠界回傳資訊

使用 print_r($_POST); 把回傳資訊展開大概就是長這樣

--

 33,168 total views,  4 views today

Related Post

36 thoughts on “Hoyo 教你串金流 - 綠界”
  1. 您好,真的謝謝您的分享!!!
    因為自學的初學者,有一些觀念還不是很清楚。能否想請教一下~
    在接收付款資訊的payEcpay.php頁面。
    其他的像TradeNo,StoreExpireDate等等,是不是都可以透過以下的方式抓取:
    $TradeNo=$_POST[TradeNo']; //綠界的交易編號
    $StoreExpireDate=$_POST['StoreExpireDate']; //超商繳費截止時間
    $vAccount=$_POST['vAccount']; //ATM繳費虛擬帳號

    $TradeNo、$TradeAmt等變數,目的用來做資料庫的記錄及儲存....。

  2. 可以,其實綠界就是根據我們設定的回傳網址送回「一個表單」給我們,是 POST 過來的

    我在更新一個回傳「長的樣子」,這樣就可以知道會回傳哪些資訊

  3. 版主您好,謝謝您的回覆!!!
    透由您的分享教學,很開心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不熟的問題,我再研究一下。

    如果說有串接上的重點沒抓到,還煩請版主能指點一下了!!!!!! 萬分感謝!!!!!!!!

  4. 版主,謝謝您~我有重新改寫一下更新的程式碼後就沒有問題了。

  5. 版主您好:
    我目前遇到的問題是,OrderResultURL、ClientRedirectURL都沒有作用
    甚至連ClientBackURL也無效

    另外,能否就payECpay.php的部分詢問您,
    我應該要如何才能夠抓得到值呢

  6. 你應該是在 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

  7. 版主您好,

    第一次串金流如發問過於簡單煩請見諒!!
    問題如下,
    我照您的教學依序寫了
    order-test.html(即您的範例f.html)及ecpay.php
    就很單純的第一步我就失敗了!!
    也就是把表單送到ecpay.php這頁,不知為何就是會出現ECPay/ECPaySPCheckOut_PHP的頁面!!

  8. 版主您好
    首先感謝您的教學文,受益良多 謝謝您 !
    我也遇到了類似的問題,請指教

    我參考您的範例
    我改寫了一部分,使 "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 我還是不太瞭解

    謝謝您

  9. Q1. CheckMacValue Error. 的錯誤必須看原始碼的輸出驗證才會知道是錯在哪?可以把最後一行「送出表單」的 echo 指令註解即可觀察

    Q2. ReturnURL 是綠界可以把交易後的結果「即時」告訴你,就可以不去綠界的後台查詢交易結果,例如是販售線上服務,那在交易成功之後即可馬上開通服務,不須人工去綠界後台查帳後才開通

  10. 請問大大,使用woocommerce購物車模組外掛後,所產生的訂單編號是特店的訂單編號
    可不可以不要特店的編號,只要綠界內建的訂單編號就好呢
    另外超商付款是預設4大超商都能繳款,能不能把OK超商繳款給取消,留其它三家呢

  11. 1. 還是需要自己網站的訂單編號,這有關系統結構設計,想一下同時有兩張金流付款,你怎麼知道哪張對應哪張?
    2. 我沒去仔細看過,不過超商付款的廠商越多是越有利,因為不需要我們自己接洽,你不想用 OK 不代表你網站付款的消費者就不用,這是很無聊的糾結問題

  12. 因為我是自己寫php去串接
    沒有用綠界的sdk
    目前可以正常產生出訂單
    但是現在卡在接收付款結果通知這邊
    不太清楚付款結果通知那部分的CheckMacValue需要串接起哪些參數在進行UrlEncode和sha256雜湊
    一直對不上他post過來的CheckMacValue
    不知道大大有沒有方法解決

  13. 您好,想請教您一些問題!謝謝
    我有串接綠界金流,目前卡在"超商代碼""超商條碼"
    無法自訂手續費金額~
    例如:商品金額99元,實際支付99元,但綠界會扣除手續費30元
    實際我的到帳只有69元,我能在哪裡自動加上產品金額+手續費金額上去呢?
    研究了好久

  14. 那必須在自己的購物車程式內修改
    當網友選擇超商支付時,程式必須「額外」加上手續費,這樣才是最後訂單的總金額

  15. 版主你好,請問在進入他們測試網站打完信用卡以及驗證碼之後都是顯示信用卡付款失敗是正常的嗎?

  16. 測試環境只能使用測試信用卡號進行刷卡測試

  17. 版主您好,想請問使用信用卡的定期定額的功能,參數要如何帶到綠界,套用版主原先的程式碼增加以下幾行,但綠界似乎接收不到,會變成普通的信用卡刷卡,不知道正確方式該如何帶,感謝您!
    $obj->Send['PeriodAmount'] = $_POST['TotalAmount'];
    $obj->Send['PeriodType'] = $_POST['PeriodType'];
    $obj->Send['Frequency'] = $_POST['Frequency'];
    $obj->Send['ExecTimes'] = $_POST['ExecTimes'];

  18. 提供實際使用案例參考
    $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'];

  19. 版主大大 你好: 很感謝你分享這篇文章 不好意思, 我想請教一下
    http://aming.idv.tw/green/f.html 後發生 CheckMacValue Error.
    我有把最後一步注解起來, 不好意思, 想請教一下 Checkmacvalue 發生問題要去哪調整呢?

  20. 貼上你的 Ecpay.php 來看看,一般都是 $obj->Send 變數少了才會導致 CheckMacValue 計算不吻合

  21. 版主您好:
    非常謝謝您的分享,但我依序完成但在測試的過程發現,試著用印出來的參數卻只是得到Array ( )並無其它資訊,也無法執行「if ( $_POST['RtnCode'] =='1' && $CheckMacValue == $_POST['CheckMacValue'] )」這一段程式,不知道您是否方便賜教可能在哪裡出了差錯呢?

  22. 如果問題是接收綠界回傳的程式話,不是使用自己的模擬回傳表單當然無法 print 出來,這段流程是 Server 對 Server 的背景運作,不是在網頁上可以看到的,可以使用以下程式將回傳資訊存成檔案
    $String = print_r( $_POST, true );
    file_put_contents( __DIR__ .'/SaveData/ECPay-'.uniqid('', true) .'.txt', $String );
    也有更新到程式內

  23. 版主您好:
    非常謝謝您的回覆,也就是說如果我將"ReturnURL"及"ClientBackURL"都指向同一個網頁時,當使用者按下「返回商店」連接到"ClientBackURL"時會出現無法執行「if ( $_POST[‘RtnCode’] ==’1′ && $CheckMacValue == $_POST[‘CheckMacValue’] )」這一段程式的錯誤是正常對嗎?

    因為在撰寫過程沒辦法確認資料是不是真的有回傳,所以想說利用"ClientBackURL"來檢示一下,看樣子是要利用檔案檢示才行了。

  24. Ecpay.php跟payEcpay.php有沒有.jsp或servlet的寫法==?

  25. 嗨,版主
    請教測試的資料如MerchantID、HashKey、HashIV是要向綠界申請,還是直接用你上面的值即可?如果要申請的話,該怎麼申請,謝謝你的回復。

  26. 測試時根據測試文件設定,正式的資料須料註冊為正式商家才有。正式的註冊請直接洽詢綠界,他們有客服可以直接回答疑問

  27. 版主直接把 merchant ID 和 hash 直接放在網頁上的方式這樣不好吧.. 這些key應該要放在後端

  28. 實際上都只是表單送出,該如何處理當然是自己的選擇。選擇從後端加工後再轉送也是可以,不過「付款」有必要嗎?
    況且,綠界的 API 是公開的,每個人都可以閱讀,每個人都知道該送出哪些欄位,前端隱藏有啥用?

  29. 請問版主,
    「// 接收到資訊回應綠界
    echo '1|OK';」
    這個echo '1|OK' 綠界是會自動判讀的嗎?
    因為我用後台的虛擬atm付款,「出現模擬付款訊息已送出,並未收到正確認訊息”1|OK”,請檢查您的接收程式」這段話
    也有用log檔確認$CheckMacValue是正確的,也有收到RtnCode為1的訊息,以及if ( $_POST['RtnCode'] =='1' && $CheckMacValue == $_POST['CheckMacValue'] )內的內容都是有讀取到的,但是綠界就是無法讀到echo '1|OK',想請問我是漏掉了那裡呢???謝謝您的回覆

  30. 那個 if 是我們自己的邏輯判斷,要怎麼判斷是有效、真實的回傳是我們自己的事
    不過站在綠界的角度就是我要收到回傳,所以 echo 是放在最後面,而且是一定會執行
    這篇資料很舊,不過我去看了一下最新的文件還是使用相同的判斷,所以理論上邏輯是一樣的

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。