Exemple #1
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure <AuthorizationOptions>(options =>
            {
                options.AddPolicy("SendOrder", policy => policy.RequireClaim("Action", "SendOrder"));
            });

            services.AddTransient <IUserDao, UserDao>();
            services.AddTransient <IUser, User>();
            services.AddTransient <IOrderDao, OrderDao>();

            var signingConfigurations = new SigningConfigurations();

            services.AddSingleton(signingConfigurations);

            var tokenConfigurations = new TokenConfigurations();

            new ConfigureFromConfigurationOptions <TokenConfigurations>(
                Configuration.GetSection("TokenConfigurations"))
            .Configure(tokenConfigurations);
            services.AddSingleton(tokenConfigurations);

            var antiFraudConfigurations = new AntiFraudConfigurations();

            new ConfigureFromConfigurationOptions <AntiFraudConfigurations>(
                Configuration.GetSection("AntiFraudConfigurations"))
            .Configure(antiFraudConfigurations);

            services.AddSingleton(antiFraudConfigurations);

            var gatewayCieloConfigurations = new GatewayCieloConfigurations();

            new ConfigureFromConfigurationOptions <GatewayCieloConfigurations>(
                Configuration.GetSection("GatewayCieloConfigurations"))
            .Configure(gatewayCieloConfigurations);

            services.AddSingleton(gatewayCieloConfigurations);

            services.AddAuthentication(authOptions =>
            {
                authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                authOptions.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearerOptions =>
            {
                var paramsValidation = bearerOptions.TokenValidationParameters;
                paramsValidation.IssuerSigningKey = signingConfigurations.Key;
                paramsValidation.ValidAudience    = tokenConfigurations.Audience;
                paramsValidation.ValidIssuer      = tokenConfigurations.Issuer;

                // Valida a assinatura de um token recebido
                paramsValidation.ValidateIssuerSigningKey = true;

                // Verifica se um token recebido ainda é válido
                paramsValidation.ValidateLifetime = true;

                // Tempo de tolerância para a expiração de um token (utilizado
                // caso haja problemas de sincronismo de horário entre diferentes
                // computadores envolvidos no processo de comunicação)
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });

            // Ativa o uso do token como forma de autorizar o acesso
            // a recursos deste projeto
            services.AddAuthorization(auth =>
            {
                auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                               .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                               .RequireAuthenticatedUser().Build());
            });

            services.AddMvc();
            services.AddDistributedMemoryCache();
            services.AddSession();
        }
Exemple #2
0
        public async Task <IActionResult> Send([FromBody] Order order,
                                               [FromServices] AntiFraudConfigurations antiFraudConfigurations,
                                               [FromServices] GatewayCieloConfigurations gatewayCieloConfigurations)
        {
            var user = JsonConvert.DeserializeObject <User>(HttpContext.Session.GetString("User").ToString());
            var urlAntiFraudApiLogin = antiFraudConfigurations.Url + (antiFraudConfigurations.Port != string.Empty ? ":" + antiFraudConfigurations.Port : "") + antiFraudConfigurations.LoginApi;
            var urlAntiFraudApiOrder = antiFraudConfigurations.Url + (antiFraudConfigurations.Port != string.Empty ? ":" + antiFraudConfigurations.Port : "") + antiFraudConfigurations.OrderApi;

            eAntiFraudSatus statusAntiFraud = eAntiFraudSatus.NotRequired;

            if (user.HasAntiFraud)
            {
                var objJson = JsonConvert.SerializeObject(new {
                    Login = new {
                        ApiKey       = user.AntiFraudApiKey,
                        ClientID     = user.AntiFraudClientID,
                        ClientSecret = user.AntiFraudClientSecret
                    }
                });

                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    HttpResponseMessage response = await client.PostAsync(urlAntiFraudApiLogin, new StringContent(objJson, Encoding.UTF8, "application/json"));

                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        response.EnsureSuccessStatusCode();
                        string responseBody = await response.Content.ReadAsStringAsync();

                        var obj = JsonConvert.DeserializeObject <AntiFraudAuthToken>(responseBody);

                        var objJsonOrder = JsonConvert.SerializeObject(new
                        {
                            ApiKey     = user.AntiFraudApiKey,
                            LoginToken = obj.Token.value,
                            Order      = order
                        });

                        HttpResponseMessage responseOrder = await client.PostAsync(urlAntiFraudApiOrder, new StringContent(objJsonOrder, Encoding.UTF8, "application/json"));

                        if (responseOrder.StatusCode == HttpStatusCode.OK)
                        {
                            responseOrder.EnsureSuccessStatusCode();
                            string responseBodyOrder = await responseOrder.Content.ReadAsStringAsync();

                            var objCheckFraud = JsonConvert.DeserializeObject <ResponseSend>(responseBodyOrder);

                            if (objCheckFraud.Orders.Status != "APA")
                            {
                                return(BadRequest(new
                                {
                                    message = "Fluxo de pagamento deverá ser interrompido - Codigo:" + objCheckFraud.Orders.Status,
                                    status = "fail",
                                    StatusCode = HttpStatusCode.BadGateway
                                }));
                            }
                            else
                            {
                                statusAntiFraud = eAntiFraudSatus.Valid;
                            }
                        }
                        else
                        {
                            return(BadRequest(new
                            {
                                message = "Erro na requisição",
                                status = "fail",
                                StatusCode = HttpStatusCode.BadGateway
                            }));
                        }
                    }
                    else
                    {
                        return(BadRequest(new
                        {
                            message = "Registro não realizado.",
                            status = "fail",
                            StatusCode = HttpStatusCode.BadGateway
                        }));
                    }
                }
            }

            bool result = false;

            GatewayCielo objPay = null;

            if (statusAntiFraud == eAntiFraudSatus.NotRequired || statusAntiFraud == eAntiFraudSatus.Valid)
            {
                order.User = user;
                order.IdentificationCode = Guid.NewGuid().ToString();
                result = _orderDao.Save(order);

                if (result)
                {
                    var urlGateWayCielo = gatewayCieloConfigurations.Url + gatewayCieloConfigurations.SalesApi;

                    for (int i = 0; i < order.Payment.Length; i++)
                    {
                        var objJSonCielo = JsonConvert.SerializeObject(new
                        {
                            MerchantOrderId = order.IdentificationCode,
                            Customer        = new
                            {
                                Name = order.BillingData.Name
                            },
                            Payment = new
                            {
                                Type           = "CreditCard",
                                Amount         = order.Payment[i].Amount,
                                Installments   = order.Payment[i].QtyInstallments,
                                SoftDescriptor = user.Name,
                                CreditCard     = new
                                {
                                    CardNumber     = order.Payment[i].CardNumber,
                                    Holder         = order.Payment[i].CardHolderName,
                                    ExpirationDate = order.Payment[i].CardExpirationDate,
                                    SecurityCode   = order.Payment[i].SecurityCode,
                                    Brand          = DefineCardBrandCielo(order.Payment[i].CardType)
                                }
                            }
                        });

                        using (var clientCielo = new HttpClient())
                        {
                            clientCielo.DefaultRequestHeaders.Accept.Clear();
                            clientCielo.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                            clientCielo.DefaultRequestHeaders.Add("MerchantId", gatewayCieloConfigurations.MerchantId);
                            clientCielo.DefaultRequestHeaders.Add("MerchantKey", gatewayCieloConfigurations.MerchantKey);
                            clientCielo.DefaultRequestHeaders.Add("RequestId", "");

                            HttpResponseMessage response = await clientCielo.PostAsync(urlGateWayCielo, new StringContent(objJSonCielo, Encoding.UTF8, "application/json"));

                            if (response.StatusCode == HttpStatusCode.Created)
                            {
                                response.EnsureSuccessStatusCode();
                                string responseBody = await response.Content.ReadAsStringAsync();

                                objPay = JsonConvert.DeserializeObject <GatewayCielo>(responseBody);
                            }
                            else
                            {
                                BadRequest(new
                                {
                                    message    = "Pagamento não registrado.",
                                    status     = "fail",
                                    StatusCode = HttpStatusCode.NotAcceptable
                                });
                            }
                        }
                    }
                }
            }
            else
            {
                BadRequest(new
                {
                    message    = "Registro não realizado - Falha Anti Fraude.",
                    status     = "fail",
                    StatusCode = HttpStatusCode.NotAcceptable
                });
            }

            if (result)
            {
                return(Ok(new
                {
                    message = "Registrado com sucesso",
                    status = "success",
                    orderId = order.IdentificationCode,
                    Payment = objPay
                }));
            }
            else
            {
                return(BadRequest(new
                {
                    message = "Registro não realizado.",
                    status = "fail",
                    StatusCode = HttpStatusCode.NotAcceptable
                }));
            }
        }