.NET 開發人員智付通 API 串接心路歷程與 Open Source
- 2017-06-19
- 25128
- 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 阿。








回應討論