轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

楼下小黑哥 小黑十一点半安全

前言

最近因为业务需求,须要开发付款码功能,该接口底层将会聚合市面上主流钱包 APP 的付款码功能,如微信支付,支付宝支付。微信

ps:付款码支付别称有不少,如微信支付端支付产品为付款码支付(以前的文档叫作刷卡支付),而支付宝端产品为当面付-条支付,而有些文档会成为二维码被扫支付。
下文统一使用微信的定义方式,统称为付款码支付。异步

可能有些同窗对于付款码支付这个听起来很陌生,其实这个功能咱们可能天天都在被使用。
像咱们在便利店买个早饭,最后结帐时,使用支付宝/微信支付付款。收银员会让咱们展现支付宝/微信付款码,而后使用扫码枪获取此码,最后上送给微信/支付宝服务端完成一次扣款。
以支付宝为例,具体用户端支付流程以下:
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创
来源自支付宝官网
付款码支付后台调用流程以下:
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创ide

付款码支付详细版流程

微信/支付宝付款码支付调用流程大同小异,官网写的都比较清楚,这里直接用支付宝的官网的流程。
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创测试

从上面的流程能够看到,付款码支付能够说是一个同步的接口,即接口同步返回扣款结果,无需经过另外异步通知获取结果。
不过这里咱们须要注意,因为涉及安全风控等问题,付款码支付过程用户端可能须要输入密码确认支付,此时付款码接口将会返回等待用户支付。
接入时务必正确判断返回信息,若返回如下结果,表明此时用户正在输入密码。微信支付

  • 微信支付: err_code=USERPAYING 或 err_code=SYSTEMERROR
  • 支付宝:code=10003 或 code=20000
    微信付款码支付在如下状况须要输入密码二次确认。
    轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创
    支付宝官方文档暂未找到相关规则,通过测试当支付金额大于 2000 ,须要输入密码。若是有熟悉其余验密规则的同窗,能够在评论区留言一下。
    另一点须要注意的是,微信/支付宝其余支付接口,支付成功以后,微信/支付宝服务端将会发送消息通知支付结果。可是付款码不同,该接口是不会有消息通知。
    因此若是付款码支付若返回等待用户输入密码,商家后台服务必须定时调用调用微信支付/支付宝查询接口,获取支付结果。
    轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

    撤销支付

    若是在一段时间内好比 30s,轮询查询支付结果返回都是等待用户支付,或者支付交易过程返回失败或支付系统超时,这两种状况官方文档都是建议马上调用撤销接口撤销交易。
    若是此订单用户支付失败,撤销接口将会订单关闭;若是用户支付成功,撤销接口将会订单资金退还给用户。
    也就是说撤销支付接口功能上等同与关闭订单加上退款。虽然撤销也具备退款功能,可是二者存在比较大的区别:设计

    支付类型限制

    微信/支付宝撤销支付仅能撤销付款码支付类型的订单,而退款能够支持多种支付类型的订单。3d

    退款金额

    撤销接口只能是全额退款,而退款接口支持传入金额,能够全额退款,也能够部分退款。code

    时间限制

    撤销接口时间限制比较短,好比微信支付撤销支持 7 天内的订单,而支付宝撤销接口仅支持当天的订单。
    可是退款接口能够支持较长时间订单退款,好比微信支付退款支持一年内的订单,而支付宝仅支持 3 个月内订单。
    基于以上区别,其余正常支付的单如需实现相同功能请调用退款接口,官方文档建议仅在异常的状况下才建议调用撤销支付接口。
    另外再说一点,有些地方这个功能接口称为冲正接口,以下面工商二维码支付。
    轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创
    实际上提供的功能与微信/支付宝撤销相似,这里须要各家支付公司提供文档具体研究。blog

    撤销支付相关问题

    因为撤销支付,可能致使退款,也可能关闭订单,接入以前一直有些问题弄不清楚,在官方文档处也没有查询到任何资料,没办法只好实测验证相关问题。

因为规定,支付机构不能直连微信/支付宝,因此如下测试基于银联微信/支付宝通道。
银联提供的接口与直连微信/支付宝存在些许差异,可是主要功能同样。

重复撤销

经过实测,微信/支付宝撤销接口幂等实现,重复撤销返回结果一致。
不过须要注意须要正确判断撤销的返回结果。
好比微信撤销接口成功判断还须要结合 recall 字段,支付宝也有相似字段。
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

订单状态

微信/支付宝订单状态处理不太一致,微信订单状态比较复杂:
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创
微信支付订单状态机
也就是说,付款码订单一旦被撤销成功,再次查询订单,状态将会返回为已撤销(REVOKED)。
另外微信对于付款码支付订单有限制,是没法调用关闭订单接口关闭订单,因此在付款码的场景中,是不存在订单状态为 CLOSED—已关闭。
接下来讲下支付宝的状态,支付宝文档没要给出相似的订单状态机,我根据官方一些文档,以及一些测试结果总结出下方订单状态图。
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创
因此支付宝的付款码订单一旦撤销成功,再次查询原单状态将会返回 TRADE_CLOSED。

对帐文件数据

当天产生交易以后,第二天咱们须要拉取微信/支付宝对帐文件,逐一核对数据,防止少帐,多帐问题。
对帐设计流程能够参考以前写过的文章:
聊聊对帐系统的设计方案
微信/支付宝对帐文件只会记录交易成功的订单,因此未支付的订单被撤销是不会出如今对帐文件中。可是若是支付成功了,而后又被撤销成功,将会在对帐文件中产生两笔记录,一笔正交易,一笔反向退款记录。
正交易与普通的退款的记录都比较好识别,通常可使用咱们上送给微信支付宝订单号。可是撤销致使退款记录,咱们没法仅用一个单号识别,咱们须要结合另外的字段区分判断。
微信对帐文件撤销产生那笔退款,交易状态为 REVOKED,因此咱们能够采用商户订单号加交易状态识别出一条记录是否为撤销产生退款记录。
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

上面银联订单号能够当作是微信支付宝内部产生订单号

支付宝对帐文件比较麻烦,撤销产生的退款记录不能跟微信根据交易状态区分。从对帐文件上看支付宝撤销产生退款与普通退款接口产生退款记录是同样的。
轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创
仔细研究对帐文件能够发现一些区别,撤销致使退款记录退款批次与正交易支付宝内部订单号是一致的。而正常退款记录,退款批次号是由商户本身上送的。因此咱们能够以此筛选出撤销产生的退款记录。

撤销失败

极端状况下,有可能产生屡次撤销都失败的奇葩状况,那怎么办?
这种状况下就不用往系统自动处理方向考虑了,经过线下人工介入处理吧,毕竟这种几率过低了。
引用知乎 @天顺 的文章中一句话:

不少时候人工保障比你动脑筋想异常中的异常如何系统自动处理来得反而高效和低成本

这句话你们仔细品,越品越有道理!

最后说一句(求点赞)

最后,文章不免存在一些疏漏,你们若是发现,能够在评论区留言指出,谢谢支持。
若是你也在从事金融支付相关工做,有任何关于支付的问题,欢迎加我微信,一块儿讨论,一块儿成长~

轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

轻轻一扫,马上扣款,付款码背后的原理你不想知道吗?|原创

相关文章
相关标签/搜索