Giới thiệu
Hi các bạn, ở vài viết mình đã hướng dẫn các bạn tích hợp thanh toán online bằng VnPay cụ thể các bạn XEM TẠI ĐÂY
Và hôm nay mình sẽ hướng dẫn các bạn sử dụng PayPal để thực hiện viện việc thanh toán online.
Oke cùng bắt đầu nào
Đăng ký PayPal Credentials
Đầu tiên các bạn vào PayPal Developer để đăng ký tài khoản Developer và để tạo Credentials cho ứng dụng
Sau khi đã có tài khoản các bạn vào My Apps & Credentials -> Sandbox -> Create App


Điền thông tin và nhấn Create App

Tiếp đến các bạn lưu lại 2 thông tin quan trọng là Client ID và Secret. Nếu không thấy Secret các bạn chọn Show ở dưới chữ Secret nhé. Do ở đây mình nhấn rồi nên nó hiện Hide 😁
Kéo xuống dưới các bạn sẽ thấy các tùy chọn thêm. Các bạn có thể chọn các mục phù hợp với nhu cầu của mình và nhấn Save

Tiếp đến là phần lấy thông tin tài khoản Test. Các bạn vào Accounts
Tại đây các bạn có thể tạo thêm các tài khoản test cho ứng dụng của mình hoặc dùng tài khoản mặc định.
Lưu ý là sử dụng tài khoản mặc định thì bạn sẽ chỉ dùng được tài khoản với type là Personal để thanh toán thôi nhé!
Sau đó các bạn vào View/Edit Account để xem thông tin về tài khoản test

Dưới đây là thông tin tài khoản test của mình. Các bạn lưu lại để thực hiện test cho phần tiếp theo

Tích hợp vào Code
Trong file appsetting.json các bạn thêm đoạn code như sau đồng thời sửa lại các thông tin ClientId, SecretKey bằng thông tin của các bạn vừa đăng ký ở trên
"Paypal": {
"ClientId": "AQLDIaHajX3CQ778-T75-vORr1V1ajjuDMckZ7yuz_xf3pseHGYzYNUGOvXcUnjc2NQuGVhZ4UFObymN",
"SecretKey": "EJTUnDlyv8_ioX2_g6MtHwzWul6ldvnYLfOfLAL9drej9OLw24mAK40h4E5VMyhqlHj4GU-guqHPJf89",
"BaseUrl": "https://api.sandbox.paypal.com"
},
Tiếp đến là cài Nuget PayPal (v2.0.0-rc2)
Do code khá dài nên mình sẽ chỉ giải thích và đưa ra các hàm cần lưu ý thôi nhá. Các bạn Download source code về coi cho chi tiết nhé
Mình sẽ tạo ra 1 interfaces có tên IPayPalService và 1 class PayPalService sẽ implement interfaces IPayPalService
IPayPalService sẽ có 2 method như sau
string CreatePaymentUrl(PaymentInformationModel model, HttpContext context);
PaymentResponseModel PaymentExecute(IQueryCollection collections);
CreatePaymentUrl sẽ có trách nhiệm tạo ra URL thanh toán tại PayPal. Còn PaymentExecute sẽ thực kiểm tra thông tin giao dịch và sẽ lưu lại thông tin đó sau khi thanh toán thành công.
Sorry các bạn là ở đây mình thừa param HttpContext. Các bạn có thể bỏ HttpContext đi nhé :D
Do PayPal chỉ chấp nhận thanh toán bằng đồng Donal Trump nên mình có một hàm Convert tiền việt ra đô la như sau
public static double ConvertVndToDollar(double vnd)
{
var total = Math.Round(vnd / ExchangeRate, 2);
return total;
}
ExchangeRate là tỉ giá của đồng đô la hiện tại
public async Task<string> CreatePaymentUrl(PaymentInformationModel model, HttpContext context)
{
// var envProd = new LiveEnvironment(_configuration["PaypalProduction:ClientId"],
// _configuration["PaypalProduction:SecretKey"]);
var envSandbox =
new SandboxEnvironment(_configuration["Paypal:ClientId"], _configuration["Paypal:SecretKey"]);
var client = new PayPalHttpClient(envSandbox);
var paypalOrderId = DateTime.Now.Ticks;
var urlCallBack = _configuration["PaymentCallBack:ReturnUrl"];
var payment = new PayPal.v1.Payments.Payment()
{
Intent = "sale",
Transactions = new List<Transaction>()
{
new Transaction()
{
Amount = new Amount()
{
Total = ConvertVndToDollar(model.Amount).ToString(),
Currency = "USD",
Details = new AmountDetails
{
Tax = "0",
Shipping = "0",
Subtotal = ConvertVndToDollar(model.Amount).ToString(),
}
},
ItemList = new ItemList()
{
Items = new List<Item>()
{
new Item()
{
Name = " | Order: " + model.OrderDescription,
Currency = "USD",
Price = ConvertVndToDollar(model.Amount).ToString(),
Quantity = 1.ToString(),
Sku = "sku",
Tax = "0",
Url = "https://www.code-mega.com" // Url detail of Item
}
}
},
Description = $"Invoice #{model.OrderDescription}",
InvoiceNumber = paypalOrderId.ToString()
}
},
RedirectUrls = new RedirectUrls()
{
ReturnUrl =
$"{urlCallBack}?payment_method=PayPal&success=1&order_id={paypalOrderId}",
CancelUrl =
$"{urlCallBack}?payment_method=PayPal&success=0&order_id={paypalOrderId}"
},
Payer = new Payer()
{
PaymentMethod = "paypal"
}
};
var request = new PaymentCreateRequest();
request.RequestBody(payment);
var paymentUrl = "";
var response = await client.Execute(request);
var statusCode = response.StatusCode;
if (statusCode is not (HttpStatusCode.Accepted or HttpStatusCode.OK or HttpStatusCode.Created))
return paymentUrl;
var result = response.Result<Payment>();
using var links = result.Links.GetEnumerator();
while (links.MoveNext())
{
var lnk = links.Current;
if (lnk == null) continue;
if (!lnk.Rel.ToLower().Trim().Equals("approval_url")) continue;
paymentUrl = lnk.Href;
}
return paymentUrl;
}
Đoạn code trên sẽ tạo ra URL thanh toán tại PayPal.
Hiện tại do app mình dùng để kiểm thử nên dùng môi trường Sanbox, các bạn đưa ra môi trường thật thì dùng LiveEnvironment nhé.
PaymentExecute mình sẽ lấy ra thông tin sau khi thực hiện giao dịch như sau:
public PaymentResponseModel PaymentExecute(IQueryCollection collections)
{
var response = new PaymentResponseModel();
foreach (var (key, value) in collections)
{
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("order_description"))
{
response.OrderDescription = value;
}
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("transaction_id"))
{
response.TransactionId = value;
}
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("order_id"))
{
response.OrderId = value;
}
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("payment_method"))
{
response.PaymentMethod = value;
}
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("success"))
{
response.Success = Convert.ToInt32(value) > 0;
}
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("paymentid"))
{
response.PaymentId = value;
}
if (!string.IsNullOrEmpty(key) && key.ToLower().Equals("payerid"))
{
response.PayerId = value;
}
}
return response;
}
Trong Controller mình thực hiện gọi 2 hàm đã tạo ở trên ra
public async Task<IActionResult> CreatePaymentUrl(PaymentInformationModel model)
{
var url = await _payPalService.CreatePaymentUrl(model, HttpContext);
return Redirect(url);
}
public IActionResult PaymentCallback()
{
var response = _payPalService.PaymentExecute(Request.Query);
return Json(response);
}
Testing và kết quả
Đây là phần giao diện thanh toán mình đã tạo

Sau khi bấm thanh toán thì các bạn sẽ được Redirect tới trang thanh toán của PayPal.
Tại đây các bạn sử dụng tài khoản test đã tạo ở trên hoặc dùng tài khoản mặc định và đăng nhập vào để thanh toán

Đăng nhập thành công sẽ có kết quả như sau:

Đây là thôn tin đơn hàng chúng ta thanh toán. Tiếp tục kéo xuống dưới và bấm Continue

Kết quả sau khi thanh toán thành công:

Well done! Với thống tin được trả về các bạn có thể lưu chúng xuống Database hoặc bất cứ nơi đâu các bạn muốn.
Tạm kết
Vậy là mình đã hướng dẫn xong cho các bạn cách tích hợp PayPal vào Website rồi. Các bạn thấy hay thì cho mình 1 share nhé!
Bye bye :D