银行支付系统API设计理念

2023-12-12  本文已影响0人  鸿雁长飞光不度

说起支付,每个人可能想到的是微信、支付宝,其实他们都是后来者,属于第三方支付,论历史还得属银行久远。在中国银行不仅代表了最正确和最前沿的支付的方向,更代表了社会主义的最先进的生产力。尤其是在“互联网+”潮流下,各个银行每年在互联网信息化方面投入上百亿,争当时代的引领者。鄙人有幸对接了中国农行的支付方式,

下面分享一些学到的设计理念,文档入口:https://bank.u51.com/ebus-two/docs

  1. 暴露状态码。

    RetunCodeEUNKWNPR0000EOSCUNKWNAP5168时,不代表交易失败,仅代表交易结果不明确,交易结果需要进行查证确认。

    • 只需要告诉用户不明确结果和成功,明确的失败不需要告诉用户,让他们自己猜或者主动测试。

    • 不用解释每个错误码具体含义,以免增加对接方心智负担。

    • 不需要提供一个错误码和对应业务场景的语义列表,以免带来更多的维护成本。

  2. 提供Java版本的Demo

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

    给对接方提供一个java版本的demo有助于业务方快速了解业务,同时给demo文件一定要包含两种以上的不同的字符集编码格式,不要用UTF8,要给打开demo的人一些想象空间和惊喜,让他们自己去猜到底应该用哪种字符集解析。

image-1.png image-2.png image-20231213144151772.png
  1. 不要提供清晰的加签、验签流程说明

    • 不要用自然语言清晰的描述加签验签流程或者提供非java语言的代码案例,要让对接方看demo或者自己猜,这也是判断是否是目标用户群的一个方式。

    • 一定不要用UTF8编码,比如可以用GBK或者其他编码,同时把编码和加签验签结合起来,一来可以凸显自己的特色,同时也能帮对接方回忆一下字符集相关的知识。

    • 采用多样的数据格式,比如提供http请求接口要采用json数据格式,给用户的回调采用xml格式,xml格式拥有悠久的历史,这也是校验对接方技术人员工作经验和技术水平的一种方式。

  2. 只提供错误的案例

    { "MSG": { "Message": { "Version": "V3.0.0", "Format": "JSON", "Common": { "Channel": "" }, "Merchant": { "ECMerchantType": "EBUS", "MerchantID": "103882200000958" }, "ReturnCode": "AP7745", "ErrorMessage": "该终端号未在当前商户维护,请联系银行工作人员前往网络金融运营管理平台进行维护", "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,对接方需要取到对应的值进行处理。在设计的时候一定要采用不同的字段,显示的向对接方传达内部接口升级的事实,要让他们感知到自己的存在。不要让对接方以为仅仅换一个接口名,参数返回值完全都完全相同,要让他们对自己的改动做check,养成良好的习惯

  2. 返回结构多样化

比如:下面的请求结果,一个采用平铺、一个采用嵌套,甚至可以更加不拘一格写出更加多样的结构.

8e9e-225b8370c9c3.png 9fcee091ac5a.png
  1. 参数和字段命名

    • 要让文档发挥不可替代的作用,否则文档编写意义就没有那么大了,比如

    NewOrderNo: 退款单号,用于查询退款状态。

    OrderNo:支付单号。

    这样没有对应的文档说明,很难知道对应字段的含义。

    • 要传一些没有看起来没有必要的参数

    退款接口让业务方必传日期和时间

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

    这样可以用自己服务器的时间和对接方请求的时间做一个对比,以便计算网络延迟。

  2. 内部的常识就是业界的常识

    比如: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编码。

    • 数据真正格式是XML,验签的简短的案例是JSON,其实不完全适用,甚至会有一些误导。

    比如:交易相关的请求的url是https://pay.abchina.com/ebus/ReceiveMerchantTrxReqServlet,你也不需要写在对应的接口文档上,你只需要写com.abc.pay.client.ebus.common.EBusMerchantCommonRequest,懂的自然懂,不懂的说明你没有看java版的demo。

  3. 节约成本

    降本增效是未来发展的主旋律,在一些服务器资源相关方面也是应该有所考量。

  1. 实践是检验真理的唯一标准

如果对接方对流程有疑问让业务方自己做实验尝试,这个可以保证最新最准确的结果。


银行系统设计博大精深,个人能力有限只能略微学到一些皮毛,不过在网上看到过一些其他人也有不同的收获:

https://www.jianshu.com/p/4a7778d5705b

https://www.jianshu.com/p/8ecd39452610

上一篇 下一篇

猜你喜欢

热点阅读