支付宝扫码支付和微信扫码支付业务场景及问题记录

这段时间一直在捣鼓扫码支付的功能,项目中使用了支付宝扫码支付和微信扫码支付。中间遇到了很多坑,由于我们系统是分别支持这两种方式的,并且可以随时切换支付方式,特此记录一下。

业务场景一

用户发起测试,选择支付宝支付,这时候生成了二维码并且扫描了二维码,但是没有付款,这时候支付宝账号里面会有一个等待付款的记录,如果你没有设置timeout_express失效时间,这个订单会一直在账单里面。

然后用户感觉这次测试有问题想删除,于是系统调用支付宝关闭订单接口,这时候账单里面显示交易关闭,流程很正常,没有一点问题。

业务场景二

用户发起测试,选择支付宝支付,这时候生成了二维码但没有扫描。

然后用户感觉这次测试有问题想删除,于是系统调用支付宝关闭订单接口,但是这时候后台接口报错了,提示订单不存在

回想起当时关闭微信订单的时候很没问题的啊,仔细阅读API,测试了好多次都是这样子,随后邮件询问了蚂蚁金服的工程师,很快就回复了,回复是这样子的:

如果你调用的是当面付预下单接口(alipay.trade.precreate),调用成功后订单实际上是没有生成,因为创建一笔订单要买家、卖家、金额三要素。预下单并没有创建订单,所以根据商户订单号操作订单,比如查询或者关闭,会报错订单不存在。当用户扫码后订单才会创建,用户扫码之前二维码有效期2小时,扫码之后有效期根据timeout_express时间指定。

简单来说,在你没扫描二维码之前其实根本没有生成订单,所以会报错提示订单不存在,这可能是支付宝跟微信支付的一个区别吧。

业务场景三

用户发起测试订单,首先我们选择支付宝支付,这时候生成支付二维码但是没有扫描。

用户突然想改变付费方式了,于是它又选择了微信支付,这时候我们的业务逻辑是要关闭支付宝订单的,但是这时候后台接口报错了,提示订单不存在 场景二已经说明,这里切换支付方式不再调用订单关闭接口。

业务场景四

用户发起测试订单,首先我们选择微信支付,这时候生成支付二维码但是没有扫描。

用户突然想改变付费方式了,于是它又选择了支付宝支付,这时候我们的业务逻辑是要关闭微信订单的,但是这时候后台接口并没有像支付宝关闭订单那样报错。

那说明微信二维码生成的同时已经生成了订单,所以不会像支付宝那样提示订单不存在

业务场景五

基于场景四,用户这时候又切换付费方式为微信了,于是我们重新调用微信下单接口,这时候问题出现了,提示订单已关闭。因为我们的产品订单号是唯一的,每次调用下单接口参数是一致的,如场景三一样,不再关闭订单。

业务场景六

基于场景五,用户这时候又切换付费方式为支付宝了,于是我们重新调用支付宝下单接口,这时候并没有提示订单已关闭,而是顺利了生成了支付二维码,但是扫描提示订单已关闭

总结

  • 微信只要下单生成二维码就生成了订单。而支付宝是预下单,即使生成了二维码也没有生成订单,只有扫描了二维码才生成订单。
  • 基于上面的总结,我们就明白了为什么微信订单关闭后,再下单直接提示订单已经关闭;而支付宝还是可以预下单的,但是扫码时提示订单已经关闭。
  • 因为我们的订单号是固定的,所以最终逻辑,切换付费类型,不再关闭订单。删除测试选择关闭订单或者退款。
  • 这里需要注意一下,微信和支付宝扫码之前二维码有效期都是2小时,也就是说你2小时候扫描二维码是无效的。这个是固定值,无法更改。
  • 关于timeout_express时间的指定,是在扫码之后了,如果你设置了timeout_express,订单将自动失效。但是我们的订单号是固定的,所以就没有设置关于timeout_express时间的指定,当然可能会有潜在问题。

相关阅读:

JAVA实现的支付宝扫描二维码支付
https://blog.52itstyle.vip/archives/169/

JAVA实现的支付宝扫描二维码支付
https://blog.52itstyle.vip/archives/169/

爪哇笔记

作者: 小柒

出处: https://blog.52itstyle.vip

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。