w7corp / easywechat

📦 一个 PHP 微信 SDK
https://easywechat.com
MIT License
10.29k stars 2.41k forks source link

按照手册写法,微信通知不停,不知那里写错了 #2804

Closed uniquespider closed 7 months ago

uniquespider commented 7 months ago

我用的环境

问题及现象

没太理解$next(message)和return $server->serve()怎么做的返回值,这里算是求一个完整的写法

代码片段 代码结构截图

image
我的想法是在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();
    }

异常和错误截图 微信日志 image

错误截图:

image
uniquespider commented 7 months ago

求大佬指点迷津

TheNorthMemory commented 7 months ago

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

很显然,你需要尝试升级到最新版试试了

uniquespider commented 7 months ago

好的,我试一下

uniquespider commented 7 months ago

升级可解决