You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

交付受阻:Laravel集成Square V2支付Webhook无法获取Auth::user()求助

解决Laravel中Square Webhook无法获取Auth::user()的问题

问题本质

Webhook请求是Square服务器主动发起的服务器端请求,不会携带你的Laravel应用的用户会话Cookie或认证凭证,因此Laravel的Auth系统无法识别出关联用户,Auth::user()必然返回null,这不是会话或Sanctum配置的问题,是逻辑设计错误。

解决方案

核心思路是:在创建Square Checkout时,将用户ID存入Square订单的metadata中,Webhook触发时从Square的payload里提取该ID,再通过ID查询用户并更新状态。

步骤1:创建Checkout时存入用户ID

调用Square Checkout API时,在订单的metadata字段中添加当前认证用户的ID:

use Square\Models\CreateCheckoutRequest;
use Square\Models\Order;
use Square\Models\OrderLineItem;

$checkoutRequest = new CreateCheckoutRequest();
$checkoutRequest->setLocationId('YOUR_SQUARE_LOCATION_ID');
$checkoutRequest->setIdempotencyKey(uniqid());

// 构建订单对象,存入用户ID到metadata
$order = new Order();
$order->setMetadata([
    'user_id' => auth()->user()->id // 传入当前登录用户的ID
]);
// 添加其他订单信息(商品、金额等)
$lineItem = new OrderLineItem();
$lineItem->setName('订阅服务')->setQuantity('1')->setBasePriceMoney(['amount' => 1000, 'currency' => 'USD']);
$order->setLineItems([$lineItem]);

$checkoutRequest->setOrder($order);

// 发起Checkout请求
$squareClient->getCheckoutApi()->createCheckout('YOUR_LOCATION_ID', $checkoutRequest);

步骤2:在Webhook控制器中提取用户ID并更新状态

在处理Webhook的控制器方法里,从Square的请求payload中提取user_id,查询用户后更新订阅状态:

public function handlePaymentWebhook(Request $request)
{
    $payload = $request->json();
    
    // 从Square的payload中获取订单metadata里的user_id
    $userId = $payload['data']['object']['order']['metadata']['user_id'] ?? null;
    
    if (!$userId) {
        Log::error('Square Webhook:未获取到用户ID');
        return response('Bad Request', 400);
    }
    
    // 通过ID查询用户
    $user = \App\Models\User::find($userId);
    
    if (!$user) {
        Log::error("Square Webhook:用户ID {$userId} 不存在");
        return response('Not Found', 404);
    }
    
    // 更新订阅状态(根据实际业务调整状态值)
    $user->subscription_status = 'active';
    $user->save();
    
    return response('Success', 200);
}

步骤3:确认Webhook签名验证正确性

确保你的SquareWebhookAuthentication中间件中的签名验证逻辑正确:

  • NOTIFICATION_URL必须和Square后台配置的Webhook URL完全一致(包括协议、域名、路径,是否带斜杠等)
  • 签名生成逻辑要符合Square的官方规范(你的当前代码逻辑是正确的,但可以再次核对)

额外注意事项

  • 处理Webhook时要保证幂等性:同一个Square事件可能多次触发,建议用Square事件的id作为唯一标识,避免重复更新用户状态
  • 详细记录Webhook的payload内容,方便后续排查问题

内容的提问来源于stack exchange,提问作者Omar Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:30:45