Tích hợp cổng thanh toán Stripe với Laravel 9
Stripe là một cổng thanh toán rất phổ biến và dễ sử dụng, trong bài viết này mình sẽ làm một ví dụ nhỏ về tích hợp cổng thanh toán Stripe vào dự án Laravel.
Tạo tài khoản Stripe và sản phẩm
Lấy Stripe API Key và SECRET
Đăng nhập và https://dashboard.stripe.com/, trong phần Get started with Stripe => For Developer lưu lại API Key và Secret key Test mode.
Tạo sản phẩm và giá sản phẩm
Vào tab Product Catalog để tạo sản phẩm và giá sản phẩm, cũng có thể tạo sản phẩm và giá qua API mà Stripe cung cấp, xem document chi tiết tại https://docs.stripe.com/api/products.
Vào Menu Product Catalog
Chọn tạo sản phẩm mới, sau khi tạo xong sản phẩm sẽ có trên màn hình danh sách
Bấm vào sản phẩm để xem chi tiết sản phẩm
Trong phần giá của sản phẩm chọn Copy Price Id để copy ID của giá để phục vụ cho phần dưới hoặc chọn Create Payment Link để tạo một link thanh toán luôn.
Tạo Project với Laravel
Tạo project với composer
Tạo project laravel với lệnh composer
như sau:
composer create-project --prefer-dist laravel/laravel laravel-stripe-demo
Tạo file .env
và dán API Key và Secret Key vừa copy ở phần trước vào .env
:
STRIPE_KEY=pk_test_<your-api-key>
STRIPE_SECRET=sk_test_<your-secret-key>
Cài đặt thư viện stripe-php
stripe/stripe-php
là thư viện được chính Stripe cung cấp để nhà phát triển PHP có thể phát triển ứng dụng kết nối tới nền tảng của họ vì vậy thư viện này là cực kỳ an toàn, cài đặt thư viện qua câu lệnh:
composer require stripe/stripe-php
Xem packagist của thư viện tại: https://packagist.org/packages/stripe/stripe-php
Tạo routes
Thêm 2 routes mới dưới đây vào file web.php
:
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('stripe', [\App\Http\Controllers\StripeController::class, 'stripe'])->name('stripe');
Route::get('success', [\App\Http\Controllers\StripeController::class, 'success'])->name('success');
Route::get('cancel', [\App\Http\Controllers\StripeController::class, 'cancel'])->name('cancel');
Route::post('payment', [\App\Http\Controllers\StripeController::class, 'payStripe'])->name('payStripe');
Tạo controller và View
Tạo StripeController
với command:
php artisan make:controller StripeController
Sau đó tạo các hàm stripe
, cancel
, success
, và payStripe
để xử lý các request vừa tạo ở trong file routes/web.php
.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Stripe\Checkout\Session;
use Stripe\Stripe;
class StripeController extends Controller
{
public function stripe()
{
return view('stripe');
}
public function success()
{
return view('success');
}
public function cancel()
{
return view('cancel');
}
public function payStripe(Request $request)
{
Stripe::setApiKey(env('STRIPE_SECRET'));
$checkoutSession = Session::create([
'line_items' => [[
'price' => 'price_1Q0Q5GHGTpXzW5bV1645uGi6',
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => route('success'),
'cancel_url' => route('cancel'),
]);
return redirect($checkoutSession->url);
}
}
- Trường
price
là ID của price mà vừa lấy được từ phần trên. - Trường
success_url
là trường URL Stripe gọi tới khi người dùng thanh toán thành công. - Trường
cancel_url
là trường URL Stripe gọi tới khi người dùng không thanh toán mà ấn hủy
Tạo các trang stripe.blade.php
, success.blade.php
, cancel.blade.php
trong resources/views
. Xem chi tiêt code trong repository github để ở cuối bài.
Thanh toán với Stripe
Sau khi hoàn thành chạy project lên với cổng 9000 php artisan serve --port=9000
và truy cập http://127.0.0.1:9000/stripe để bắt đầu tiến hành thanh toán với Stripe.
Bấm vào nút Checkout, bạn sẽ được chuyển hướng về trang thanh toán của Stripe đó chính là URL trả về trong hàm payStripe
của class StripeController
.
Nếu không thanh toán mà bấm vào nút quay lại bên cạnh chữ Test Mode bạn sẽ được chuyển hướng về route('cancel')
đã được định nghĩa khi khởi tạo URL Payment.
Nếu tiến hành thanh toán nhập thông tin thẻ Visa hoặc Master Card. Với Test Mode có thể test với các card ảo mà Stripe cung cấp, xem danh sách thẻ test tại link https://docs.stripe.com/testing#cards.
Có thể sử dụng 3 thẻ sau cho 3 mục đích test khác nhau:
- Thanh toán thành công: 4242 4242 4242 4242
- Thanh toán yêu cầu xác thực: 4000 0025 0000 3155
- Thanh toán từ chối: 4000 0000 0000 9995
Thông tin về thẻ test chỉ cần nhập đúng số thẻ, ngày hết hạn là một ngày trong tương lai còn các thông tin khác có thể nhập bất kỳ. Sau khi thanh toán thành công sẽ được chuyển hướng về trang route('success')
để thông báo cho người dùng đã thanh toán thành công.
Clone code trên Repository Github tại: https://github.com/trannguyenhan/laravel-stripe-demo
Tham khảo: https://docs.stripe.com/checkout/quickstart, https://docs.stripe.com/api/products
All rights reserved