首页 > 其他分享 >对接三方支付平台 + 分布式锁

对接三方支付平台 + 分布式锁

时间:2023-06-13 20:44:59浏览次数:70  
标签:三方 支付宝 实现 对接 接口 支付 退款 分布式

一、对接三方支付平台

第三方支付平台是指平台提供商在商家和银行之间建立连接,供以支付等交易活动

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锁的过期时间,保证锁持有者在业务未执行完成期间,锁不会过期。

标签:三方,支付宝,实现,对接,接口,支付,退款,分布式
From: https://www.cnblogs.com/psuitj/p/17478680.html

相关文章

  • EKS对接EBS
    EKS对接EBS简介AWSEKS产品为Kubernetes容器集群,EKS组件默认不包含EBS和对象存储S3等插件,需要独立安装组件才能使用Storageclass对接至EBS和S3。另外在组件安装过程中较为特殊的是需要指定IAM角色,该角色需要以命令方式eksctl创建AmazonEBSCSI插件IAM角色IAM创建使......
  • post、raw、json调用第三方接口
    1、调用第三方接口,对方接口文档写到”请求方式postjson格式、请求参数json格式“,看不懂,就用postMan试试看。发现只有一种方式能调用通, 2、 3、Content-Type:application/json  4、根据上面的方式,所有写了下面的方法:/****@paramurl接口地址*@paramputData......
  • Git(分布式版本控制系统)在Windows下的使用-将代码托管到开源中国(oschina)
    一、Git是什么?    Git---Thestupidcontenttracker,傻瓜内容跟踪器。Git是目前世界上最先进的分布式版本控制系统。二、SVN与Git的最主要的区别?     SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务......
  • 基于.NET的Web Service技术的分布式异构数据库的集成
    摘要:本文分析了WebService的特点,提出了一种基于Microsoft.NET的WebService技术访问分布异构数据库的体系结构,并采用.NET技术实现了原型系统。在原型系统中,使用WebService将分布于Internet上的不同的数据库系统中的数据集成,向访问数据库的应用程序提供统一的数据操作接口,实现......
  • nginx添加第三方模块
    1.理念nginx除了支持内置模块,还支持第三方模块,但是第三方模块需要重新编译进nginx。(重新生成nginx二进制命令)1.如你的nginx默认不支持https2.给你的nginx添加echo模块,用于打印nginx的变量。 2.编译添加echo模块echo-nginx-module 模块可以在Nginx中用来输出一些信息......
  • WebRTC十周年、Space X成功对接国际空间站、TikTok复制品Zynn或有快手支持|Decode the
    >>顺便祝大家六一快乐<<DecodetheWeek≠音视频技术周刊 01 SpaceX载人飞船首发成功并与国际空间站对接北京时间5月31日,SpaceX首次载人火箭发射成功,而这只是SpaceX创始人ElonMusk庞大的商业航天计划中的一环。在经历19个小时的飞行后,SpaceX龙飞船与国际空间站成功对接,对接......
  • 电子行业 K 公司对接 Nexperia EDI 项目案例
    项目背景Nexperia是一家全球领先的半导体制造商,专注于提供高性能、高可靠性和创新性的半导体解决方案。公司成立于2017年,是前飞思卡尔半导体业务的一部分,并在全球范围内拥有多个设计、研发和生产基地。Nexperia使用EDI(电子数据交换)来实现高效的业务合作和供应链管理。通过ED......
  • (2023.6.12)buildroot交叉编译第三方库
    编译链没有精确到bin目录Buildroot下没有dl文件夹(编译之后才有;新的第三方库,文件夹如何命名?) 修改profile,使用build_root重新编译??(重新打包就行)新的第三方库源码如何配置编译参数?......
  • java调用第三方接口,请求方式 get,传参方式 param形式非json。
    项目调用第三方接口,调用方式人家做了限制“请求方式get 传参方式param形式传参,非json”。所有有了下面的代码: importcom.alibaba.fastjson.JSONObject;importcom.spcp.platform.common.util.StringUtil;importcom.spcp.qypt.whpt.util.HttpClientUtil;importorg.spring......
  • 分布式书库收集
    作者:北山望链接:https://zhuanlan.zhihu.com/p/636255330来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。从基础知识到应用知识的联系与应用,从计算机体系结构,计算机组成原理,操作系统,Linux内核,分布式系统设计与开发理论,分布式存储系统应用研究,到HDFS......