好了,不 BB 了,今天跟大家分享一下聚合收款码的支付原理,这也是我这大半年来一直在做的项目。

微信/支付宝收款码大家应该不会陌生,线下小微商户收款大多使用这个,就比如下图。

这种收款方式很方便,微信、支付宝后台申请开通,然后还可以免费申请相关物料。

不过这种方式用户体验其实不是很好,之前有好几次拿出支付宝,却扫了微信支付码。

另外,这种个人的收款码通常还有单日收款的上限,比如支付宝单日上限 500元。

有了需求,自然会有聪明人人想到解决方案,于是有了聚合收款码产品解决方案,如下图。

一个收款码,支持多种客户端,主流是微信、支付宝,现在常见还会支持银联,QQ 等。

用户选择任一支持的客户端扫码,都能完成支付,再也不用纠结扫错码的尴尬。

有没有很神奇?其实底层原理很简单,看完你就明白了,下面就让小黑哥带你解密聚合收款码的底层原理。

微信相关支付方式

聚合收款码底层支付其实还是离不开微信、支付宝支持的支付方式,所以我们先从微信支付宝渠道出发,简单介绍这个过程将会使用的支付方式。

上篇文章,我们以支付宝为例来介绍,这次我们就以微信支付为例。

打开微信支付官网,可以看到很多支付方式。

其中付款码支付在前两篇文章完整介绍过,这里不再介绍,感兴趣的小伙伴可以看下下面这两篇文章。

首先我们介绍一下「微信Native支付」,引用微信官网的解释:

Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

简单来讲就是商户后台调用微信支付接口,微信返回预支付交易的链接,格式如下:

weixin://wxpay/bizpayurl?sr=123456

然后商户将其转为二维码,提供给客户使用微信扫码支付。

来自微信支官网

这种支付方式可以应用在 PC 网站购物场景,比如说英雄联盟官网购买相关游戏道具:

既然「微信Native支付」最后可以变成二维码完成支付,那么聚合收款码是不是可以采用「微信Native支付」这种支付方式呢?

答案是可以,但是不适合,产品体验不太好。

最好使用微信支付另外一种支付产品「JSAPI 支付」

至于原因,不要急,接下去看就会明白。

「JSAPI 支付」,又被称为公众号支付,名词解释引用一下官网介绍:

JSAPI 支付是用户在微信中打开商户的 H5 页面,商户在 H5 页面通过调用微信支付提供的 JSAPI 接口调起微信支付模块完成支付。

具体业务流程如下:

来自微信支官网

日常生活中,很多应用场景使用这种支付方式,比如说:极客时间公众号上购买课程

这种支付方式相对于「微信Native支付」,比较麻烦,还需要使用微信公众号登录授权功能,以此获取用户的 openid。

另外当我们调用「微信 JSAPI」 后台接口,拿到微信返回的相关参数之后,我们还需要使用「微信的 JSSDK」,这样才能唤起微信支付。

聚合收款码核心原理

了解完聚合支付的所需要的底层支付方式,下面我们来了解一下聚合收款码的核心原理。

聚合收款码业务流程如下:

聚合收款码

第一步用户使用微信/支付宝 APP 扫码之后,将会打开一个收银台页面。

这个收银台页面可以自适应,不同 APP 显示不同的样式,比如支付宝打开收银台显示支付宝的 logo,微信打开就会显示微信的 logo。

第二步用户在收银台输入金额,点击支付之后将会唤起 APP 的支付弹窗。

好了,观察这个流程,我们可以发现扫码之后,后台应用需要识别出当前 APP 到底是微信还是支付宝。

那如何判断当前使用的 APP 呢?

其实这个原理很简单,在支付宝/微信打开一个链接,实际将会使用内置的浏览器发起了 HTTP 请求,而 HTTP  的请求头将会携带 「User-Agent(UA)」,用来标识用户代理软件的应用类型、操作系统、软件开发商以及版本号。

微信/支付宝中浏览器发起 HTTP 请求,携带的 「User-Agent」 分别为:

支付宝
UCBrowser/11.5.0.939 UCBS/2.10.1.6 Mobile Safari/537.36 AliApp(AP/10.0.15.051805) AlipayClient/10.0.15.051805 Language/zh-Hans微信
MQQBrowser/6.2 TBS 043220 Safari/537.36 MicroMessenger/6.5.8.1060 NetType/4G Language/zh_CN

这里需要注意了,不同型号的手机,不同的版本 APP,「User-Agent」 不一定会一样,其实我们只需要判断是否包含某些关键字即可,比如说只要 「User-Agent」  包含 「MicroMessenger」  就是微信,包含 「AlipayClient」 就是支付宝。

下面使用 Java 代码为例:

String userAgent = request.getHeader("user-agent");
if (Objects.equals(userAgent, "AlipayClient")) {// 支付宝} else if (Objects.equals(userAgent, "MicroMessenger")) {// 微信
}

这个问题解决之后,后面的流程就很简单了,只要调用微信/支付宝的 「JSAPI 支付」接口,拿到相关参数之后,唤起支付。

准确来讲,支付宝那边 JSAPI 支付官方名称为支付宝生活号支付。

这里解释一下上面的问题,为什么聚合收款码不能使用「微信Native支付」呢?

主要是因为「微信Native支付」接口返回是一个微信自定义 schema 协议,只能通过微信扫码打开,唤起支付。

如何聚合收款码使用「微信Native支付」,收银台提交金额之后,需要将微信返回交易链接转成二维显示在页面,然后用户使用微信内置识别二维码功能唤起支付。

这样一来比较影响产品体验,降低支付的成功率。

支付宝也有类似「微信Native支付」支付接口-「当面付扫码支付」,成功调用之后也会返回支付链接。

那这里可以提大家提个小问题,聚合收款码是否可以使用「支付宝当面付扫码支付」接口那?

答案是可以的,而且体验比「微信Native支付」好。

这是因为支付宝返回链接是一个标准 HTTP 连接,如下:

https://qr.alipay.com/xxxx

这个链接只要在支付宝内中打开,就可以唤起支付。

所以如果聚合收款码使用「支付宝当面付扫码支付」接口,收银台金额提交之后,当拿到支付宝返回的支付链接,应用程序内只要使用  HTTP 302 跳转到支付链接,就可以唤起支付宝支付。

画外音:之前我也一直以为支付宝跟微信一样,不能使用。

那这样实际上聚合收款码底层使用支付方式就有了两种方案:

  • 微信 JSAPI 支付/支付宝生活支付

  • 微信 JSAPI 支付/支付宝面付扫码支付

那如何选择那?个人建议使用第一种方案,微信、支付宝都采用 JSAPI 支付。

主要是因为只要 302 跳转唤起支付宝支付,就会关闭我们收银台页面,这样一来整个微信支付与支付宝支付流程就不太一样了

其次,当用户支付成功之后,JSAPI 支付还可以跳转到一个成功页面,这个页面我们可以支付结果展示,或者骚一点,还可以挂些广告,或者引流其他公号上。

但是如果使用付宝面付扫码支付,支付完成之后,页面就被关闭了,就没办法完成支付页面跳转。

聚合收款码核心流程

介绍完原理,下面主要介绍一下市面上主流聚合收款码业务流程,其实聚合收款码可以分为三类:

  • 静态聚合收款码

  • 动态聚合收款码

  • 银联静态二维码

静态聚合收款码就类似如下这种,需要用户主动输入金额,可以无限次使用。

静态收款码

而动态聚合收款码是只能使用一次,并且由商家指定金额,用户只要扫码就可以支付指定金额。

这种应用场景比如 B 站购买大会员:

银联静态二维码其实功能上与静态聚合收款码差不多,但是它多了支持银联支付的功能。

除了这个以外,最主要的区别是银联静态二维码是银联发码,背后对应的地址是银联的地址,类似如下:

https://qr.95516.com/00010000/xxx

静态聚合收款码流程

静态聚合收款码主要支付流程主要可以分为二步,第一步为登录授权。

聚合收款码-登录授权

这里的登陆授权一般使用微信、支付宝匿名登录授权功能,这样这个过程普通用户其实是无感知的。

画外音:如果是程序员的话,可能会感受到这个过程经过了多次跳转。

第二步,用户在收银台输入金额之后,应用内部将会创建相应的订单,然后再调用微信/支付宝的 JSAPI 支付。

聚合收款码-JSAPI支付

另外,如果支付宝采用面付扫码支付这种支付方式的话,那么其实不需要第一步登录授权了,可以直接跳到收银台发起支付。

聚合收款码-支付宝 native 支付

动态聚合收款码流程

动态聚合收款码其实与静态收款码总体比较类似,只不过创建动态码内部已经创建了相应的订单,后续流程与静态聚合收款码差不多。

聚合收款码-动态码内部创单

银联静态二维码流程

如果你使用微信、支付宝扫码打开银联二维码,将会打开我们自己收银台页面,后续流程其实跟静态聚合收款码一模一样的。

但是如果你使用支付银联支付的 APP 扫码,比如说各大银行的手机 APP,美团,京东等,就会在这些 APP 内各自支付页面,然后完成支付。

我们银联二维码的功能,将会在银联后台报备一个跳转地址,比如说

https://www.heihei.com

当用户使用微信/支付宝访问银联二维码,银联后台自己识别访问请求 「User-Agent」 ,然后后台根据规则拼接重定向地址。

拼接规则如下:

https://www.heihei.com?qrCode=URLENCODE(https://qr.95516.com/00010000/xxx)

聚合收款码-银联二维码扫码流程

总结

聚合收款码统一了用户支付流程,提高商家的收款效率。

另外聚合收款码其实还可以跟商家后台一些 ERP 等软件打通,这样还提高的商家生产效率。

不得不说,第一个设计出聚合收款码的的产品,真实个鬼才~

聚合收款码,背后原理一点也不难,根据用访问请求的 「User-Agent」 ,以此判断用户当前扫码使用的客户端类型。

然后调用微信/支付宝匿名登录获取用户 id,最后用户输入金额之后,调用微信/支付宝完成支付。

好了,今天文章介绍到这里,最后,点个赞再走吧~

嘻嘻吗,国庆就要到了,大家再熬几天!!!

相关资料

  1. https://pay.weixin.qq.com/wiki/doc/api/index.html

  2. https://opendocs.alipay.com/open/194

  3. https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

收款神器!解读聚合收款码背后的原理|原创相关推荐

  1. 收款神器!解读聚合收款码背后的原理

    Hello,我是楼下小黑哥! 今天跟大家分享一下聚合收款码的支付原理,这也是我这大半年来一直在做的项目. 微信/支付宝收款码大家应该不会陌生,线下小微商户收款大多使用这个,就比如下图. 这种收款方式很 ...

  2. 直播源码背后的原理是?初识视频流协议 HLS 和 RTMP

    背景 万物皆协议,互联网构建在一系列协议之上,直播源码也一样.一般直播源码开发时主要采用的视频流协议有两种,一种 HLS 和,一种是 RTMP. HTTP Live Streaming (HLS) H ...

  3. 收款神器!解读聚合收款码背后的原理,你都知道吗?

    微信/支付宝收款码大家应该不会陌生,线下小微商户收款大多使用这个,就比如下图. 这种收款方式很方便,微信.支付宝后台申请开通,然后还可以免费申请相关物料. 不过这种方式用户体验其实不是很好,之前有好几 ...

  4. 人见人爱!收款码背后的原理是什么?

    往期热门文章: 1.<往期精选优秀博文都在这里了!> 2.这么设计,Redis 10亿数据量只需要100MB内存 3.当Docker遇到Intellij IDEA,再次解放了生产力~ 4. ...

  5. 轻轻一扫,立刻扣款,付款码背后的原理你不想知道吗?

    来自:程序通事 前言 最近由于业务需求,需要开发付款码功能,该接口底层将会聚合市面上主流钱包 APP 的付款码功能,如微信支付,支付宝支付. ps:付款码支付别称有很多,如微信支付端支付产品为付款码支 ...

  6. 还不知道付款码背后的原理吗?轻轻一扫,立刻扣款,来!带你解密

    前言 最近由于业务需求,需要开发付款码功能,该接口底层将会聚合市面上主流钱包 APP 的付款码功能,如微信支付,支付宝支付. ps:付款码支付别称有很多,如微信支付端支付产品为付款码支付(之前的文档叫 ...

  7. 解读银行卡支付背后的原理

    上次写了一篇『轻轻一扫,立刻扣款,付款码背后的原理你不想知道吗』 ,本以为这类文章没什么会看,没想到发布之后,阅读量数据还不错.那么今天小黑哥再来跟大家聊聊支付. 虽然现在我们主流的支付方式是使用支付 ...

  8. 深入理解微信二维码扫码登录的原理

    文章目录 1.二维码应用场景及安全问题 2.二维码登录的本质 3.二维码验证机制的原理解析 4.深入理解二维码在登录的交互过程 5.总结感悟 1.二维码应用场景及安全问题 二维码使用广泛,生活处处都有 ...

  9. 聚合收款码怎么推广?

    以前,你可能对聚合收款码怎么推广没什么兴趣,甚至都不知道不了解聚合收款码. 现在,2022年3月1日起个人收款码禁用于经营性服务,经营收款需要换成商家码,属于聚合收款码的春天来了. 聚合收款码是什么? ...

最新文章

  1. 6个强大的PHP/Mysql代码生成器介绍
  2. 基于php的足球联赛接口调用,足球数据API接口 - 【队员资料】API调用示例代码
  3. idea2020.03打开项目注释变为显示模式,大于等于等符号也变为中文符号
  4. linux配置redis服务,记一次linux下安装redis, 设置redis服务, 及添加环境变量
  5. 使java代码更干净_java如何使用Lombok更优雅地编码
  6. 马斯克:挑战纽北赛道的Model S配有7个座椅
  7. android全局livedata,Android 使用ViewModel,LiveData高效、简
  8. python 列表相关应用大全
  9. Json时间格式转换
  10. RANSAC算法详解
  11. Presto 即席查询
  12. DELL G3 3590 重装win10后,显卡不识别,喇叭x号没声解决办法
  13. 三种简单的浏览器设置自动刷新网页
  14. html5 canvas花瓣,canvas花瓣飘落
  15. Python代码爬取下载应用宝所有APP软件
  16. 电脑自带热点,去打不开热点(解决方案)
  17. 【QA】集成高德地图SDK闪退问题
  18. R语言List列表和向量Vector互相转化源码和思路
  19. [COGS 2583]南极科考旅行
  20. python创建网盘_超简单!基于Python搭建个人“云盘”

热门文章

  1. php判断网页编码,python判断网页编码的方法
  2. 修复mysql编码错乱的数据_关于MySQL数据库编码修复相关问题
  3. HDU1874(SPFA算法)
  4. 图论 + 数论 ---- CF1325E E. Ehab‘s REAL Number Theory Problem (约数个数 + 枚举 + bfs找最小环)[从图结构优化搜索]
  5. 有上下界网络流 ---- Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流
  6. 【图论专题】无向图的双连通分量
  7. php经典操作,php数组的经典操作(遍历数组、基本操作)实例
  8. Java比较数量怎么比较_java - 如何在Java数量比较字符 - SO中文参考 - www.soinside.com...
  9. 怎么安装linux系统 硬盘,如何实现硬盘安装linux系统
  10. mysql数据库多级分类汇总_sql多级分类汇总实现介绍