+4

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.

image.png

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

product_catalog.png

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

list_product.png

Bấm vào sản phẩm để xem chi tiết sản phẩm

product_detail.png

Screenshot from 2024-09-18 23-07-57.png

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.

checkout.png

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.

payment.png

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.

cancel.png

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.

success.png

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

Viblo
Let's register a Viblo Account to get more interesting posts.