1.场景

  1. 在支付中, 我们经常会遇到支付后, 支付结果没办法同步返回的情况, 也就是说用户已经支付了, 但是具体支付结果还需要等待一小段时间才能知道, 微信的支付有很多种, 小程序, app,公众号, 线下支付被扫, H5 等等, 有些支付是微信自动异常通知你的, 而有些支付是微信同步返回的, 但不是管是微信给你同步返回还是异步返回, 都会有可能存在延迟的情况, 那么我们就可以写一个轮询的机制, 只要用户支付了, 我们就去轮询的查询用户的支付结果, 并获取到支付状态,我们才好对交易做进一步的处理;
  2. 还有一种场景, 比较有针对性, 当我们开发的是付款码支付(线下商户支付被扫)的时候, 这个微信的接口如果是免密的情况会同步返回支付结果, 而当需要用户输入密码的情况返回的是一个202的http状态码, 这时候微信会去唤醒用户输入密码, 最终具体的支付结果微信并不会给你推送异步通知, 因为没有异步通知这个接口, 那么就需要你主动的去查询, 所以当微信返回202的时候,我们就可以在后台开启一个轮询的机制,去查询支付结果;

2.线程池选择

ScheduledExecutorService是延时执行的线程池,他可以用来代替timer定时器。
scheduleAtFixedRate()方法:

//循环执行任务,第一次执行时延时5秒后执行,然后第二次开始每间隔10秒执行一次,最后一个参数是时间单位
service.scheduleAtFixedRate(Runnable, 5, 10, TimeUnit.SECONDS);

大家有兴趣的可以去针对性的了了解下ScheduledExecutorService的使用,这里就不一一讲了;

3.核心线程数配置

  1. 轮询的时候线程经常需要挂起, 消耗的是cpu的资源, 上下文切换时间, 也就是说我们这个程序属于cpu密集型;
  2. 程序订单表记录的查询是根据唯一索引去查的, IO次数很少, 所以在IO上花费的时间并不多;
  3. 程序并发上比较稳定, 正常不会存在短时间内访问量激增的情况;
  4. 通过分析, 我们确定了目前的场景是: 并发不高, 执行时间长(这里的执行时间是线程挂起时间,所以消耗的是cpu的资源), 属于cpu密集型;
  5. 最后我们根据分析的场景把线程池的线程数设置为cpu核数+1, 线程不开太多, 减少线程上下文切换时间;

关于什么是IO密集型和CPU密集型,大家可以看下这篇文章:
https://blog.csdn.net/weixin_40151613/article/details/81835974

4.代码示例

//获取当前机器的核数
public static final int cpuNum = Runtime.getRuntime().availableProcessors();//轮询public void repeat(String tradeState, Map<String, Object> wechatinfo) {//延迟执行的线程池, 核心线程数以自己的服务器cpu去计算;ScheduledExecutorService service = newScheduledThreadPool(cpuNum+1);Map<String, String> queryReq = new HashMap<>();queryReq.put("outTradeNo", wechatinfo.get("out_trade_no"));queryReq.put("spmchid", wechatinfo.get("sp_mchid"));queryReq.put("submchid", wechatinfo.get("sub_chid"));//此方法无论执行时间长短,都是当一个任务执行完成之后,延退指定时间再开始执行第二个任务 service.scheduleAtFixedRate(new Runnable() {int count = 1;//计数器 count:初始为,Max=5;@Overridepublic void run() {if (count < 6 && "USERPAYING".equals(tradeState)) {//调用查询接口,新该订单状态(这部分是去调你的查询接口,大同小异自己修改一下)log.info("queryorder 第" + count + "次轮询 start" + queryReq);Commonresponse queryOrderResp = wechatTranInfo.queryOrder(queryReq);log.info("queryorder 第" + count + "次轮询 end" + queryOrderResp);Map<String, Object> queryResp = (Map) queryOrderResp.getResult();String trade_state = StringUtil.nvl(queryResp.get("trade_state"));count++;//判断查询是否成功及订单状态是否USERPAYING,不为USERPAYING就去更新订单表;if ("0".equals(queryOrderResp.getTransok()) && "IUSERPAYING".equals(trade_state)) {Map<String, Object> map = fovaOrderInfo.updatebygtcg(queryResp);log.info("支付更新订单表结果" + map);service.shutdown();}} else {//超时撤单,(这部分是去调你的撤销订单接口,大同小异自己修改一下)log.info("revokeorder超时撤单 start" + queryReq);Commonresponse revokeResp = wechatTranVoid.revokeOrder(queryReq);String trade_state = "0".equals(revokeResp.getTransok()) ? "REVOKED" : "NREVOKED";//更新订单表入参HashMap<String, Object> revokeOrderIntput = new HashMap<>();//新增类型,撤销revokeOrderIntput.put("trade_ state", trade_state);//设置订单状态revokeOrderIntput.put("out trade_no", wechatinfo.get("out_trade_no"));//设置商户订单号Map<String, Object> map = fovaorderinfo.updateByGtcg(revokeOrderIntput);//更新订单表log.info("撤单更新订单表结果" + map);service.shutdown();}}}, 5, 10, TimeUnit.NANOSECONDS);}

今天的分享就到这里,有什么微信疑问的可以联系我 WX: yufei4358

微信支付V3 消费后轮询支付结果的方案相关推荐

  1. 微信支付V3==>公众号支付、踩坑、简单记录

    开始! 接支付前,看了微信支付文档(有点乱),也看了一些文章,都是假V3,点进去看demo还是XML格式,坑,不过多描述. V3接起来整体还是有些坑的,不过坑不深,这里简单记录一下,避免忘了再踩! 首 ...

  2. springboot集成微信支付V3 SDK

    微信支付开通支付方法在这里可以参考一下:申请开通微信支付教程_个人怎么申请微信支付_郑鹏川的博客-CSDN博客 因为微信支付回调需要一个外网可访问的地址,我本地调试是采用的内网穿透的方式进行调试的. ...

  3. Java微信支付V3 DEMO分享

    1. 前言 距离上次发原创分享应该有 12 天了,最近忙里忙外的,无论是 Spring Security OAuth2 相关的,还是微信支付相关的都留了很多坑没有来得及去补,所以十分抱歉.今天得空赶紧 ...

  4. 微信支付v3版本npm包

    wechatpay-node-v3 # 微信支付v3 支持在ts和js中使用 欢迎大家加入一起完善这个api 前言 微信官方在2020-12-25正式开放了v3版本的接口,相比较旧版本v2有了不少改变 ...

  5. 微信支付V3版 java

    微信支付V3版 1.引入依赖 2.创建时间工具类 DateTimeZoneUtil.class 3.解密工具类 AesUtil.class 4.对外暴露方法 公共参数 4-1.支付下单 V3PayGe ...

  6. springboot利用官方SDK(wechatpay-apache-httpclient)接入微信支付V3

    利用微信官方提供的SDK wechatpay-apache-httpclient 实现.以微信小程序支付为例,其他支付也是一样的,就是参数和接口地址不同. 微信支付V3文档 首先要在微信商户平台设置好 ...

  7. PHP实现对微信支付v3版本的订单查询

    PS:本文只是对微信支付v3订单的查询流程的介绍,如果要实际使用请按照自身需求对代码进行修改,本文中调用了部分其他文件的方法,我会放在链接里请前往其他文章进行查看,本文采用的是使用商户订单号查询,若是 ...

  8. 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装

    微信支付 V3版本的 签名生成,验签,解密,统一下单的简单封装 V3Base 获取平台证书 回调报文解密 统一下单 暂时看了文档只完成了这部分,感觉封装的不是特别完美,希望有大佬指点一下,想着封装好一 ...

  9. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

最新文章

  1. 如何将网页下载的文档中的手动换行符替换掉
  2. 不使用递归求全排列和组合数
  3. (十)Java B2B2C o2o多用户商城 springcloud架构- SSO单点登录之OAuth2.0登录认证(1)
  4. 他来阿里 4 年,刻苦奋斗、稳扎稳打终于爬到 P7 ,他说一定要感谢这几个公众号的指导!...
  5. XCode 6 制作framework
  6. 统计学、数据分析、机器学习常用数据特征汇总
  7. .NET Core 迁移躺坑记续集--Win下莫名其妙的超时
  8. android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM
  9. 吴恩达深度学习 —— 3.7 为什么需要非线性激活函数
  10. 扩展、统计线性化和无迹RTS平滑器
  11. windows批量转换网易ncm音乐
  12. 计算机业打字排版比赛计算机实施方案,大学“新生杯”计算机打字比赛活动策划书...
  13. 移动web页面前端开发总结
  14. java 微信网页授权_java微信网页授权获取openid(第十四课)
  15. 口碑极好的SAP PP培训视频, 21G, 52个视频
  16. 关于jmeter中编写shell脚本json的应用
  17. 高数 02.04隐函数的导数
  18. 工业互联网·制药机械设备远程在线监控系统
  19. 你可能不知道的css-doodle
  20. Python爬取中原地产香港26281套在售二手房数据并分析

热门文章

  1. 美国的米拉超级计算机,超级计算机“米拉”:效力阿贡国家实验室_Intel Xeon E5-4650_服务器评测与技术-中关村在线...
  2. javaweb技术及应用QST
  3. java 图片移动代码,如何较好的移动图片
  4. 安装完Ubuntu16.04后要做的事
  5. 【9122】谈装修:项目与项目群
  6. ASP.Net0625金通置业企业网站
  7. [BZOJ]4491: 我也不知道题目名字是什么 线段树(差分)
  8. 代码优化- 前端优化
  9. 开讲啦超级计算机是几季,《开讲啦》第二季成龙:没人能替你奋斗
  10. 大众点评网平台架构组高级工程师 hadoop 应用案例