示例#1
0
        /// <summary>
        /// Creates an order based on a store's transaction and items being purchased.
        /// </summary>
        /// <param name="store">Store requesting the transaction</param>
        /// <param name="items">Items being purchased</param>
        /// <param name="transaction">Transaction being requested</param>
        /// <param name="currency">Base currency for the transaction</param>
        public Order(Store store, IEnumerable <Item> items, Operators.Transaction transaction, string orderId, string currency = "BRL")
        {
            var card    = transaction.CreditCard;
            var payment = new Payment(transaction);

            ID       = orderId;
            Date     = DateTime.Today;
            Email    = card.Holder.Email;
            IP       = store.IpAddress;
            Currency = currency;

            Items    = items;
            Payments = new List <Payment>()
            {
                payment
            };
            BillingData  = card.Holder;
            ShippingData = store.Owner;

            // Optional
            TotalShipping = 0;
            Obs           = string.Empty;
            Status        = "N";
            Reanalysis    = false;
            CustomFields  = new List <CustomFields>();
        }
        public void successfullyCreatesOperatorRequest()
        {
            // Setup
            var transaction = new Operators.Transaction(Test.Amount, Test.Card, Test.Installments);
            var request     = new Operators.Request(transaction, Test.OrderId);

            // Assertions
            Assert.Equal("Carlos", request.Customer.Name);
            Assert.Equal(Test.OrderId, request.OrderId);
            Assert.Equal(400, request.Transaction.AmountInCents);
            Assert.Equal(Test.Installments, request.Transaction.InstallmentCount);
        }
示例#3
0
        public void poorCustomerIsDenied()
        {
            var poorCard = PersonRepository.GetCard("963258");
            var transaction = new Operators.Transaction(Test.Amount, poorCard, Test.Installments);
            var order = new AntiFraud.Order(Test.Store, Test.Items, transaction, Test.OrderId);

            // Operator step
            var request = new Operators.Request(transaction, Test.OrderId);
            var response = RequestManager.MakeCieloRequest(request);

            Assert.Equal(3, response.Status);
            Assert.Equal("4", response.ReturnCode);
        }
示例#4
0
        /// <summary>
        /// Creates a Payment object based on an operator's transaction.
        /// </summary>
        public Payment(Operators.Transaction transaction, int type = 1)
        {
            var card = transaction.CreditCard;

            Date   = DateTime.Today;                    // Credit card transactions are live
            Amount = transaction.AmountInCents * 100;   // The AntiFraud.Payment amount is on currency units
            Type   = type;                              // Only credit card transactions

            // Card info
            CardType           = (int)card.CreditCardBrand;
            CardNumber         = card.CreditCardNumber;
            CardHolderName     = card.Holder.Name;
            CardExpirationDate = card.ExpirationAsString;
        }
示例#5
0
        public void fraudulentCustomerIsDenied()
        {
            var fraudulentCard = PersonRepository.GetCard("987654");
            var transaction = new Operators.Transaction(Test.Amount, fraudulentCard, Test.Installments);
            var order = new AntiFraud.Order(Test.Store, Test.Items, transaction, Test.OrderId);

            // Antifraud step
            var orders = new List<AntiFraud.Order>() { order };
            var request = new AntiFraud.Request(Test.Store.AntiFraudInfo.ApiKey, Test.Store.AntiFraudInfo.LoginToken, orders, "BRA");
            var jsonRequest = JsonConvert.SerializeObject(request);
            var response = ApiResponseMock.MockClearSaleResponse(orders, jsonRequest);
            var allValid = response.All(r => r.AllValid);

            Assert.False(allValid);
        }
示例#6
0
 /// <summary>
 /// Processes the anti-fraud step if necessary.
 /// </summary>
 /// <returns>
 /// True if the sale is authorized by the anti-fraud system or if the store doesnt use the system.
 /// </returns>
 private bool evaluateAntiFraud(IEnumerable <AntiFraud.Item> items, Operators.Transaction transaction, string orderId)
 {
     if (Store.UseAntiFraud)
     {
         var order  = new AntiFraud.Order(Store, items, transaction, orderId);
         var orders = new List <AntiFraud.Order>()
         {
             order
         };
         var request = new AntiFraud.Request(Store.AntiFraudInfo.ApiKey, Store.AntiFraudInfo.LoginToken, orders, "BRA");
         return(RequestManager.MakeAntiFraudRequest(request));
     }
     else
     {
         return(true);
     }
 }
        public void successfullyCreatesAntiFraudRequest()
        {
            // Setup
            var transaction = new Operators.Transaction(Test.Amount, Test.Card, Test.Installments);
            var order       = new AntiFraud.Order(Test.Store, Test.Items, transaction, Test.OrderId);

            var orders = new List <AntiFraud.Order>()
            {
                order
            };
            var request = new AntiFraud.Request(Test.Store.AntiFraudInfo.ApiKey, Test.Store.AntiFraudInfo.LoginToken, orders, "BRA");

            // Assertions
            Assert.Equal("Carlos Key", request.ApiKey);
            Assert.Equal("Carlos Token", request.LoginToken);
            Assert.NotNull(request.Orders.First().ShippingData);
            Assert.NotNull(request.Orders.First().BillingData);
        }
示例#8
0
        /// <summary>
        /// Makes a sale request.
        /// </summary>
        /// <param name="items">Items to be sold</param>
        /// <param name="installments">Number of installments</param>
        /// <param name="card">Customer credit card</param>
        /// <param name="operatorIndex">Index of the operator</param>
        public void MakeRequest(IEnumerable <AntiFraud.Item> items, int installments, Operators.CreditCard card, int operatorIndex)
        {
            if (operatorIndex > Store.Operators.Count() - 1)
            {
                throw new InvalidOperationException("Invalid operator!");
            }

            // Creates the transaction
            var amount      = items.Sum(i => i.ItemValue * i.Qty);
            var transaction = new Operators.Transaction(amount, card, installments);
            var orderId     = Guid.NewGuid().ToString();

            // Check AntiFraud
            if (evaluateAntiFraud(items, transaction, orderId))
            {
                // Makes request to the operator
                var request = new Operators.Request(transaction, orderId);
                Operators.Response response;

                var op = Store.Operators.ElementAt(operatorIndex);
                switch (op.Brand)
                {
                case OperatorBrandEnum.Cielo:
                    response = RequestManager.MakeCieloRequest(request);
                    break;

                case OperatorBrandEnum.Stone:
                    response = RequestManager.MakeStoneRequest(request, Store.MerchantId);
                    break;

                default:
                    throw new NotImplementedException("Unknown operator!");
                }

                handleOperatorResponse(response);
            }
            else
            {
                transaction.Authorized = false;
                transaction.Message    = "Transaction denied by the anti-fraud system.";
                StoreRepository.SaveTransaction(transaction);
            }
        }
示例#9
0
        public void validRequestIsAuthorized()
        {
            var transaction = new Operators.Transaction(Test.Amount, Test.Card, Test.Installments);
            var order = new AntiFraud.Order(Test.Store, Test.Items, transaction, Test.OrderId);

            // Antifraud step
            var orders = new List<AntiFraud.Order>() { order };
            var req1 = new AntiFraud.Request(Test.Store.AntiFraudInfo.ApiKey, Test.Store.AntiFraudInfo.LoginToken, orders, "BRA");
            var jsonRequest = JsonConvert.SerializeObject(req1);
            var responseAF = ApiResponseMock.MockClearSaleResponse(orders, jsonRequest);
            var allValid = responseAF.All(r => r.AllValid);

            // Operator step
            var req2 = new Operators.Request(transaction, Test.OrderId);
            var responseOP = RequestManager.MakeCieloRequest(req2);

            // Assertions
            Assert.True(allValid);
            Assert.Equal(1, responseOP.Status);
            Assert.Equal("0", responseOP.ReturnCode);
        }