下单的二次支付的问题

简介: 下单的二次支付的问题

公众号merlinsea


  • 背景
  • 用户第一次点击下单操作的时候,会弹出支付页面等待用户支付的页面。但可能存在支付异常的情况,比如用户发现金额不够关闭了支付页面,后续通过选择其他支付方式(比如由微信支付转为支付宝支付)或者 不同的端类型(比如第一次是用电脑端支付,后面选择app支付等等)来进行支付,这个时候就会出现二次支付的场景。

  • 解决二次支付问题的思路1:
  • 由于用户支付的时候的支付页面是个html文件或者是一个支付二维码的图片,可以选择将支付页面存在数据库中,用户二次支付时通过查询数据库的支付页面,将页面返回给用户进行再次使用。【特别需要注意的是这个支付页面有没有过期!!】
  • 这种解决思路后台需要自己存储用户的支付页面或者二维码,增加了维护成本;如果支付信息超时了,那么依旧需要二次调用第三方支付。


640.jpg


  • 解决二次支付问题的思路2:


  • 用户第二次支付的时候继续调用第三方支付,让第三方根据是否超时等情况来判断是返回原来的支付页面还是生成一个新的支付页面返回。这种方案便于实现,减轻了自己后台下单的维护成本。

640.jpg


  • 注意点:用户二次支付的时候,订单微服务中是存储了用户第一次下单支付的基本信息的。因此第二次支付的时候,可以通过查询第一次支付的一些基本信息来调用第三方支付,尤其是该订单的【剩余过期时间】。
  • 剩余过期时间:后台调用第三方支付,第三方支付从收到请求信息->处理请求信息->响应请求信息是存在一定的时延的,因此一定不 能死死卡住过期时间来调用第三方支付。需要预留一些时间给第三方支付处理。比如支付过期时间是30分钟,当用户二次支付到达我们下单服务的时候是29分钟那么就拒绝支付。


  • 订单超时支付的策略
  • 策略一:前端显示订单30分钟内需要支付,后端中对第三方支付实际上是31分钟内不能支付 【预留时间给后端和第三方支付交互】
  • 策略二:前端显示订单30分钟内需要支付,后端对第三方的支付实际上是当用户支付请求在地29分钟到后端就不给支付了


  • 思路2的核心代码实现
@Override
@Transactional
public JsonData repay(RepayOrderRequest repayOrderRequest) {
    LoginUser loginUser = LoginInterceptor.threadLocal.get();
    //根据订单流水号查询第一次支付的订单信息
    ProductOrderDO productOrderDO = productOrderMapper.selectOne(new QueryWrapper<ProductOrderDO>().eq("out_trade_no",repayOrderRequest.getOutTradeNo()).eq("user_id",loginUser.getId()));
    log.info("订单状态:{}",productOrderDO);
    if(productOrderDO==null){
        return JsonData.buildResult(BizCodeEnum.PAY_ORDER_NOT_EXIST);
    }
    //订单状态不对,不是NEW状态
    if(!productOrderDO.getState().equalsIgnoreCase(ProductOrderStateEnum.NEW.name())){
        return JsonData.buildResult(BizCodeEnum.PAY_ORDER_STATE_ERROR);
    }else {
        //订单创建到现在的存活时间
        long orderLiveTime = CommonUtil.getCurrentTimestamp() - productOrderDO.getCreateTime().getTime();
        //创建订单是临界点在预留一分钟时间,比如订单实际已经存活了28分钟了,我们就对外说订单已经存活了29分钟。
        orderLiveTime = orderLiveTime + 60*1000;
        //大于订单超时时间,则失效
        if(orderLiveTime>TimeConstant.ORDER_PAY_TIMEOUT_MILLS){
            return JsonData.buildResult(BizCodeEnum.PAY_ORDER_PAY_TIMEOUT);
        }else {
            //记得更新DB订单支付参数 payType,还可以增加订单支付信息日志  TODO
            //总时间-存活的时间 = 剩下的有效时间
            long timeout = TimeConstant.ORDER_PAY_TIMEOUT_MILLS - orderLiveTime;
            //创建支付
            PayInfoVO payInfoVO = new PayInfoVO(productOrderDO.getOutTradeNo(),
                    productOrderDO.getPayAmount(),repayOrderRequest.getPayType(),
                    repayOrderRequest.getClientType(), productOrderDO.getOutTradeNo(),"",timeout);
            log.info("payInfoVO={}",payInfoVO);
            //调用第三方支付
            String payResult = payFactory.pay(payInfoVO);
            if(StringUtils.isNotBlank(payResult)){
                log.info("创建二次支付订单成功:payInfoVO={},payResult={}",payInfoVO,payResult);
                return JsonData.buildSuccess(payResult);
            }else {
                log.error("创建二次支付订单失败:payInfoVO={},payResult={}",payInfoVO,payResult);
                return JsonData.buildResult(BizCodeEnum.PAY_ORDER_FAIL);
            }
        }
    }
}
相关文章
|
8月前
|
JavaScript 开发者 索引
鸿蒙应用开发从入门到实战(九):ArkTS渲染控制
ArkTS拓展了TypeScript,可以结合ArkUI进行渲染控制,是的界面设计具有可编程性。本文简要描述鸿蒙应用开发中的条件渲染和循环渲染。
347 5
|
缓存 NoSQL Java
京东电商下单黄金链路:防止订单重复提交与支付的深度解析
【10月更文挑战第21天】在电商领域,尤其是在像京东这样的大型电商平台中,防止订单重复提交与支付是一项至关重要的任务。
879 44
|
机器学习/深度学习 编解码 人工智能
SANA-Sprint:基于连续时间一致性蒸馏的单步扩散模型,0.1秒即可生成图像
Nvidia 提出的 SANA-Sprint 是一种混合蒸馏框架,结合连续时间一致性模型(sCM)与潜在对抗扩散蒸馏(LADD),实现快速高质量文本到图像生成。它支持 1-4 步推理,单步生成 FID 7.59、GenEval 0.74,H100 GPU 上 0.1 秒生成 1024×1024 图像,比 FLUX-Schnell 快 10 倍。通过无训练一致性变换和稳定训练技术,SANA-Sprint 克服传统方法局限,推动实时生成应用。
444 4
SANA-Sprint:基于连续时间一致性蒸馏的单步扩散模型,0.1秒即可生成图像
多进程同步之文件锁
【10月更文挑战第16天】文件锁是一种常用的多进程同步机制,它可以用于确保多个进程在访问共享资源时的互斥性。在使用文件锁时,需要注意锁的粒度、释放、竞争和性能等问题。通过合理使用文件锁,可以提高多进程程序的正确性和性能
|
存储 数据可视化 数据挖掘
大数据环境下的房地产数据分析与预测研究的设计与实现
本文介绍了一个基于Python大数据环境下的昆明房地产市场分析与预测系统,通过数据采集、清洗、分析、机器学习建模和数据可视化技术,为房地产行业提供决策支持和市场洞察,探讨了模型的可行性、功能需求、数据库设计及实现过程,并展望了未来研究方向。
904 4
大数据环境下的房地产数据分析与预测研究的设计与实现
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:跨平台模型移植与部署
【7月更文挑战第10天】 使用Python实现深度学习模型:跨平台模型移植与部署
1038 1
|
JavaScript 前端开发 Java
博客管理系统|基于SpringBoot+Vue+ElementUI个人博客系统的设计与实现
博客管理系统|基于SpringBoot+Vue+ElementUI个人博客系统的设计与实现
1532 0
|
存储 监控 小程序
排查服务器异常流量保姆级教程
这篇文章将介绍当WEB服务器报警,提示磁盘使用率问题和带宽满载时的一些排查思路和解决方案。
2164 0
排查服务器异常流量保姆级教程
|
编解码 C++
基于Live555实现RtspServer及高清高分辨率和高码率视频传输优化
基于Live555实现RtspServer及高清高分辨率和高码率视频传输优化
1049 0