Пример #1
0
        public PurchaseTransactionResponse PerformPaymentTransaction(PurchaseTransactionRequest requestTx)
        {
            // Get URL from Config
            PaymentConfiguration paymentConfiguration = this.GetPaymentConfiguration();

            requestTx.CO_ID      = paymentConfiguration.CO_ID;
            requestTx.OUTLET     = paymentConfiguration.OUTLET;
            MERCHANT_SECRET      = paymentConfiguration.MERCHANT_SECRET_KEY;
            requestTx.Reference  = BuildMerchantReference(requestTx);
            requestTx.Consistent = this.BuildConsistentKey(requestTx);

            // Persist request transaction
            requestTx = this.PersistPaymentRequest(requestTx);

            // Do Payment
            SetcomPurchase transactionProcessor = new SetcomPurchase();
            PurchaseTransactionResponse purchaseTransactionResponse;

            purchaseTransactionResponse = transactionProcessor.DoPayment(requestTx, paymentConfiguration.PaymentGatewayURL);

            // persist response
            bool updateSuccessful = this.VerifyAndPersistPaymentResponse(requestTx, purchaseTransactionResponse);

            return(purchaseTransactionResponse);
        }
Пример #2
0
        public void MockSetcomPurchaseRequest()
        {
            PurchaseTransactionRequest purchaseTransactionRequest = new PurchaseTransactionRequest();

            // Action based on service calls
            // CO_ID and OUTLET from DB - are set in the PerformPaymentTransaction method, trackID is derived during paymentTransaction process
            // Internal use fields
            purchaseTransactionRequest.MemberInGameID      = 1;
            purchaseTransactionRequest.transactionDateTime = DateTime.Now;

            // Mandatory SETCOM fields
            purchaseTransactionRequest.CCNumber  = "4444333322221111";
            purchaseTransactionRequest.CCCVV     = "111";
            purchaseTransactionRequest.ExYear    = "2020";
            purchaseTransactionRequest.ExMonth   = "11";
            purchaseTransactionRequest.CCName    = "Test Buyer VS1";
            purchaseTransactionRequest.CC_Amount = "270.00";
            purchaseTransactionRequest.CO_ID     = ""; // Populated during PerformPaymentTransaction, data from db payment config
            purchaseTransactionRequest.OUTLET    = ""; // Populated during PerformPaymentTransaction, data from db payment config
            purchaseTransactionRequest.Reference = ""; // Unique merchant tracking ID, set during PerformPaymentTransaction

            // Consistent key field - Optional SETCOM field - hashed transaction key for transactional safety
            purchaseTransactionRequest.Consistent = ""; // Populated during PerformPaymentTransaction, data from db payment config

            // Optional SETCOM fields
            purchaseTransactionRequest.MobileNumber    = "0823456789";
            purchaseTransactionRequest.buyer_id        = purchaseTransactionRequest.MemberInGameID.ToString();
            purchaseTransactionRequest.bill_first_name = "test";
            purchaseTransactionRequest.bill_last_name  = "user";
            purchaseTransactionRequest.bill_phone      = "08234567890";
            purchaseTransactionRequest.bill_street1    = "street1";
            purchaseTransactionRequest.bill_street2    = "street2";
            purchaseTransactionRequest.bill_state      = "Gauteng";
            purchaseTransactionRequest.bill_zip        = "1234";
            purchaseTransactionRequest.bill_city       = "Johannesburg";
            purchaseTransactionRequest.bill_country    = "South Africa";
            purchaseTransactionRequest.bill_title      = "Mr";
            purchaseTransactionRequest.EmailAddress    = "*****@*****.**";
            purchaseTransactionRequest.ip_address      = "172.152.43.1";

            PurchaseTransactionResponse ptRes = this.PerformPaymentTransaction(purchaseTransactionRequest);

            Console.WriteLine("outcome [" + ptRes.outcome + "]");
            Console.WriteLine("response indicator [" + ptRes.responseIndicator + "]");
            Console.WriteLine("tx date [" + ptRes.transactionDate + "]");
            Console.WriteLine("tx time [" + ptRes.transactionTime + "]");
            Console.WriteLine("tx order ID [" + ptRes.transactionOrderID + "]");
            Console.WriteLine("merchant ref [" + ptRes.merchantReference + "]");
            Console.WriteLine("tx amount [" + ptRes.transactionAmount + "]");
        }
Пример #3
0
        private string BuildMerchantReference(PurchaseTransactionRequest purchaseTransactionRequest)
        {
            string merchantReference = purchaseTransactionRequest.bill_last_name.Trim() + ", " + purchaseTransactionRequest.bill_first_name.Trim() + purchaseTransactionRequest.CC_Amount + purchaseTransactionRequest.transactionDateTime;

            string hashedMerchantReference = Hashing.GetMd5Hash(merchantReference);

            if (hashedMerchantReference.Length > 250)
            {
                hashedMerchantReference = hashedMerchantReference.Substring(0, 249);
            }

            Console.WriteLine("The MD5 hash of " + merchantReference + " is: " + hashedMerchantReference + ".");

            return(hashedMerchantReference);
        }
Пример #4
0
        // Returns PaymentTransactionID for this transaction.
        private PurchaseTransactionRequest PersistPaymentRequest(PurchaseTransactionRequest purchaseTransactionRequest)
        {
            PaymentTransaction paymentTransaction = new PaymentTransaction();

            paymentTransaction.Action       = "1";
            paymentTransaction.Address      = "";
            paymentTransaction.Amount       = Convert.ToDecimal(purchaseTransactionRequest.CC_Amount);
            paymentTransaction.City         = purchaseTransactionRequest.bill_city;
            paymentTransaction.ClientIP     = purchaseTransactionRequest.ip_address;
            paymentTransaction.CountryCode  = purchaseTransactionRequest.bill_country;
            paymentTransaction.CurrencyCode = "ZAR";
            paymentTransaction.email        = purchaseTransactionRequest.EmailAddress;
            paymentTransaction.Member       = purchaseTransactionRequest.bill_last_name + ", " + purchaseTransactionRequest.bill_first_name;
            //paymentTransaction.MemberInGameID = purchaseTransactionRequest.MemberInGameID;
            paymentTransaction.MerchantIP = "";
            paymentTransaction.StateCode  = purchaseTransactionRequest.bill_state;
            paymentTransaction.TrackID    = purchaseTransactionRequest.Reference;
            paymentTransaction.TransactionRequestDateTime = purchaseTransactionRequest.transactionDateTime;
            paymentTransaction.Zip           = purchaseTransactionRequest.bill_zip;
            paymentTransaction.PaymentStatus = "UNPAID";

            db.PaymentTransactions.Add(paymentTransaction);

            try
            {
                db.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {
                foreach (var eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                      eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        System.Diagnostics.Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                                           ve.PropertyName, ve.ErrorMessage);
                    }
                }
            }
            purchaseTransactionRequest.paymentTransactionID = paymentTransaction.PaymentTransactionID;
            return(purchaseTransactionRequest);
        }
Пример #5
0
        public bool pay(PaymentsModel model, int membershipSubscriptionStatus, string username, string ipAddress, String custIp)
        {
            Member member = memberDao.findMember(username);
            double amount = subscriptionTypeDao.findAmount(membershipSubscriptionStatus) - Convert.ToDouble(member.MemberSubscriptionType.amount);
            SetcomPaymentTransactionManager PayMan = new SetcomPaymentTransactionManager();

            PurchaseTransactionRequest purchaseTransactionRequest = new PurchaseTransactionRequest();

            purchaseTransactionRequest.CCNumber            = model.CardNumber;
            purchaseTransactionRequest.CCCVV               = model.CVCNumber;
            purchaseTransactionRequest.ExYear              = (model.ExpiryDateY.Trim().Length > 2) ? model.ExpiryDateY : "20" + model.ExpiryDateY;
            purchaseTransactionRequest.ExMonth             = model.ExpiryDateM;
            purchaseTransactionRequest.CCName              = HttpUtility.UrlEncode(model.NameOnCard);
            purchaseTransactionRequest.MemberInGameID      = null;
            purchaseTransactionRequest.buyer_id            = "";
            purchaseTransactionRequest.bill_first_name     = HttpUtility.UrlEncode(member.FirstName);
            purchaseTransactionRequest.bill_last_name      = HttpUtility.UrlEncode(member.LastName);
            purchaseTransactionRequest.bill_street1        = "";
            purchaseTransactionRequest.bill_street2        = "";
            purchaseTransactionRequest.bill_city           = "";
            purchaseTransactionRequest.bill_state          = "";
            purchaseTransactionRequest.bill_country        = "";
            purchaseTransactionRequest.bill_zip            = "";
            purchaseTransactionRequest.EmailAddress        = HttpUtility.UrlEncode(member.EmailAddress);
            purchaseTransactionRequest.CC_Amount           = amount.ToString();
            purchaseTransactionRequest.ip_address          = custIp;
            purchaseTransactionRequest.transactionDateTime = DateTime.Now;

            PurchaseTransactionResponse ptRes = PayMan.PerformPaymentTransaction(purchaseTransactionRequest);

            if (ptRes.outcome.ToUpper() == "APPROVED")
            {
                member.MemberSubscriptionTypeID = membershipSubscriptionStatus;
                memberDao.save(member);
                this.sendUpgradeEmail(member.FirstName + ' ' + member.LastName, member.EmailAddress);
                return(true);
            }
            log.Info("PaymentService: error processing payment: " + ptRes.outcome + ", " + ptRes.responseIndicator);
            return(false);
        }
Пример #6
0
        private string BuildConsistentKey(PurchaseTransactionRequest purchaseTransactionRequest)
        {
            // Consistent Key - NB!! NEVER store/persist this field !!!

            /*  How to generate the Consistent Field:
             *  The consistent field to be sent in the Request is generated by hashing (using the SHA-512 algorithm using UTF-8 encoding) the concatenated fields in the order specified below:
             *  1. CO_ID
             *  2. OUTLET
             *  3. Reference
             *  4. CC_Amount
             *  5. CCName
             *  6. CCNumber
             *  7. ExYear
             *  8. ExMonth
             *  9. CCCVV
             *  10. Merchant Secret Key
             *  Process to follow to generate the Consistent field:
             *  1. Concatenate the above fields in the order specified.
             *  2. Apply a SHA512 hashing algorithm to the newly generated string. Remember to use UTF-8 encoding.
             *  3. Please ensure that the generated hash is always in uppercase. */
            StringBuilder consistentKey = new StringBuilder();

            consistentKey.Append(purchaseTransactionRequest.CO_ID);
            consistentKey.Append(purchaseTransactionRequest.OUTLET);
            consistentKey.Append(purchaseTransactionRequest.Reference);
            consistentKey.Append(purchaseTransactionRequest.CC_Amount);
            consistentKey.Append(purchaseTransactionRequest.CCName);
            consistentKey.Append(purchaseTransactionRequest.CCNumber);
            consistentKey.Append(purchaseTransactionRequest.ExYear);
            consistentKey.Append(purchaseTransactionRequest.ExMonth);
            consistentKey.Append(purchaseTransactionRequest.CCCVV);
            consistentKey.Append(MERCHANT_SECRET);

            string sha512HashedConsistentKey = Hashing.GetSHA512Hashed(consistentKey.ToString()).ToUpper();

            Console.WriteLine("The MD5 hash of " + consistentKey + " is: " + sha512HashedConsistentKey + ".");

            return(sha512HashedConsistentKey);
        }
Пример #7
0
        private bool VerifyAndPersistPaymentResponse(PurchaseTransactionRequest purchaseTransactionRequest, PurchaseTransactionResponse purchaseTransactionResponse)
        {
            PaymentTransaction paymentTransaction = db.PaymentTransactions.Where(x => x.TrackID == purchaseTransactionResponse.merchantReference).First();

            // Do validation on merchant reference.
            if (purchaseTransactionResponse.merchantReference == purchaseTransactionRequest.Reference)
            {
                paymentTransaction.Result       = purchaseTransactionResponse.outcome;
                paymentTransaction.ResponseCode = purchaseTransactionResponse.responseIndicator;
                paymentTransaction.AuthCode     = (purchaseTransactionResponse.outcome.ToUpper() == "APPROVED") ? purchaseTransactionResponse.responseIndicator : "";
                paymentTransaction.TranID       = purchaseTransactionResponse.transactionOrderID;
                paymentTransaction.TransactionResponseDateTime = DateTime.Now;
                if (purchaseTransactionResponse.outcome.ToUpper() == "APPROVED")
                {
                    paymentTransaction.PaymentStatus = "PAID";
                }
            }

            try
            {
                db.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {
                foreach (var eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                      eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        System.Diagnostics.Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                                           ve.PropertyName, ve.ErrorMessage);
                    }
                }
                return(false);
            }
            return(true);
        }
Пример #8
0
        public string Purchase(FormCollection form)
        {
            int        GameID = Convert.ToInt32((form["GameID"]));
            AspNetUser user   = db.AspNetUsers.Where(x => x.UserName == User.Identity.Name).First();
            Member     member = db.Members.Where(m => m.ASPUserId == user.Id).First();


            MemberInGame mib = db.MemberInGames.Where(c => c.MemberID == member.MemberID && c.GameID == GameID).First();

            trackingTransactionManager.PausePaymentTrackingTransaction(GameID, member.MemberID);

            //Address billingAddress = db.Addresses.Where(a => a.MemberID == member.MemberID && a.AddressType.ToLower() == "billing").First();
            pig = mib.Game.ProductInGames.FirstOrDefault();



            /* Setcom Purchase */
            SetcomPaymentTransactionManager PayMan = new SetcomPaymentTransactionManager();
            PurchaseTransactionRequest      purchaseTransactionRequest = new PurchaseTransactionRequest();

            purchaseTransactionRequest.CCNumber            = form["PaymentsModel.CardNumber"]; //"4444444444444444";
            purchaseTransactionRequest.CCCVV               = form["PaymentsModel.CVCNumber"];
            purchaseTransactionRequest.ExYear              = (form["PaymentsModel.ExpiryDateY"].ToString().Trim().Length > 2) ? form["PaymentsModel.ExpiryDateY"] : "20" + form["PaymentsModel.ExpiryDateY"];
            purchaseTransactionRequest.ExMonth             = form["PaymentsModel.ExpiryDateM"];
            purchaseTransactionRequest.CCName              = form["PaymentsModel.NameOnCard"];
            purchaseTransactionRequest.MemberInGameID      = mib.MemberInGameID;
            purchaseTransactionRequest.EmailAddress        = mib.Member.EmailAddress;
            purchaseTransactionRequest.CC_Amount           = pig.PriceInGame.ToString();
            purchaseTransactionRequest.ip_address          = Request.ServerVariables["REMOTE_ADDR"];
            purchaseTransactionRequest.transactionDateTime = DateTime.Now;

            /* Additional Non-mandatory fields */
            purchaseTransactionRequest.bill_first_name = mib.Member.FirstName;
            purchaseTransactionRequest.bill_last_name  = mib.Member.LastName;

            purchaseTransactionRequest.bill_street1 = "";
            purchaseTransactionRequest.bill_street2 = "";
            purchaseTransactionRequest.bill_city    = "";
            purchaseTransactionRequest.bill_state   = "";
            purchaseTransactionRequest.bill_country = mib.Member.Country.CountryName;;
            purchaseTransactionRequest.bill_zip     = "";
            purchaseTransactionRequest.bill_phone   = "";
            purchaseTransactionRequest.bill_title   = "";



            PurchaseTransactionResponse ptRes = PayMan.PerformPaymentTransaction(purchaseTransactionRequest);

            ptRes.outcome = ptRes.outcome.ToUpper();
            if (ptRes.outcome.ToUpper() != "APPROVED")
            // Setcom change ends here
            {
                trackingTransactionManager.ResumePaymentTrackingTransaction(GameID, member.MemberID);
                ptRes.timeRemaining = trackingTransactionManager.GetTimeRemaining(GameID, member.MemberID).ToString();
            }
            else
            {
                trackingTransactionManager.CompletePaymentTrackingTransaction(GameID, member.MemberID);
                //Update paymentIndicator
                mib.PaymentIndicator = true;
                try
                {
                    db.SaveChanges();
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                          eve.Entry.Entity.GetType().Name, eve.Entry.State);
                        foreach (var ve in eve.ValidationErrors)
                        {
                            System.Diagnostics.Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                                               ve.PropertyName, ve.ErrorMessage);
                        }
                    }
                }


                // get winner address
                Address deliveryAddress = db.Addresses.FirstOrDefault(x => x.MemberID == member.MemberID && x.AddressType.ToLower() == "postal");

                // get quantity won - divide quantity from pig by number of winners ??? really??? ok then.....
                Game qtyGame = db.Games.Find(GameID);

                int winQuantity = 1; //pig.Quantity / qtyGame.NumberOfWinners;
                // send winner email
                this.sendWinnermail(member.FirstName + ' ' + member.LastName, member.EmailAddress, deliveryAddress, winQuantity);
            }

            JsonResult json = new JsonResult
            {
                Data = ptRes
            };

            string son = new JavaScriptSerializer().Serialize(json.Data);

            return(son);
        }