fastAdmin支付插件之异步回调问题,处理并发通知

博主使用FastAdmin支付插件开发PC端扫码充值功能,遇到微信服务器多次异步回调致数据多次修改问题。查阅微信支付文档,得知需检查业务数据状态、用数据锁并发控制。博主采取方法解决问题,但仍觉有缺陷,欢迎分享更好办法。

最近使用FastAdmin的支付插件来开发了一个PC端扫码充值余额的功能。在成功充值后,我遇到了微信服务器多次发送异步回调通知,我的数据多次修改的问题。我按照FastAdmin支付插件里的回调响应,

//下面这句必须要执行,且在此之前不能有任何输出
return $pay->success()->send();

但是我觉得这一行代码没有实际作用(不知道是否是bug,网上没找到相关解决的办法),因此没有向微信服务器发送成功的响应消息使微信不再推送。这导致微信服务器继续发送通知,最终导致我的数据被多次修改,以下内容主要是解决这个问题。

我查阅了微信支付官方文档,发现文档明确指出:“同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。” 推荐的做法是,当商户系统收到通知后,首先检查相关业务数据的状态,判断通知是否已经被处理。如果尚未处理,则进行处理;如果已经处理,则直接返回处理成功的结果。在处理业务数据之前,必须使用数据锁来进行并发控制,以防止函数重入造成数据混乱。

并发控制确实是需要考虑的问题。下面是我打印的日志:

写入时间:	2023-09-15 10:07:21
支付时间:	2023-09-15T10:07:20+08:00
商户订单号:	R20230915100609000017
支付方式:	wechat
微信支付系统订单号:	4200001944202309159886018410
支付类型:	NATIVE
总金额:	0.01
用户支付金额:	0.01
付款银行:	OTHERS
支付手续费:	0
支付状态:	SUCCESS
============================================================================

写入时间:	2023-09-15 10:07:23
支付时间:	2023-09-15T10:07:20+08:00
商户订单号:	R20230915100609000017
支付方式:	wechat
微信支付系统订单号:	4200001944202309159886018410
支付类型:	NATIVE
总金额:	0.01
用户支付金额:	0.01
付款银行:	OTHERS
支付手续费:	0
支付状态:	SUCCESS
============================================================================

写入时间:	2023-09-15 10:07:37
支付时间:	2023-09-15T10:07:20+08:00
商户订单号:	R20230915100609000017
支付方式:	wechat
微信支付系统订单号:	4200001944202309159886018410
支付类型:	NATIVE
总金额:	0.01
用户支付金额:	0.01
付款银行:	OTHERS
支付手续费:	0
支付状态:	SUCCESS
============================================================================

显示微信服务器在短短5秒内发送了3次通知。由于我的余额修改业务代码位于异步通知中,因此我的余额连续修改了三次。这导致我的余额瞬间暴涨,我的血压也随之上升。这对用户来说是一个“好事”对于我来说就是要命呐,多余的资金还得自己承担。

为了解决并发请求异步回调的问题,我采取了下面的方法:

/**
     *  商户订单号作为标识同一个请求
     *  查询数据库支付订单状态是否修改为已经支付,是则退出
     *  根据订单号首字母区别是客户下单支付还是充值余额
     *  O:客户下单  R: 客户充值
     *  支付成功异步通知
     */
    public function notifyx()
    {
        $paytype = $this->request->param('paytype');
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值