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

一、五个接口

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

1.发起支付

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

2.支付结果查询

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

3.退款

商户用该接口进行退款

4.退款查询

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

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

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

二、四个流程

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

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

1.发起支付请求

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

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

时序图

伪代码

#商城系统

说明点

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

实例

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

2.同步回调和异步回调

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

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

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

时序图

伪代码

#2.同步回调 异步回调

说明点

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

实例

3.退款

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

时序图

伪代码

#3.退款

说明点

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

    • 部分退款:有的第三方公司不支持,需要提前咨询
    • 全额退款
  • 待退款列表:建议同一个订单的多个退款单,确认处理完一个之后,再处理另一个
  • 退款相关状态:调用第三方接口状态callStatus,退款结果状态refundStatus。callStatus成功,refundStatus未成功,可定时查退款状态
  • 查询退款结果:可选,根据第三方API情况做判断
  • 日志:请求日志和返回日志都进行记录

4.对账

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

对不上账的类型有:

  • 支付网关有数据,第三方没有数据

    • 可能被黑客攻击了,用户没有真正支付,但是我们发货了
    • 代码有问题,用户没有完成支付,但是系统认为支付成功了
    • 第三方提供数据不全
  • 支付网关没有数据,第三方有数据

    • 用户支付成功,但是同步或者异步通知都失败了
  • 金额不一致

    • 代码有问题,电商发起支付金额和真正调用第三方金额不一致
    • 第三方提供数据有问题

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

实例

三、支付进阶

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

  • 支付网关中接入多个第三方支付,如何设计使变动最小?
  • 相同的银行,多个第三方支付支持,如何设计分配流量的系统?
  • 如何监控每个第三方支付的成功率,并动态切换第三方支付?
  • 如何做好风控?

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

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

http://weixin.qq.com/r/jCkOFgjEHFVjrUx193ye (二维码自动识别)

往期文章回顾:

算法

  1. 算法学习计划
  2. 蛮力法
  3. 分治法

技术

  1. 浅谈微服务
  2. TCP性能优化
  3. 限流实现1
  4. Redis实现分布式锁
  5. Golang源码BUG追查
  6. 事务原子性、一致性、持久性的实现原理
  7. CDN请求过程详解
  8. 记博客服务被压垮的历程
  9. 常用缓存技巧
  10. 如何高效对接第三方支付
  11. Gin框架简洁版
  12. InnoDB锁与事务简析

读书笔记

  1. 敏捷革命
  2. 如何锻炼自己的记忆力
  3. 简单的逻辑学-读后感
  4. 热风-读后感
  5. 论语-读后感

思考

  1. 对项目管理的一些看法
  2. 对产品经理的一些思考
  3. 关于程序员职业发展的思考
  4. 关于代码review的思考
  5. Markdown编辑器推荐-typora

另一个小程序 返回的支付结果如何得到_如何高效对接第三方支付相关推荐

  1. 另一个小程序 返回的支付结果如何得到_手把手教你测微信小程序

    WeTest 导读 在小程序持续大量爆发的形势下,现在已经成为了各平台竞争的战略布局重点.至今年2月,月活超500万的微信小程序已经达到237个,其中个人开发占比高达2成.因小程序的开发门槛低.传播快 ...

  2. 另一个小程序 返回的支付结果如何得到_所以,你想用 $8 的价格修一个bug吗?...

    disclaimer:我对于 program repair 的了解仅限于一节软件工程的课,观点也大多是基于课上的讨论,我对于 program repair 相关的研究也没有进行更广泛的阅读,所以以下的 ...

  3. 另一个小程序 返回的支付结果如何得到_微信小程序商城的开发商家需要注意什么?...

    原标题:微信小程序商城的开发商家需要注意什么? 小程序的应用目前已经成为人们使用较为普遍的平台,无论是用于吃喝玩乐亦或是工具.商业发展等.微信作为小程序的首家推出平台,凭借其自身的10亿流量用户让小程 ...

  4. 另一个小程序 返回的支付结果如何得到_都火遍全球了,你却还在为电商支付功能开发犯难...

    作者 | 慕课网 来源 | 慕课网 "支付宝在2019年新增四亿行代码","风投圈里的宝典刊物金融博览指出:支付将迎来新的风口"......这些消息都说明了当前 ...

  5. 一个小程序云开发教程实例

    根据经验来看,制作一个小程序的整个过程,大概需要3个工作日左右,其中包括注册.审核.测试与发布等工作. 1.注册小程序账号进行认证,认证信息可复用公众号资质,无需再支付认证费用. 注:整理保存AppI ...

  6. 《十四》微信小程序中的常用 API之登录、获取用户信息、支付、提现、跳转小程序、网络请求、弹框、导航、数据缓存、图片、查看文档、音频、拨打电话、剪贴板、滚动、WXML

    微信小程序提供了 wx 这个全局变量,通过这个全局变量可以调用微信小程序的 API. 登录: wx.login():获取登录凭证 code.通过登录凭证 code 进而换取用户登录态信息,包括用户在当 ...

  7. 怎么用linux设计一个小程序,“Linux”小程序发布一个月后,我们发现了什么

    原标题:"Linux"小程序发布一个月后,我们发现了什么 这一个月来,这个小程序得到了八千多人的使用,一百多位贡献者实际参与了翻译贡献,其中贡献最高的"Datura st ...

  8. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...

    本文基于 webpack 4 和 babel 7,Mac OS,VS Code 小程序开发现状: 小程序开发者工具不好用,官方对 npm 的支持有限,缺少对 webpack, babel 等前端常用工 ...

  9. 一个小程序的首页对接后端实现用户注册

    一个小程序的首页对接后端实现用户注册 //index.js //获取应用实例 const app = getApp()Page({globalData: {appid: 'wx4abc8f71681a ...

最新文章

  1. React 项目----内联样式style的使用 (12)
  2. python工资等级分类程序-php项目中用python来预测薪资(工资)
  3. CCNA2 - Module 2 Exam Answers (05/07/2008 14:30)
  4. SpringBoot中在配置文件中限制文件上传的大小
  5. ADB 操作手机的粘贴板
  6. hdu 2025 查找最大元素
  7. “ModSecurity2”源码分析
  8. java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理
  9. 高效代码审查的十个经验
  10. linux软件包管理解析,linux学习笔记_09_软件包管理解析.doc
  11. java的var与auto_java – @Autowired和default-autowire可以共存吗?
  12. OpenCV2简单的特征匹配
  13. mysql中时间处理函数_基于mysql时间处理函数的应用详解
  14. Pygame教程系列三:绘制文本篇
  15. bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】
  16. 怎么给表格加一列序号_(表格的序号怎么顺下来)如何在excel表格填充一列序号列...
  17. 25匹马,5个跑道,最少比几次可以得出跑得最快的前三匹吗?
  18. Microsoft_SQL_Server_自定义函数整理大全
  19. 大数 组合数C(n,m)算法
  20. java补考不过怎样,合格考补考好过吗 合格考补考不过怎么办

热门文章

  1. 又一个2B的O2O创新:帮商家留住熟客
  2. 提升服务器带宽能改善延迟吗,加大带宽就能提高网速吗?
  3. c语言编程高速公路超速处罚,有关交通违章的法律知识:高速超速扣分如何规定的?...
  4. Unity坐标系 左手坐标系
  5. java游戏开发什么游戏_JAVA可以做什么类的游戏
  6. 西安三本哪个计算机学校最好,西安公办三本院校最新排名 2015
  7. 计算机硬盘换,电脑硬盘更换步骤
  8. 调整word列表缩进
  9. 微信零钱通(Java)
  10. 拍一拍:“你拍一,我拍一”,共创沙雕小气息