Asp.net C# PayU Entegrasyon

Selamlar, Bu yazımda daha önce yaptığımız c# örnek sipariş modülüne ekleme yapacağız. Ürün ekleme/silme, kupon kodu ekleme, adres ekleme, ödeme ekleme v.b fonksiyonlarımızı eklemiştik. Şimdi ise ödeme eklerken PayU sistemi ile ödeme eklemeyi yapacağız. Bunu yaparken bir önceki c# ile sipariş örnek modülü yazımızda geliştirdiğimiz web tarafınında ödeme ekleme bölümünü geliştiriyor olacağız. Projemizi modül modül geliştiriyoruz ama ben yine son halini toplu bir şekilde yüklüyorum.
Projeyi indirim için tıklayınız

PayU entegrasyonunda çekim işlemlerini yaparken PayU tarafından geliştirilen DLL'leri kullanacağız. Refund yani iade durumlarında ise DLL tarafına eklememişler. İade işleminide kendimiz Web Client istek göndererek tamamlıyacağız. PayU ile alakalı geliştirmeleri projemiz içerisinde Sale.PaymentPayU projesinde yapacağız. Bu yaptığımız projeyi daha sonra Sale.Web tarafına referans edip kullanacağız. Sale.PaymentPayU tarafında ilk olarak çekim yapma ile başlıyalım.

Bunu yaparken iki farklı yöntem uygulayabiliriz. İstersek eğer kullanıcıyı PayU tarafına gönderir kullanıcının kart bilgilerini PayU tarafında girmesini isteriz. Yada direkt olarak kart bilgilerini biz alıp çekimi PayU ile entegre olup hiç post işlemi olmadan kendi tarafımızda halletmek isteyebiliriz. Biz bu tarza daha çok ağırlık vereceğiz. Model klasörünün altında Request.cs oluşturdum. PayU tarafına giderken bize hem kullanıcının kredi kartı bilgileri lazım. Hemde kullanıcıyı sipariş bilgileri lazım. Kredi kartı bilgilerinde kullanmak için CreditCard.cs'yi oluşturdum. Sipariş için ise Sale.Library tarafında yazdığımız SaleModel'imizi kullanacağız. Bu tarzda yerlerde kullanalım diye yazdık onu :)

Genel olarak PayRequest adında bir class oluşturup. Kredi kartı ve Sipariş bilgilerini bunun üstünde tutacağız. Request işleminin response bilgisi için ise Result.cs içindeki PayResult.cs'yi kullanacağız. Bu classıda PayU tarafından gelen değerlere göre yazdım. Repository.cs tarafına geçelim. PayU tarafı ile tüm fonksiyonları burda yazacağız. İki adet çekim işlemi var demiştim. Bunlara bağlı olarak iki adet private method yazdım.
Bunlar şöyle ;
PayU tarafına gitmeden direk çekim : PayPayU
PayU tarafına gönderip cevap bekleme : GoPayUPage

Genel olarak Pay methodumuz var. Bu methoda göndereceğimiz parametre ile beraber iki methondan hangisini tercih edeceğimize karar verebiliriz. Önemli olan kullanıcıy PayU tarafına göndermeden kart bilgilerini alıp kullanıcıya PayU'yu hissetirmeden çekim yapmak. PayU tarafına gittiğimizde dönüş olarak returnUrl veriyoruz. Burdan gelen HttpRequest'i yine Repository.cs içinde bulunan Pay3DResult ile PayResult tipine çevirip kullanabilirsiniz. PayPayU methoduna ağırlık verirsek eğer set edilen değerleri method içerisinde göreceksiniz. Burda PayU.AutomaticLiveUpdate.dll'i kullanacağız. PayU tarafından istenilen order nesnesini doldurduktan sonra "ProcessPayment" methodunu cağıyoruz. Burda ince bir nokta var, bu methodu cağırdığımızda PayU aksii bir durum olduğunu hissederse eğer kullanıcıyı 3D ekranına atmamızı isteyebilir.

                var response = service.ProcessPayment(order);
                //PayU işlemin 3D devam etmesini isteyebilir..
                if (response.Is3DSResponse)
                {
                    HttpContext.Current.Response.Redirect(response.Url3DS);
                    HttpContext.Current.Response.End();
                }

Burda Is3DSResponse değeri true dönerse eğer çekim yapılmamış, PayU kullanıcıyı 3D ekranıma gönder demek istemiştir. Bizde gönderiyoruz. Çekim olumlu sonuçlanıp sonuçlanmadığını gelen response üzerindeki status ile PayU.AutomaticLiveUpdate.Status enum tipinde "success olarak karşılaştırarak bulursak kesin sonuç alırız. ReturnCode vb. değerlere bakmamıza gerek yok.

  if (response.Status == PayU.AutomaticLiveUpdate.Status.Success)
                {

                    return new PayResult
                    {
                        BankOrderId = response.BankClientId,
                        Amount = response.Amount ?? 0,
                        ErrorMessage = response.ReturnMessage,
                        AuthCode = response.AuthCode,
                        IsPay = true,
                        CreditCardNumber = response.PAN,
                        Order = response.BankOrderId,
                        TransactionId = response.TransactionId,
                        InstallmentCount = Convert.ToByte(response.InstallmentNumber),
                        CreditCardName = response.CardProgramName
                    };
                 //İşlem başarılı..
		//Burda result dönülmeden önce loglama yapılabilir. Size bırakıyorum..
      }

Ayrıca kullanılan try catch bölümünde exception nesnesi olarak "PayException" nesnesini kullanırsak eğer hata olması durumunda daha detaylı sonuçlar elde edebiliriz. Bilginize.. Buraya kadar çekim olayını işledik. Şimdide DLL üzerinde bulunmayan uğraş kısmı biraz daha fazla olan iade kısmına geçelim. Dediğim gibi bunun için dll tarafında geliştirme yapılmamış web client ile request atarak halledeceğiz.

Çekim yaparken bulundurduğumuz request nesneleri kadar kalabalık bir nesne değil RefundRequest. Merchant, Hash, Currency, IRNDate, OrderId ve OrderAmonut propertylerimiz var. Burda en can alıcı nokta "Hash" kısmı. Bu yüzden PayU tarafında yazılmış kodlardanda destek alacağız. Böylece daha hızlı sonuça gidebiliriz. PayU tarafının yazdığı "ParameterHandler" adında bir class görüceksiniz. Helper klasörünün altında bu class, bu class içerisinde bir çok işlevi var içine girip kafanızı karıştırmak istemiyorum. Bizde kendi Repository.cs tarafında kullandığımız kısmıyla size bahsedeceğim.

 public RefundResult PayCancel(RefundRequest refund)
        {
            try
            {
                refund.Merchant = merchant;
                //Oluşturduğumuz refund nesnesini ParameterHandler'ı instance alırken veriyoruz. NameValueCollection haline getiriyor.
                var parameterHandler = new ParameterHandler(refund);
              //Refund nesnesine set ettiğimiz değerler NameValueCollection haline geldikten sonra hashleme methoduna gönderiyoruz.
                var hashData = parameterHandler.CreateOrderRequestHash(signatureKey);
               //İlgili refund nesnesimizi biz doldurduk ancak hash datası eksik haldeydi. Create işlemini yaptıktan sonra hashlenmiş hali ile tekrar NameValueCollection halinde çekiyoruz.
                var requestData = parameterHandler.GetRequestData();
                var requestHelper = new RequestHelper();
		//Oluşturduğumuz NameValueCollection ile SendRequest methodunu cağırıyoruz. Verdiğimiz "RefundResult" tipinde bize değer dönüyor.
                var result = requestHelper.SendRequest(refundEndPoint, requestData);
                return result;
            }
            catch (PayuException ex)
            {

                //Exception loglanabilir..
            }
            return new RefundResult();
        }

Yukarda hem methodu paylaştım. Hemde method içerisinde neler yapıldığını anlattım. Hepsi açık kaynak proje içerisinde var, inceyebilirsiniz. Sorularınız varsa eğer yazımın altına yorum atabilirsiniz. Sale.PaymentPayU tarafında geliştirmelerimizi tamamladık. Şimdi ise çekim yapacağımız Sale.Web tarafına geçiyorum. salecontroller.cs içerisinde "paymentok" adında bir actionumuz vardı. Burda sorgusuz bir şekilde ödemeyi ekliyorduk. Şimdi ise PayU tarafına göndereceğiz, olumlu cevap alırsak eğer ödemeyi ekleyeceğiz.

var saleModel = Sale.Data.Library.BaseController.SaleController.GetSale();

            Sale.PaymentPayU.Repository rep = new Sale.PaymentPayU.Repository();

            var result = rep.Pay(new Sale.PaymentPayU.Model.PayRequest(saleModel)
            {
                CreditCardModel = new Sale.PaymentPayU.Model.CreditCard
                {
                    CreditCardName = "S.Ç.",
                    CardNumber = "4355084355084358",
                    ExpiryMonth = "12",
                    ExpiryYear = "2018",
                    CVV = "000"
                }
            });

            if (result.IsPay)
            {
                //Ödeme başarılı ise..
                var paymentModel = new PaymentModel
                {
                    Name = "PayU Ödeme",
                    Price = saleModel.RemainingPrice
                };
                saleModel.AddPayment(paymentModel);
                saleModel.SaveChanges();
                return RedirectToAction("result");
            }
            return RedirectToAction("payment");

Burda kullandığım kart bilgileri PayU tarafından verilen test bilgileridir. Gördüğünüz gibi PayU tarafından olumlu sonuç dönerse ödememizi ekleyip siparişimizi tamamlıyoruz. Olumsuz bir durumda ise ödeme sayfasına tekrar gönderiyoruz. Siz ödeme sayfasına tekrar gönderirken sayfaya error mesaj tarzında yazılar yazabilirsiniz. Geliştirmesi size kalmış. Projemize güzel bir geliştirme ile PayU Entegrasyonu yapmış olduk. Projemizi ileri tarihli yazılarımda yine geliştiriyor olacağız..

Yorumlar

  1. Fevzi 23.1.2016

    Hocam çok iyi mailiniz varsa alabilrmıyım sormak istediğim bir kaç soru var

    Samet Ç. 15.3.2016

    Linkedin üzerinden bana ulabilirşiniz.

    Mahir Erbakan 27.6.2016

    Samet bey firmamız için uyguladı payu entegrasyon ödeme sistemini. c# dilinde kodlanmış sitemizde sorunsuz adaptasyonu sağlandı. Payu tarafından alamadığımız desteği kendisi bize verdi, Hızlı ve ilgili kardeşimiz. Payu Entegrasyonu ile ilgili bir ihtiyacı olan site sahipleri gönül rahatlığı ile işi verebirler samet kardeşimize. Verdiği hizmetten memnun kaldık. Teşekkürler!

    okan k 5.10.2016

    Proje dll hataları veriyor düzenler misiniz ya da mesaj attığım e-mail bilgisine bana mail atar mısınız

    Feridun 3.5.2017

    Merhaba, Taksitlendirme örneği var mı? Teşekkürler.

Yorum Yaz