public function notify(Request $request): Response
    {
        try {
            $app = $this->getEasyApp($request);
            $server = $app->getServer();

            //1、使用微信平台证书,验证签名
            try {
                $app->getValidator()->validate($app->getRequest());
            } catch (\Exception|\Throwable $e) {
                throw new InvalidArgumentException('验证签名失败');
            }

            //2、循环接收验证信息
            //$server->getRequestMessage()
            $server->handlePaid(function (Message $message, \Closure $next) use ($app) {
                //2.1、获取商户订单号
                $msgArray = $message->toArray();
                //2.2、订单查询结果
                $result = $app->getClient()->get("v3/pay/transactions/out-trade-no/{$msgArray['out_trade_no']}", [
                    'query'=>[
                        'mchid' =>  $app->getMerchant()->getMerchantId()
                    ]
                ])->toArray();

                //2.3、支付成功处理业务
                if ($result['trade_state'] === 'SUCCESS') {
                    Db::transaction(function () use ($msgArray) {
                        //2.3.1、 更新订单状态为已支付
                        .....

                        //2.3.2、记录支付成功信息
                        ....

                        //2.3.3、写入缓存,备前端轮循
                        Cache::set($msgArray['out_trade_no'], '', 120);
                    }, 3);
                }
                //2.4、未收到成功消息继续下一个循环接收
                return $next($message);
            });

            // 默认返回 ['code' => 'SUCCESS', 'message' => '成功']
            $response = $server->serve();
            return new Response(
                $response->getStatusCode(),
                $response->getHeaders(),
                $response->getBody()->getContents()
            );
        } catch (\Throwable $throwable) {
            Log::error('[' . __METHOD__ . '][微信支付回调通知] 异常:' . $throwable->getMessage() . PHP_EOL . $throwable->getTraceAsString());
            $data = ['code' => 'FAIL', 'message' => $throwable->getMessage()];

            return new Response(
                400,
                ['Content-Type' => 'application/json'],
                json_encode($data, JSON_UNESCAPED_UNICODE)
            );
        }
    }

标签: none

评论已关闭