Closed uniquespider closed 7 months ago
没太理解$next(message)和return $server->serve()怎么做的返回值,这里算是求一个完整的写法 代码片段 代码结构截图
没太理解$next(message)和return $server->serve()怎么做的返回值,这里算是求一个完整的写法
代码片段 代码结构截图
我的想法是在handlePaid里面处理完逻辑,大部分我方系统异常全部正常返回,不需要微信再次通知; 只有一个查询订单支付状态接口如果没成功,我会抛出异常,让$sever->serve()生成500的返回,以便再次通知处理 public function payCallback(): \Psr\Http\Message\ResponseInterface { $payObj = new Pay(); $server = $payObj->app->getServer(); $server->handlePaid(function (Message $message, \Closure $next) use ($payObj) { Log::channel('wechat')->info('支付通知:'.$message); // 建议是拿订单号调用微信支付查询接口,以查询到的订单状态为准 $outTradeNo = $message->out_trade_no; $order = DB::table('membership_order') ->where('order_number', $outTradeNo) ->where('prepay_id', $message->transaction_id) ->first(); if (empty($order)) { // todo 后期需要加一个队列处理,前期默认全部成功 $msg = '我方系统异常:未找到有效订单,订单号:'.$outTradeNo; event(new SystemOperate(1, '开通会员支付回调通知','异常:'.$msg)); return $next($message); } Log::channel('wechat')->info('订单有效'); // 判断是否处理过通知 if (in_array($order->status, [Common::PAID, Common::PAY_EXCEPTION ])) { return $next($message); } Log::channel('wechat')->info('订单还未处理'); $vxUser = DB::table('vx_user')->where('id', $order->vx_user_id)->first(); $memberType = DB::table('member_type')->where('id', $order->member_type_id)->first(); $response = $payObj->app->getClient()->get("v3/pay/transactions/out-trade-no/{$outTradeNo}", [ 'query' => [ 'mchid' => $payObj->app->getMerchant()->getMerchantId() ] ]); Log::channel('wechat')->info('查询订单支付状态结果:'. json_encode($response)); if ($response['trade_state'] == 'SUCCESS') { try { // 更新我方订单信息 // 更新用户会员时长 DB::table('membership_order') ->where('id', $order->id) ->update([ 'status' => Common::PAID, 'pay_time' => date('Y-m-d H:i:s') ]); return $next($message); }catch (QueryException $exception) { $msg = $exception->getPrevious()->getMessage(); // 我方系统自己处理,不需要再次通知 event(new SystemOperate(1, '开通会员支付回调通知','更新信息失败,订单号:'.$outTradeNo.','.$msg)); return $next($message); }catch (\Throwable $exception){ $msg = $exception->getMessage(); // 我方系统自己处理,不需要再次通知 event(new SystemOperate(1, '开通会员支付回调通知','更新信息失败,订单号:'.$outTradeNo.','.$msg)); return $next($message); } } else { DB::table('membership_order') ->where('id', $order->id) ->update([ 'status' => Common::PAY_EXCEPTION, ]); // 扔出异常,让微信再次通知 event(new SystemOperate(1, '开通会员支付回调通知','订单支付状态不明,订单号:'.$outTradeNo)); throw new \Exception('订单支付状态不明'); } }); return $server->serve(); }
异常和错误截图 微信日志
错误截图:
求大佬指点迷津
6.7.0
https://github.com/w7corp/easywechat/blob/85a49397713662c5b98d661a5a9ad8f5566042c4/src/Kernel/ServerResponse.php#L192-L200
6.15.1
https://github.com/w7corp/easywechat/blob/8902917ceeaa20354301e533ff3725f0044c04ca/src/Kernel/ServerResponse.php#L194-L205
很显然,你需要尝试升级到最新版试试了
好的,我试一下
升级可解决
我用的环境
问题及现象
错误截图: