2014年11月29日 星期六

[聽演講筆記] PHP 也有 Day - 那些金流的二三事



非常幸運的有報到 11 月的 php 也有 Day,Ricky 大大要講金流處理的分享,我最這塊也是超有興趣的,還好有來聽,學習到很多經驗。

以下的筆記,是我個人在聽的一些紀錄,建議還是看影片比較真實哦。

相關網址:
Youtube:






以下是我的筆記,其實跟 slideshow 差不多拉,因為我去就是瘋狂紀錄這樣 XDD :

PHP 也有 Day - 那些金流的二三事


金流類型
  • 線上付款
    • 付款即時確認
    • 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



金流處理
  1. 加密
  2. hash
  3. 送請求到金流廠商
  4. 不處理資料庫寫入的動作


  • 離線金流的話要先建立事件通知 (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 慢慢收,而你的訂單的金額,銀行會把錢一次性的給你。 


完。

2014年11月21日 星期五

如何同時擁有多個 Bitbucket 帳號

這標題下得有點詭異,如果想要同時擁有多個 bitbucket 帳號,當然是一直申辦就有,不過我想說的是,因為不同帳號,可是擁有同一組 SSH public key,就會發生 『 Someone has already registered that SSH key.』 這樣的悲劇。所以問題就在於, SSH public key 不能共享。



最近公司剛好從 Gitlab 轉移到 bitbucket 的服務,不過由於我使用 bitbucket 有好長一段時間,並不希望個人 email 使用的帳戶跟公事的帳戶綁在一起,所以另以公司使用的 email 申請一組新的 account。


Step 1 : 產生另一組獨立使用的 SSH Key

$ ssh-keygen -f ~/.ssh/YOUR_NEW_ACCOUNT_NAME  -C “email”
$ pbcopy < ~/.ssh/YOUR_NEW_ACCOUNT_NAME.pub


範例,以我的 new account 為 winwu_youmeb : 
    $ ssh-keygen -f ~/.ssh/winwu_youmeb -C “win.wu[at]youmeb.com”
    $ pbcopy < ~/.ssh/winwu_youmeb.pub

將複製的這組 pub key 加到 bitbucket 的 account setting。


Step 2 : 修改 ~/.ssh/config

預設你可能已經有一組 HOST bitbucket.org,接著你要為為新加的 public key,設一組 host:


Clone Repo 上面所設定的 Host 跟你在 clone 新帳號的 repo 時大有關係。

接下來如果你是要 clone 新的 account 裡面的 repo,

  • 原本是 :   git clone git@bitbucket.org:youmeb/project-name.git
    (因為用這組會衝突到你之前的帳號)

  • 改成 :       git clone git@bitbucket-youmeb:youmeb/project-name.git

原本的 account 則不需要調整 clone repo 時的 HOST。






修改專案的 remote 位置

畢竟我們是從 gitlab 轉移至 bitbucket,因為本來的 repo 的 git remote 位置就必須修改:
你可以修正 .git/config。



完畢。

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...