支付系统 - 开放平台 REST API 设计实践

2,831 阅读4分钟

根据我们之前的整体介绍,和业务方交互我们使用的是 HTTP 协议。我们称提供 WEB 接口支持的服务为开放平台(其实每家公司都有自己的叫法,领会精神)。开放平台的职责为支付平台化后,系统内部接口不可对外,所有的外部系统交互统一与开放平台交互,完成服务收口。所以一些格式、参数校验可以在这里完成,进而将请求转发的服务层。

由于这些接口都是提供给外部调用方的,接口的设计好坏直接影响到了对接方的使用体验。某种程度上,它还是我们的脸面。作为一名专业的开发者,我们都不希望自己设计的接口被别人吐槽不好用、不专业、能用。因此,本篇幅着重分析如何设计 API,希望大家能够重视起来,做一个专业的开发者。

接口需求

首先,我们和业务方通过 HTTP 协议进行通信,接口以 URL 的形式提供,使用目前最主流的 JSON 格式,并且以 application/json 的格式进行 POST 提交。接口分两种:服务接口、通知回调接口。服务接口由开放平台提供,供业务方调用。回调通知接口由业务平台提供,由支付系统进行主动调用。所以,需要设计的是服务接口。

微信支付接口设计

这里是 微信支付接口 的入口地址,不同的支付场景读者可以自行点进去查看。

微信支付场景
微信支付场景


我们还是以扫码支付的流程进行分析。点击 Native 支付,我们可以看到如下的图:

微信API列表
微信API列表

基本上对接微信支付,从开发交易到后期的对账,这些 API 都在这里了。这里我简单列了个表格,方便大家参考。

接口 URI
统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
查询订单 https://api.mch.weixin.qq.com/pay/orderquery
关闭订单 https://api.mch.weixin.qq.com/pay/closeorder
申请退款 https://api.mch.weixin.qq.com/secapi/pay/refund
查询退款 https://api.mch.weixin.qq.com/pay/refundquery
下载交易账单 https://api.mch.weixin.qq.com/pay/downloadbill
下载资金账单 https://api.mch.weixin.qq.com/pay/downloadfundflow

OK,我们看到微信支付的接口设计是 RESTful 风格。这里也提一下 RESTful 设计时常用的准则:
  • 见名知意,可读性强。如 https://gitbook.cn/gitchat/categories/5d8b7c3786194a1921979122 一看就是分类。
  • 不要搞一些花里胡哨的外语,以为自己很酷。比如 https://api.famous/donald-trump 不知道的人以为是介绍特朗普,其实可能只是某个开发同学的 demo 首页。
  • 不要在结尾加/,不要使用_,不要使用大写。
  • 不要英文中文拼音混用。
  • 一般不需要 RESTful 提示信息和版本,如 https://gitbook.cn/gitchat/v2/restful/categories/1013 太臃肿。


举例,如微信查询退款的接口也可以设计为 /pay/refund-query,但是千万不要搞一个 /pay/refundQuery 为难调用者。

支付宝支付接口设计

这里是 支付宝开放平台文档 的入口地址,这个页面偏从零开始,如何使用 SDK 进行对接,点击后可以看到如下页面:

支付宝开放平台文档
支付宝开放平台文档

支付宝我们同样以扫码支付的流程进行分析。

支付宝接口SDK
支付宝接口SDK
支付宝接口说明
支付宝接口说明

第一幅图是扫码支付快速接入中对【搭建和配置开发环境】中的说明,可以看到调用支付宝接口可以使用其提供更多 SDK,很重要的一点是配置参数 URL 时统一的值https://openapi.alipay.com/gateway.do。第二幅图是【API】列表中扫码支付的说明。

再来看看 支付 API 文档 的介绍,注意图中标红的部分:

支付API文档
支付API文档

通过以上分析,可以看出支付宝接口使用统一的网关,只有一个入口,内部使用参数进行路由。这种 API 的设计方式我们称之为命令模式。是一种大一统的设计方案,缺点是做负载均衡会稍微麻烦点,优点是扩展方便,直接增加 method 的值即可进行内部路由。

支付规范命名参考

统一的命名规范带来的好处不言而喻。为此,我整理了一下微信和支付宝中高频词汇的英文命名,大家觉得好的可以参考,当然自己用起来舒服最重要。

名称 微信 支付宝
商户号 mch_id
应用 ID app_id app_id
随机字符串 nonce_str
签名 sign sign
签名类型 sign_type sign_type
标题 subject
商品描述 body body
商户订单号 out_trade_no out_trade_no
支付订单号 transaction_id trade_no
交易起始时间 time_start
交易结束时间 time_expire
标价金额 total_fee total_amount
通知地址 notify_url notify_url
交易类型 trade_type
交易状态 trade_state trade_status
商品 ID product_id goods_id
返回状态码 return_code code
返回信息 return_msg msg
业务结果 result_code sub_code
业务结果描述 sub_msg
错误代码 err_code
错误代码描述 err_code_des