另一个小程序 返回的支付结果如何得到_如何高效对接第三方支付
本文主要分享如何对接第三方支付,以及在生产上实际遇到的一些问题,避免大家重复踩坑。
一、五个接口
先简单阐述一下,对接第三方支付时,需要对接如下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 (二维码自动识别)
往期文章回顾:
算法
- 算法学习计划
- 蛮力法
- 分治法
技术
- 浅谈微服务
- TCP性能优化
- 限流实现1
- Redis实现分布式锁
- Golang源码BUG追查
- 事务原子性、一致性、持久性的实现原理
- CDN请求过程详解
- 记博客服务被压垮的历程
- 常用缓存技巧
- 如何高效对接第三方支付
- Gin框架简洁版
- InnoDB锁与事务简析
读书笔记
- 敏捷革命
- 如何锻炼自己的记忆力
- 简单的逻辑学-读后感
- 热风-读后感
- 论语-读后感
思考
- 对项目管理的一些看法
- 对产品经理的一些思考
- 关于程序员职业发展的思考
- 关于代码review的思考
- Markdown编辑器推荐-typora
另一个小程序 返回的支付结果如何得到_如何高效对接第三方支付相关推荐
- 另一个小程序 返回的支付结果如何得到_手把手教你测微信小程序
WeTest 导读 在小程序持续大量爆发的形势下,现在已经成为了各平台竞争的战略布局重点.至今年2月,月活超500万的微信小程序已经达到237个,其中个人开发占比高达2成.因小程序的开发门槛低.传播快 ...
- 另一个小程序 返回的支付结果如何得到_所以,你想用 $8 的价格修一个bug吗?...
disclaimer:我对于 program repair 的了解仅限于一节软件工程的课,观点也大多是基于课上的讨论,我对于 program repair 相关的研究也没有进行更广泛的阅读,所以以下的 ...
- 另一个小程序 返回的支付结果如何得到_微信小程序商城的开发商家需要注意什么?...
原标题:微信小程序商城的开发商家需要注意什么? 小程序的应用目前已经成为人们使用较为普遍的平台,无论是用于吃喝玩乐亦或是工具.商业发展等.微信作为小程序的首家推出平台,凭借其自身的10亿流量用户让小程 ...
- 另一个小程序 返回的支付结果如何得到_都火遍全球了,你却还在为电商支付功能开发犯难...
作者 | 慕课网 来源 | 慕课网 "支付宝在2019年新增四亿行代码","风投圈里的宝典刊物金融博览指出:支付将迎来新的风口"......这些消息都说明了当前 ...
- 一个小程序云开发教程实例
根据经验来看,制作一个小程序的整个过程,大概需要3个工作日左右,其中包括注册.审核.测试与发布等工作. 1.注册小程序账号进行认证,认证信息可复用公众号资质,无需再支付认证费用. 注:整理保存AppI ...
- 《十四》微信小程序中的常用 API之登录、获取用户信息、支付、提现、跳转小程序、网络请求、弹框、导航、数据缓存、图片、查看文档、音频、拨打电话、剪贴板、滚动、WXML
微信小程序提供了 wx 这个全局变量,通过这个全局变量可以调用微信小程序的 API. 登录: wx.login():获取登录凭证 code.通过登录凭证 code 进而换取用户登录态信息,包括用户在当 ...
- 怎么用linux设计一个小程序,“Linux”小程序发布一个月后,我们发现了什么
原标题:"Linux"小程序发布一个月后,我们发现了什么 这一个月来,这个小程序得到了八千多人的使用,一百多位贡献者实际参与了翻译贡献,其中贡献最高的"Datura st ...
- 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...
本文基于 webpack 4 和 babel 7,Mac OS,VS Code 小程序开发现状: 小程序开发者工具不好用,官方对 npm 的支持有限,缺少对 webpack, babel 等前端常用工 ...
- 一个小程序的首页对接后端实现用户注册
一个小程序的首页对接后端实现用户注册 //index.js //获取应用实例 const app = getApp()Page({globalData: {appid: 'wx4abc8f71681a ...
最新文章
- React 项目----内联样式style的使用 (12)
- python工资等级分类程序-php项目中用python来预测薪资(工资)
- CCNA2 - Module 2 Exam Answers (05/07/2008 14:30)
- SpringBoot中在配置文件中限制文件上传的大小
- ADB 操作手机的粘贴板
- hdu 2025 查找最大元素
- “ModSecurity2”源码分析
- java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理
- 高效代码审查的十个经验
- linux软件包管理解析,linux学习笔记_09_软件包管理解析.doc
- java的var与auto_java – @Autowired和default-autowire可以共存吗?
- OpenCV2简单的特征匹配
- mysql中时间处理函数_基于mysql时间处理函数的应用详解
- Pygame教程系列三:绘制文本篇
- bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】
- 怎么给表格加一列序号_(表格的序号怎么顺下来)如何在excel表格填充一列序号列...
- 25匹马,5个跑道,最少比几次可以得出跑得最快的前三匹吗?
- Microsoft_SQL_Server_自定义函数整理大全
- 大数 组合数C(n,m)算法
- java补考不过怎样,合格考补考好过吗 合格考补考不过怎么办
热门文章
- 又一个2B的O2O创新:帮商家留住熟客
- 提升服务器带宽能改善延迟吗,加大带宽就能提高网速吗?
- c语言编程高速公路超速处罚,有关交通违章的法律知识:高速超速扣分如何规定的?...
- Unity坐标系 左手坐标系
- java游戏开发什么游戏_JAVA可以做什么类的游戏
- 西安三本哪个计算机学校最好,西安公办三本院校最新排名 2015
- 计算机硬盘换,电脑硬盘更换步骤
- 调整word列表缩进
- 微信零钱通(Java)
- 拍一拍:“你拍一,我拍一”,共创沙雕小气息