这段时间一直在捣鼓扫码支付的功能,项目中使用了支付宝扫码支付和微信扫码支付。中间遇到了很多坑,由于我们系统是分别支持这两种方式的,并且可以随时切换支付方式,特此记录一下。
用户发起测试,选择支付宝支付,这时候生成了二维码并且扫描了二维码,但是没有付款,这时候支付宝账号里面会有一个等待付款的记录,如果你没有设置timeout_express失效时间,这个订单会一直在账单里面。
然后用户感觉这次测试有问题想删除,于是系统调用支付宝关闭订单接口,这时候账单里面显示交易关闭,流程很正常,没有一点问题。
用户发起测试,选择支付宝支付,这时候生成了二维码但没有扫描。
然后用户感觉这次测试有问题想删除,于是系统调用支付宝关闭订单接口,但是这时候后台接口报错了,提示订单不存在
回想起当时关闭微信订单的时候很没问题的啊,仔细阅读API,测试了好多次都是这样子,随后邮件询问了蚂蚁金服的工程师,很快就回复了,回复是这样子的:
如果你调用的是当面付预下单接口(alipay.trade.precreate),调用成功后订单实际上是没有生成,因为创建一笔订单要买家、卖家、金额三要素。预下单并没有创建订单,所以根据商户订单号操作订单,比如查询或者关闭,会报错订单不存在。当用户扫码后订单才会创建,用户扫码之前二维码有效期2小时,扫码之后有效期根据timeout_express时间指定。
简单来说,在你没扫描二维码之前其实根本没有生成订单,所以会报错提示订单不存在,这可能是支付宝跟微信支付的一个区别吧。
用户发起测试订单,首先我们选择支付宝支付,这时候生成支付二维码但是没有扫描。
用户突然想改变付费方式了,于是它又选择了微信支付,这时候我们的业务逻辑是要关闭支付宝订单的,但是这时候后台接口报错了,提示订单不存在 场景二已经说明,这里切换支付方式不再调用订单关闭接口。
用户发起测试订单,首先我们选择微信支付,这时候生成支付二维码但是没有扫描。
用户突然想改变付费方式了,于是它又选择了支付宝支付,这时候我们的业务逻辑是要关闭微信订单的,但是这时候后台接口并没有像支付宝关闭订单那样报错。
那说明微信二维码生成的同时已经生成了订单,所以不会像支付宝那样提示订单不存在 。
基于场景四,用户这时候又切换付费方式为微信了,于是我们重新调用微信下单接口,这时候问题出现了,提示订单已关闭。因为我们的产品订单号是唯一的,每次调用下单接口参数是一致的,如场景三一样,不再关闭订单。
基于场景五,用户这时候又切换付费方式为支付宝了,于是我们重新调用支付宝下单接口,这时候并没有提示订单已关闭,而是顺利了生成了支付二维码,但是扫描提示订单已关闭
相关阅读:
JAVA实现的支付宝扫描二维码支付
https://cloud.tencent.com/developer/article/1096147
JAVA实现的支付宝扫描二维码支付
https://cloud.tencent.com/developer/article/1096147