微信防止重复支付方案

支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互。

支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。

这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好。

总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新。

这个时候有可能产生投诉,或者用户重复支付。

由于③⑤造成的掉单称之为外部掉单,由④⑥造成的掉单我们称之为内部掉单

为了防止掉单,这里可以这样处理:

1、 支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态;
2、 支付中心这边要自己定义一个超时时间(比如:30秒),在此时间范围内如果没有收到支付成功回调,则应调用接口主动查询支付结果,比如10s、20s、30s查一次,如果在最大查询次数内没有查到结果,应做异常处理;
3、 支付中心收到支付结果以后,将结果同步给业务系统,可以发MQ,也可以直接调用,直接调用的话要加重试(比如:SpringBootRetry);
4、 无论是支付中心,还是业务应用,在接收支付结果通知时都要考虑接口幂等性,消息只处理一次,其余的忽略;
5、 业务应用也应做超时主动查询支付结果;

对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中,用定时任务去扫

为了防止订单重复提交,可以这样处理:

创建订单的时候,用订单信息计算一个哈希值,判断redis中是否有key,有则不允许重复提交,没有则生成一个新key,放到redis中设置个过期时间,然后创建订单。

其实就是在一段时间内不可重复相同的操作

附上微信支付最佳实践:

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP微信支付Native支付是指在PHP开发环境中使用微信支付的一种支付方式。具体而言,Native支付是将微信支付的功能集成到PHP程序中,使得用户在网页上能够通过微信扫码支付的方式完成支付流程。 要实现PHP微信支付Native支付,在开发环境中需要先进行以下几个步骤: 1. 注册微信支付商户账号:通过微信支付官方网站注册并获取商户号以及相关的API密钥。 2. 配置服务器环境:搭建PHP开发环境,并确保服务器支持HTTPS协议,因为微信支付要求使用HTTPS进行数据传输。 3. 引入微信支付SDK:下载并引入微信支付的PHP SDK,该SDK提供了调用微信支付接口的相关函数库。 4. 编写支付代码:根据具体需求,编写PHP代码调用微信支付接口,包括生成支付二维码、处理支付结果等。 5. 测试支付流程:在开发环境中进行支付流程的测试,包括生成支付二维码供用户扫码、接收微信支付异步通知等。 需要注意的是,使用微信支付Native支付时,要确保生成的支付二维码能够正常显示,并能够通过微信扫码完成支付。另外,在接收微信支付异步通知时,要对收到的订单信息进行验证,确保支付结果的准确性。 总结来说,PHP微信支付Native支付是在PHP开发环境中实现微信支付功能的一种方式,通过生成支付二维码让用户扫码完成支付流程。要实现该功能,需要注册商户账号、配置服务器环境、引入微信支付SDK并编写相应的支付代码。最后,在开发环境中进行测试,确保支付流程的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值