订单超时之后的支付如何处理?如何让支付宝拒绝用户的支付请求?

遇到一种情况是,用户点击了订单的去支付宝支付,可能临时有事走开了,在支付页面停留了很长时间,直到订单超时了才回到电脑前继续完成支付,商品被恢复的库存可能已经被别的用户买走了,没有足够库存了,却生成了新的订单,这种情况怎么处理呢?怎么让支付宝对超时订单拒绝支付请求呢?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

@leo
@ruke
解决了,先感谢两位的回应。

yansongda/pay的close方法只能关闭已经创建的订单,即便参数传递的正确,因为用户下单后没有点“支付宝支付”这个按钮,支付宝单号就没有创建,对没有创建的支付宝单号就会返回上面说的 该交易不存在的 错误。
支付宝的官方文档中 提到 了 time_express参数,在用户点击“支付宝支付”创建支付宝网页支付的方法中添加这个参数就可以做到限时支付,超时支付宝网页会自动跳转到 该支付单号已关闭的页面。

file

图中参数30m(30分钟,参数支持单位m(分钟) 、d(天),更详细的查看支付宝文档),是以用户点击了“支付宝支付”这一刻算起的,如果想以订单下单时间为起点计算,可以考虑两种方案:
1、需要自己用php的时间函数计算一下用户点击“支付宝支付”时 距离结束时间的 分钟数,再赋值给time_express就行了。
2、参照了一下淘宝的做法,当用户下单的时候,直接设置超时时间,并跳转到支付宝支付页面,不让用户自己选择点击“支付宝支付”的时间节点。

我下面的回复帖子里也有讨论这两个方案,觉得都不是最佳方案,希望有大佬们能帮忙想想更好的方案,感谢留言啊。

--------------2019-4-2 更新一下---------------------------------
有个在大型电商网站的朋友告诉我分两种情况:
一、支付宝/微信的二维码超时了,用户就不能付款了,这种就不用担心了
二、如果二维码本身没有超时,订单超时了,用户会成功支付,电商后台程序也会成功更新付款数据,这种情况直接让用户找客服就好了。

总结:开发程序,不能完全抱着程序员思维,要多思考业务场景,像这个问题中的情况,本来就是极小众的情况,万一真的遇到了,让客户打电话就可以给处理,万一客户懒,嫌退款麻烦,就让你们业务人员直接按已付款处理了,直接发货,作为公司又多了一单,何乐而不为?
不要死钻牛角尖,非要在程序逻辑上做到100%完美!折磨自己不说,还让公司少了一个单子!

5年前 评论
讨论数量: 8

@leo
@ruke
解决了,先感谢两位的回应。

yansongda/pay的close方法只能关闭已经创建的订单,即便参数传递的正确,因为用户下单后没有点“支付宝支付”这个按钮,支付宝单号就没有创建,对没有创建的支付宝单号就会返回上面说的 该交易不存在的 错误。
支付宝的官方文档中 提到 了 time_express参数,在用户点击“支付宝支付”创建支付宝网页支付的方法中添加这个参数就可以做到限时支付,超时支付宝网页会自动跳转到 该支付单号已关闭的页面。

file

图中参数30m(30分钟,参数支持单位m(分钟) 、d(天),更详细的查看支付宝文档),是以用户点击了“支付宝支付”这一刻算起的,如果想以订单下单时间为起点计算,可以考虑两种方案:
1、需要自己用php的时间函数计算一下用户点击“支付宝支付”时 距离结束时间的 分钟数,再赋值给time_express就行了。
2、参照了一下淘宝的做法,当用户下单的时候,直接设置超时时间,并跳转到支付宝支付页面,不让用户自己选择点击“支付宝支付”的时间节点。

我下面的回复帖子里也有讨论这两个方案,觉得都不是最佳方案,希望有大佬们能帮忙想想更好的方案,感谢留言啊。

--------------2019-4-2 更新一下---------------------------------
有个在大型电商网站的朋友告诉我分两种情况:
一、支付宝/微信的二维码超时了,用户就不能付款了,这种就不用担心了
二、如果二维码本身没有超时,订单超时了,用户会成功支付,电商后台程序也会成功更新付款数据,这种情况直接让用户找客服就好了。

总结:开发程序,不能完全抱着程序员思维,要多思考业务场景,像这个问题中的情况,本来就是极小众的情况,万一真的遇到了,让客户打电话就可以给处理,万一客户懒,嫌退款麻烦,就让你们业务人员直接按已付款处理了,直接发货,作为公司又多了一单,何乐而不为?
不要死钻牛角尖,非要在程序逻辑上做到100%完美!折磨自己不说,还让公司少了一个单子!

5年前 评论
ruke

我之前做拼团活动的时候也遇到这个问题..

我是直接给退款了..

5年前 评论
leo

支付宝有提供关闭订单接口,yansongda/pay 包也提供了封装:https://docs.pay.yansongda.cn/alipay/close

在关闭订单任务中调用这个关闭订单接口即可。

5年前 评论

我按照文档写了close方法,但是各种报错。

文档中close传递的是一个数组格式的参数,我写代码如下:

file
queue:work 处理失败,查看日志中的内容是一堆SQL:
不明白错误
file

file

file

5年前 评论

@leo
如果采用了数组方式的写法,
$alipay = app('alipay');
$result = $alipay->close( [
$this->order->no
]);
报错内容是这样的:

file

5年前 评论
leo

@jingzhognwa 文档已经说得很清楚怎么用了,自己认真看

5年前 评论

@leo
@ruke
解决了,先感谢两位的回应。

yansongda/pay的close方法只能关闭已经创建的订单,即便参数传递的正确,因为用户下单后没有点“支付宝支付”这个按钮,支付宝单号就没有创建,对没有创建的支付宝单号就会返回上面说的 该交易不存在的 错误。
支付宝的官方文档中 提到 了 time_express参数,在用户点击“支付宝支付”创建支付宝网页支付的方法中添加这个参数就可以做到限时支付,超时支付宝网页会自动跳转到 该支付单号已关闭的页面。

file

图中参数30m(30分钟,参数支持单位m(分钟) 、d(天),更详细的查看支付宝文档),是以用户点击了“支付宝支付”这一刻算起的,如果想以订单下单时间为起点计算,可以考虑两种方案:
1、需要自己用php的时间函数计算一下用户点击“支付宝支付”时 距离结束时间的 分钟数,再赋值给time_express就行了。
2、参照了一下淘宝的做法,当用户下单的时候,直接设置超时时间,并跳转到支付宝支付页面,不让用户自己选择点击“支付宝支付”的时间节点。

我下面的回复帖子里也有讨论这两个方案,觉得都不是最佳方案,希望有大佬们能帮忙想想更好的方案,感谢留言啊。

--------------2019-4-2 更新一下---------------------------------
有个在大型电商网站的朋友告诉我分两种情况:
一、支付宝/微信的二维码超时了,用户就不能付款了,这种就不用担心了
二、如果二维码本身没有超时,订单超时了,用户会成功支付,电商后台程序也会成功更新付款数据,这种情况直接让用户找客服就好了。

总结:开发程序,不能完全抱着程序员思维,要多思考业务场景,像这个问题中的情况,本来就是极小众的情况,万一真的遇到了,让客户打电话就可以给处理,万一客户懒,嫌退款麻烦,就让你们业务人员直接按已付款处理了,直接发货,作为公司又多了一单,何乐而不为?
不要死钻牛角尖,非要在程序逻辑上做到100%完美!折磨自己不说,还让公司少了一个单子!

5年前 评论

@jingzhognwa 我觉得方案一,用户体验比较好,你实现了没?有相关代码可以贴出来看看么?

5年前 评论

@Flourishing 我也觉得一好,但是麻烦- -所以我采用了第二种。。。
第一种的话:
问题一:
因为服务器之间的时间总会有点误差,加上php计算时间函数所产生的时间花销,两个服务器的处理时间不可能完全一致,得保证支付宝关闭时间一定要早于订单关闭时间,常规情况下,让支付宝比订单早关闭5-10秒钟就差不多了。
问题二:
上面说的是常规考量,但是自己的服务器大概率是比支付宝的稳定性差一点,假如订单提交后,支付宝的时间计算过并传递过去了,你的服务器挂了,或者redis挂了,队列不能及时处理订单关闭的操作。。。。
问题三:
其他极端情况

综上,方案一处理起来太费神了。
第二种方案的话,也有问题二 的情况,但是它发生的机会只有在订单提交后跳转支付宝前的一瞬间,方案二,在订单提交之后到订单结束时间之间都有问题二产生的机会,你设置了30分钟,那问题发生就多了30分钟的机会。。

总之这俩方案都不完美,有没有其他高人有更好的方案啊,感谢留言

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!