iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
PHP新手30天實戰金流, Laravel6

前言

了解 ECPay API 的重要參數; 報告觀察到的現象,但是未能說明; 測試收到付款結果

API 參數

  • ReturnURL
    ==必要參數==。當消費者付款完成後,綠界會將付款結果參數以 Server POST 回傳到該網址。
    注意事項:
    1. 請勿設定與 Client 端接收付款結果網址 OrderResultURL 相同位置,避免程式判斷錯誤。
    2. 請在收到 Server 端付款結果通知後,請正確回應 1|OK 給綠界。

  • PaymentInfoURL:
    ==非==必要參數。訂單建立完成後(非付款完成),綠界會 Server 端背景回傳消費者付款方式相關資訊(例:銀行代碼、繳費虛擬帳號繳費期限…等)

  • CheckMacValue
    ==必要參數==。檢查碼機制。在與 ECPay 進行資料傳遞時,除了檢查碼[CheckMacValue]及其餘所有傳遞給綠界的參數皆需要加入檢查碼計算。

    CheckMacValue Error 常見原因:
    1.帶入的 ALL IN ONE HashKey及HashIV 對應的值貼相反
    2.帶入的 ALL IN ONE HashKey及HashIV 字母Key錯或多帶入空白鍵(建議使用複製貼上)
    3.將 ALL IN ONE HashKey及HashIV 當作參數一起送出亦會產生此錯誤
    4.因為綠界僅支援UTF-8編碼,若送出的參數中含有亂碼則會無法計算檢查碼(建議可以使用 Fiddler Web Debugger做檢查喔!)
    5.參數帶入時是否有依照A-Z的字母排序(遇第一個英名字母相同時,以第二個英名字母來比較,以此類推)
    6.請確認您的語言的 UrlEncode function 轉換後的結果符合附錄 URLEncode 轉換表中的「.NET 編碼 (ECPAY)」欄位值,若有不符合的字元,請用字元替換功能處理,以免無法符合檢查規則。

測試的廠商編號

  • 要用非OPT的才能成功付款

是真是假

  • 送出訂單後, sdk 會產出如下圖的 html 畫面
  • 當我們填完付款資訊(信用卡)按下付款後,會開始跑許多 request,其中好多 Name 一樣的 request,讓我有點看不懂:
  1. DoAutoSubmitForm: https://payment-stage.ecpay.com.tw/Common/DoAutoSubmitForm?timestamp=1569398732

  2. DoAutoSubmitForm: https://pay-stage.ecpay.com.tw/Common/DoAutoSubmitForm?waitForSecond=0&timestamp=1569398733

  3. DoAutoSubmitForm: https://cc-stage.ecpay.com.tw/Common/DoAutoSubmitForm?waitForSecond=0&timestamp=1569398734

  1. DoAutoSubmitForm: https://pay-stage.ecpay.com.tw/Common/DoAutoSubmitForm?waitForSecond=0&timestamp=1569398747

跑完之後,會轉到成功畫面

流程

我們看到範例最後是呼叫 SDK 的 CheckOut 函式,於是我們到 SDK(ECPay.Payment.Integration.php)裡看,範例傳什麼東西給 ECpay server。

static function CheckOut($target = "_self",$arParameters = array(),$arExtend = array(),$HashKey='',$HashIV='',$ServiceURL=''){

    $arParameters = self::process($arParameters,$arExtend);
    //產生檢查碼
    $szCheckMacValue = ECPay_CheckMacValue::generate($arParameters,$HashKey,$HashIV,$arParameters['EncryptType']);

    //生成表單,自動送出
    $szHtml = parent::HtmlEncode($target, $arParameters, $ServiceURL, $szCheckMacValue, '') ;
    echo $szHtml ;
    exit;
}

為了方便印出來看我們先將 $arParameters 從 array 轉成 string,有以下三種方法:

  1. var_dump($arr_x)
array(25) {
  ["MerchantID"]=>
  string(7) "2000132"
  ["EncryptType"]=>
  string(1) "1"
  .
  .
  .
  }
  1. print_r($arr_x)
Array
(
    [MerchantID] => 2000132
    [EncryptType] => 1
.
.
.
)
  1. print json_encode($arr_x)
{"MerchantID":"2000132","EncryptType":"1", ...
}

想要用 json_encode 完的格式丟給 postman 送出訂單資訊,不過會出現:

訊息代碼 Message code:10200073<br>
訊息說明 Description:CheckMacValue Error.

還沒研究明確原因

Postman 小技巧分享:

  1. Json 格式的資料可以直接貼上 form-data 或 x-www-form-urlencoded
{"MerchantID":"2000214","EncryptType":"1","ReturnURL":"http:\/\/www.ecpay.com.tw\/receive.php","ClientBackURL":"","OrderResultURL":"","MerchantTradeNo":"Test1569413219","MerchantTradeDate":"2019\/09\/25 12:06:59","PaymentType":"aio","TotalAmount":2000,"TradeDesc":"good to drink","ChoosePayment":"ALL","Remark":"","ChooseSubPayment":"","NeedExtraPaidInfo":"N","DeviceSource":"","IgnorePayment":"","InvoiceMark":"","StoreID":"","CustomField1":"","CustomField2":"","CustomField3":"","CustomField4":"","HoldTradeAMT":0,"ItemURL":"dedwed","ItemName":"\u6b50\u4ed8\u5bf6\u9ed1\u829d\u9ebb\u8c46\u6f3f 2000 \u5143 x 1"}

晚生學習分享所學經驗,若內容有誤或不清楚,煩請不吝指教!更是歡迎各位大神多多補充,感謝萬分!


上一篇
[Day9] 金流平台的主要函式之概觀
下一篇
[Day11] clone github laravel-shop project
系列文
PHP新手30天實戰金流34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言