一、主题分享:微服务下支付宝接入

大家好!我今天给大家分享下我们现在用的微服务下支付宝接入。

1.1 接入步骤

首先支付宝支付需要去支付宝申请一个开发者账号,获取到appid,自己的私钥以及公钥,然后需要与支付宝签约APP支付方可使用。否则无法调用支付宝接口。

1.2 架构介绍

我们这边服务分api,service两层架构。api供移动端(ios、android)调用。 举个例子,假如用户需要充值,则

  1. 用户发起一笔充值请求到服务端,
  2. 服务端拿到充值业务数据后经过组装调用AlipayClient 初始化客户端;
  3. 然后将组装数据通过AlipayTradeAppPayRequest 将参数发送请求到支付宝并设置回调地址(公网可以访问到的)
  4. 之后通过alipayClient调用sdkExecute方法 将请求参数发送过去。
  5. 然后支付宝会返回一串alipay_sdk信息, 我们服务端将这sdk信息发送给用户端。
  6. 用户端拿着此sdk信息可以直接唤醒支付宝支付功能

20171218_194323

此时服务端任务结束,如果用户支付成功。那么支付宝会根据传输过去的回调地址进行回调。回调回来后,拿到参数如下:
20171218_194456

将此参数需要验签后判断数据是否正确,注意:

提醒事项:

由于支付宝回调多次,需要我们这边自己根据业务ID 去作数据重复处理。业务ID是在充值的时候生成,然后通过参数传输给支付宝,支付宝回调会将数据返回,并同时返回支付宝业务id。

二、Q&A

  1. 调用支付宝的支付接口支付后,支付宝会不间断的给回传支付信息吗?

    通过JAVA服务端SDK生成APP支付 其中支付宝文档有确切说明是要自己服务返回success 才算成功,否则会不间断回调。建议采取:被动接收回调和主动查询两种方式; 处理是: 支付宝回调回来后, 如果数据处理成功则不用处理;
    如果是失败会有几种原因:

    1. 如果是参数问题,这些是在上线前可以避免的,支付前会做参数校验;
    2. 如果是服务的问题未处理成功。内部会去重重试机制;
  2. 关于重复提交支付的问题,应用场景主要在PC端。假设用户针对该笔支付,同时打开了两个支付页面,在第一个页面支付时由于网络原因未能及时返回支付结果,但是实际已经支付成功。然后用户在未获得支付结果的情况下立即在第二个页面进行了支付。(即在短时间内同时提交两笔支付请求),关于该场景的防重复支付应该怎么做?

    这种应该是两笔支付才对。首先要确保自己的支付单号不会有重复;需要排重,通过rabbitmq。 实现请求幂等或者用互斥表可以实现幂等。对支付宝来说交易单号不一致,说明不是同一笔业。其实有很多业务不能完全压在支付宝这边。很多逻辑是需要我们服务端去考虑这样问题的。例如重复支付,重复下单扣款等;POS机一旦生成新的流水号,那就扣钱,即使重复了,只能线下解决了。另外一种对重复支付的做法:有自己的收银台,支付使用多个第三方支付,支付宝流水又不能做幂等(每次请求都必须不一样),在用户确认支付时会查询该笔订单有没有支付中状态的支付流水,如果存在就调用支付宝关单接口,如果可以关单就重新生成支付流水继续支付,否则就提示支付宝支付处理中,不允许重复支付。

  3. 预下单相关业务(比如减库存,优惠)是同步还是完全异步方式呢?

    减库存是同步,然后异步请求财务模块。我们是有分几大模块,模块间通过mq相互调用,来保证数据最终一致性。

  4. 客户端是完全抛掉同步接口的返回(比如APP SDK这块的同步返回)?

    app这块是 app请求支付后,同步会返回alipay_sdk 的然后剩下步骤就看用户自己操作了。

  5. 订单表目前分库分表了大概如何划分的呢?

    我们这边现在是用有做主从数据库,读写分开。

  6. 聚合支付商户平台维度订单设计是否合理? 20171218_201854 线下支付、当面付;

  7. 这块的数据一致检性查怎么做?
    1. 商户查询主要以我们数据库为准,每天都会效验一遍。
    2. 有问题的会被丢处理。
    3. 报异常也会实时报警。
    4. 系统设计要有埋点;
    5. 记录成功或者1分钟支付撤销, 标记为失败;
    6. 网络异常的会被抛出出来在预制订单表;然后每10秒跟支付宝或者微信效验一遍;1分钟,没有返还成功或者失败的,直接放到异常订单表里面。
  8. 支付宝或微信查询订单接口有没有限制?

    一般都有限制,调用频次;支付宝有异步回调,微信没有;微信这边建议是每10秒查询一次 40秒后撤销订单;信微退款有回调;

  9. 对接支付宝微信这些支付接口,是不是必须他们授权不然拉不起他们?

    支付宝用授权,微信不用。微信授权只是目录
    20171218_204424
    20171218_204433
    对于微信公众号支付,
    20171218_204451 微信的网页支付分为(微信内支付只准在微信内(webkit是改造过来的),纯H5支付如浏览器);

  10. 对接支付宝接口,h5拉起支付宝支付需要授权吗?

    要签约的,应用开发平台里面,好处是不需要交300元钱;微信,应用开发资质300元,app支付申请300元,公众号(服务号)支付申请300元。注意APP与公众号支付不是同一个商户平台,但后端是绑定同一个对公银行账户;

  11. mq这块大家用的什么呢?rabbitmq,nsq,kafka?

    rabbitmq、ActiveMQ、rocketmq,rabbitmq这块,协议太重了适应企业级应用,不过功能是比较多,但相对而言,用的人还是比较多。

  12. 商户进件资料如果没审核通过,是不是不行?

    不通过话你就没有商户号;审核了6次才通过的,微信支付;对行业有要求。

  13. 做支付宝对接的时候遇过两个坑?
    1. TRADE_SUCCESS与TRADE_FINISHED的区别。
    2. 是应用开发公钥与支付宝公钥的区别,这两个不一样

本文档来自支付产品技术交流群的聊天记录整理,由志愿者整理并发布到本网站。如需要及时收到来自支付产品技术交流群的最新消息,请扫码关注“凤凰牌老熊”的微信公众号。 本群面向支付行业的有经验(2年以上)的产品经理、软件工程师、架构师等,提供交流平台。如想加入本群,请在本文评论中留言(不公开),说明所在的公司、负责的工作、入群分享的主题和时间。