本文探讨了在使用支付宝二维码扫码支付时遇到的关单和查单异常问题。在正常支付流程中,用户扫码支付和系统主动关单均表现符合预期。然而,当服务端在用户扫码前主动关单时,会收到交易失败的提示,但用户侧已被限制交易,且此时查询订单会显示“交易不存在”。即使后续用户扫码触发了“支付失败”提示,再次关单也可能成功。更令人困惑的是,无论用户是否扫码,预下单接口始终能成功返回二维码地址,但该二维码却无法支付。这种现象导致系统在自身代码出现问题时,无法准确感知订单状态,用户也无法完成支付,给业务带来了困扰。
在支付宝扫码支付场景下,当服务端在用户扫码前执行关单操作时,即使关单接口返回失败(如40004交易失败),用户侧的交易状态也已被锁定,导致用户无法进行支付,并可能收到“支付失败,本笔交易已关闭,请收银员重新收款”的提示。
在用户扫码支付前调用查询订单接口,会返回“交易不存在”(ACQ.TRADE_NOT_EXIST);而在用户扫码后,即使关单操作失败,查询订单接口也可能返回“等待支付”(WAIT_BUYER_PAY),这表明订单状态在用户交互前后存在不一致的感知。
无论用户是否扫码,调用支付宝的PreCreate预下单接口始终能够成功生成二维码地址,但该二维码在实际支付时却无法使用。这暗示了预下单接口与实际支付流程之间可能存在状态同步或校验的断层。
当系统自身代码出现问题导致提前关单但未被正确记录时,系统无法准确感知订单已被关闭。用户即使扫码,也只能看到支付失败或交易不存在的提示,且无法获得可用的支付二维码,造成了用户体验的严重下降和业务流程的中断。
简单描述下问题。
我们目前只用到了支付宝的二维码扫码支付这一个产品,会涉及到重试关单的逻辑。
情况 1:正常调用下单,用户扫码可以正常支付
情况 2:正常调用下单,但是用户尚未扫码的时候我们关单,此时用户侧会提示支付失败
以上用户侧体验都符合预期,但是服务端关单和查单接口不正常。
情况 2-服务端-未扫码关单:
如果用户尚未扫码我们就关单,会提示关单失败( 40004 ,交易失败),但是此时用户已经不可交易了。
如果用户扫码触发提醒“支付失败,本笔交易已关闭,请收银员重新收款。”,之后再次关单,会提示关单成功。
用户扫码之前,查询订单,会提示“交易不存在”ACQ.TRADE_NOT_EXIST
用户在扫码之后,查询订单,会提示“等待支付”WAIT_BUYER_PAY
无论是用户扫码之前还是用户扫码之后,我们调用 PreCreate 预下单的接口,都可以正常得到 qrcode 的地址
所以以上情况发生了什么?
一旦我们自身的代码出现任何问题,一个单在用户有访问之前我们就提早关单但是并未记录,无论用户是否扫码我们都不能感知到这个单已经被关了——扫码之前查单提示交易不存在,扫码之后查单提示等待支付;预下单始终是成功的;用户拿到的 qrcode 始终是不能支付的
请问——这合理么?