
laravel cashier是一个功能强大的订阅计费管理库,它旨在简化与支付网关的交互,特别是在处理周期性订阅和一次性支付方面。然而,cashier的设计初衷是为了与特定的支付服务提供商深度集成,以提供高度抽象和统一的api接口。
目前,Laravel Cashier原生且仅支持以下两个支付网关:
这意味着,如果您正在使用Laravel Cashier,并且希望利用其提供的订阅管理、发票生成、退款处理等高级功能,您只能选择Stripe或Paddle作为您的支付服务提供商。Cashier通过封装这些特定网关的API,为开发者提供了一致且简化的接口,从而大大降低了实现订阅计费系统的复杂性。
明确指出,Laravel Cashier目前不直接支持Razorpay。Razorpay是一个在印度市场非常流行的支付网关,但它没有被集成到Laravel Cashier的核心功能中。因此,如果您计划在您的Laravel应用中使用Razorpay,您将无法通过Cashier来管理其支付流程,需要采用独立的集成方案。
尽管Laravel Cashier不直接支持Razorpay,但您仍然可以在Laravel应用中成功集成Razorpay。这需要您直接与Razorpay的API进行交互,并自行管理支付流程的各个环节。以下是实现这一目标的详细步骤和示例。
首先,您需要通过Composer安装Razorpay官方提供的PHP SDK。这个SDK封装了Razorpay的API,使您能够方便地与支付网关进行通信。
composer require razorpay/razorpay
安装SDK后,您需要配置您的Razorpay API密钥ID和密钥秘钥。这些凭证通常可以在您的Razorpay商家账户仪表板中获取。建议将它们存储在Laravel的.env文件中,并通过config/services.php进行访问,以确保安全性。
在.env文件中添加:
RAZORPAY_KEY_ID=rzp_test_xxxxxxxxxxxxxxxxxx RAZORPAY_KEY_SECRET=xxxxxxxxxxxxxxxxxxxxxx
在config/services.php中添加或修改:
'razorpay' => [
'key_id' => env('RAZORPAY_KEY_ID'),
'key_secret' => env('RAZORPAY_KEY_SECRET'),
],Razorpay的支付流程通常包括以下几个关键步骤:在后端创建订单、在前端展示支付界面、处理支付回调以及验证支付签名。
当用户发起支付请求时,您需要在后端使用Razorpay SDK创建一个订单。这个订单将包含支付金额、货币类型和可选的收据ID等信息。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Razorpay\Api\Api;
class RazorpayController extends Controller
{
public function createOrder(Request $request)
{
// 验证请求数据,例如金额、商品信息等
$amount = 10000; // 金额以“派士”为单位,例如100.00 INR = 10000
$currency = 'INR'; // 货币代码
try {
$api = new Api(config('services.razorpay.key_id'), config('services.razorpay.key_secret'));
$order = $api->order->create([
'receipt' => 'order_rcptid_' . uniqid(), // 唯一的收据ID
'amount' => $amount,
'currency' => $currency,
'payment_capture' => 1 // 自动捕获支付
]);
// 将订单ID存储到数据库,与您的用户或商品关联
// 例如:Auth::user()->orders()->create(['razorpay_order_id' => $order->id, 'amount' => $amount, 'status' => 'pending']);
return view('payment.checkout', compact('order', 'amount', 'currency'));
} catch (\Exception $e) {
return redirect()->back()->with('error', '创建支付订单失败: ' . $e->getMessage());
}
}
}在后端创建订单后,您需要将订单信息传递到前端页面,并使用Razorpay Checkout JS SDK来渲染支付界面。用户将在该界面完成支付。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Razorpay 支付</title>
</head>
<body>
<h1>请完成支付</h1>
<form action="{{ route('razorpay.callback') }}" method="POST">
@csrf
<script
src="https://checkout.razorpay.com/v1/checkout.js"
data-key="{{ config('services.razorpay.key_id') }}"
data-amount="{{ $order->amount }}"
data-currency="{{ $order->currency }}"
data-order_id="{{ $order->id }}"
data-buttontext="立即支付"
data-name="您的公司名称"
data-description="订单描述"
data-image="https://your-logo-url.png"
data-prefill.name="用户姓名"
data-prefill.email="user@example.com"
data-theme.color="#F37254"
></script>
<input type="hidden" custom="Hidden Element" name="hidden">
</form>
<p>总金额: {{ number_format($amount / 100, 2) }} {{ $currency }}</p>
</body>
</html>请确保将data-name、data-description和data-image替换为您的实际信息。
当用户完成支付后,Razorpay会将支付结果(包括支付ID和签名)回传到您指定的路由。您需要在后端处理这个回调,并验证支付签名的合法性,以确保支付的真实性。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Razorpay\Api\Api;
use Razorpay\Api\Errors\SignatureVerificationError;
class RazorpayController extends Controller
{
public function handleCallback(Request $request)
{
$input = $request->all();
try {
$api = new Api(config('services.razorpay.key_id'), config('services.razorpay.key_secret'));
$attributes = [
'razorpay_order_id' => $input['razorpay_order_id'],
'razorpay_payment_id' => $input['razorpay_payment_id'],
'razorpay_signature' => $input['razorpay_signature']
];
$api->utility->verifyPaymentSignature($attributes);
// 签名验证成功,支付有效
// 在这里更新您的数据库中的订单状态,标记为“已支付”
// 例如:Order::where('razorpay_order_id', $input['razorpay_order_id'])->update(['status' => 'completed', 'razorpay_payment_id' => $input['razorpay_payment_id']]);
// 可以获取支付详情
// $payment = $api->payment->fetch($input['razorpay_payment_id']);
return redirect()->route('payment.success')->with('success', '支付成功!');
} catch (SignatureVerificationError $e) {
// 签名验证失败,支付可能被篡改或无效
// 记录错误信息,通知用户支付失败
return redirect()->route('payment.failure')->with('error', '支付失败或签名验证失败:' . $e->getMessage());
} catch (\Exception $e) {
// 其他异常处理
return redirect()->route('payment.failure')->with('error', '支付处理异常:' . $e->getMessage());
}
}
public function paymentSuccess()
{
return view('payment.success');
}
public function paymentFailure()
{
return view('payment.failure');
}
}为了使上述控制器方法可访问,您需要在routes/web.php中定义相应的路由:
use App\Http\Controllers\RazorpayController;
Route::get('/pay', [RazorpayController::class, 'createOrder'])->name('razorpay.pay');
Route::post('/razorpay/callback', [RazorpayController::class, 'handleCallback'])->name('razorpay.callback');
Route::get('/payment/success', [RazorpayController::class, 'paymentSuccess'])->name('payment.success');
Route::get('/payment/failure', [RazorpayController::class, 'paymentFailure'])->name('payment.failure');在独立集成Razorpay时,有几个关键点需要特别注意:
Laravel Cashier为Stripe和Paddle提供了强大的订阅计费抽象,极大地简化了相关开发工作。然而,对于Razorpay等未被Cashier原生支持的支付网关,开发者需要采取独立的集成策略。这意味着您需要直接使用Razorpay的PHP SDK来管理订单创建、支付流程和回调验证。虽然这会增加一定的开发工作量,尤其是在需要实现订阅管理时,但它提供了更大的灵活性和对支付流程的完全控制。通过遵循本文提供的指南和最佳实践,您可以成功地在Laravel应用中集成Razorpay,并构建稳定可靠的支付系统。
以上就是Laravel Cashier与Razorpay:理解其局限性及独立集成指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号