交付受阻: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
相关产品推荐
相关产品推荐

