对于大多数做支付系统设计的同学来说,对于支付业务提供的调用方式都不陌生,今天,金融民工小曾就和大家一起探讨一下:支付业务调用方式有哪些?为什么微信公众号支付采用JSAPI方式?
一、支付渠道调用方式
通常来说,传统的支付渠道调用方式分为以下几种:API直接调用、网关跳转支付、移动端APP的SDK跳转支付、移动端APP直接跳转支付、二维码主被扫支付和JSAPI支付。
1.API直接调用
这种方式一般适用于支付渠道不再不涉及用户交互,直接进行扣款落地的场景。
例如:银行卡刷卡,对于发卡方系统来说,直接校验客户余额和合法性后并进行扣款落地。同样的还有如协议支付、银行卡代扣、快捷支付等。
2.网关跳转支付
这种方式最早诞生于线上电商平台如淘宝、亚马逊等。在这一类平台需要与银行网银对接,为了保证安全性,需要电商平台在发起支付时跳转到银行的B2C或者B2B支付网关完成支付。客户在网银支付网关上插入UKEY并输入支付密码后完成支付。
这一类支付方式应用在电商平台上相当广泛,电商平台或者支付公司都会提供类似于线上收银台这样的支付网关页面,客户可以在页面上选择各种支付方式完成支付。到移动互联网时代还衍生出了H5或者叫WAP跳转支付
3.移动端APP的SDK跳转支付
这种方式是在近几年移动互联网兴起之后开始进入大家生活中。常见的比如电商APP上完成购物后调起支付公司提供的SDK插件完成银行卡扣款支付。这一类插件有的由支付公司提供(如苹果提供的apply pay应用内支付插件、银联云闪付支付插件),有的由像strip\paypal\ping++\现在支付等支付系统集成商提供
4.移动端APP直接跳转支付
这种方式其实是在上面SDK跳转支付方式上的更进一步。随着微信、支付宝等生态型APP的做大,原来支付只是以SDK插件形式存在变为了电商APP需要直接跳转到微信和支付宝等APP上来完成支付。这里面的代表就是现在大家用的很多的手机上比如滴滴打车、美团外卖、拼多多等互联网电商APP跳转到微信和支付宝APP上完成支付。
5.二维码主被扫支付
上述的几种支付方式,在定义上,还是属于线上支付行为。如何区分线上支付和线下支付,就笔者多年的实践经验来看,可以根据交易对手双方是否需要当面完成交易来进行区分。所以扫码支付当然属于线下支付。传统的银行卡刷卡是通过收单机构是通过各收单机构与银联还有发卡机构进行API直接调用来完成扣款,客户只需要在商户的POS机上完成身份认证,也就是输入密码和签名。与之相对的,二维码支付是客户通过APP与商户的POS机或者其他扫码收银终端完成交互,不管是主扫还是被扫,其支付鉴权过程都是依赖于客户APP。
6.JSAPI支付
这种支付方式应该算是微信首创的,其产品形式是,在微信内打开的网页链接,上面可以嵌入支付按钮,支付按钮可以通过JSAPI方式直接调起微信的密码控件完成支付,与此类似的是支付宝的服务窗支付。
7.其他复合的方式
比如先通过API下单,再调起网关或者APP或者SDK,比如在网关支付页面嵌入二维码供客户可以通过手机APP进行扫码支付,其形式都是以上几种方式的组合。
二、微信公众号支付采用JSAPI方式产品设计分析
微信JSAPI支付方式其实就是上述复合支付方式中典型的一种,但是从产品设计角度上,其设计的非常精巧,既考虑了商户的个性化,又保证了支付的安全,还与微信C端客户无缝打通,这也为后来的二维码聚合支付提供了一个APP厂商的标准支付产品设计模板。
2.1产品流程
微信公众号JSAPI支付,是一种典型的在线支付模式,先让商户系统从后台下单,获得参数后通过前端页面直接向微信支付系统发起支付请求,在这个过程中完成客户的身份授权以及密码输入,完成支付。支付结束后通过异步通知或者商户主动发起查询完成支付。
2.2产品的易用性
由于微信是在移动端,移动端支付与在线基于浏览器的支付模式不同,在线支付的浏览器可以通过网页redirect在商户平台、支付平台间传递信息,例如跳转到银行支付页面让用户输入密码;而在移动支付场景下,除了商户平台、支付平台外,还多了商户APP端、商户服务器、支付SDK(如果有)、支付平台之间信息交互的过程。中间最核心的环节是:需要在商户APP端让用户授权确认。
而在微信场景里,没有商户APP,客户和商户都用的是微信,也就变成了,微信直接跟商户网站之间完成交互的过程。所以微信要求先进行统一下单,然后拿到prepay_id等支付参数后,商户再调起微信完成支付,包括商户扫用户的扫码支付、APP支付、公众号支付、H5/WAP支付也是这样设计。
仔细分析便可以理解,不同行业解决方案,对支付订单请求参数不同,如果放在APP端或SDK端做,协议改动调整极为麻烦。放到统一下单来做,只需要调整统一下单接口,APP端或SDK端不用做任何调整。例如:微信支付增加卡券标识,增加借贷记标识、红包支持等,都是通过后台增加附加字段完成。另外,由于移动端的网络不确定性以及调用的复杂性,所以通过后台API下单模式可以极大地简化这中间的问题,既能减少出错概率也能减少数据传输。另外通过JSAPI方式,可以让商户支付页面完成自行定制,整个支付过程看不到微信提供的任何网关页面,而是直接调用支付控件,让整个支付过程和体验更加流畅。
2.3产品的安全性
在这中间,微信对安全性做了极其严格的管控,主要体现在以下方面:
2.3.1商户网站防伪
1.调起支付密码控件的业务域名必须ICP备案并且在微信支付后台进行白名单配置
2.支付目录和支付的appid必须预先配置和绑定
3.使用微信支付的公众号主体与开通微信支付的商户主体必须一致
4.对于未登记的网站还会有安全提示,请勿在页面中输入账号密码等敏感信息
以上几点有效地防止了钓鱼页面和其他中间人页面劫持
2.3.2客户身份授权
1.另外,微信还针对跨号支付做了严格限制,防止一个公众号跳到其他支付网关上进行支付
2.客户在微信支付下单前必须进行微信登录授权(隐式授权,让用户基本无感)
2.3.3支付过程安全
1.从后台下单返回的支付要素需要用商户私钥签名
2.一组支付参数不能被另外的用户用于支付
3.微信自己的密码控件,并且回显交易对手
2.3.4风控系统
1.针对可疑交易进行阻断
2.针对信用卡占比过高进行限额
3.另外有人工加机器的自动运营,对商户行为风控,进行限额和关停处理
3 总结
不同的支付渠道的调用方式也是随着支付业务的发展不断地创新,产品的易用性和安全性是支付系统在这一类问题设计上的重中之重,微信支付JSAPI的相关机制给我们提供了一个很好的参考,值得我们学习和借鉴。