VNPAY là một dịch vụ thanh toán trực tuyến phổ biến tại Việt Nam, hỗ trợ nhiều phương thức thanh toán như thẻ tín dụng, thẻ ATM, QR Code, và ví điện tử. Việc tích hợp VNPAY vào dự án C# .NET sẽ giúp bạn cung cấp cho người dùng một phương thức thanh toán thuận tiện và bảo mật.
Mục tiêu của thư viện này là đơn giản hóa quá trình thiết lập và xử lý giao dịch cho nhà phát triển, đồng thời cải thiện hiệu suất so với code mẫu từ VNPAY.
Warning
- Tác giả không khuyến khích sử dụng thư viện của bên thứ ba cho tính năng thanh toán tiền THẬT trong dự án.
- Hướng dẫn tích hợp dịch vụ thanh toán của VNPAY tại đây.
- Nhà phát triển vui lòng đọc hết hướng dẫn của tác giả để hạn chế lỗi không đáng có.
Tham khảo tại trang chính thức của VNPAY.
- Cách 1: Tìm và cài đặt thông qua NuGet Package Manager nếu bạn sử dụng Visual Studio.
- Cách 2: Cài đặt thông qua môi trường dòng lệnh. Chi tiết tại ĐÂY.
Note
Đăng ký để lấy thông tin tích hợp tại ĐÂY. Hệ thống sẽ gửi thông tin kết nối về email được đăng ký (có thể chậm vài giờ hoặc vài ngày).
| Thông tin | Mô tả |
|---|---|
TmnCode |
Mã định danh kết nối được khai báo tại hệ thống của VNPAY. Mã định danh tương ứng với tên miền website, ứng dụng, dịch vụ của merchant kết nối vào VNPAY. Mỗi đơn vị có thể có một hoặc nhiều mã TmnCode kết nối. |
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). |
BaseUrl |
URL thanh toán. Đối với môi trường Sandbox (thử nghiệm), URL là https://sandbox.vnpayment.vn/paymentv2/vpcpay.html. |
CallbackUrl |
URL truy vấn kết quả giao dịch. URL này được tự động chuyển đến sau khi giao dịch được thực hiện. |
Version |
Phiên bản API VNPAY (mặc định: 2.1.0). |
OrderType |
Loại đơn hàng (mặc định: other). |
Warning
Cần đảm bảo thông tin vnp_TmnCode và vnp_HashSecret bảo mật tuyệt đối.
Thêm những thông tin cấu hình lấy từ VNPAY vào appsettings.json như ví dụ sau:
{
"VNPAY": {
"TmnCode": "A1B2C3D4", // Ví dụ
"HashSecret": "A4D3C4C6D1Đ3D1D4QCS16PAFHI2GJ42D", // Ví dụ
"BaseUrl": "https://sandbox.vnpayment.vn/paymentv2/vpcpay.html", // Tùy chọn, mặc định là URL thanh toán môi trường TEST
"CallbackUrl": "https://localhost:1234/api/Vnpay/Callback", // Ví dụ
"Version": "2.1.0", // Tùy chọn, mặc định là 2.1.0
"OrderType": "other" // Tùy chọn, mặc định là other
}
}Trong file Program.cs, thêm cấu hình VNPAY vào container:
using VNPAY.Extensions;
var vnpayConfig = builder.Configuration.GetSection("VNPAY");
builder.Services.AddVnpayClient(config =>
{
config.TmnCode = vnpayConfig["TmnCode"]!;
config.HashSecret = vnpayConfig["HashSecret"]!;
config.CallbackUrl = vnpayConfig["CallbackUrl"]!;
// config.BaseUrl = vnpayConfig["BaseUrl"]!; // Tùy chọn. Nếu không thiết lập, giá trị mặc định là URL thanh toán môi trường TEST
// config.Version = vnpayConfig["Version"]!; // Tùy chọn. Nếu không thiết lập, giá trị mặc định là "2.1.0"
// config.OrderType = vnpayConfig["OrderType"]!; // Tùy chọn. Nếu không thiết lập, giá trị mặc định là "other"
});Trong Controller, inject IVnpay thông qua constructor:
using VNPAY.NET;
[ApiController]
[Route("api/[controller]")]
public class VnpayController : ControllerBase
{
private readonly IVnpayClient _vnpayClient;
public VnpayController(IVnpayClient vnpayClient)
{
_vnpayClient = vnpayClient;
}
// Các phương thức xử lý thanh toán...
}- Cách 1 - Tạo nhanh:
var moneyToPay = 10000; // Số tiền phải thanh toán (ví dụ: 10.000 VND)
var description = "Thanh toan don hang ABC"; // Mô tả giao dịch
var bankCode = BankCode.ANY; // Mã phương thức thanh toán
var paymentUrlInfo = _vnpayClient.CreatePaymentUrl(money, description, bankCode);
var paymentUrl = paymentUrlInfo.Url;- Cách 2 - Tạo yêu cầu thanh toán chi tiết:
var request = new VnpayPaymentRequest
{
Money = 10000, // Số tiền thanh toán (ví dụ: 10.000 VND)
Description = "Thanh toan don hang ABC", // Mô tả giao dịch
BankCode = BankCode.ANY, // Tùy chọn. Mã phương thức thanh toán. Mặc định là tất cả phương thức giao dịch
Language = DisplayLanguage.Vietnamese // Tùy chọn. Mặc định là tiếng Việt
};
var paymentUrlInfor = _vnpayClient.CreatePaymentUrl(request);
var paymentUrl = paymentUrlInfo.Url;Sử dụng IPN (Instant Payment Notification) URL cho phép hệ thống backend tự động nhận thông báo từ VNPAY khi trạng thái thanh toán thay đổi để từ đó xử lý tiếp mà không cần người dùng phải quay lại trang web.
Warning
- Khi đăng ký tích hợp VNPAY, bạn cần cung cấp IPN URL (Ví dụ:
https://localhost:1234/api/Vnpay/ProceedAfterPayment) để VNPAY gọi khi có giao dịch được thực hiện hoàn tất. - Đường dẫn IPN phải sử dụng giao thức
HTTPSđể đảm bảo an toàn. - Lưu ý chi tiết đọc tại ĐÂY.
[HttpGet("ProceedAfterPayment")]
public IActionResult ProceedAfterPayment()
{
try
{
var paymentResult = _vnpayClient.GetPaymentResult(this.Request);
// Thực hiện hành động nếu thanh toán thành công tại đây. Ví dụ: Cập nhật trạng thái đơn hàng trong cơ sở dữ liệu.
return Ok();
}
catch (VnpayException ex) // Bắt lỗi liên quan đến VNPAY
{
return BadRequest(ex.Message);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}CallbackUrl là URL được tự động chuyển hướng đến sau khi kết thúc thanh toán. Ví dụ: https://localhost:1234/api/Vnpay/Callback. Phía frontend sẽ bắt kết quả phản hồi để xử lý tiếp.
Warning
- URL này chỉ kiểm tra kết quả thanh toán và trả về cho người dùng.
- Không nên được sử dụng để xử lý tiếp đơn hàng.
- Thay
BaseUrlthành URL chính thức của VNPAY. - Đảm bảo bảo mật cho
HashSecret. - Thông tin tài khoản để chạy thử trên môi trường Sandbox tại ĐÂY.
VNPAY.NET là thư viện mã nguồn mở và hoàn toàn miễn phí cho .NET. Mọi người có thể ủng hộ tác giả và dự án này bằng cách để lại một ⭐ cho dự án, và đừng quên tặng tác giả cốc cà phê để tiếp thêm nhiều động lực.

