一文搞懂“支付核心”
在新零售SaaS收银系统中,支付核心起到了至关重要的作用,这篇文章里,作者针对支付核心做了解读和梳理,想了解的同学,不妨来看一下。
一、概念
支付核心,是处理不同业务线支付的核心模块。
具体做的内容就是:一笔订单由交易系统请求下单,支付系统将此账单的支付指令,传递给上游支付渠道,最终完成支付并处理业务支付结果。
这其中,在新零售SaaS收银系统中,支付核心起到了至关重要的作用。
它承载着内部业务和外部渠道支付,最终促成交易闭环。
二、收银台API的本质
用户在收银台完成下单支付,在整个收银系统中不光要靠线上/线下的可视化收银台,还需要一套接口收银台。
在准备封装前 ,我们先来深挖一下收银台的本质是什么?
在传统收银台前,收银台是要促成买家和卖家交易并完成支付。也就是我们常说的,一手交钱一手交货。钱从买家的钱包转移到了卖家的钱包中。
在现代收银台前,收银台可能是线下终端收银台,也可能是线上收银台。卖家将商品或服务提供给买家,钱从买家账户转移到卖家账户中。
不管在传统收银台,还是现代收银台,要完成交易,支付是其中必备的一环。
支付:就需要将钱从买方转移到卖方。其中交易媒介就是我们的账户。
当我们站在最上层结算银行的角度来看这个支付过程时,它就是对账户进行借记贷记操作。
对账户的操作有:存钱,转账,消费,退款等操作。银行方会对此封装出各类操作的接口,提供给下游平台使用。
针对这些操作,第三方支付渠道,银行等会结合下层应用的场景,封装出不同的支付产品,来供它的下游平台或商户使用。
新零售SaaS软件服务商,也需要根据自己的客户业务场景,封装出一套收银台接口。同时也需要选择适合自己业务场景的渠道支付产品进行对接。最终来为客户的收银场景提供支付服务。
收银台的API封装本质:就是根据不同的支付业务场景,传递不同的支付指令,来对买方和卖方的账户进行借记贷记操作。
只不过这其中经由多个下层,根据服务业务场景,层层封装成该渠道的支付产品而已。
那么支付核心到底要如何封装收银台API?
又该如何确定支付渠道产品是否能支对接呢?
三、如何封装收银台API
1. 分析行业不同业务线的支付场景
有线上支付、线下支付、智能机具,礼品卡券等支付场景。
- 线上支付:主要是 小程序支付,公众号支付,H5支付,PC网关支付、APP支付等
- 线下支付:银行卡支付,云闪付,微信、支付宝等钱包类支付,数字人民币等
- 智能收银终端: 智能POS,MIS-POS,聚合人脸支付等
- 卡券:会员卡、优惠券支付、次卡、电子礼品卡、电子现金券等
2. 选择合适的支付方式
根据公司不同业务线的支付场景,我们需要找到合适的支付渠道产品。
结合银行、第三方提供的支付渠道产品,新零售SaaS收银行业的业务,需要B扫C,C扫B,JSAPI,APP,刷脸等支付方式。
当我们确定好所选支付渠道产品时,首要考虑的内容就是支付渠道产品的应用场景,
是否适配新零售SaaS收银系统的业务线。其次考虑通道的安全性,稳定性,手续费率等问题。
我们这里主要从接口角度,来分析业务场景是否适配。
那么我们该如何审核渠道接口文档是否适配新零售SaaS收银系统业务场景呢?
四、审核渠道接口文档
此小节,着重从开发角度来审核渠道支付接口是否符合业务所需。
接口文档中也是,只以核心参数拿出来作为判断依据。
根据上面分析的新零售SaaS收银系统业务线, 我们确定了要对接B扫C,JSAPI(小程序,扫码点餐)支付,C扫B接口 还有刷脸支付。
为了促使交易支付流程的完整性,不只是需要支付操作的接口,还需要订单查询、退款、退款查询、撤销、异步回调推送订单状态。
接下来就需要明确支付通道方提供的接口中必填业务参数, 新零售SaaS收银系统是否支持对接。
同时,新零售SaaS收银系统的支付参数必传项,通道方是否支持。
1. B扫C
此接口需要注意的点:上游平台商户号,商户订单号,付款码, 付款金额,单品优惠详情、落单号。
上游平台商户号(必填):这个参数是每个接口必须得,它是上游渠道判断指令来源于哪个商户的重要依据。
商户平台唯一订单号(必填):需要注意订单号长度超长的情况或定制化规则。不同通道要求不同,开发需要单独来处理。
付款金额(必填):单位要看清是分还是元,在实际编码的过程中,开发需要使用BigDecaimal类型转换,警惕使用Double方式进行转换,从而来避免精度丢失问题。
单品优惠详情(非必填):渠道方或者商户想要针对商品优惠,开发需要上传此信息给上游渠道。
此字段需要格外注意商户传入的商品名称是否有特殊字符,开发需要进行单独过滤或者编码,防止支付验签报错。
回调推送地址(非必填):接口中存在此字段建议上传,能够异步接收订单状态。不过度依赖程序定时任务查询,减轻服务器压力。
响应参数中的落单号(非必填):此字段如果接口能返回最好也要记录下来,方便商家给客户退款时,直接扫描落单号直接发起退款。从而减少商家输入商户订单号,这种繁琐的退款步骤。
2. C扫B
此接口响应字段中的 支付链接(必填),是预下单之后返回的付款二维码。扫描付款二维码 进入到线上收银台 进行支付。
其他字段解读同【B扫C】。
3. JSAPI
使用场景主要在微信小程序或者支付宝小程序。
如果是微信场景:接口中小程序APPID和 用户标识 是必须传入的。响应结果中会返回拉起微信支付控件的必备参数。
如果是支付宝场景:接口用户标识必传。响应结果中返回支付宝订单号,是用来拉起支付宝控件。
其他字段解读同【B扫C】。
说明:微信小程序支付 和 支付宝小程序支付;对接此方法,还需要对接回调方法。
关键点:回调地址,微信subAppId,微信或支付宝用户ID。
4. 刷脸支付
刷脸支付,分为支付宝刷脸和微信刷脸。
此场景下依赖前端POS或IOT小程序较多。更多的是需要前端去初始化调用官方提供的文档接口。
支付宝,是前端直接调用平台接口获取刷脸付款码,然后调用B扫C接口便可以拉起支付。
微信,是需要后台提供一个接口拉获取微信刷脸调用凭证。
最终,前端调用刷脸识别SDK,获取刷脸付款码后,调用B扫C进行支付。
这里是微信获取刷脸调用凭证的接口,核心参数展示。
5. 订单支付查询
订单支付状态不明确时、需要查询订单支付状态等详细信息时,需要调用此接口。
核心请求参数,通常是只需要传入两个参数即可。平台商户号和订单号(商户平台支付订单号或者是上游平台的支付订单号)。
很多渠道方支付文档,都会优先使用渠道方的订单号。但站在开发对接者的角度是有漏洞的。
比如:新零售SaaS收银系统一笔支付单,请求上游渠道方支付完成,会存在无法拿到支付响应结果的情况。
因为在支付过程中,网络波动后请求超时,导致商户收银系统无法拿到上游返回的支付订单号。
所以此时,就需要订单支付查询接口,有一个商户平台支付订单号(下文中的orderCode)的 参数。
当存在这种情况时,商户收银系统依旧可以查询到支付结果。而不是,只能依赖渠道方订单号。
我们在审核渠道接口时,如果只能根据渠道方订单号查询订单详情,一定要向渠道方要求添加上商户平台支付订单号(orderCode)此参数。
6. 退款
核心请求参数:
退款必备关键性请求参数:refundNo(商户退款订单号,有时候此参数也不一定) 或 orderCode(商户支付订单号);
如果存在多次退款的情况,reundNo(商户退款订单号)最好要有,方便追踪退款记录。
其他字段解读同【B扫C】。
7. 退款查询
此接口中,优先以商户平台单号查询,原因同【订单支付查询】。
其他字段解读同【B扫C】。
8. 撤销
涉及字段解读同【B扫C】。
9. 回调推送
对接线上JSAPI 、C扫B.接口必接。退款和支付都会存在回调信息推送。
如果支付或退款回调地址是以下拼装的后缀是订单ID这种方式,需要注意下通道退款推送规则,规则可能有不同。
如:https://www.xx.cn/pay/orderPay/xx/1 是支付推送,https://www.xx.cn/pay/orderPay/xx/2 是退款推送地址。
通道方通常会按照此地址直接进行推送,但也会有少数通道按照支付接口中传入的回调地址进行推送。
涉及字段解读同【B扫C】。
回调接口响应必备参数:
响应内容按照接口文档要求即可,通常是返回 success,fail。
五、支付核心流程
一笔支付请求来到支付核心要经历那些流程呢?
- 从不同应用场景中发来了一笔支付请求,进入到收银台API中
- 检查业务参数,是否满足当前支付操作的业务要求
- 幂等性验证
- 组装交易数据:如新零售SaaS收银系统中的商户基本信息,初始化状态
- 获取到支付账号路由
- 组装交易数据:支付渠道配置的商户号等信息
- 根据交易信息创建支付单
- 支付发送前,封装符合通道要求的业务参数。如:基本支付信息,加签,加密等
- 支付发送中,使用符合通道要求的请求方式,数据格式等。如post方式请求,使用json格式传递数据等
- 支付发送后,渠道方返回响应结果并验证结果。如:验签,解密。支付信息检查是否预期返回。
- 更新支付单,将支付状态等业务信息进行同步。如:更新状态支付状态,支付订单号,落单号,渠道号等信息
本文由 @PenguinPay 原创发布于人人都是产品经理。未经作者许可,禁止转载。
题图来自Unsplash,基于CC0协议。
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。
刚好在弄支付这块的对接,希望可以参考下