真香!一行代码搞定微信支付回调
前言
微信支付成功之后,会对商户系统发送异步回调请求,来通知商户支付成功。
需要注意的是:
同样的通知可能会多次发送给商户系统,商户系统必须能够正确处理重复的通知
后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止
在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【查询订单API】确认订单状态。
集成
在调用外部服务进行操作时,常常因为网络抖动、服务方进行限流等因素造成查询失败。为了克服这些问题,引入了重试机制。
在通知一直不成功的情况下,微信总共会发起多次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功
重试原则
查询可以进行重试
写操作要慎重,除非业务方支持重入
配置文件 pom.xml 引入:
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.2.5.RELEASE</version>
</dependency>
启动类新增注解 @EnableRetry:
@EnableRetry
@EnableAsync
@EnableCaching
@EnableScheduling
@SpringBootApplication
public class Application extends SpringBootServletInitializer {private static final Logger logger = LoggerFactory.getLogger(Application.class);public static void main(String[] args) {SpringApplication.run(Application.class, args);logger.info("PayCloud 支付分账系统");}@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(Application.class);}
}
回调商家客户端:
@Async
@Override
@Transactional(rollbackFor=Exception.class)
@Retryable(value= {Exception.class},maxAttempts = 10,backoff = @Backoff(delay = 2000L,multiplier = 2))
public void notifyApp(Map<String,Object> params) throws Exception {Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");String str = format.format(date);System.out.println("现在时间:" + str);/*** 处理业务逻辑*/throw new Exception("应用回调异常");
}
打印时间如下:
现在时间:21:36:40
现在时间:21:36:42
现在时间:21:36:46
现在时间:21:36:54
现在时间:21:37:10
现在时间:21:37:40
现在时间:21:38:10
现在时间:21:38:40
现在时间:21:39:10
现在时间:21:39:40
需要注意的是,最后几次重试间隔定格在了30s,原因是参数中有个maxdelay属性,默认是30s。时间间隔是取{delay,maxDelay}的最小值。如果想继续递增执行,需要将 maxDelay 设置为理想的数值。
说明
参数 @Retryable 说明
value:抛出指定异常才会重试
include:和value一样,默认为空,当exclude也为空时,默认所以异常
exclude:指定不处理的异常
maxAttempts:最大重试次数,默认3次
backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为2,则第一次重试为2秒,第二次为4秒,第三次为8秒。
小结
总的来说,这玩意还是比较不错的,但是如果遇到程序崩溃或者集群扩展那问题就来了,显然是不能满足我们实际的业务需求。后期可以使用高可用的延迟队列或者手动补偿的方式来解决!
源码
支付服务:支付宝,微信,银联详细代码案例
https://gitee.com/52itstyle/spring-boot-pay
演示
后台:https://pay.cloudbed.vip
账号:pay 密码:123456
- END -
1.3 万亿条数据查询,如何做到毫秒级响应?
分享六个经典的 SpringBoot 开源项目
一套通用的后台管理系统,赚钱就靠它了!
SpringBoot 开发案例之接入腾讯云短信
推荐一款基于 Java 的身份证号码识别系统
分享一个支付大屏实时监控数据平台
推荐一款清爽的实时监控大屏附安装教程
微信支付收银台功能上线了
支付宝支付新版 SDK 上线,让支付触手可及
太厉害了!我用 Nginx 提升系统10倍性能
牛逼,CTO点名要搞个灰度发布系统
微信支付分账,就是这么简单!
真香!一行代码搞定微信支付回调相关推荐
- java微信支付代码_10行代码搞定微信支付(Java版)
原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...
- 微信支付java helloworld_10行代码搞定微信支付(Java版)
微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与对象的互转, 微信使用xml格式而不使用jso ...
- WPF使用Linq 一行代码搞定数据绑定
首先设置好DataGrid控件的相关属性,注意XAML代码文件中的列绑定要和源数据的列名一致,如: Binding="{Binding No}" 详细设置如下: this.data ...
- 开源作品ThinkJDBC—一行代码搞定数据库操作
1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...
- 成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!)
成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!) 目录 解决问题 解决思路 解决方法 解决问题 numpy.ndarray格式类型转数据为list格式数据 ...
- 一行代码搞定 Scrapy 随机 User-Agent 设置
摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,本文就对这些方法进行汇总,提供一种只需要 ...
- 【Python】Autoviz: 一行代码搞定数据集探索并可视化
数据集各个特征有什么变化趋势.各个特征之间有何关系,我们可以借助Matplotlib.Seaborn等诸多工具来可视化展示,那么有没有一种工具能一次展示所有的关系了? 本文要介绍的Python工具Au ...
- 一行代码搞定 FTP 服务
环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...
- 一行代码搞定 GitHub 访问徽章
相信对于使用 GitHub 的小伙伴来说,以上 GitHub 徽章(badge)应该都不怎么陌生吧.如果你想快速用起来,找到你想要的徽章代码 ctrl+c & ctrl+v ,再修改对应的 G ...
最新文章
- 历史 history
- 24. Swap Nodes in Pairs 链表每2个点翻转一次
- linux定时任务_从零开始学Linux运维|41.定时任务crontab
- [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
- C语言指针变量的运算
- oracle 创建用户表空间及赋权
- 连连看(HDU-1175)
- input 底线_社区建设如何帮助组织的底线
- tomcat基本配置和应用
- 2022年电工杯B题参赛历程
- 移动通信原理B-------例题解答2
- 大唐杯 5G协议与信令 任务六、任务七(24:30-35:00)
- 电子计算机最早的应用,电子计算机的最早应用领域是什么?
- IP地址和mac地址的区别
- 博客成长,源于您的肯定……
- 16 医疗挂号系统_【预约下单】
- dcn网络与公网_DCN网络安全
- windows怎么设置始终以管理员身份运行
- 激战2怎么选最新的服务器,选哪个服好?《激战2》高玩分析各服务器进驻人数...
- 百度地图商家标注,查询附近3000米内的商家并标到地图上
热门文章
- cocos2d android 音乐,cocos2d-之音乐背景播放(示例代码)
- MINE:Mutual Information Neural Estimation
- URP无法使用 RenderType:Overlap
- 搭建自动化测试平台(selenium+testng+maven+svn+Jenkins)【转自galen2016】
- A:	牛牛的DRB迷宫I (dp)
- 个性和共性,对共性的封装。新的语言是如何诞生的
- 基于安卓的共享单车设计与实现
- Java- 求⼀个三位数,该三位数等与其每位数字的阶乘之和
- 【11g】屏蔽敏感数据 (Masking Sensitive Data)
- HDFS分布式文件系统架构