.NET 開發人員智付通 API 串接心路歷程與 Open Source
- 2017-06-19
- 23498
- 0
近期內接了不少的金流【歐付寶】【綠界】【TapPay】【智付通】被搞的嫑嫑的,雖然這篇主要是要來說智付通的心路歷程,但我還是想來評論一下以上四種金流對於 .NET 開發人員的友善度,滿分是五顆星。
- 【歐付寶】
- 【綠 界】
- 【TapPay】
- 【智付通】
以上的友善度為個人觀感,串接的時間點為 2017-03 ~ 2017-06 之間,不代表往後的友善度。
智付通的資料傳遞是這樣設計的(我接的版本為 V1.4 )
- 將傳遞的資料使用 Query 的方式組合,如 key1=val1&key2=val2&key3=val3
- 使用智付通提供的 KEY 與 VI 對 Query 字串使用 AES 演算法加密
- 將 AES 字串使用 SHA256 做不可逆雜湊
以上為大致的做法雙向都是使用一樣的雜湊加密法(雷也都在裡面)
再我撞的亂七八糟後我通知了當初的窗口和她說
demo:「你們的文件和範例對於 .NET 開發人員實在太虐心了」
窗口:「怎麼說?」
demo:「範例沒有 C# 就算了,文字的描述漏東漏西,我最後是去查 PHP 文件後才看懂你們文件漏了什麼」
窗口:「哪部分漏了?」
demo:「多到我不知道怎麼說,不過我決定要把我寫的部分 Open Source 出來,不然這樣的文件我不知道要怎麼和我周圍寫 .NET 的朋友推薦…」
於是呢我接好以後就把它放上 GitHub 了,不過因為 demo 寫的都是只有自己會用的部分,不好意思稱呼為 SDK ,所以這是一個小幫手(Helper)
整個專案是由兩個 Helper 組合而成
- CryptoHelper.cs
- 主要的加解密與雜湊都在這裡
- MyHelper.cs
- 大無畏的類別,不屬於上面的都丟這(看不爽歡迎發 PR)
使用的方式也不難
public ActionResult Index() { var tradeInfo = new TradeInfo() { MerchantID = "MS12345678", RespondType = "JSON", TimeStamp = DateTime.Now.ToUnixTimeStamp(), Version = "1.4", Amt = 100, ItemDesc = "TTEESSTT", //InstFlag="3,6", //CreditRed = 0, Email = "demo@demo.demo", EmailModify = 0, LoginType = 0, MerchantOrderNo = DateTime.Now.Ticks.ToString(), TradeLimit = 180, //CVS=1, //ExpireDate=DateTime.Now.ToString("yyyyMMdd"), ReturnURL = "http://localhost:51639/home/index", }; var postData = tradeInfo.ToDictionary(); var cryptoHelper = new CryptoHelper(_key, _Vi); var aesString = cryptoHelper.GetAesString(postData); ViewData["TradeInfo"] = aesString; ViewData["TradeSha"] = cryptoHelper.GetSha256String(aesString); return PartialView(); }
該專案提供了 TradeInfo 物件,此物件是參考智付通文件建立的,內含所有可以傳遞的欄位,不過有些欄位的互斥條件並沒有處理,請使用者建立物件的時候自行處理,也因為要組成 QueryString 所以設計了一個方法可以把物件轉 Dictionary 這樣就可以很簡單的使用 LINQ 處理(偷雞到極致)。
再來建立 CryptoHelper 物件,並且使用建構子的方式把智付通提供的 Key , VI 傳入,就可以使用 GetAesString() 與 GetSha256String() 兩個方法得到需要的字串啦,有沒有超簡單?
交易結束後取得智付通的回傳也不難
[HttpPost] public ActionResult Index(SpGatewayResponse response) { response.Key = _key; response.Vi = _Vi; var success = response.Validate("MS12345678"); if (success) { var tradInfoModel=response.GetResponseModel<TradeInfoModel>(); } return View(); }
該專案設計了一個 SpGatewayResponse
物件,接到後請給 Key & VI 兩個屬性正確的值,這樣才可以正確驗證與還原,再來呼叫 Validate("商店編號")
方法可以檢查回傳的字串是否正確,確定回傳字串正確以後就可以使用 GetResponseModel<T>()
當然這個 T 你可以用專案提供的,也可以自己設計,畢竟我都用泛型了你爽就好。
基本上就是這樣,傳出去和接回來的部分都已經處理掉了,您只需處理自己系統的串接部分,應該可以大幅的減少串接金流所花費的時間,如果專案有任何不滿意不開心不喜歡不實用的部分,歡迎發 PR 阿。
回應討論