订单失效了,第三方支付却推来了支付成功的消息,你遇到过吗?

2024-05-19 13:47

1. 订单失效了,第三方支付却推来了支付成功的消息,你遇到过吗?

  背景 
   一大早运营报来了一个问题:
   问题描述:有一个订单客户支付成功了,订单状态却显示过期。
   预期:客户应该支付不了失效的订单。
   问题猜想:1 是处理回调通知时,程序处理错误导致修改订单状态不成功。
   2 用户停留在支付宝的支付时间过长,导致过了订单失效期后,进行了支付。
   作为程序开发者,其他的问题都是小问题,但是遇到支付问题就是大问题,大家都懂得,于是开始紧急排查。
    问题排查 
   查看错误日志,果然找到了该订单已过期的信息,说明问题应该是问题2。
   找到订单相应的支付回调通知参数,果然找到第三方支付的成功通知。
    解决方案1 
    预支付时设置过期时间 
   微信支付订单过期参数: time_expire
      支付宝支付订单过期参数:time_expire
     
        
   温馨提示: 在排查时,看到同事写的支付代码里传了time_express , 这个不代表我们的订单过期时间,代表的是用户正确输入密码支付宝受理这笔订单业务开始计时时间,千万不要混淆了 。
   聪明的细致的你肯定想到了,还需要做一步服务器时间和第三方支付系统的服务器时间校验,不然可能出现不准的情况。
   校验服务器时间和标准时间
     
      需要关注delta,就是NTP服务时间和本地时间的差值。
   如果相差较大可以同步服务器时间,这种方式是最简单的:
   实际操作大家可以用一个定时任务,每天去同步一次。
    解决方案2 
   如果你的服务器比较多,并且同步时间会存在风险,或者你没有操作正式服务器的权限,那么可以在自己处理失效订单时,主动通知给第三方系统你的订单已经失效。
   微信调用 closeorder 方法
     
      支付宝调用
     
       比较2种方案的优劣 
   1 第一种方案的优点是,代码量少,只需要多添加一个参数即可。缺点是可能存在时间不准。
   2 第二种方案优点,可以保证订单失效时的决定时间。缺点代码量稍微大些。
    感悟 
   通过这个问题,我们可以看到,很多问题都有多种解决方案,当身处不同位置时,解决方案不同,需要我们自己权衡方案的利弊找出最优方案。如果大家有更好的解决方案,欢迎大家留言与评论。
    演示视频 
   视频加载中...

订单失效了,第三方支付却推来了支付成功的消息,你遇到过吗?

2. 第三方付款的原因

出现这种情况一般有几种原因,一是子公司和母公司不在一个区域,子公司为享受母公司的物流折扣而办理的第三方支付,例如各大航空公司以及跨区域经营公司;或是电子商务公司,他们代理着全国各种企业的商品网络销售,出现订单后让生产单位直接在产地发货给收货方,费用由电子商务公司支付,这样极其节约物流时间,一般作为附加服务的一种,例如互联成品等电子商务公司。