如何高效对接第三方支付

article/2025/10/2 14:28:00

简介

电商购物流程中核心的一环是用户支付。目前我们已经服务30个国家和地区,不同国家往往需要对接不同的第三方支付公司,所以最近两年,研发组对接了大量的第三方支付公司,积累了一定的经验。

本文主要分享如何对接第三方支付,以及在生产上实际遇到的一些问题,避免大家重复踩坑。

一、五个接口

先简单阐述一下,对接第三方支付时,需要对接如下5个核心接口

1.发起支付

该接口主要用于从第三方获取token,当用户跳转到第三方网站进行支付时,第三方支付公司用来校验是否是合法的支付请求

2.支付结果查询

商户用该接口来判断支付结果成功与否

3.退款

商户用该接口进行退款

4.退款查询

商户用该接口来判断退款结果成功与否

5.获取支付成功订单列表接口

商户用该接口获取第三方某日所有成功支付订单列表,用于对账时使用

二、四个流程

只需要对接完如下四个流程,便可完成第三方支付的对接。

  • 发起支付请求
  • 同步回调和异步回调
  • 退款和退款查询
  • 对账

1.发起支付请求

下面的时序图中有几个名词,此处先给大家介绍一下

  • 电商系统:海外商城的服务系统,负责提供整个购物流程
  • 支付网关:我们将支付抽离为一个单独的系统,该系统用来对接所有支付

时序图

在这里插入图片描述

伪代码

#商城系统
function pay(){#1.请求支付网关,获取发起支付必要信息(token,跳转url)$res = $this->payRequest($orderInfo,$sign);#2.根据返回结果,跳转到第三方,进行支付redirect($res['url']);
}#支付网关
function payment(){#1.检查请求数据的签名$this->checkSign();#2.初始化订单数据,将传入参数格式化为需要的结构$this->initData();#3.参数检查$this->checkParam();#4.记录请求日志$this->savePayLog();#5.发起支付#5.1不是首次支付,则检查是否支付成功过if(!$isFirstRequest){$this->checkPaymentStatus();}#5.2生成新的支付号$transactionCode = $this->getNewTransactionCode();#5.3请求第三方,获取token,跳转链接等信息$res = $this->pay($transactionCode);return $res;
}

说明点

  • 签名校验:请求支付接口域名为内网域名,使用签名校验,让系统更加安全
  • 记录请求日志:请求除了记录到log文件中,建议落库,方便日后查找
  • 非首次支付判断支付状态:防止重复支付,该判断可在流量高峰期降配掉
  • 生成新的支付号:部分第三方支付公司,规定同一个支付号,无论支付成功与否只能使用一次。目前,在小米网,当订单创建成功后,订单号不会改变,所以每次用户发起支付后,支付网关会生成新的支付号,使用该支付号请求第三方。该方案会引入重复支付问题,在后面章节阐述解决方案。

实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • surl:支付后,第三方会调用该url,告知支付网关支付结果,这个流程叫同步回调
  • pay_url:需要跳转到第三方的url
  • hash:第三方用hash来检验该请求是否合法

2.同步回调和异步回调

支付后,第三方支付会通知支付网关,支付结果。通知的实现一般会有两种方案

  • 同步回调:支付后,立即回调支付网关提供的回调接口。该接口url一般在发起支付时,作为参数传递给第三方
  • 异步回调:支付后,第三方支付会调用对接方提供的API,该API一般是对接的时候提供给第三方,第三方配置在自己系统中的。异步回调有重试机制,如果对接方没有返回指定结果,如httpcode不为200,则会在一段时间后重试,直到达到指定重试上线后,会停止重试。

**同步回调和异步回调是支付系统稳定性和准确性的重要保证。**这两个流程核心逻辑一致,所以此处放在一起讲述。

时序图

在这里插入图片描述

伪代码

#2.同步回调 异步回调
#支付网关
function callback()
{#1.记录请求日志$this->savePayLog();#2.检查第三方传入数据是否合法$this->checkCallbackData();#3.检查第三方签名是否合法$this->checkign();#4.根据传入数据/调用第三方查询接口判断该订单在第三方系统里是否支付成功$this->checkPaymentStatus();#5.记录返回数据$this->saveResponseLog();#6.更改订单状态#6.1如果订单是待支付状态,则更新支付网关内的订单状态,同时通知订单中心支付完成,可出库if ($orderStatus == "待支付") {$this->updateOrderStatusFinish();$this->notifyOC();#6.2如果订单已经支付完成} elseif($orderStatus == "已经支付完成") {if("相同的支付方式,第三方交易号也相同"){#6.2.1重复通知,幂等处理$this->notifyOC();}elseif("相同的支付方式,不同的交易号"){#6.2.2同渠道重复支付,将该信息记入重复支付表,进行退款$this->addRepeatPayment();}elseif("不同的支付方式"){#6.2.3不同渠道重复支付,将该信息记入重复支付表,进行退款$this->addRepeatPayment();}}#7.根据订单状态,跳转到支付成功/失败页面if("是同步回调"){redirect("电商支付成功/失败页面");}
}

说明点

  • 日志:传入和返回数据都做记录
  • 签名校验:校验第三方签名十分重要,这是防止他人攻击的方案之一
  • 判断支付成功:情况允许条件下,建议请求第三方查询接口来判断是否支付成功,这是防止他人攻击的方案之二
  • 跳转支付成功/失败页面:当发起支付时,支付成功或者失败页面的url会传给支付网关。之所以请求支付时传递该url,原因在于不同终端,url不同。
  • 该流程需要两个定时脚本进行支撑
    • 通知订单中心支付完成。因为更改支付系统的订单状态和通知订单中心未必会同时成功。
    • 重复支付订单自动退款

实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.退款

退款整体流程一般为,财务系统向支付网关发起退款请求,支付网关将退款记录到表。支付系统定时进行退款,财务系统定时查询退款状态。

时序图

在这里插入图片描述

伪代码

#3.退款
#支付网关
function refund(){#1.获取待退款列表$refundList = $this->getNotRefundList();foreach ($refundList as $item){#2.检查数据,订单是否支付成功,退款金额是否小于订单金额$this->checkRefundParams();#3.记录退款请求数据$this->saveRefundReqData();#4.查询退款结果$this->checkRefundStatus();#5.调用第三方接口进行退款$this->refund();#6.记录第三方返回数据$this->saveRefundResponse();#7.更新退款状态$this->updateRefundStatus();}
}

说明点

  • 退款类型:退款一般分为两种类型

    • 部分退款:有的第三方公司不支持,需要提前咨询

    • 全额退款

  • 待退款列表:建议同一个订单的多个退款单,确认处理完一个之后,再处理另一个

  • 退款相关状态:调用第三方接口状态callStatus,退款结果状态refundStatus。callStatus成功,refundStatus未成功,可定时查退款状态

  • 查询退款结果:可选,根据第三方API情况做判断

  • 日志:请求日志和返回日志都进行记录

4.对账

对账的完成,需要第三方提供前一天的支付成功数据,然后和支付网关系统中当天的支付成功数据进行对比。

对不上账的类型有:

  • 支付网关有数据,第三方没有数据
    • 可能被黑客攻击了,用户没有真正支付,但是我们发货了
    • 代码有问题,用户没有完成支付,但是系统认为支付成功了
    • 第三方提供数据不全
  • 支付网关没有数据,第三方有数据
    • 用户支付成功,但是同步或者异步通知都失败了
  • 金额不一致
    • 代码有问题,电商发起支付金额和真正调用第三方金额不一致
    • 第三方提供数据有问题

对账是验证支付系统准确的重要一环,可以帮助开发人员今早发现很多问题,建议每一种支付方式都要支持,并且及时对账。

实例

在这里插入图片描述

三、支付进阶

完成上述四个流程后,就实现了支付渠道的对接。然后需要考虑支付网关的实现。支付网关包含多个支付渠道,对外部提供统一的接口。支付网关一般需要考虑如下问题:

  • 支付网关中接入多个第三方支付,如何设计使变动最小?

  • 相同的银行,多个第三方支付支持,如何设计分配流量的系统?

  • 如何监控每个第三方支付的成功率,并动态切换第三方支付?

  • 如何做好风控?

这些问题的讲解涉及到很大的篇幅,今后会进行讲解。大家可以先自己思考一些解决方案。

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
在这里插入图片描述
往期文章回顾:

  1. CDN请求过程详解

  2. 关于程序员职业发展的思考

  3. 记博客服务被压垮的历程

  4. 常用缓存技巧

  5. 如何高效对接第三方支付

  6. Gin框架简洁版

  7. 关于代码review的思考


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

相关文章

第三方支付

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

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

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

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

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

程序员如何挣外快

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

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

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

程序员如何挣外快?

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

程序员挣外快指南

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

程序员赚外快的方式

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

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

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

怎么用开发技术赚外快?

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

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

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

赚外快—常见编程接单的网站集合(20余个)

▍前 言 关于程序员接私活,社会各界说法不一。按照作者的观点来说如果你确实急用钱,价格又合适,那就去做。如果不怎么缺钱,那就接私活之前要好好考虑。私活的钱不好挣是一个方面,更重要的是如果你把做私活的时间花在提…

​程序员如何挣外快?

全文共2183字,预计学习时长7分钟 来源:Pexels 当程序员是一件很棒的事情。不仅很有趣,还有大量的工作机会,其中多数工作的薪资都很高。 但有时候,你仍想去赚一些外快。可能是因为仍在上大学,可能是想为自己…

程序员六个赚外快的方法(建议收藏)

在你低头写代码的同时,很多人都在高调赚外快 文章同步到公众号《前端小时》,欢迎大家关注! 01 前言 近日闲来无事,总喜欢钻研一些“技巧”型的东西,也一直考虑别的除技术以外的东西(虽然现在技术不好&#…

盘点程序员的花式赚外快的骚操作

2022世界杯比赛难得如期开幕了,卡塔尔王子的表情包想必大家已经看到眼晕。 我拿2200亿和你玩,你踢一个0:2过不过分啊~ 现实中的投资可不比卡塔尔王子的表情包失落更多,毕竟投资有风险入行需谨慎。 然而悲惨的事实是,…

研究生期间如何赚外快

上图包含三个小图,分别是蚂蚁财富账户、腾讯理财通账户和2020年收入和纳税额,根据新的税收政策,将会退税11000左右。 本人研究生两年半已经攒了将近13W,目前还在实习,月工资7K,不出意外,六月毕…

python爬虫外快_python爬虫怎样赚外快

1)在校大学生。最好是数学或计算机相关专业,编程能力还可以的话,稍微看一下爬虫知识,主要涉及一门语言的爬虫库、html解析、内容存储等,复杂的还需要了解URL排重、模拟登录、验证码识别、多线程、代理、移动端抓取等。…

java程序员挣外快_Java程序员如何赚外快

程序员挣外快已经是屡见不鲜的事了,不管是做拍php开发,java开发,还是C,抑或是做前端开发的程序员们,都希望能凭自己的手艺挣点外快。那么,java程序员如何赚外快,赚外快的途径有哪些,…

c语言外快项目,赚外快

我这工作恐怕是要搁置一段时间了,这周旺爸刚好白班,昨天说服他让他骑着我的小电车去上班,而我家大白,就在家“好生休养”几天,车虽不是什么豪车,但是对于旺爸这个路怒症患者来说,这个车在他手里…

十个接私活赚外快的网站,你有技术就有钱

大家好,我是尼奥。 前两天在知乎上发了一篇文章「现在程序员的工资是不是被高估了」,有一些网友就私信我说:为什么工资被高估了,我还这么穷,有没有什么兼职平台推荐的。 我一想,还真有,毕竟自己也做过那么几年兼职,有些经验,就整理了这篇文章,给大家讲讲国内外那些…