一、主题分享:微服务下支付宝接入
大家好!我今天给大家分享下我们现在用的微服务下支付宝接入。
1.1 接入步骤
首先支付宝支付需要去支付宝申请一个开发者账号,获取到appid,自己的私钥以及公钥,然后需要与支付宝签约APP支付方可使用。否则无法调用支付宝接口。
1.2 架构介绍
我们这边服务分api,service两层架构。api供移动端(ios、android)调用。 举个例子,假如用户需要充值,则
- 用户发起一笔充值请求到服务端,
- 服务端拿到充值业务数据后经过组装调用AlipayClient 初始化客户端;
- 然后将组装数据通过AlipayTradeAppPayRequest 将参数发送请求到支付宝并设置回调地址(公网可以访问到的)
- 之后通过alipayClient调用sdkExecute方法 将请求参数发送过去。
- 然后支付宝会返回一串alipay_sdk信息, 我们服务端将这sdk信息发送给用户端。
- 用户端拿着此sdk信息可以直接唤醒支付宝支付功能
此时服务端任务结束,如果用户支付成功。那么支付宝会根据传输过去的回调地址进行回调。回调回来后,拿到参数如下:
将此参数需要验签后判断数据是否正确,注意:
- 请求支付宝的时候需要用到自己的appid,自己的私钥,字符串编码,阿里公钥(这个公钥需要去阿里支付宝里面通过上传自己的公钥获取);
- 验签需要用到回调回来参数、支付宝公钥以及支付编码(UTF-8) 通过调用AlipaySignature.rsaCheckV2方法返回true说明验签成功(这一步很重要)。则可以进行自己的业务逻辑。
提醒事项:
- 支付宝回调是有时间限制的,需要服务端确切的返回success 7个字符才算成功;
- 否则支付宝会不间断的重发通知。直到超过24小时22分钟,一般情况下25小时内完成6~10次通知;
- 间隔频率是 5s,2m,10m,15m,1H,2H.6H,15h;
由于支付宝回调多次,需要我们这边自己根据业务ID 去作数据重复处理。业务ID是在充值的时候生成,然后通过参数传输给支付宝,支付宝回调会将数据返回,并同时返回支付宝业务id。
二、Q&A
- 调用支付宝的支付接口支付后,支付宝会不间断的给回传支付信息吗?
通过JAVA服务端SDK生成APP支付 其中支付宝文档有确切说明是要自己服务返回success 才算成功,否则会不间断回调。建议采取:被动接收回调和主动查询两种方式; 处理是: 支付宝回调回来后, 如果数据处理成功则不用处理;
如果是失败会有几种原因:- 如果是参数问题,这些是在上线前可以避免的,支付前会做参数校验;
- 如果是服务的问题未处理成功。内部会去重重试机制;
- 关于重复提交支付的问题,应用场景主要在PC端。假设用户针对该笔支付,同时打开了两个支付页面,在第一个页面支付时由于网络原因未能及时返回支付结果,但是实际已经支付成功。然后用户在未获得支付结果的情况下立即在第二个页面进行了支付。(即在短时间内同时提交两笔支付请求),关于该场景的防重复支付应该怎么做?
这种应该是两笔支付才对。首先要确保自己的支付单号不会有重复;需要排重,通过rabbitmq。 实现请求幂等或者用互斥表可以实现幂等。对支付宝来说交易单号不一致,说明不是同一笔业。其实有很多业务不能完全压在支付宝这边。很多逻辑是需要我们服务端去考虑这样问题的。例如重复支付,重复下单扣款等;POS机一旦生成新的流水号,那就扣钱,即使重复了,只能线下解决了。另外一种对重复支付的做法:有自己的收银台,支付使用多个第三方支付,支付宝流水又不能做幂等(每次请求都必须不一样),在用户确认支付时会查询该笔订单有没有支付中状态的支付流水,如果存在就调用支付宝关单接口,如果可以关单就重新生成支付流水继续支付,否则就提示支付宝支付处理中,不允许重复支付。
- 预下单相关业务(比如减库存,优惠)是同步还是完全异步方式呢?
减库存是同步,然后异步请求财务模块。我们是有分几大模块,模块间通过mq相互调用,来保证数据最终一致性。
- 客户端是完全抛掉同步接口的返回(比如APP SDK这块的同步返回)?
app这块是 app请求支付后,同步会返回alipay_sdk 的然后剩下步骤就看用户自己操作了。
- 订单表目前分库分表了大概如何划分的呢?
我们这边现在是用有做主从数据库,读写分开。
-
聚合支付商户平台维度订单设计是否合理? 线下支付、当面付;
- 这块的数据一致检性查怎么做?
- 商户查询主要以我们数据库为准,每天都会效验一遍。
- 有问题的会被丢处理。
- 报异常也会实时报警。
- 系统设计要有埋点;
- 记录成功或者1分钟支付撤销, 标记为失败;
- 网络异常的会被抛出出来在预制订单表;然后每10秒跟支付宝或者微信效验一遍;1分钟,没有返还成功或者失败的,直接放到异常订单表里面。
- 支付宝或微信查询订单接口有没有限制?
一般都有限制,调用频次;支付宝有异步回调,微信没有;微信这边建议是每10秒查询一次 40秒后撤销订单;信微退款有回调;
- 对接支付宝微信这些支付接口,是不是必须他们授权不然拉不起他们?
支付宝用授权,微信不用。微信授权只是目录
对于微信公众号支付,
微信的网页支付分为(微信内支付只准在微信内(webkit是改造过来的),纯H5支付如浏览器); - 对接支付宝接口,h5拉起支付宝支付需要授权吗?
要签约的,应用开发平台里面,好处是不需要交300元钱;微信,应用开发资质300元,app支付申请300元,公众号(服务号)支付申请300元。注意APP与公众号支付不是同一个商户平台,但后端是绑定同一个对公银行账户;
- mq这块大家用的什么呢?rabbitmq,nsq,kafka?
rabbitmq、ActiveMQ、rocketmq,rabbitmq这块,协议太重了适应企业级应用,不过功能是比较多,但相对而言,用的人还是比较多。
- 商户进件资料如果没审核通过,是不是不行?
不通过话你就没有商户号;审核了6次才通过的,微信支付;对行业有要求。
- 做支付宝对接的时候遇过两个坑?
- TRADE_SUCCESS与TRADE_FINISHED的区别。
- 是应用开发公钥与支付宝公钥的区别,这两个不一样
本文档来自支付产品技术交流群的聊天记录整理,由志愿者整理并发布到本网站。如需要及时收到来自支付产品技术交流群的最新消息,请扫码关注“凤凰牌老熊”的微信公众号。 本群面向支付行业的有经验(2年以上)的产品经理、软件工程师、架构师等,提供交流平台。如想加入本群,请在本文评论中留言(不公开),说明所在的公司、负责的工作、入群分享的主题和时间。