最近使用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');

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

1906

被折叠的 条评论
为什么被折叠?



