Asp .Net Mvc Paypal Entegrasyonu

Merhabalar, bu yazımda Asp .Net Mvc de Paypal ödeme sisteminin entegresine bir örnek yapacağız. Bu yazıyı yazdığım dönem paypal entegresi hakkında Türkçe kaynak hiç yoktu ilk olacak. Umarım hem Türkçe kaynakları hem de paypal siteminin kendisini en yakın zamanda ülkemizde tekrar görmek ümidiyle hemen yazımıza başlayalım.

İlk olarak bir paypal hesabı açıyoruz. Hesap türü olarak Business seçiyoruz.


Daha sonra sisteme uygun şekilde mail ve telefon numarasıyla kayıt oluyoruz. Bu işlemden sonra aşağıdaki linkten hesabımıza giriş yapıyoruz.

https://developer.paypal.com/classic-home

Giriş yaptığınız da yukarıdaki gibi bir ekran sizi karşılayacak.

1- Sizin bu paypal hesabına bağlı uygulamaları genel olarak gördüğünüz yer.

2- Yapılan uygulamanın test sürecinde mi yoksa yayında mı olduğunu belirlediğimiz alan. Biz şu an test sürecinde olduğumuz için SandBox seçili kalacak.

3- Bir paypal uygulaması oluşturmak istediğimizde kullanacağımız buton


Create App diyerek uygulamamıza bir isim vererek uygulamamızı kuruyoruz.


Daha sonra çıkan ekrandaki Client ID ve Secret ID yi bir kenara not ediyoruz.


Şimdilik buradaki işlemimiz tamam kod bölümüne geçelim. İlk olarak nuget package manager dan gerekli kütüphaneyi indiriyoruz.

  • Paypal

Daha sonra Web.config sayfasına geliyoruz ve aşağıdaki eklemeleri yapıyoruz.

<configuration>

  <configSections>
     //
 <section name="paypal" type="PayPal.SDKConfigHandler, PayPal" />
     //
  </configSections>

  <paypal>
    <settings>
   <add name="mode" value="sandbox" />
   <add name="connectionTimeout" value="360000" />
   <add name="requestRetries" value="1" />
   <add name="clientId" value="KaydettiğinizClientIdYeri" />
   <add name="clientSecret" value="KaydettiğinizSecretIdYeri" />
    </settings>
  </paypal>

     //
</configuration>

Bu işlemi yaptıktan sonra Models klasörünün içine Configuration adında statik bir class açıyoruz ve aşağıdaki gibi dolduruyoruz. Using’e ek olarak PayPal.Api veriyoruz

using PayPal.Api;
//

public static class Configuration
    {

        public readonly static string ClientId;
        public readonly static string ClientSecret;

        static Configuration()
        {
            var config = GetConfig();
            ClientId = config["clientId"];
            ClientSecret = config["clientSecret"];
        }

        // getting properties from the web.config
        public static Dictionary<string, string> GetConfig()
        {
            return PayPal.Manager.ConfigManager.Instance.GetProperties();
        }

        private static string GetAccessToken()
        {
            // getting accesstocken from paypal                
            string accessToken = new OAuthTokenCredential
        (ClientId, ClientSecret, GetConfig()).GetAccessToken();

            return accessToken;
        }

        public static APIContext GetAPIContext()
        {
            // return apicontext object by invoking it with the accesstoken
            APIContext apiContext = new APIContext(GetAccessToken());
            apiContext.Config = GetConfig();
            return apiContext;
        }
    }

Daha sonra PaypalController adında bir controller açıyoruz ve dolduruyoruz. Using’e ek olarak

  • using PayPal.Api;
  • using Configuration = Blog.Models.Configuration;

Veriyoruz.

  public class PaypalController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult FailureView()
        {
            return View();
        }

        public ActionResult SuccessView()
        {
            return View();
        }

   public ActionResult PaymentWithCreditCard()
        {
            //create and item for which you are taking payment
            //if you need to add more items in the list
            //Then you will need to create multiple item objects or use some loop to instantiate object
            Item item = new Item();
            item.name = "Demo Item";
            item.currency = "USD";
            item.price = "5";
            item.quantity = "1";
            item.sku = "sku";

            //Now make a List of Item and add the above item to it
            //you can create as many items as you want and add to this list
            List<Item> itms = new List<Item>();
            itms.Add(item);
            ItemList itemList = new ItemList();
            itemList.items = itms;

            //Address for the payment
            Address billingAddress = new Address();
            billingAddress.city = "NewYork";
            billingAddress.country_code = "US";
            billingAddress.line1 = "23rd street kew gardens";
            billingAddress.postal_code = "43210";
            billingAddress.state = "NY";


            //Now Create an object of credit card and add above details to it
            CreditCard crdtCard = new CreditCard();
            crdtCard.billing_address = billingAddress;
            crdtCard.cvv2 = "874";
            crdtCard.expire_month = 1;
            crdtCard.expire_year = 2020;
            crdtCard.first_name = "Aman";
            crdtCard.last_name = "Thakur";
            crdtCard.number = "1234567890123456";
            crdtCard.type = "discover";

            // Specify details of your payment amount.
            Details details = new Details();
            details.shipping = "1";
            details.subtotal = "5";
            details.tax = "1";

            // Specify your total payment amount and assign the details object
            Amount amnt = new Amount();
            amnt.currency = "USD";
            // Total = shipping + tax + subtotal.
            amnt.total = "7";
            amnt.details = details;

            // Now make a trasaction object and assign the Amount object
            Transaction tran = new Transaction();
            tran.amount = amnt;
            tran.description = "Description about the payment amount.";
            tran.item_list = itemList;
            tran.invoice_number = "your invoice number which you are generating";

            // Now, we have to make a list of trasaction and add the trasactions object
            // to this list. You can create one or more object as per your requirements

            List<Transaction> transactions = new List<Transaction>();
            transactions.Add(tran);

            // Now we need to specify the FundingInstrument of the Payer
            // for credit card payments, set the CreditCard which we made above

            FundingInstrument fundInstrument = new FundingInstrument();
            fundInstrument.credit_card = crdtCard;

            // The Payment creation API requires a list of FundingIntrument

            List<FundingInstrument> fundingInstrumentList = new List<FundingInstrument>();
            fundingInstrumentList.Add(fundInstrument);

            // Now create Payer object and assign the fundinginstrument list to the object
            Payer payr = new Payer();
            payr.funding_instruments = fundingInstrumentList;
            payr.payment_method = "credit_card";

            // finally create the payment object and assign the payer object & transaction list to it
            Payment pymnt = new Payment();
            pymnt.intent = "sale";
            pymnt.payer = payr;
            pymnt.transactions = transactions;

            try
            {
                //getting context from the paypal, basically we are sending the clientID and clientSecret key in this function 
                //to the get the context from the paypal API to make the payment for which we have created the object above.

                //Code for the configuration class is provided next

                // Basically, apiContext has a accesstoken which is sent by the paypal to authenticate the payment to facilitator account. An access token could be an alphanumeric string

                APIContext apiContext = Configuration.GetAPIContext();

                // Create is a Payment class function which actually sends the payment details to the paypal API for the payment. The function is passed with the ApiContext which we received above.

                Payment createdPayment = pymnt.Create(apiContext);

                //if the createdPayment.State is "approved" it means the payment was successfull else not

                if (createdPayment.state.ToLower() != "approved")
                {
                    return View("FailureView");
                }
            }
            catch (PayPal.PayPalException ex)
            {
                Logger.Log("Error: " + ex.Message);
                return View("FailureView");
            }

            return View("SuccessView");
        }

    public ActionResult PaymentWithPaypal()
        {
            //getting the apiContext as earlier
            APIContext apiContext = Configuration.GetAPIContext();

            try
            {
                string payerId = Request.Params["PayerID"];

                if (string.IsNullOrEmpty(payerId))
                {
                    //this section will be executed first because PayerID doesn't exist

                    //it is returned by the create function call of the payment class

                    // Creating a payment

                    // baseURL is the url on which paypal sendsback the data.

                    // So we have provided URL of this controller only

                    string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + "/Paypal/PaymentWithPayPal?";

                    //guid we are generating for storing the paymentID received in session

                    //after calling the create function and it is used in the payment execution

                    var guid = Convert.ToString((new Random()).Next(100000));

                    //CreatePayment function gives us the payment approval url

                    //on which payer is redirected for paypal acccount payment

                    var createdPayment = this.CreatePayment(apiContext, baseURI + "guid=" + guid);

                    //get links returned from paypal in response to Create function call

                    var links = createdPayment.links.GetEnumerator();

                    string paypalRedirectUrl = null;

                    while (links.MoveNext())
                    {
                        Links lnk = links.Current;

                        if (lnk.rel.ToLower().Trim().Equals("approval_url"))
                        {
                            //saving the payapalredirect URL to which user will be redirected for payment
                            paypalRedirectUrl = lnk.href;
                        }
                    }

                    // saving the paymentID in the key guid
                    Session.Add(guid, createdPayment.id);

                    return Redirect(paypalRedirectUrl);
                }
                else
                {
                    // This section is executed when we have received all the payments parameters

                    // from the previous call to the function Create

                    // Executing a payment

                    var guid = Request.Params["guid"];

                    var executedPayment = ExecutePayment(apiContext, payerId, Session[guid] as string);

                    if (executedPayment.state.ToLower() != "approved")
                    {
                        return View("FailureView");
                    }

                }
            }
            catch (Exception ex)
            {
                Logger.Log("Error" + ex.Message);
                return View("FailureView");
            }

            return View("SuccessView");
        }

   private PayPal.Api.Payment payment;

        private Payment ExecutePayment(APIContext apiContext, string payerId, string paymentId)
        {
            var paymentExecution = new PaymentExecution() { payer_id = payerId };
            this.payment = new Payment() { id = paymentId };
            return this.payment.Execute(apiContext, paymentExecution);
        }


        private Payment CreatePayment(APIContext apiContext, string redirectUrl)
        {
            Item item = new Item();
            item.name = "Demo Item";
            item.currency = "USD";
            item.price = "5";
            item.quantity = "1";
            item.sku = "sku";

            //Now make a List of Item and add the above item to it
            //you can create as many items as you want and add to this list
            List<Item> itms = new List<Item>();
            itms.Add(item);
            ItemList itemList = new ItemList();
            itemList.items = itms;

         
            var payer = new Payer() { payment_method = "paypal" };

            // Configure Redirect Urls here with RedirectUrls object
            var redirUrls = new RedirectUrls()
            {
                cancel_url = redirectUrl,
                return_url = redirectUrl
            };

            // similar as we did for credit card, do here and create details object
            Details details = new Details();
            details.shipping = "1";
            details.subtotal = "5";
            details.tax = "1";
     

            // similar as we did for credit card, do here and create amount object
            var amount = new Amount()
            {
                currency = "USD",
                total = "7", // Total must be equal to sum of shipping, tax and subtotal.
                details = details
            };

            var transactionList = new List<Transaction>();

            transactionList.Add(new Transaction()
            {
                description = "Transaction description.",
                invoice_number = "your invoice number which you are generating",
                amount = amount,
                item_list = itemList
            });

            this.payment = new Payment()
            {
                intent = "sale",
                payer = payer,
                transactions = transactionList,
                redirect_urls = redirUrls
            };

            // Create a payment using a APIContext
            return this.payment.Create(apiContext);

        }

Buradaki tüm ActionResult’lara birer view açıyoruz. İçinin gerekli olduğu viewleri aşağıdaki gibi dolduruyoruz.


Index.cshtml

@Html.ActionLink("Pay Direct With Credit Card", "PaymentWithCreditCard", "Paypal")
@Html.ActionLink("Pay with Paypal Account", "PaymentWithPaypal", "Paypal")

SuccessView.cshtml

<h2>İşlem başarılı !!</h2>

FailureView.cshtml

<h2>İşlem hatalı !!</h2>

Evet buraya kadar kodsal işlemlerimiz tamam. Şimdi test satın alma işlemi nasıl yapılıyor onu yapalım. Test işleminde bu uygulama için açtığınız paypal hesabını veya başka hesapları kullanamıyorsunuz. Kendi verdiği hesapları kullanıyoruz. Peki bunu nereden alıyoruz. Developer paypal hesabına geliyoruz.

1- Account bölümü sizin test satın alma işlemlerinde kullanacağınız hesapların listelendiği bölümdür.

2- Bu hesapları oluşturmak için kullanacağımız yer

3- Bu hesaplar ile ilgili bakiye/şifre gibi bilgilerin yer aldığı bölüm


Şimdi Create Account diyerek bir Personal hesap açıyoruz. Sonra üstteki ekrandan 3 numaralı butona tıklıyoruz.

Buradaki Email ID ve System Generated Password sizin test işleminde paypal’a giriş için kullanacağınız hesap bilgileri


Şimdi de bu test işlemini kredi kartı metodunu kullanarak yapacaksanız onun test bilgileri nasıl alınıyor onu gösterelim.

1- Bu bölüm test kredi kartı oluşturmak için kullanacağımız yer

2- Oluşturmak istediğimiz kartın özelliklerini seçiyoruz.

3- Oluşturduğumuz kartın bilgilerinin yer aldığı bölüm.


Genel yapı olarak bitti şimdi hata yönetimi yapalım muhtemel hataları konuşalım. Bunun yüzünden çok muzdarip oldum çünkü 🙂

  • Test işleminde dahi fatura numarasını unique bir ifade yapın yoksa bir defadan sonra hata veriyor.
  • Amount içindeki total property’sine shipping, tax ve subtotal değerlerinin toplamını veriyoruz.
  • Kredi kartı için kullanabileceğiniz kart tipleri hepsi küçük şekilde visa, mastercard, amex, jcb, discover.
  • Item içindeki quantity “1” olmak zorunda.
  • Bu tüm fiyat işlemlerinde double bir ifadeyi direkt toString() yapınca hata veriyor 5,64 double ifadesi stringe çevirince “5,64” oluyor. Sistem virgüle hata veriyor doğru ifade “5.64” olacak şekilde ayarlama yapınız.

Bunlar şimdilik benim denk geldiklerim debug ile hata yönetimi yapmak isterseniz try catch bölümünde catch tarafına breakpoint koyun ve gelen ex verisinden şu yola bakın

  • Ex–Details–details

Bu yolda size dönen hataların açıklamasını göreceksiniz.

Evet paypal entegrasyon işlemi bu kadar. Umarım güzel açıklayabilmişimdir.


Yazımın sonuna geldik. Bir sonraki yazımda görüşmek üzere. Sağlıcakla kalın.

Bir cevap yazın