yansongda / laravel-pay

可能是我用过的最优雅的 Alipay/WeChat/Unipay 的 laravel 支付扩展包了

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用laravels后支付宝回调报错。但是咋传统的fpm模式下没问题。

pro911 opened this issue · comments

[2022-02-19 15:43:07] master.ERROR:  {"exception":"[object] (Yansongda\\Pay\\Exception\\InvalidResponseException(code: 5003):  at /data/Application/ Demo/vendor/yansongda/pay/src/Plugin/Alipay/CallbackPlugin.php:33)
[stacktrace]
#0 /data/Application/ Demo/vendor/yansongda/supports/src/Pipeline.php(132): Yansongda\\Pay\\Plugin\\Alipay\\CallbackPlugin->assembly(Object(Yansongda\\Pay\\Rocket), Object(Closure))
#1 /data/Application/ Demo/vendor/yansongda/supports/src/Pipeline.php(90): Yansongda\\Supports\\Pipeline->Yansongda\\Supports\\{closure}(Object(Yansongda\\Pay\\Rocket))
#2 /data/Application/ Demo/vendor/yansongda/pay/src/Provider/AbstractProvider.php(75): Yansongda\\Supports\\Pipeline->then(Object(Closure))
#3 /data/Application/ Demo/vendor/yansongda/pay/src/Provider/Alipay.php(142): Yansongda\\Pay\\Provider\\AbstractProvider->pay(Array, Array)
#4 /data/Application/ Demo/app/Http/Controllers/Api/PayController.php(149): Yansongda\\Pay\\Provider\\Alipay->callback()
#5 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\Api\\PayController->alipayNotifyCallback(Object(App\\Services\\OrderService))
#6 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('alipayNotifyCal...', Array)
#7 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Api\\PayController), 'alipayNotifyCal...')
#8 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()
#9 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()
#10 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#11 /data/Application/ Demo/app/Http/Middleware/StopService.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#12 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\StopService->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#13 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#14 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#15 /data/Application/ Demo/app/Http/Middleware/MyThrottle.php(61): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#16 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\MyThrottle->handle(Object(Illuminate\\Http\\Request), Object(Closure), '120', '60')
#17 /data/Application/ Demo/app/Http/Middleware/JsonResponse.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#18 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\JsonResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#19 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#20 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#21 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#22 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#23 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#24 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#25 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#26 /data/Application/ Demo/app/Http/Middleware/EnableCrossRequestMiddleware.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#27 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\EnableCrossRequestMiddleware->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#28 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#29 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#30 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#31 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#32 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#33 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#34 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 /data/Application/ Demo/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#37 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#38 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#39 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#40 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#41 /data/Application/ Demo/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#42 /data/Application/ Demo/vendor/hhxsv5/laravel-s/src/Illuminate/Laravel.php(153): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#43 /data/Application/ Demo/vendor/hhxsv5/laravel-s/src/LaravelS.php(251): Hhxsv5\\LaravelS\\Illuminate\\Laravel->handleDynamic(Object(Illuminate\\Http\\Request))
#44 /data/Application/ Demo/vendor/hhxsv5/laravel-s/src/LaravelS.php(202): Hhxsv5\\LaravelS\\LaravelS->handleDynamicResource(Object(Hhxsv5\\LaravelS\\Illuminate\\Laravel), Object(Illuminate\\Http\\Request), Object(Swoole\\Http\\Response))
#45 [internal function]: Hhxsv5\\LaravelS\\LaravelS->onRequest(Object(Swoole\\Http\\Request), Object(Swoole\\Http\\Response))
#46 /data/Application/ Demo/vendor/hhxsv5/laravel-s/src/Swoole/Server.php(409): Swoole\\Server->start()
#47 /data/Application/ Demo/vendor/hhxsv5/laravel-s/src/Console/Portal.php(158): Hhxsv5\\LaravelS\\Swoole\\Server->run()
#48 /data/Application/ Demo/vendor/hhxsv5/laravel-s/src/Console/Portal.php(59): Hhxsv5\\LaravelS\\Console\\Portal->start()
#49 /data/Application/ Demo/vendor/symfony/console/Command/Command.php(298): Hhxsv5\\LaravelS\\Console\\Portal->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#50 /data/Application/ Demo/bin/laravels(167): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#51 {main}
"}

验签出错了,检查你的配置

好的,问题找到了,仔细排查了下,使用laravels后原有的接参方式获取不到参数。需要将laravel的Request 接参后传参进去。

    /**
     * 支付宝支付异步回调
     *
     * @param OrderService $orderService
     * @return ResponseInterface
     * @throws ContainerDependencyException
     * @throws ContainerException
     * @throws InvalidParamsException
     * @throws ServiceNotFoundException
     */
    public function alipayNotifyCallback(\Illuminate\Http\Request $request, OrderService $orderService): ResponseInterface
    {
        $alipay = Pay::alipay(config('pay'));
        $data = $alipay->callback($request->all());   //假如这里不传入参数,那么在后面pay包内的获取参数的方式获取不到数据。原因可能是laravels为了协程安全防止全局变量污染做了限制处理导致。 
        $orderService->alipayNotifyCallback($data);
        return $alipay->success();
    }


    /**
     * @param array|\Psr\Http\Message\ServerRequestInterface|null $contents
     *
     * @throws \Yansongda\Pay\Exception\ContainerDependencyException
     * @throws \Yansongda\Pay\Exception\ContainerException
     * @throws \Yansongda\Pay\Exception\InvalidParamsException
     * @throws \Yansongda\Pay\Exception\ServiceNotFoundException
     */
    public function callback($contents = null, ?array $params = null): Collection
    {
        Event::dispatch(new Event\CallbackReceived('alipay', $contents, $params, null));

        $request = $this->getCallbackParams($contents);

        return $this->pay(
            [CallbackPlugin::class], $request->merge($params)->all()
        );
    }

    /**
     * @param array|ServerRequestInterface|null $contents
     */
    protected function getCallbackParams($contents = null): Collection
    {
        if (is_array($contents)) {
            return Collection::wrap($contents);
        }

        if ($contents instanceof ServerRequestInterface) {
            return Collection::wrap('GET' === $contents->getMethod() ? $contents->getQueryParams() :
                $contents->getParsedBody());
        }

        $request = ServerRequest::fromGlobals();

        return Collection::wrap(
            array_merge($request->getQueryParams(), $request->getParsedBody())
        );
    }