Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
沉默王二
Jmx Java
提交
941b9761
J
Jmx Java
项目概览
沉默王二
/
Jmx Java
大约 1 年 前同步成功
通知
160
Star
18
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
Jmx Java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
941b9761
编写于
8月 23, 2022
作者:
沉默王二
💬
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update ruhfzddcfzf.md
上级
2e8fd246
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
63 addition
and
52 deletion
+63
-52
docs/nice-article/weixin/ruhfzddcfzf.md
docs/nice-article/weixin/ruhfzddcfzf.md
+63
-52
未找到文件。
docs/nice-article/weixin/ruhfzddcfzf.md
浏览文件 @
941b9761
...
...
@@ -13,13 +13,13 @@ head:
想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付。
# 看看订单支付流程
#
#
看看订单支付流程
我们来看看,电商订单支付的简要流程:
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-d214715e-611b-40bd-be68-e4646e91cdcc.jpg
)
![
订单钱包支付流程
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-d214715e-611b-40bd-be68-e4646e91cdcc.jpg
)
订单钱包支付流程
从下单/计算开始:
...
...
@@ -28,22 +28,22 @@ head:
3.
**发起支付**
:支付服务调用三方支付,通常这种钱包类的支付,在发起支付这一步,会响应一些支付的链接,客户端会对链接进行对应的处理。
4.
**钱包支付**
:用户进行支付,通常是通过对应的钱包进行的,大家可以回忆一下自己在购物中,支付的过程,不同的端,对钱包支付的处理是不太一样的:
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-9b6deba3-d86b-45d3-b17f-b3f4aa615505.jpg
)
![
京东PC端支付页
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-9b6deba3-d86b-45d3-b17f-b3f4aa615505.jpg
)
京东PC端支付页
*
`APP端`
: 在国内,购物大部分都是在APP端,产品经理会想法设法把用户带到APP,为什么我的示例图都用京东,不用淘宝呢?因为我拿UC打开淘宝,会直接跳转APP。
APP端的钱包支付,我们应该都非常熟悉,一般是拉起钱包,支付。
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-9a63af83-39e5-463b-9a69-8e5238e4a49e.jpg
)
![
APP支付
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-9a63af83-39e5-463b-9a69-8e5238e4a49e.jpg
)
APP支付
*
`WAP端`
:手机的网页站,WAP端的支付一般是直接拉起对应的钱包,如果拉起钱包失败,就跳转界面
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-ba7c4a9a-27cb-43d3-8624-30f3b451ba26.jpg
)
![
京东支付WAP端
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-ba7c4a9a-27cb-43d3-8624-30f3b451ba26.jpg
)
京东支付WAP端
*
`PC端`
:PC端,通常是打开收银台,展示一个二维码,通过钱包扫码支付,下面是京东的微信支付扫码页
6.
**支付回调**
:用户完成支付后,三方支付平台,会回调商户,通知支付结果。
...
...
@@ -51,28 +51,28 @@ APP支付
我们再从支付流水的角度看一下支付状态的变化:
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-a1c0390b-e070-4b77-a913-d28ce971b0af.jpg
)
![
支付状态变化
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-a1c0390b-e070-4b77-a913-d28ce971b0af.jpg
)
支付状态变化
*
从未支付,到有支付结果的终态,中间还有一个中间状态
`支付中`
*
用户通过打开钱包--》完成支付--》支付回调,这段时间的支付流水就处于
`支付中`
为什么要花这么多篇幅来讲支付的业务流程、交互过程呢?因为我认为,防止订单的重复支付,不止是技术上的问题,也是业务和产品上的问题。
# 为什么订单会重复支付
#
#
为什么订单会重复支付
## 未防重导致的重复支付
##
#
未防重导致的重复支付
我们可以看到PC端支付,是扫描二维码,这些二维码,就是对应相应的支付流水,假如用户重复点击支付,如果不做防重的的话,会生成两笔支付流水,也就是两个不同的二维码,要是用户分别扫了两个不同的支付码,那么毫无疑问,就会产生重复支付。
## 掉单导致的重复支付
##
#
掉单导致的重复支付
“我明明付款了,为什么我的订单还没支付呢?”
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-85a3662c-ccc6-4bea-8fd6-78374ad64fd5.jpg
)
![
黑我钱是吧
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-85a3662c-ccc6-4bea-8fd6-78374ad64fd5.jpg
)
黑我钱是吧
这就是所谓的“掉单”:
...
...
@@ -81,7 +81,7 @@ APP支付
用户一看,自己付了款,结果商城里订单还未付款,但是又特别想要,可能就会再下一单,这样就重复支付了。
## 多渠道导致的重复支付
##
#
多渠道导致的重复支付
我们国内支付的体验还是非常快捷的,大家可能没有感觉,如果了解过海外支付的可能了解,很多支付的渠道,消耗的时间非常长。
...
...
@@ -89,13 +89,13 @@ APP支付
这种情况大家可能很少遇到,我们可以用
`美团`
下一个单,先打开微信支付,不要支付啊,接着回到美团,打开支付宝,用支付宝支付完成后,用微信接着支付,大家猜猜,两笔支付是不是都能成功?答案是可以。
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-10584c11-08ca-4fb8-a6fb-a68155aeb21e.jpg
)
![
美团多渠道支付
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-10584c11-08ca-4fb8-a6fb-a68155aeb21e.jpg
)
美团多渠道支付
# 如何防止订单重复支付
## 加锁
## 如何防止订单重复支付
### 加锁
不管是
`3.申请支付`
、还是
`5.支付回调`
,都应该以订单维度加锁,防止并发下的重复操作。
...
...
@@ -103,9 +103,8 @@ APP支付
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-31a82d77-598a-4b1e-bf73-0c2b5ac490f1.jpg
)
加锁
## 缓存结果
##
#
缓存结果
申请支付成功,支付回调成功,都应该缓存结果。
...
...
@@ -113,9 +112,8 @@ APP支付
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-4dbb0659-7401-47be-b009-f266cca2d732.jpg
)
在这里插入图片描述
## 支付中流水取消
##
#
支付中流水取消
假如说,用户重复支付了,再次申请支付的时候,如果已经申请支付成功了,那么这笔支付肯定是要拒绝的。
...
...
@@ -125,31 +123,31 @@ APP支付
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-ef5a814e-e1fa-4851-b976-325c2ffc6b68.jpg
)
支付中流水取消
## 已支付流水退款
### 已支付流水退款
现在又有新的问题了,假如发起支付的时候,有流水正在支付中,如果第三方支付平台不支持取消支付,或者用户新的支付是通过不同的渠道,我们希望尽可能提高用户的支付成功率,怎么办呢?
我们可以在发起支付的时候,订单还在支付中的情况下,允许用户发起多笔支付,在支付回调的时候,检查用户是否已经有成功流水,对后来的流水进行退款处理。
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-41a23c59-9701-4f6e-808f-64b0c856327c.jpg
)
![
支付回调
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-41a23c59-9701-4f6e-808f-64b0c856327c.jpg
)
支付回调
当然,退款是个很危险的操作,毕竟钱退了,可就很难追回来,一定要做好风险的控制。
## 主动轮询&重试防止掉单
##
#
主动轮询&重试防止掉单
### 主动轮询防止外部掉单
###
#
主动轮询防止外部掉单
如果因为故障没有收到回调,或者没有及时收到回调,就可能会发生所谓的外部掉单。
防止外部掉单的关键,就在于,不能傻傻地只等三方的回调通知,而要主动去查询,用户发起支付的3s之后,就可以发起轮询了,直到拿到支付流水的最终状态,主动轮询,一般可以这么实现:
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-4fe79ee5-b65f-4992-bec0-3f521aa7362d.jpg
)
![
轮询
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-4fe79ee5-b65f-4992-bec0-3f521aa7362d.jpg
)
轮询
*
**定时任务轮询**
...
...
@@ -164,7 +162,7 @@ APP支付
另外一种方式就是使用延时消息,用户发起支付之后,发送一个延时消息,消费到延时消息之后,查询流水支付状态,没有拿到最终状态,就再发一个延时消息。延时消息的好处是对数据库的压力没有那么大,轮询的梯度也可以进行控制,缺点是实现起来复杂一些,而且要维护消息队列。
### 同步+异步防止内部掉单
###
#
同步+异步防止内部掉单
支付服务在收到异步通知回调、或者主动轮询到流水的最终状态后,要通知订单服务支付流水的变化,订单服务同步更新订单的状态,这个过程要尽可能保证通知成功,可以采用同步+异步的方式。
...
...
@@ -178,37 +176,50 @@ APP支付
*
拉:很简单,就是客户端在用户跳回订单状态页的时候,轮询一会,如果用户完成支付,通常很短时间就能获取到状态的变更,当然这种方式对客户端的性能会有一些影响,而且很出现状态同步“漏网之鱼”的情况。
*
推:推的实现有些麻烦,Web通常是用Websocket,对APP端的推送,一般采用第三方的推送平台。
## 客户端支付尽可能不外跳
##
#
客户端支付尽可能不外跳
不管从产品的角度,还是技术的角度,客户端发起支付这一步,其实应该尽可能地不要外跳,PC端使用支付服务生成的支付码,而不是跳转;移动端网页、APP在应用内展示支付页,当然这个是由第三方支付平台决定的。
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-0a29dff7-75eb-43b9-a2e4-fd04e9b299e6.jpg
)
![
在UC内内嵌支付宝
](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-0a29dff7-75eb-43b9-a2e4-fd04e9b299e6.jpg
)
在UC内内嵌支付宝
不知道大家留意到了没有,现在的支付宝,已经做到了不用拉起钱包,在应用内就可以完成支付,这个对于商家的意义还是比较大的,对用户体验、支付成功率,都有正面的作用,相信以国内的内卷程度,其它支付供应商,一定会“跟进”的。
* * *
## ending
一个人可以走得很快,但一群人才能走得更远。欢迎加入
[
二哥的编程星球
](
https://mp.weixin.qq.com/s/e5Q4aJCX9xccTzBBGepx4g
)
,里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议。星球提供的三份专属专栏《Java 面试指南》、《编程喵 🐱(Spring Boot+Vue 前后端分离)实战项目笔记》、《Java 版 LeetCode 刷题笔记》,干货满满,价值连城。
![](
https://files.mdnice.com/user/3903/0c9e5f37-f702-4799-9a56-0ad87173e875.png
)
![](
https://files.mdnice.com/user/3903/93ef3f1d-10f1-433a-932e-d5ba45cd61ee.png
)
![](
https://files.mdnice.com/user/3903/16199e4c-5e44-4924-abcb-46a6e1e1bc0f.png
)
**微信8.0将好友放开到了一万,小伙伴可以加我大号了,先到先得,再满就真没了**
**扫描下方二维码即可加我微信啦,`2022,抱团取暖,一起牛逼。`**
已经有
**650 多名**
小伙伴加入
[
二哥的编程星球
](
https://mp.weixin.qq.com/s/e5Q4aJCX9xccTzBBGepx4g
)
了,如果你也需要一个良好的学习氛围,
[
戳链接
](
https://mp.weixin.qq.com/s/e5Q4aJCX9xccTzBBGepx4g
)
加入我们的大家庭吧!这是一个 Java 学习指南 + 编程实战 + LeetCode 刷题的私密圈子,你可以向二哥提问、帮你制定学习计划、跟着二哥一起做实战项目,冲冲冲。
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-30d252e2-ef82-4f4a-bbe8-45ca12c12ef4.jpg
)
## 推荐阅读
![](
https://files.mdnice.com/user/3903/b76fe1f7-cca8-48e8-99dc-061233ed1b5e.png
)
*
[
程序员买房前后对比,太TM真实了!
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247501513&idx=1&sn=7c6b6152c836922a2a5edec461634a99&scene=21#wechat_redirect
)
*
[
在IDEA里下五子棋不过分吧?
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247501430&idx=1&sn=9a9ee5545ab2221463ffeff640e7d9a2&scene=21#wechat_redirect
)
*
[
阿里 P6 和 P7 的主要区别是什么?
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247501423&idx=1&sn=67066ada93102045be7291a1bf7b5ee2&scene=21#wechat_redirect
)
*
[
仅需一个依赖给Swagger换上新皮肤,既简单又炫酷!
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247501400&idx=1&sn=ddafc938b05816cc6871d912f94e913d&scene=21#wechat_redirect
)
*
[
HTTP 3.0 彻底放弃TCP,TCP到底做错了什么?
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247501374&idx=1&sn=98c26361a97d7bf894a6de089318943b&scene=21#wechat_redirect
)
*
[
Mall电商实战项目全面升级!支持最新版SpringBoot,干掉循环依赖...
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247500820&idx=1&sn=9895bd4c39b90d45eb2a10efedb236ac&scene=21#wechat_redirect
)
*
[
重磅更新!Mall实战教程全面升级,瞬间高大上了!
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247499376&idx=1&sn=3ed28795cdd35fbaa3506e74a56703b0&scene=21#wechat_redirect
)
*
[
40K+Star!Mall电商实战项目开源回忆录!
](
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247486684&idx=1&sn=807fd808adac8019eb2095ba088efe54&scene=21#wechat_redirect
)
![](
https://files.mdnice.com/user/3903/d6587d16-7953-417c-a0e8-78868bb8f71f.png
)
* * *
没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。
**推荐阅读**
:
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ruhfzddcfzf-da664b36-ac4c-4d16-a345-fc710462b515.jpg
)
-
[
专升本上岸的秘诀
](
https://mp.weixin.qq.com/s/yH42DxmRBSjrr0SW9N3MFg
)
-
[
愤怒,一个破培训班要价 28 万
](
https://mp.weixin.qq.com/s/miOagyv4x3HrqVaU38uh4w
)
-
[
公司不卡学历,却担心自己实力不够
](
https://mp.weixin.qq.com/s/s7KwW0cw2ZPR60SPFc6K0Q
)
-
[
今年面试有点小难,还是要冲
](
https://mp.weixin.qq.com/s/iETW0dCfxxTTiRt1-WmeNw
)
-
[
人生当中挣到的第一个 1 万元
](
https://mp.weixin.qq.com/s/9Naa2r7Xkf9D4d9tqEdgVQ
)
-
[
新一代开源免费的终端工具,太酷了
](
https://mp.weixin.qq.com/s/2IUe50xBhuEWKDzARVd51A
)
-
[
Java 后端四件套学习资料
](
https://mp.weixin.qq.com/s/3lqp4x1B5LI1hNjWAi6v1g
)
-
[
银行开发太安逸,奋发图强要跳槽
](
https://mp.weixin.qq.com/s/ZeA-mEyMkEeSHRtd8Pob9A
)
>转载链接:[https://mp.weixin.qq.com/s/yieSqKZbVvpe7R_DhRNVoA](https://mp.weixin.qq.com/s/yieSqKZbVvpe7R_DhRNVoA),出处:macrozheng,整理:沉默王二
![](
http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-rumrabbitmqzypjdg-53717e59-63c9-44bd-99d3-dd2c26fe68bb.png
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录