easywechat 6.x 回调报错

aspire

问题描述

easywechat 6.x 回调拿不到数据

easywechat 官方提供的回调代码

$server = $app->getServer();
$server->handlePaid(function (Message $message, \Closure $next) {
    // $message->out_trade_no 获取商户订单号
    // $message->payer['openid'] 获取支付者 openid
    // 🚨🚨🚨 注意:推送信息不一定靠谱哈,请务必验证
    // 建议是拿订单号调用微信支付查询接口,以查询到的订单状态为准
    return $next($message);
});

// 默认返回 ['code' => 'SUCCESS', 'message' => '成功']
return $server->serve();

报错信息

 default.ERROR: Invalid request body. [] []

这个是因为收不到腾讯request请求内容, 我想通过setRequest方法解决问题,但还是不会使用

$app->setRequest($request);

有大佬遇到过这个问题吗?

@yzh52521 大佬的帮助下解决了问题: (已解决)

use Symfony\Component\HttpFoundation\HeaderBag;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;

    public function notify(Request $request)
    {

        $app = new Application(config('wx.config'));
        $symfony_request = new SymfonyRequest($request->get(), $request->post(), [], $request->cookie(), [], [], $request->rawBody());
        $symfony_request->headers = new HeaderBag($request->header());
        $app->setRequestFromSymfonyRequest($symfony_request);
        // $app 为你实例化的支付对象,此处省略实例化步骤
        $server = $app->getServer();
//        $response = $server->serve();
        // 处理支付结果事件
        $server->handlePaid(function (Message $message, \Closure $next) {
            var_dump($message['out_trade_no']);
            // $message 为微信推送的通知结果,详看微信官方文档

            // 微信支付订单号 $message['transaction_id']
            // 商户订单号 $message['out_trade_no']
            // 商户号 $message['mchid']
            // 具体看微信官方文档...
            // 进行业务处理,如存数据库等...
            return $next($message);
        });

        // 处理退款结果事件
        $server->handleRefunded(function (Message $message, \Closure $next) {
            // 同上,$message 详看微信官方文档
            // 进行业务处理,如存数据库等...
            return $next($message);
        });
        return $server->serve();
    }

以上解决方案还有一些不完美,最完美的解决方案:https://www.workerman.net/a/1556

645 2 1
2个回答

yzh52521
        $app                      = new Application( $config );
        $symfony_request          = new SymfonyRequest( $request->get(),$request->post(),[],$request->cookie(),[],[],$request->rawBody() );
        $symfony_request->headers = new HeaderBag( $request->header() );
        $app->setRequestFromSymfonyRequest( $symfony_request );
        $server   = $app->getServer();
        $response = $server->serve();
  • aspire 2023-08-17

    感谢大佬。 已解决

  • aspire 2023-08-17

    大佬,
    $symfony_request->headers = new HeaderBag( $request->header() );
    无法获取header,
    报错
    max(): Argument #1 ($value) must contain at least one element [] []
    好像拿不到header信息

  • yzh52521 2023-08-17

    new HeaderBag( $request->header() );

    参数必须是数组 你打印一下

  • aspire 2023-08-17

    是的返回的是数组 array(22) { }

    报错信息:

    ValueError: max(): Argument #1 ($value) must contain at least one element in /vendor/w7corp/easywechat/src/Kernel/ServerResponse.php(193): max()
    
    default.ERROR: max(): Argument #1 ($value) must contain at least one element [] []

    报错位置:

        public function __toString(): string
        {
            $headers = $this->getHeaders();
    
            ksort($headers);
    
            $max = max(array_map('strlen', array_keys($headers))) + 1;
            $headersString = '';
    
            foreach ($headers as $name => $values) {
                $name = ucwords($name, '-');
                foreach ($values as $value) {
                    $headersString .= sprintf("%-{$max}s %s\r\n", $name.':', $value);
                }
            }
    
            return sprintf(
                'HTTP/%s %s %s',
                $this->getProtocolVersion(),
                $this->getStatusCode(),
                $this->getReasonPhrase()
            )."\r\n".
                $headersString."\r\n".
                $this->getBody();
        }
  • yzh52521 2023-08-17

    你打印 header 是不是有key或者value是null的

  • yzh52521 2023-08-17

    max 前面 你加个 @ 试试

  • aspire 2023-08-17

    $request->header() 是返回数组, new HeaderBag($request->header())之后就变成了对象

  • aspire 2023-08-17

    max 是 vendor 里面的函数

latin
🔝