Dec 1 2010

garanti sanal pos entegrasyonu

Category: cankaya07 @ 23:24

Merhaba arkadaşlar, bu makalemizde sanal pos nedir, kimler kullanır, güvenliği nasıl sağlanır gibi sorulara yanıt vermeye çalışacağız. Sanal pos genel tabiriyle bizim günlük hayatta alışverişlerde kullandığımız pos makinesinden bir farkı yoktur. Arada tek bir fark vardır, O da ortada gözle görülen bir makinenin olmamasıdır.

Pos makinalarından kartımızı geçirdiğimizde, kartımızın üzerindeki bilgiler okunur ve sunucuya gönderir. Sunucudan gelen cevaba göre bize slip diye tabir edilen bir kâğıt verilir işlem tamamlanmış olur.

Sanal pos işleminde ise ortada bir makina olmadığına göre kartımızın üzerindeki bilgileri bizim girmemiz gerekecektir. Bu bilgileri girerken de insan ister istemez kuşkuya düşer. Nereye gidiyor bu bilgiler ya birileri bu bilgilerimi alırsa gibi? Bunun içinde kredi kartı bilgilerinizi girdiğiniz sitelerde SSL adı verilen güvenlik sisteminin çalışıp çalışmadığına dikkat etmelisiniz.

Sanal posu kimlerin kullandığına gelince internetten satış yapmak isteyen firmalar gerekli web yazılımını(web sitesi) hazırladıktan sonra bankanın istediği bir takım istekleri de yerine getiren herkes kullanabilir.

Günümüzde  eticaret uygulamalarında büyük firmalar genellikle kendi sanal posunu kullanmaktadır. Küçük işletmeler ise paypal yâda gittigidiyor gibi siteler üzerinden belirli bir yüzde vererek ürünlerini satabilmektedir.

Bu makalede Garanti bankası sanal posunun nasıl entegre edileceğini göreceğiz.

GarantiBank isimli classımın propertyleri:

public string strMode { get; set; }//TEST - PROD
        public string strVersion { get { return "v0.00"; } }
        public string strTerminalID { get { return "***"; } }//Terminal numarasi
        public string _strTerminalID { get { return "***"; } }//Terminal numarasi Başına 0 eklenerek 9 digite tamamlanmalıdır. 
        public string strProvUserID { get { return "PROVAUT"; } }
        public string strProvisionPassword { get { return "***"; } }//Terminal UserID şifresi 
        public string strUserID { get { return "PROVAUT"; } }
        public string strMerchantID { get { return "***"; } }//Üye İşyeri Numarası 
        public string strCustomerName { get; set; }//kart üzerindeki ad soyad
        public string strIPAddress { get; set; }//işlem yapan kullanıcının ip adresi
        public string strEmailAddress { get; set; }//işlem yapan kullanıcının email adresi
        public string strOrderID { get; set; }//sistemde kullandıgınız siparis id
        public string strNumber { get; set; }//kredikart üzerindeki no
        public string strExpireDate { get; set; }//son kullanma tarihi 0112 gibi
        public string strCVV2 { get; set; }// 3 yada 4 hane kartın arkasındaki cvv numarasi
        public string strAmount { get; set; }//cekilecek tutar 1250 gibi yada 100 gibi
        public string strType { get { return "sales"; } }
        public string strCurrencyCode { get { return "949"; } } // tl işlem kodu
        public string strCardholderPresentCode { get { return "0"; } }
        public string strMotoInd { get { return "N"; } }
        public string strHostAddress { get { return "https://sanalposprov.garanti.com.tr/VPServlet"; } }
        public string SecurityData { get { return GetSHA1(strProvisionPassword + _strTerminalID).ToUpper(); } }
        public string HashData { get { return GetSHA1(strOrderID + strTerminalID + strNumber + strAmount + SecurityData).ToUpper(); } }
        public string HataIletisi { get; set; }
        public string ConfirmRefNo { get; set; }

Hash Olusturmak için gerekli olan birkaç metot: Yine garantibank classının içerisinde

public string GetHexaDecimal(byte[] bytes)
        {
            StringBuilder s = new StringBuilder();
            int length = bytes.Length;
            for (int n = 0; n <= length - 1; n++)
            {
                s.Append(String.Format("{0,2:x}", bytes[n]).Replace(" ", "0"));
            }
            return s.ToString();
        }
        public string GetSHA1(string SHA1Data)
        {
            SHA1 sha = new SHA1CryptoServiceProvider();
            string HashedPassword = SHA1Data;
            byte[] hashbytes = Encoding.GetEncoding("ISO-8859-9").GetBytes(HashedPassword);
            byte[] inputbytes = sha.ComputeHash(hashbytes);
            return GetHexaDecimal(inputbytes);
        }

Bankanın sizden beklediği xmli olusturma ve cevabı okuma işlemini aşağıdaki kod bloguyla gercekleştirebilirsiniz.

public string GenerateXmlDocument()
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            System.Xml.XmlDeclaration dec = null;
            dec = doc.CreateXmlDeclaration("1.0", "ISO-8859-1", "yes");
            doc.AppendChild(dec);

            System.Xml.XmlElement GVPSRequest = null;
            GVPSRequest = doc.CreateElement("GVPSRequest");
            doc.AppendChild(GVPSRequest);

            System.Xml.XmlElement Mode = null;
            Mode = doc.CreateElement("Mode");
            Mode.AppendChild(doc.CreateTextNode(strMode));
            GVPSRequest.AppendChild(Mode);

            System.Xml.XmlElement Version = null;
            Version = doc.CreateElement("Version");
            Version.AppendChild(doc.CreateTextNode(strVersion));
            GVPSRequest.AppendChild(Version);

            System.Xml.XmlElement Terminal = null;
            Terminal = doc.CreateElement("Terminal");
            GVPSRequest.AppendChild(Terminal);

            System.Xml.XmlElement ProvUserID = null;
            ProvUserID = doc.CreateElement("ProvUserID");
            ProvUserID.AppendChild(doc.CreateTextNode(strProvUserID));
            Terminal.AppendChild(ProvUserID);

            System.Xml.XmlElement HashData_ = null;
            HashData_ = doc.CreateElement("HashData");
            HashData_.AppendChild(doc.CreateTextNode(HashData));
            Terminal.AppendChild(HashData_);

            System.Xml.XmlElement UserID = null;
            UserID = doc.CreateElement("UserID");
            UserID.AppendChild(doc.CreateTextNode(strUserID));
            Terminal.AppendChild(UserID);

            System.Xml.XmlElement ID = null;
            ID = doc.CreateElement("ID");
            ID.AppendChild(doc.CreateTextNode(strTerminalID));
            Terminal.AppendChild(ID);

            System.Xml.XmlElement MerchantID = null;
            MerchantID = doc.CreateElement("MerchantID");
            MerchantID.AppendChild(doc.CreateTextNode(strMerchantID));
            Terminal.AppendChild(MerchantID);

            System.Xml.XmlElement Customer = null;
            Customer = doc.CreateElement("Customer");
            GVPSRequest.AppendChild(Customer);

            System.Xml.XmlElement IPAddress = null;
            IPAddress = doc.CreateElement("IPAddress");
            IPAddress.AppendChild(doc.CreateTextNode(strIPAddress));
            Customer.AppendChild(IPAddress);

            System.Xml.XmlElement EmailAddress = null;
            EmailAddress = doc.CreateElement("EmailAddress");
            EmailAddress.AppendChild(doc.CreateTextNode(strEmailAddress));
            Customer.AppendChild(EmailAddress);

            System.Xml.XmlElement Card = null;
            Card = doc.CreateElement("Card");
            GVPSRequest.AppendChild(Card);

            System.Xml.XmlElement Number = null;
            Number = doc.CreateElement("Number");
            Number.AppendChild(doc.CreateTextNode(strNumber));
            Card.AppendChild(Number);

            System.Xml.XmlElement ExpireDate = null;
            ExpireDate = doc.CreateElement("ExpireDate");
            ExpireDate.AppendChild(doc.CreateTextNode(strExpireDate));
            Card.AppendChild(ExpireDate);

            System.Xml.XmlElement CVV2 = null;
            CVV2 = doc.CreateElement("CVV2");
            CVV2.AppendChild(doc.CreateTextNode(strCVV2));
            Card.AppendChild(CVV2);

            System.Xml.XmlElement Order = null;
            Order = doc.CreateElement("Order");
            GVPSRequest.AppendChild(Order);

            System.Xml.XmlElement OrderID = null;
            OrderID = doc.CreateElement("OrderID");
            OrderID.AppendChild(doc.CreateTextNode(strOrderID));
            Order.AppendChild(OrderID);

            System.Xml.XmlElement GroupID = null;
            GroupID = doc.CreateElement("GroupID");
            GroupID.AppendChild(doc.CreateTextNode(""));
            Order.AppendChild(GroupID);

            System.Xml.XmlElement Description = null;
            Description = doc.CreateElement("Description");
            Description.AppendChild(doc.CreateTextNode(""));
            Order.AppendChild(Description);

            System.Xml.XmlElement Transaction = null;
            Transaction = doc.CreateElement("Transaction");
            GVPSRequest.AppendChild(Transaction);

            System.Xml.XmlElement Type = null;
            Type = doc.CreateElement("Type");
            Type.AppendChild(doc.CreateTextNode(strType));
            Transaction.AppendChild(Type);

            System.Xml.XmlElement InstallmentCnt = null;
            InstallmentCnt = doc.CreateElement("InstallmentCnt");
            InstallmentCnt.AppendChild(doc.CreateTextNode(""));
            Transaction.AppendChild(InstallmentCnt);

            System.Xml.XmlElement Amount = null;
            Amount = doc.CreateElement("Amount");
            Amount.AppendChild(doc.CreateTextNode(strAmount));
            Transaction.AppendChild(Amount);

            System.Xml.XmlElement CurrencyCode = null;
            CurrencyCode = doc.CreateElement("CurrencyCode");
            CurrencyCode.AppendChild(doc.CreateTextNode(strCurrencyCode));
            Transaction.AppendChild(CurrencyCode);

            System.Xml.XmlElement CardholderPresentCode = null;
            CardholderPresentCode = doc.CreateElement("CardholderPresentCode");
            CardholderPresentCode.AppendChild(doc.CreateTextNode(strCardholderPresentCode));
            Transaction.AppendChild(CardholderPresentCode);

            System.Xml.XmlElement MotoInd = null;
            MotoInd = doc.CreateElement("MotoInd");
            MotoInd.AppendChild(doc.CreateTextNode(strMotoInd));
            Transaction.AppendChild(MotoInd);

            System.Xml.XmlElement _Description = null;
            _Description = doc.CreateElement("Description");
            _Description.AppendChild(doc.CreateTextNode(""));
            Transaction.AppendChild(_Description);

            System.Xml.XmlElement OriginalRetrefNum = null;
            OriginalRetrefNum = doc.CreateElement("OriginalRetrefNum");
            OriginalRetrefNum.AppendChild(doc.CreateTextNode(""));
            Transaction.AppendChild(OriginalRetrefNum);
            return doc.OuterXml;
        }

        public bool OdemeyiAl()
        {
            try
            {
                WebRequest _WebRequest = WebRequest.Create(strHostAddress);
                _WebRequest.Method = "POST";
                byte[] byteArray = Encoding.UTF8.GetBytes("data=" + GenerateXmlDocument());
                _WebRequest.ContentType = "application/x-www-form-urlencoded";
                _WebRequest.ContentLength = byteArray.Length;

                Stream dataStream = _WebRequest.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();

                WebResponse _WebResponse = _WebRequest.GetResponse();
               // Response.Write(((HttpWebResponse)_WebResponse).StatusDescription);
                dataStream = _WebResponse.GetResponseStream();


                StreamReader reader = new StreamReader(dataStream);
                string result = reader.ReadToEnd();

                dataStream.Close();
                dataStream.Dispose();
                reader.Close();
                reader.Dispose();
                _WebResponse.Close();

                XmlDocument readeddocument = new XmlDocument();
                readeddocument.LoadXml(result);
                XmlNodeList _statu = readeddocument.GetElementsByTagName("Message");
                XmlNodeList _hata = readeddocument.GetElementsByTagName("ErrorMsg");
                XmlNodeList _RefNo = readeddocument.GetElementsByTagName("RetrefNum");
                
                if (_statu[0].InnerText == "Approved")
                {
                    ConfirmRefNo = _RefNo[0].InnerText;
                    return true;
                }
                else
                {
                    HataIletisi ="Hata Olustu :"+ _hata[0].InnerText;
                    return false;
                }
            }
            catch (Exception ex)
            {
                HataIletisi ="İşleminizi şu an gerçekleştiremiyoruz. Lütfen daha sonra tekrar deneyiniz "+ ex.Message;  
                return false;
            }
        }

 

Gerekli entegrasyon dokümanlarını buradan edinebilirsiniz. Linkini verdiğim bu dokümandaki kaynak kodlarda birkaç gözden kaçan yer fark ettim. Yanılmıyorsam xml generate ederken olan bölümdeydi. Yukarda benim vermiş olduğum kodlar çalışmaktadır. Onları kullanabilirsiniz. Vermiş olduğum kodları kendi bilgilerinizi girerek çalıştırırsanız muhtemel hata alacaksınızdır. Ben aldım J  Provaut kullanıcısını bu şekilde kullanabilmeniz için size banka tarafından verilen bir panelde provaut kullanıcısına bir şifre belirleyip bu kullanıcıyı aktif hale getirmelisiniz. Ve girmiş olduğunuz bu şifreyi propertydeki sanal pos şifresi alanına set etmelisiniz. Artık çalışmaması için hiçbir neden yok.

Yine de hata alıyorsanız: eticaret@garanti.com.tr mail adresiyle iletişime geçmelisiniz. Çok başarılı teknik destekleri var buradan kendilerini tekrardan tebrik ederim. Harikuladesiniz çocuklar ;)

Kaynak Kodları daha sağlık incelemenizi için garantibank classını buradan indirebilirsiniz.

Umarım yeterince açıklayıcı olmuştur. Yeni bir makalede görüşünceye dek hoşça kalın.

 

Tags: ,

Comments

Comments are closed