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 的确切位置。
我正在使用 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 的确切位置。