Nhiều người đang loay hoay tìm kiếm cách tích hợp thanh toán Vnpay trong Laravel bởi vì đây là lần đầu tiên họ thử sức trên website thương mại điện tử. Nhưng bạn đừng lo, chúng tôi sẽ giúp bạn đọc giải quyết vấn đề này ngay trong bài viết bên dưới. Dành ra ít phút để tham khảo ngay nhé.
Đầu tiên chúng ta phải hiểu Laravel sau đó mới học cách để tích hợp cổng thanh toán trực tuyến VNPay.
Contents
Laravel là gì?
Có thể hiểu Laravel là một PHP framework mã nguồn mở, miễn phí, được xây dựng nhằm hỗ trợ phát triển các phần mềm, ứng dụng, theo kiến trúc MVC.
Hiện nay Laravel đang là PHP framework (thư viện với các tài nguyên có sẵn cho từng lĩnh vực để lập trình viên sử dụng ngay mà không phải tự tay thiết kế) phổ biến nhất và tốt nhất. Lý do là bởi:
- Laravel sử dụng các tính năng mới nhất của PHP
- Nguồn tài nguyên vô cùng lớn và sẵn có
- Tích hợp với dịch vụ mail
- Tốc độ xử lý nhanh, hỗ trợ hiệu quả cho việc tạo lập website hay các dự án lớn trong thời gian ngắn
- Dễ sử dụng, ngay cả với người có ít vốn kiến thức về lập trình với PHP
- Cung cấp các tính năng bảo mật mạnh mẽ
- Sử dụng PDO để chống lại tấn công SQL Injection
- Sử dụng một field token ẩn để chống lại tấn công kiểu CSRF
Tuy nhiên vấn đề thiếu sự liên kết giữa các phiên bản, nếu cố cập nhật code, có thể khiến cho ứng dụng bị gián đoạn hoặc phá vỡ. Hay như dung lượng quá nặng trên app nên tải trang chậm chạp là 2 nhược điểm của framework này.
Dẫu sao thì Laravel vẫn được các lập trình viên chuyên nghiệp và nghiệp dư dành sự ưu ái nhất định.
Cách tích hợp thanh toán VNPay trong Laravel
VNPay là một trong số những cổng thanh toán phổ biến nhất tại Việt Nam. Bạn có thể bắt gặp cái tên này ở các nhà hàng, siêu thị, quán ăn, sạp bán đồ hoa quả, quán nước ven đường…
Nếu website của bạn sử dụng framework Laravel và muốn tích hợp cổng thanh toán VNPay thì hãy xem ngay cách tích hợp sau đây:
Quy trình kết nối thanh toán
Bước 1: Client thực hiện Thanh toán trực tuyến trên website
Bước 2: Website tạo thông tin thanh toán dưới dạng URL mang thông tin thanh toán và chuyển hướng khách hàng sang Cổng thanh toán VNPAY. Cổng thanh toán VNPAY xử lý yêu cầu Thanh toán. Client nhập các thông tin được yêu cầu để thực hiện việc Thanh toán.
Bước 3, 4: Client nhập thông tin để xác minh tài khoản Ngân hàng của khách hàng và xác thực giao dịch.
Bước 5: Giao dịch thành công tại Ngân hàng, VNPAY tiến hành: Chuyển hướng khách hàng về Website hiển thị cho người dùng (vnp_ReturnUrl) và thông báo cho website thương mại điện tử kết quả thanh toán của client thông qua vnp_IpnURL.
Bước 6: Hiển thị kết quả giao dịch tới khách hàng.
Tích hợp code VNPay với PHP – Laravel
- Đăng kí tài khoản test tại https://sandbox.vnpayment.vn/devreg
- Sau đó, VNPay sẽ gửi cho bạn 02 thông tin cấu hình để định danh website đó trên hệ thống Cổng thanh toán: vnp_TmnCode: Mã của Website được khai báo tại hệ thống Cổng Thanh toán VNPAY vnp_HashSecret: Chuỗi bí mật sử dụng để kiểm tra toàn vẹn dữ liệu khi hai hệ thống trao đổi thông tin (checksum) .
- Bạn có thể sử dụng tài khoản test của VNPay cung cấp. Các tài khoản test được cấp trên trang hỗ trợ của VNPay: https://sandbox.vnpayment.vn/apis/vnpay-demo/
- Khi đã có 2 thông tin cấu hình để truy cập cổng thanh toán của VNPay tạo vnp_url trong function gọi thanh toán tới Vnpay:
public function create(Request $request)
{
session([‘cost_id’ => $request->id]);
session([‘url_prev’ => url()->previous()]);
$vnp_TmnCode = “UDOPNWS1”; //Mã website tại VNPAY
$vnp_HashSecret = “EBAHADUGCOEWYXCMYZRMTMLSHGKNRPBN”; //Chuỗi bí mật
$vnp_Url = “http://sandbox.vnpayment.vn/paymentv2/vpcpay.html”;
$vnp_Returnurl = “http://localhost:8000/return-vnpay”;
$vnp_TxnRef = date(“YmdHis”); //Mã đơn hàng. Trong thực tế Merchant cần insert đơn hàng vào DB và gửi mã này sang VNPAY
$vnp_OrderInfo = “Thanh toán hóa đơn phí dich vụ”;
$vnp_OrderType = ‘billpayment’;
$vnp_Amount = $request->input(‘amount’) * 100;
$vnp_Locale = ‘vn’;
$vnp_IpAddr = request()->ip();
$inputData = array(
“vnp_Version” => “2.0.0”,
“vnp_TmnCode” => $vnp_TmnCode,
“vnp_Amount” => $vnp_Amount,
“vnp_Command” => “pay”,
“vnp_CreateDate” => date(‘YmdHis’),
“vnp_CurrCode” => “VND”,
“vnp_IpAddr” => $vnp_IpAddr,
“vnp_Locale” => $vnp_Locale,
“vnp_OrderInfo” => $vnp_OrderInfo,
“vnp_OrderType” => $vnp_OrderType,
“vnp_ReturnUrl” => $vnp_Returnurl,
“vnp_TxnRef” => $vnp_TxnRef,
);
if (isset($vnp_BankCode) && $vnp_BankCode != “”) {
$inputData[‘vnp_BankCode’] = $vnp_BankCode;
}
ksort($inputData);
$query = “”;
$i = 0;
$hashdata = “”;
foreach ($inputData as $key => $value) {
if ($i == 1) {
$hashdata .= ‘&’ . $key . “=” . $value;
} else {
$hashdata .= $key . “=” . $value;
$i = 1;
}
$query .= urlencode($key) . “=” . urlencode($value) . ‘&’;
}
$vnp_Url = $vnp_Url . “?” . $query;
if (isset($vnp_HashSecret)) {
// $vnpSecureHash = md5($vnp_HashSecret . $hashdata);
$vnpSecureHash = hash(‘sha256’, $vnp_HashSecret . $hashdata);
$vnp_Url .= ‘vnp_SecureHashType=SHA256&vnp_SecureHash=’ . $vnpSecureHash;
}
return redirect($vnp_Url);
}
Danh sách các tham số dùng ở trên để cấp cho VN Pay thông tin của thanh toán:
-
- vnp_Version: Phiên bản api mà merchant kết nối. Phiên bản hiện tại là 2.0.0
- vnp_Command: Mã API sử dụng, mã cho giao dịch thanh toán là pay
- vnp_TmnCode: Mã website của merchant trên hệ thống của VNPAY. Ví dụ: 2QXUI4J4
- vnp_Amount: Số tiền thanh toán. Số tiền không mang các ký tự phân tách thập phân, phần nghìn, ký tự tiền tệ. Để gửi số tiền thanh toán là 10,000 VND (mười nghìn VNĐ) thì merchant cần nhân thêm 100 lần (khử phần thập phân), sau đó gửi sang VNPAY là: 1000000
- vnp_BankCode: Mã Ngân hàng thanh toán. Ví dụ: NCB
- vnp_CreateDate: Ví dụ: 20170829103111
- vnp_CurrCode: Đơn vị tiền tệ sử dụng thanh toán. Hiện tại chỉ hỗ trợ VND
- vnp_IpAddr: Địa chỉ IP của khách hàng thực hiện giao dịch. Ví dụ: 13.160.92.202
- vnp_Locale: Ngôn ngữ giao diện hiển thị. Hiện tại hỗ trợ Tiếng Việt (vn), Tiếng Anh (en)
- vnp_OrderInfo: Thông tin mô tả nội dung thanh toán (Tiếng Việt, không dấu). Ví dụ: Thanh toan hoa don. So tien 2,000,000 VND
- vnp_OrderType: Mã danh mục hàng hóa. Mỗi hàng hóa sẽ thuộc một nhóm danh mục do VNPAY quy định. Xem thêm bảng Danh mục hàng hóa
- vnp_ReturnUr: URL thông báo kết quả giao dịch khi Khách hàng kết thúc thanh toán. Ví dụ: http://localhost:8000/return-vnpay
- vnp_TxnRef: Mã tham chiếu của giao dịch tại hệ thống của merchant. Mã này là duy nhất đùng để phân biệt các đơn hàng gửi sang VNPAY. Không được trùng lặp trong ngày. Ví dụ: 23554
- vnp_SecureHashType: Loại mã băm sử dụng: MD5, SHA256
- vnp_SecureHash Mã kiểm tra (checksum) để đảm bảo dữ liệu của giao dịch không bị thay đổi trong quá trình chuyển từ merchant sang VNPAY. Việc tạo ra mã này phụ thuộc vào cấu hình của merchant và phiên bản api sử dụng. Phiên bản hiện tại hỗ trợ SHA256 và MD5. Ví dụ:e6ce09ae6695ad034f8b6e6aadf2726f
Sau đó tất cả mọi hoạt động thanh toán sẽ được thực hiện trên VNpay. Khi thực hiện xong, VnPay trả về kết quả theo vnp_ReturnUrl đã truyền lên trong hàm Create. Lúc này ta viết hàm để trả lại kết quả:
public function return(Request $request)
{
$url = session(‘url_prev’,’/’);
if($request->vnp_ResponseCode == “00”) {
$this->apSer->thanhtoanonline(session(‘cost_id’));
return redirect($url)->with(‘success’ ,’Đã thanh toán phí dịch vụ’);
}
session()->forget(‘url_prev’);
return redirect($url)->with(‘errors’ ,’Lỗi trong quá trình thanh toán phí dịch vụ’);
}
Lưu ý: function này chỉ kiểm tra toàn vẹn dữ liệu (checksum) và hiển thị thông báo tới khách hàng Không cập nhật kết quả giao dịch tại function này. Để lưu hoặc cập nhật kết quả cũng như xử lý backend ta xử lý trong ipn_URL mà VNPay trả về, có thể đọc thêm tại https://sandbox.vnpayment.vn/apis/docs/huong-dan-tich-hop/
Ngoài VNPay, bạn có thể tham khảo thêm giải pháp cổng thanh toán trực tuyến AppotaPay hỗ trợ doanh nghiệp tối ưu chi phí vận hành, dễ dàng quản lý doanh thu, tối ưu trải nghiệm khách hàng…. Liên hệ với chúng tôi ngay TẠI ĐÂY.
Tham khảo thêm từ: Nncoder