在使用 Laravel 7.3.0 和 tzsk/payu
包进行支付重定向时,如果遇到 419 错误(通常是 CSRF 令牌失效),可以按照以下步骤进行排查和解决:
Laravel 使用 CSRF 令牌来防止跨站请求伪造攻击。确保你的表单中包含正确的 CSRF 令牌。
在 Blade 模板中,确保在表单中包含 @csrf
指令:
<form method="POST" action="{{ route('your.payment.route') }}">
@csrf
<!-- 其他表单字段 -->
<button type="submit">Pay</button>
</form>
确保 CSRF 令牌的生命周期足够长,以便用户在支付过程中不会过期。你可以在 config/session.php
文件中调整 lifetime
设置:
'lifetime' => 120, // 以分钟为单位
确保会话配置正确,并且会话驱动程序设置为 file
或其他持久化存储(如 database
或 redis
):
// config/session.php
'driver' => env('SESSION_DRIVER', 'file'),
确保你的支付路由没有被 CSRF 中间件排除。你可以在 app/Http/Middleware/VerifyCsrfToken.php
文件中检查:
protected $except = [
// 你的支付回调 URL
'payment/callback',
];
tzsk/payu
包确保你正确地使用了 tzsk/payu
包。以下是一个示例,展示了如何在 Laravel 中使用 tzsk/payu
包进行支付:
tzsk/payu
包首先,安装 tzsk/payu
包:
composer require tzsk/payu
tzsk/payu
发布配置文件:
php artisan vendor:publish --tag=payu-config
在 config/payu.php
文件中配置你的 PayU 凭据。
创建一个支付控制器来处理支付请求和回调:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Tzsk\Payu\Facade\Payment;
class PaymentController extends Controller
{
public function initiatePayment(Request $request)
{
$payment = Payment::make([
'amount' => 100, // 支付金额
'txnid' => uniqid(), // 交易 ID
'productinfo' => 'Product Description',
'firstname' => 'John',
'email' => 'john@example.com',
'phone' => '1234567890',
]);
return $payment->redirect();
}
public function paymentCallback(Request $request)
{
$response = Payment::capture();
if ($response->isSuccessful()) {
// 支付成功
return redirect()->route('payment.success');
} elseif ($response->isFailed()) {
// 支付失败
return redirect()->route('payment.failed');
} else {
// 支付状态未知
return redirect()->route('payment.unknown');
}
}
}
在 routes/web.php
文件中定义支付路由:
use App\Http\Controllers\PaymentController;
Route::post('/payment/initiate', [PaymentController::class, 'initiatePayment'])->name('payment.initiate');
Route::post('/payment/callback', [PaymentController::class, 'paymentCallback'])->name('payment.callback');
添加日志记录来调试问题。例如,可以在控制器中添加日志:
use Illuminate\Support\Facades\Log;
public function paymentCallback(Request $request)
{
Log::info('Payment callback received', $request->all());
$response = Payment::capture();
if ($response->isSuccessful()) {
Log::info('Payment successful', $response->getData());
return redirect()->route('payment.success');
} elseif ($response->isFailed()) {
Log::error('Payment failed', $response->getData());
return redirect()->route('payment.failed');
} else {
Log::warning('Payment status unknown', $response->getData());
return redirect()->route('payment.unknown');
}
}
通过这些步骤,你应该能够解决 419 错误并成功处理支付重定向。如果问题仍然存在,请检查网络连接和浏览器设置,并确保所有配置正确。
领取专属 10元无门槛券
手把手带您无忧上云