一、对接三方支付平台
第三方支付平台是指平台提供商在商家和银行之间建立连接,供以支付等交易活动
1.1 支付宝支付、微信支付……(以支付宝为例)
1、通过支付宝的开放平台对接 : https://open.alipay.com/
2、进入平台API的当面付 : https://open.alipay.com/api
3、需要支付宝账号,这里用沙箱环境,申请沙箱账号
4、下载客户端,用沙箱账号登录APP
5、拉取sl-express-pay 第三方支付对接代码
6、在NativePayHandler的实现类中完成与支付宝的对接,编写对接代码
7、注意,在AlipayConfig请切换成自己的沙箱信息:网关,私钥公钥,加密方式等
8、测试类中生成本次订单金额的二维码链接,使用草料二维码进行生成二维码,沙箱账户进行支付
1.2 具体代码是如何实现的
这块我是先定义了支付接口类 :里面定义了一些通用的支付方法
1、线下交易-预创建接口【创建交易订单接口】:收银员通过收银台或商户后台调用此接口,生成二维码,用户扫描支付订单
【参数:交易单号+金额】
2、线下交易-查询接口:该接口提供所有支付订单的查询,商户可以通过该接口主动查询订单状态,完成下一步的业务逻辑。
【参数:交易单号】
3、关闭交易订单接口 : 通过设置订单状态为枚举类型的取消订单即可
4、交易退款接口 :当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。
【参数:交易单号+退款单号+退款金额】
5、 交易退款查询接口 :
【交易单号+退款单号】
然后我分别提供了基于支付宝和微信的两种支付接口的实现,其中
-
支付宝支付,目前支持的是当面付中的扫码支付(用户扫商家二维码),主要是对Easy版SDK进行的封装。
- 需要提供参数有:appid应用号 + 应用私钥 + 支付宝公钥 + 接口内容加密方式 + 回调地址
-
微信支付,目前手支持的是Native本地支付方式,使用的V3版本的API接口。这块使用的是HttpClient对API接口请求进行封装
- 需要提供参数有:appid应用号 + mchId商户号 + 商户证书序列号 + 私钥字符串 + V3密钥
二、分布式锁
:解决微服务同一操作并发提交导致的错误,要结合具体业务说明。比如寄件时,京东快递员提交订单生成二维码让你支付,网络不好提交了多次,这多次访问即为并发操作,已经出现重大错误。解决方案 : 我们需要加锁,这里加的是分布式锁
2.1 分布式锁的具体实现
分布式锁实现方式有很多种,比如可以使用Redis实现,也可以使用Zookeer。这两个是现在比较常用的分布式锁的实现方式。因为我们项目中有使用到Redis,所以当时我是使用Redis实现的
具体说说Redis是怎么实现的?
-
可以使用Redis的setnx指令来实现分布式锁
setnx 指令说明 : 因为setnx指令只有第一次执行会设置成功,如果key已经存在则设置不成功,所以这块利用的就是setnx这个特性来实现分布式锁的。
- 对操作加锁时,执行setnx指令,如果设置成功说明加锁成功。
- 如果执行失败,说明加锁失败
- 释放锁就执行删除指令,就可以把锁释放。
-
存在的问题
- 持有锁的线程未释放锁,导致死锁问题 : 加过期时间
- 当本持有锁的线程发生卡顿或者其他问题,到了过期时间锁自动释放,导致持有锁的线程在执行完业务逻辑后,释放了别的线程的锁:判断value值
- 超时自动释放,其他线程可以访问,发生并发问题
所以这块可以自己实现但是实现起来比较困难,所以我在开发中并没有自己去实现。而是使用的 Redisson提供的分布式锁的api。
那你说说Redisson分布式锁的实现?
- Redisson分布式锁实现底层比较复杂,具体细节平时开发比较忙也没怎么研究。
- 但是我大概知道他底层使用的lue脚本操作的redis,这样可以保证操作的原子性。
- 我还知道他底层有一个看门狗机制,用于刷新redis锁的过期时间,保证锁持有者在业务未执行完成期间,锁不会过期。