第三方支付接口设计

article/2025/10/2 12:57:25

你是个干大事的人

  • 前言
  • 安全性
  • 稳定性
  • 事务一致性
  • 可维护性

前言

阅读本文大概需要6分钟

​最近在项目中对接了第三方支付,对于第三方支付来说,比较复杂功能的就是支付、退款、对账。

本篇文章我们只介绍支付相关的接口设计。

一笔支付流水可能涉及到的节点包括:支付、支付结果查询、支付结果通知、撤单、关单、退款、对账。

拿支付宝举例,支付宝提供了非常丰富的支付能力:app支付、扫码支付、网站支付等等。不同的支付方式之间的区别不大。

对接第三方支付的流程大同小异。按照官方提供的文档可以迅速完成对接,所以这篇文章我们不讨论如何对接第三方支付,我们要聊的是对接以外的事。

我在如何设计好一个接口?里有写到,设计一个接口要考虑五点:安全性、稳定性、高效性、可维护性、可读性。

下面我们就围绕这几个特性来讨论下如何设计一个支付接口。

安全性

支付接口涉及资金的流转,那么其安全性不言而喻。

支付宝规定,接入支付能力的时,数据传输接口用公私钥的方式进行加密。

那我们自己接口间是如何保证安全性的呢?

SHA256 或者RSA2

具体的加密算法此处不详细说明,网上一找一大堆。
本文只简单说一下加密的流程,如下图:

在这里插入图片描述
具体来说就是:

  • 在App端首先用SHA256 或者RSA2将支付报文进行加密,然后传给后台服务;
  • 后台解析密文,并进行验证。
  • 解析通过则进行下一步逻辑,否则提示密文解析失败。

稳定性

对于支付接口来说幂等性是极为重要的。

支付业务涉及到的数据库操作包括:保存支付流水、同步订单状态、更新库存数量等等。

由于新增操作天然的非幂等性,所以我们需要在设计层面来保证。

我在项目中使用Redis分布式锁实现支付接口的幂等

  • 有关使用Redis实现分布式锁的原理,我会在下一篇文章和大家分享。

我在项目中实现的方式:Redisson

Redisson原理:

  • 线程去获取锁,获取成功:执行lua脚本,保存数据到redis数据库。
  • 线程去获取锁,获取失败:一直通过while循环尝试获取锁,获取成功后执行lua脚本,保存数据到redis数据库。
  • 支持看门狗自动延期机制。

代码实例:

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version>
</dependency>
public void testReentrantLock(RedissonClient redisson){RLock lock = redisson.getLock("anyLock");try{// 1. 最常见的使用方法//lock.lock();// 2. 支持过期解锁功能,10秒钟以后自动解锁, 无需调用unlock方法手动解锁//lock.lock(10, TimeUnit.SECONDS);// 3. 尝试加锁,最多等待3秒,上锁以后10秒自动解锁boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS);if(res){    //成功// do your business}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}

除了幂等性之外,支付接口还要考虑的一个问题就是订单超时关闭。这个问题先留给各位思考一下,我们会在后期文章中详细介绍。

事务一致性

支付成功同时要更新订单状态、库存数量。
在微服务的背景下,各业务的数据库都是独立的,为了保证事务的一致性就需要用上分布式事务。

常见的分布式事务解决方案:

  • XA 两阶段提交
  • TCC模式:支持 TCC 事务的开源框架有:ByteTCC、Himly、TCC-transaction。
  • Saga事务
  • 基于消息的分布式事务:基于事务消息的方案、基于本地消息的方案
  • 分布式事务中间件:Seata

可维护性

我们项目中目前只对接了支付宝和微信,以后还可能对接银联等等。支付方式会随着业务的增长不断增加。
但是每个支付方式的流程大致都是一样的:支付信息解密、支付、修改订单、修改库存。

如此一来,使用if else判断就会导致支付功能和系统业务功能高度耦合。

if (payType.equals ("WeiXin")) {
//dosomething
}else if (payType.equals ("AliPay")) {
//dosomething
} else if(payType.equals ("UnionPay")) {
//dosomething
}

所以我在项目中用到了策略模式,来为不同的支付方式定义不同的实现。

  • 首先定义一个抽象类,封装公共的方法。

  • 然后自定义注解ServiceRoute,标注在具体的支付实现接口,项目启动时自动把标注了ServiceRoute注解的服务注入到容器;

  • 在支付的时候根据具体的通道编号,调用不同的支付实现功能。

自定义注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ServiceRoute {/*** 支付通道编号** @return*/String value();
}

服务注册:

public class RegisterService implements ApplicationContextAware {private static final Logger logger = LoggerFactory.getLogger(RegisterService.class);private Map<String, Object> servicesMap = new ConcurrentHashMap<String, Object>();private static ApplicationContext applicationCtx = null;/*** 注册服务接口*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {applicationCtx = applicationContext;//扫描添加了ServiceRoute注解的类Map<String, Object> allWebResBeans = applicationCtx.getBeansWithAnnotation(ServiceRoute.class);for (Object bean : allWebResBeans.values()) {String routeName = getServiceRoute(bean);if (routeName != null) {servicesMap.put(routeName, bean);logger.debug("register route,routeName={},bean={}", new Object[] {routeName,bean});}}}private String getServiceRoute(Object bean) {if (bean != null) {Annotation anno = AnnotationUtils.getAnnotation(bean.getClass(), ServiceRoute.class);if (anno != null) {return anno.getClass().getAnnotation(ServiceRoute.class).value();}}return null;}public Object getServiceByAnnoName(String name) {if (StringUtils.isNotEmpty(name)) {return servicesMap.get(name);}return null;}
}

http://chatgpt.dhexx.cn/article/keNSxLix.shtml

相关文章

第三方支付接口怎么测试

现在有不少测试朋友做的项目中&#xff0c;可能也会涉及到支付相关的功能。比如&#xff1a;做商城的&#xff0c;做游戏的以及其他在线交易的网站、APP等。如果支付出了问题&#xff0c;或者用户拿少的钱通过篡改请求数据购买大金额的商品&#xff0c;如果是实物的话&#xff…

java支付系统,三方支付系统,四方支付系统

背景介绍 之前使用的是外面的四方系统&#xff0c;不方便服务商批量提供和管理收款账号&#xff1b;所以想着自己写一套&#xff0c;技术使用的都是新技术 前后分离&#xff0c;前端使用vue&#xff0c;后端使用springcloud-alibabaspringboot微服务架构。现在系统可以投入使用…

php第三方支付系统--支付流程--及代码

目前来说,越来越多的行业互联网化,也掀起了互联网金融的浪潮,第三方支付的开发也越来越广泛,一般大型的第三方支付系统包括,前置系统,支付系统,渠道系统,账务系统,清结算系统,运营与维护管理平台。下面我们来了解一下常见的一些支付流程,让大家了解了解 快捷支付流…

涉及第三方支付接口,怎么测?

大家好啊&#xff0c;我是大田。 像一些做金融项目、电商项目等有支付功能的系统&#xff0c;基本都会调用第三方支付接口&#xff0c;那我们应该如何测试&#xff1f;这里谈谈大田的思路&#xff0c;仅供参考&#xff1a; 1、根据流程图&#xff0c;深刻理解我司与第三方系统都…

第三方支付流程

目前来说&#xff0c;越来越多的行业互联网化&#xff0c;也掀起了互联网金融的浪潮&#xff0c;第三方支付的开发也越来越广泛&#xff0c;一般大型的第三方支付系统包括&#xff0c;前置系统&#xff0c;支付系统&#xff0c;渠道系统&#xff0c;账务系统&#xff0c;清结算…

第三方支付原理

1.什么是第三方支付 所谓第三方支付&#xff0c;就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中&#xff0c;买方选购商品后&#xff0c;使用第三方平台提供的账户进行货款支付&#xff0c;由第三方通知卖…

支付宝第三方登录

支付宝登录 最近做了第三方登录&#xff0c;看了官方文档&#xff0c;加上各种百度&#xff0c;依然踩过不少坑&#xff0c;今天和大家分享一下。 我是做的pc端的&#xff0c;贴张图。 首先&#xff1a; 有支付宝的实名账号&#xff0c;没有实名实名一下。然后选择合作伙伴角色…

第三方支付简要原理解释说明

第三方支付&#xff0c;就是一些具备实力和信誉保障的第三方独立机构提供的交易支付平台。买方选购了商品后&#xff0c;使用第三方平台进行付款&#xff0c;由第三方通知卖家货款到达。 目前市面上支持第三方支付的平台有很多&#xff0c;商家通过和第三方签署协议&#xff0…

如何高效对接第三方支付

简介 电商购物流程中核心的一环是用户支付。目前我们已经服务30个国家和地区&#xff0c;不同国家往往需要对接不同的第三方支付公司&#xff0c;所以最近两年&#xff0c;研发组对接了大量的第三方支付公司&#xff0c;积累了一定的经验。 本文主要分享如何对接第三方支付&a…

第三方支付

1. 第三方支付 概念&#xff1a; 第三方支付&#xff0c;就是通过与产品所在国家以及国外各大银行签约、由具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中&#xff0c;买方选购商品后&#xff0c;使用第三方平台提供的账户进行货款支…

第三方支付系统--支付流程

目前来说&#xff0c;越来越多的行业互联网化&#xff0c;也掀起了互联网金融的浪潮&#xff0c;第三方支付的开发也越来越广泛&#xff0c;一般大型的第三方支付系统包括&#xff0c;前置系统&#xff0c;支付系统&#xff0c;渠道系统&#xff0c;账务系统&#xff0c;清结算…

作为测试,你了解第三方支付吗?

在很多平台都是调用第三方支付平台&#xff0c;比如支付宝&#xff0c;微信&#xff0c;银联电子支付等。你是否真的了解第三方支付呢&#xff1f; 大家每天在使用支付宝时&#xff0c;是不是感觉很蛮简单的&#xff1f;不外乎就是绑个卡&#xff0c;验一下支付密码&#xff0c…

程序员如何挣外快

挣钱的方式有很多&#xff0c;今天讲的是我觉得比较适合程序员的方法&#xff0c;如果渴望一夜暴富的&#xff0c;可以不用往下看了&#xff0c;因为这种简单粗暴的方法可能有&#xff0c;但是我并不知道&#xff0c;就算知道了也不会到处跟人说。在我看来&#xff0c;对于程序…

php初级程序员,接单,挣外快的指导方法

本文只是适合入门一段时间的php初级程序员哟&#xff0c;大佬就可以忽略不计。 我当时大二&#xff0c;学习php一个月&#xff0c;就尝试网上第一次接单了&#xff0c;也算是运气不错&#xff0c;当时接了几个女生的课堂设计&#xff0c;刚好她们就不需要太多的美观&#xff0c…

程序员如何挣外快?

当程序员是一件很棒的事情。不仅很有趣,还有大量的工作机会,其中多数工作的薪资都很高。 但有时候,你仍想去赚一些外快。可能是因为仍在上大学,可能是想为自己而非他人工作,或者想用更多的时间陪伴孩子。你仍需要赚更多的钱,或者仅仅是兴趣使然。好消息是:作为程序员,…

程序员挣外快指南

作为一名程序员&#xff0c;在上班之余&#xff0c;我们有大把的时间&#xff0c;不能浪费&#xff0c;这些时间其实都是可以用来挖掘自己潜在的创造力&#xff0c;今天要讨论的话题就是&#xff0c;程序员如何利用空余时间挣零花钱&#xff1f;比如说周末可以赚外快啊&#xf…

程序员赚外快的方式

更多文章详情–>码帮帮 前言 IT这个行业&#xff0c;就是个围城&#xff0c;里面都想逃离&#xff0c;外面的人千方百计想进来&#xff0c;外面的人想进来无非就是看中我们这个行业的工资高罢了&#xff0c;里面的人想出去&#xff0c;无非就是工作压力大&#xff0c;技术…

怎么通过python挣外快_我是如何通过python挣外快的

之前写过《在校大学生如何用知识月入3000》&#xff0c;是文字版的&#xff0c;昨天趁着去KFC吃饭这件事引起了我话痨模式&#xff08;录制了视频上传到B站&#xff09;&#xff0c;重新谈谈兼职赚钱这个事情。 我为啥要去吃KFC&#xff1f; 根本原因 我是风险规避型人格&…

怎么用开发技术赚外快?

假设你是一位软件开发人员&#xff0c;想利用业余时间赚点外快补贴生活&#xff0c;你会怎么做呢&#xff1f; 我听到过很多答案&#xff0c;懂iOS开发的小伙伴说&#xff0c;可以做个App放到App Store中卖&#xff1b;懂网站开发的小伙伴说&#xff0c;可以做个网站卖广告&am…

网络安全是怎样练成的.5——SRC外快之路

SRC赚外快 一、什么是SRC&#xff1f;二、各大SRC的奖励&#xff08;先看好处吧&#xff09;1. CNVD的奖励2.其它平台的奖励 三、各大SRC平台&#xff08;深入了解一下吧&#xff09;1.国家平台2.各大厂商平台 四、寄语 一、什么是SRC&#xff1f; 在网络时代虽然有很多的网站…