非常幸運的有報到 11 月的 php 也有 Day,Ricky 大大要講金流處理的分享,我最這塊也是超有興趣的,還好有來聽,學習到很多經驗。
以下的筆記,是我個人在聽的一些紀錄,建議還是看影片比較真實哦。
相關網址:
Youtube:
以下是我的筆記,其實跟 slideshow 差不多拉,因為我去就是瘋狂紀錄這樣 XDD :
PHP 也有 Day - 那些金流的二三事
- 講者: Ricky Su
- 時間: 2014-11-20
- 活動網址: http://phptheday.kktix.cc/events/c80ec9f8-b9614e-4948f4-687e44-296d6c-929ace-716173-a6aa5e-d317e9-fb9523
金流類型
- 線上付款
- 付款即時確認
- credit card
- WebATM
- Paypal
- 支付寶
- 離現金流
- 訂單成立後有一段緩衝時間讓 user 付款,付款完成後才算成立。
- 超商繳費 (ibon, 條碼繳費)
- ATM 轉帳 (一次性) (虛擬帳號)
- 某些不讓你臨櫃繳款 lol
- 超商繳費: 金額不可以超過 20000 元 :8ball:
- 虛擬帳號 ATM: 使用繳費方式,不受三萬塊方式 :+1: (請記得選繳費而非轉帳)
- 轉帳:: 非約定戶單日上限 3 萬
金流 API
廠商要你簽 NDA,簽完才給你 API,再決定簽哪家之前只能問朋友了 xdd
API 串接流程
線上付款:
- 消費者-->請求付款--> 做一個 forward request (怕詐騙)
- 有些時候刷卡動作會把你導向一些金流平台,進行刷卡動作。
- 提供 redirect url 給金流平台。
- 驗證完成後會 callback 讓你知道有刷過還是沒有刷過。
- 有些金流廠商的 callback,是把訊息封裝完之後,由 user 端帶回來給你 (類似加密過的資訊直接帶給消費者的瀏覽器)
- 付款請求資訊欄位
- 簽約完之後會給你一組商家代碼
- 訂單編號
- 付款方式
- 金額
- 繳費截止時間 (虛擬帳號或是ibon,有些平台允許你加入繳費截止時間,時間都是以『天』來算)
- ibon 會要求你提供訂單明細(繳費單會列項目是什麼)
離線金流:
- user 請求付款,電商回傳繳費代碼。
- 銷帳: user 至超商,一繳錢/匯款後,就會通知金流平台-->繳費成功-->繳費成功通知,進入結賬程序-->通知 user 已收到錢。
付款結果通知欄位
- 商家代碼
- 訂單編號
- 付款方式
- 金額
- 交易狀態(成功或失敗)
- 交易時間
- (有些金流商不讓你設定繳款時間,因為有 user 就是未超過繳費時間才繳費,最後我們會用人工的方式去確認繳費時間)
如何驗證欄位
金流商最後要給我們的 callback。
Note: 你不會知道這是不是真的金流商送的,相對的金流商也不知道是不是真的你。通常他們首先都會先產生一組 key(共同持有),將欄位加密後傳後,能解密 callback 的資料就是真的資料。
- 某綠色金流商採用的方式為
- key/IV 由金流商以及商家共同持有。
- 簽完約金流商就會給你了。
- 資料已 XML 封裝。
- 要簽湊齊 16 bytes 的整數倍。
- 要補 padding(PKCS7 padding)
- PHP:
- 加密: function AESEncrypt($xml, $key, $iv)...
- 解密: function AESDecrypt(...)
- 要把padding 解掉。
- AES 128 CBC Mode..... 加密。
- CBC 是以一塊一塊的方式來加密,所以是有固定的長度的。
- 將欄位與 key 依照特定格式 加密為 MD5...??@#@$@% (沒跟到 T_T )
- 接收端驗證 MD5
訂單資料結構
- 訂單狀態 (有效/作廢)
- 交易方式 (credit card/ ATM / ibon)
- 交易狀態 (succes / ing / fail)
- 繳款代碼
- 交易有效期限
- 付款時間
- 訂單建立時間
程式架構
- 跟金流商串接
- callback 接
- 一條龍的程式架構
- 金流方式一直增加,以上流程無限迴圈 ?
- 最可怕的事,在串接新的金流時,有些廠商沒有測試平台 (OS: 真是驚人..... )
分為商業邏輯跟金流處理
商業邏輯
- 處理 user 付款流程
- 專注在跟訂單相關的事件
- 變動訂單的狀態
- 處理動作是由事件驅動
- 一堆 callback 等著商業邏輯來 call
- Example :
- 更新資料庫繳款代碼
- 發送簡訊
- 寄送email
金流處理
- 加密
- hash
- 送請求到金流廠商
- 不處理資料庫寫入的動作
- 離線金流的話要先建立事件通知 (event) 商業邏輯。
- 當消費者繳費了,金流商會給我們 callback 處理,一樣是處理事件通知。
返回 (Redirect Url)
- 返回到商業邏輯,帶著訂單編號等資料,從資料庫 match data,然後做訂單狀態顯示。
- 訂單狀態 response http status code 為依據
實作 Event
- Symfony (Laravel) / Pear Event Dispatcher
- 自己刻一個 XD
如何測試
- 金流處理如何送出 Event?
- 我發出訊息給金流廠商,廠商回傳繳費代碼
- 實作邏輯兩件事:
- 收到繳費代碼事件的 callback
- 負責更新狀態
- 送 email
- 送簡訊...
Event callback works?
- by 事件 event 去 call 他。
- 一開始程式就要註冊好,收到 event 之後要做什麼事情。
Note
注意 :
ATM 繳款的話,要看你的金流廠商怎麼做,比如說多繳錢或是少繳錢,有些廠商會給錯誤訊息,但有些廠商會給成功訊息。
Q: 產生訂單編號都用哪些方法?
產生訂單編號,最忌諱流水號,因為容易被猜到。
講者的慣例是 :
第一位按照訂單類型編號
第二位為年 (ex: 2014 只取 14),哪一年的哪一天(太陽日,一年之類的第幾天)
幾點幾分幾秒產生 (同一秒會有人同時交易,所以後面會有 randon 三位數 rand (100, 999) )
國外金流手續費太高 paypal lol
(光抽的 % 數就差很多)
銀聯卡
會有固定匯率的問題,每半年程式就要調整。 (可能是國外的金流才有這個問題)
Q: 有無串國外金流的部分?
國外金流手續費太高 paypal (光抽的 % 數就差很多)
銀聯卡
會有固定匯率的問題,每半年程式就要調整。 (可能是國外的金流才有這個問題)
Q: 多久掃一次繳費截止時間?
常常去掃的話會太頻繁。
有人下訂單才會去掃,有效跟無效的,在計算已經超過繳費時間的一次作廢掉。
Q: 離線金流要怎麼知道 user 已經繳費
如果你是透過這些金流廠商,有些廠商會主動 callback。
有些虛擬帳號的部分不會主動 callback,你要定期去要,回傳恐怖的 CSV XDD
Q: 什麼時間點去扣庫存 ? 先扣還是後扣?
這通常是無解的問題...
只要有訂單下訂,我們就會保留名額,會有時間限制 (ex: 過了一天沒繳費就把庫存加回來,然後此訂單作廢)
來賓發言: 只要有人把東西放到購物車,就會先扣,這個問題就會比較少。
Q: 分期處理是否有相關的經驗 ?
有些銀行期數太多,手續費是不一樣的
基本上只是剛開始帶入的參數不一樣,即使分期,實際上收錢是銀行跟 user 慢慢收,而你的訂單的金額,銀行會把錢一次性的給你。
完。