Tìm kiếm


    Tích hợp thanh toán Online PayPal với .Net Core


    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

    dá

    đasad

    Đ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 IDSecret. 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

    dád

    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

    đâsd

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

    đasa

    Đâ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

    dáds

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

    đasa

    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


    Tiểu sử
    Are you one or zero?


    Bình luận