Laravel Spark 403 - 3D 安全支付时重定向主机不匹配

Laravel Spark 403 - REDIRECT HOST MISMATCH when 3D Secure Payment

我正在使用 Laravel Spark 向我的客户收费。如果他们将使用 3D 安全卡支付(我使用 stripe doc https://stripe.com/docs/testing#regulatory-cards 中的卡号进行测试:4000 0027 6000 3184)我遇到以下问题:

条带 pop-up/modal 打开,我单击 'Complete Authentication'。

之后,身份验证过程开始,用户被定向到 http://127.0.0.1:8000/stripe/payment/pi_xxx?redirect=/home

这里我得到以下 Laravel 错误(我没有在控制台或其他地方找到其他错误原因):

我已经在 VerifyCsrfToken Class 中添加了 stripe/*... 也许我需要在我的服务器上测试这个案例?

非常奇怪,我想这表明我对条纹没有任何问题,而是 laravel。当我删除查询参数 ?redirect=home 时,我得到这个屏幕:

当我继续时,我没有被重定向。当然是因为没有重定向 uri...

以前有人遇到过这个问题吗?

我想出了一个(肮脏的?)解决方法:

在我的 StripWebHookController 中有一些代码可以为用户发出通知:

if ($billable) {
        $model = config('cashier.model');
        $notifiable = $billable instanceof $model ? $billable : $billable->owner;
        if (in_array(Notifiable::class, class_uses_recursive($notifiable))) {
            $payment = new Payment(StripePaymentIntent::retrieve(
                $payload['data']['object']['payment_intent'],
                $billable->stripeOptions()
            ));
            $notifiable->notify(new $notification($payment));
        }
    }

现在,这是一个通知,显然是在 Cashier 的 PaymentController 中创建的 StripePaymentIntent 通知(位于 /var/www/html/site/vendor/laravel/cashier/src/Http/Controllers)

有一个 VerifyRedirectUrl 中间件导致了正确的问题。所以当你把它注释掉时,403 就消失了:

public function __construct()
{
    //$this->middleware(VerifyRedirectUrl::class);
}

但是,接受付款后的“返回”按钮不起作用,所以我会检查一下。但就目前而言,这个 403 至少没有了。如果我找不到其他解决方案,我会选择这个。

对我来说,这是 Spark 中的一个错误。我搜索了所有 Stripe 使用重定向的地方。对我来说这可能真的是一个错误的一个迹象是:

subscription-notice.blade.php 文件中有 link 构建如下:

{!! __('Please :linkOpen confirm your payment :linkClose to activate your subscription!', ['linkOpen' => '<a href="/'.config('cashier.path').'/payment/'.auth()->user()->subscription()->latestPayment()->id.'?redirect='.url('/home').'">', 'linkClose' => '</a>']) !!}

'?redirect='.url('/home').' 部分使用主机地址创建完整有效的 URL。 不仅是相对路径!在我的例子中,这些相对路径遇到了 403 错误。 就像在 RegisterController:

/**
 * Handle a registration request for the application.
 *
 * @param  \Laravel\Spark\Contracts\Http\Requests\Auth\RegisterRequest  $request
 * @return \Illuminate\Http\Response
 */
public function register(RegisterRequest $request)
{
    list($user, $paymentId) = Spark::interact(
        Register::class, [$request]
    );

    Auth::login($user);

    event(new UserRegistered($user));

    if ($user instanceof MustVerifyEmail && ! $user->hasVerifiedEmail()) {
        $user->sendEmailVerificationNotification();
    }

    return response()->json([
        'redirect' => $paymentId ?
            '/'.config('cashier.path').'/payment/'.$paymentId.'?redirect='.$this->redirectPath()
            : $this->redirectPath(),
    ]);
}

$this->redirectPath() returns 相对路径。我已将这部分更改为:

return response()->json([
        'redirect' => $paymentId ?
            '/'.config('cashier.path').'/payment/'.$paymentId.'?redirect='.config('app.url').$this->redirectPath()
            : $this->redirectPath(),
    ]);

在这种情况下,我从我的配置中获取主机地址并将其放在相对路径的前面。

为了更好理解,这里使用上面返回的URL(register-stripe.js):

    /*
     * After obtaining the Stripe token, send the registration to Spark.
     */
    sendRegistration(paymentMethod) {
        this.registerForm.stripe_payment_method = paymentMethod;

        Spark.post('/register', this.registerForm)
            .then(response => {
                window.location = response.redirect;
            });
    }

还有一些情况我需要覆盖一些 JavaScript 或 PHP 来源...

  • 注册过程(此处显示)
  • 支付信息更新过程
  • 使用现有帐户创建订阅

我希望我能帮助其他人!如有必要,我还可以 post 在评论中更改重定向 URL 的确切位置。