銀行支付系統(tǒng)API設(shè)計理念

說起支付,每個人可能想到的是微信、支付寶,其實他們都是后來者,屬于第三方支付,論歷史還得屬銀行久遠(yuǎn)。在中國銀行不僅代表了最正確和最前沿的支付的方向,更代表了社會主義的最先進(jìn)的生產(chǎn)力。尤其是在“互聯(lián)網(wǎng)+”潮流下,各個銀行每年在互聯(lián)網(wǎng)信息化方面投入上百億,爭當(dāng)時代的引領(lǐng)者。鄙人有幸對接了中國農(nóng)行的支付方式,

下面分享一些學(xué)到的設(shè)計理念,文檔入口:https://bank.u51.com/ebus-two/docs

  1. 暴露狀態(tài)碼。

    當(dāng)RetunCodeEUNKWNPR0000EOSCUNKWNAP5168時,不代表交易失敗,僅代表交易結(jié)果不明確,交易結(jié)果需要進(jìn)行查證確認(rèn)。

    • 只需要告訴用戶不明確結(jié)果和成功,明確的失敗不需要告訴用戶,讓他們自己猜或者主動測試。

    • 不用解釋每個錯誤碼具體含義,以免增加對接方心智負(fù)擔(dān)。

    • 不需要提供一個錯誤碼和對應(yīng)業(yè)務(wù)場景的語義列表,以免帶來更多的維護(hù)成本。

  2. 提供Java版本的Demo

    https://bank.u51.com/ebus-two/docs/#/quick-start/brefore-start

    給對接方提供一個java版本的demo有助于業(yè)務(wù)方快速了解業(yè)務(wù),同時給demo文件一定要包含兩種以上的不同的字符集編碼格式,不要用UTF8,要給打開demo的人一些想象空間和驚喜,讓他們自己去猜到底應(yīng)該用哪種字符集解析。

image-1.png
image-2.png
image-20231213144151772.png
  • 不同字符集體現(xiàn)了內(nèi)部多樣化的開發(fā)環(huán)境,也是向?qū)臃秸故咀约很泴嵙Φ囊粋€窗口。

  • 雖然有些中文是亂碼,但是很多都是代碼注釋信息,俗話說代碼即注釋,這也是代碼質(zhì)量的一種自信。

  • 不要提供其他的語言的包

    • java才是主流,用其他語言比如php、go的公司肯定做不大,要直接在編程語言上幫公司過濾沒有價值的客戶,這也是技術(shù)要理解和支持業(yè)務(wù)發(fā)展的表現(xiàn)。

    • 不懂java、不會運行java-demo的對接方不是目標(biāo)用戶群。

  1. 不要提供清晰的加簽、驗簽流程說明

    • 不要用自然語言清晰的描述加簽驗簽流程或者提供非java語言的代碼案例,要讓對接方看demo或者自己猜,這也是判斷是否是目標(biāo)用戶群的一個方式。

    • 一定不要用UTF8編碼,比如可以用GBK或者其他編碼,同時把編碼和加簽驗簽結(jié)合起來,一來可以凸顯自己的特色,同時也能幫對接方回憶一下字符集相關(guān)的知識。

    • 采用多樣的數(shù)據(jù)格式,比如提供http請求接口要采用json數(shù)據(jù)格式,給用戶的回調(diào)采用xml格式,xml格式擁有悠久的歷史,這也是校驗對接方技術(shù)人員工作經(jīng)驗和技術(shù)水平的一種方式。

  2. 只提供錯誤的案例

    { "MSG": { "Message": { "Version": "V3.0.0", "Format": "JSON", "Common": { "Channel": "" }, "Merchant": { "ECMerchantType": "EBUS", "MerchantID": "103882200000958" }, "ReturnCode": "AP7745", "ErrorMessage": "該終端號未在當(dāng)前商戶維護(hù),請聯(lián)系銀行工作人員前往網(wǎng)絡(luò)金融運營管理平臺進(jìn)行維護(hù)", "TrxType": "ScanPayOrderReq", "OrderNo": "No20220909100002751953", "OrderAmount": "1.00", "ScanPayQRURL": "" }, "Signature-Algorithm": "SHA1withRSA", "Signature": "dSlArjRftdC3uXVtA4mwDppnSbgDa1gOQMnZ4ZYluk5hlXGtW0b2OqCjuqrX2Oxwt5obszuWXk2qkzWcSiyvp64hP7cC7Ps+5FKM3SQwVbnvXLTVM2ODYtH6lG1s3ogSTzEWyvb+Tukqm8SupnlI8ycsfayRvd80qGUAMn9Msj0=" } }

給用戶提供接口只提供錯誤的案例,幫助用戶加深錯誤的印象。比如上面案例中ScanPayQRURL在成功場景下返回的格式是什么,要讓對接方自己測試。

  1. 接口升級要具備一定不兼容性。

    比如舊接口和新接口的返回值:

    https://pay.abchina.com/ebusperbank/PaymentModeNewAct.ebf?TOKEN=15753560246988869886

    https://wx.test.abchina.com/mpay1/mobileBank/zh_CN/EBusinessModule/BarcodeH5Act.aspx?token=16655410551410037795

    token和TOKEN,對接方需要取到對應(yīng)的值進(jìn)行處理。在設(shè)計的時候一定要采用不同的字段,顯示的向?qū)臃絺鬟_(dá)內(nèi)部接口升級的事實,要讓他們感知到自己的存在。不要讓對接方以為僅僅換一個接口名,參數(shù)返回值完全都完全相同,要讓他們對自己的改動做check,養(yǎng)成良好的習(xí)慣

  2. 返回結(jié)構(gòu)多樣化

比如:下面的請求結(jié)果,一個采用平鋪、一個采用嵌套,甚至可以更加不拘一格寫出更加多樣的結(jié)構(gòu).

8e9e-225b8370c9c3.png
9fcee091ac5a.png
  • 這樣可以向?qū)臃秸故咀约喊蓍_放多樣化的代碼風(fēng)格。

  • 給對接方留下疑問:是文檔寫錯了?還是真是這樣設(shè)計的?這樣是不是就不能復(fù)用了?

  1. 參數(shù)和字段命名

    • 要讓文檔發(fā)揮不可替代的作用,否則文檔編寫意義就沒有那么大了,比如

    NewOrderNo: 退款單號,用于查詢退款狀態(tài)。

    OrderNo:支付單號。

    這樣沒有對應(yīng)的文檔說明,很難知道對應(yīng)字段的含義。

    • 要傳一些沒有看起來沒有必要的參數(shù)

    退款接口讓業(yè)務(wù)方必傳日期和時間

    OrderDate String 10 退款日期 2019/12/23
    OrderTime String 8 退款時間 11:55:30

    這樣可以用自己服務(wù)器的時間和對接方請求的時間做一個對比,以便計算網(wǎng)絡(luò)延遲。

  2. 內(nèi)部的常識就是業(yè)界的常識

    比如:https://bank.u51.com/ebus-two/docs/#/api/pay/payment-result-notify/abc-payment-result-notify?id=%e8%af%b7%e6%b1%82%e5%8f%82%e6%95%b0。

    下面的事情是沒有必要告知對接方的

    • 采用了post請求,但是選用了urlencoded form格式。

    • 字符集是非UTF8編碼。

    • 數(shù)據(jù)真正格式是XML,驗簽的簡短的案例是JSON,其實不完全適用,甚至?xí)幸恍┱`導(dǎo)。

    比如:交易相關(guān)的請求的url是https://pay.abchina.com/ebus/ReceiveMerchantTrxReqServlet,你也不需要寫在對應(yīng)的接口文檔上,你只需要寫com.abc.pay.client.ebus.common.EBusMerchantCommonRequest,懂的自然懂,不懂的說明你沒有看java版的demo。

  3. 節(jié)約成本

    降本增效是未來發(fā)展的主旋律,在一些服務(wù)器資源相關(guān)方面也是應(yīng)該有所考量。

  • 用戶超時未支付以后不要主動關(guān)閉支付單,要始終保持支付單的狀態(tài)是未支付。

    • 超時關(guān)單一般用異步消息,訂單量大的時候發(fā)消息也是一種浪費,所以超時未支付不更改狀態(tài)。

    • 對接方在支付超時后查詢支付單狀態(tài)依然要保持未支付的狀態(tài),千萬不要結(jié)合“status = 未支付 && exipre_time < 當(dāng)前時間” 給對接方轉(zhuǎn)換成一個closed狀態(tài),要最原始的狀態(tài)暴漏給對接方。

  • 回調(diào)通知盡可能的少

    • 只回調(diào)業(yè)務(wù)方一次,不論對方是否成功處理,不做重試。

    • 最多回調(diào)3次。

  1. 實踐是檢驗真理的唯一標(biāo)準(zhǔn)
  • 不需要整理對接方常見的問題,并回答。

  • 不需要畫流程圖,不需要對異常情況進(jìn)行總結(jié)。

如果對接方對流程有疑問讓業(yè)務(wù)方自己做實驗嘗試,這個可以保證最新最準(zhǔn)確的結(jié)果。


銀行系統(tǒng)設(shè)計博大精深,個人能力有限只能略微學(xué)到一些皮毛,不過在網(wǎng)上看到過一些其他人也有不同的收獲:

http://www.itdecent.cn/p/4a7778d5705b

http://www.itdecent.cn/p/8ecd39452610

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容