/// <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); }
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); }
/// <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; }
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); }
/// <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); }
/// <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); } }
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); }