예제 #1
0
 public async Task <IActionResult> CreateOrder(CreateOrderRequestDto createOrderRequestDto)
 {
     return(Ok(await _mediator.Send(new CreateOrderCommand
     {
         CreateOrderRequestDto = createOrderRequestDto
     })));
 }
        public async Task <CreateOrderResponseDto> CreateOrderAsync(CreateOrderRequestDto order)
        {
            var uri = _baseUri + "/mpmobile/instore/qr/" + _userId + "/" + order.ExternalId + "?access_token=" + _accessToken;

            using (var client = new HttpClient())
            {
                HttpContent content = new StringContent(System.Text.Json.JsonSerializer.Serialize(order), Encoding.UTF8, "application/json");
                content.Headers.Add("X-Ttl-Store-Preference", _orderTimeoutSeconds.ToString());
                HttpResponseMessage response = await client.PostAsync(uri, content);

                var responseText = await response.Content.ReadAsStringAsync();

                var responseDto = JsonSerializer.Deserialize <CreateOrderResponseDto>(responseText);
                responseDto.Success    = response.IsSuccessStatusCode;
                responseDto.Status     = (int)response.StatusCode;
                responseDto.Content    = responseText;
                responseDto.RequestUri = response.RequestMessage.RequestUri.OriginalString;

                return(responseDto);
            }
        }
예제 #3
0
        public LhiActionResult <CreateOrderResponseDto> CreateOrder([FromBody] CreateOrderRequestDto orderRequest)
        {
            var transactionId      = Guid.NewGuid().ToString();
            var contractId         = Guid.NewGuid().ToString();
            var createOrderCommand = new CreateOrderCommand
            {
                TransactionId = transactionId,
                ContractId    = contractId
            };

            try
            {
                _endpoint.Send(createOrderCommand);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not send CreateOrderCommand to NServiceBus");
            }


            // log info
            var format  = "{Application}.{Service}.{Operation}-{TransactionId}: {LogMessage}";
            var message = $"Step 0: CreateOrderCommand was sent with TransactionId {transactionId}";

            //_logger.LogInformation(message, transactionId);
            _logger.LogInformation(format, "Lhi.NsbDemo.Orders", "Api", "OrderController-CreateOrder", transactionId, message);

            // instrumentation
            _promCounter.Labels(Environment.MachineName, "received").Inc();

            LhiActionResult <CreateOrderResponseDto> responseMessage = new LhiActionResult <CreateOrderResponseDto>(
                new CreateOrderResponseDto
            {
                //TrackingId = createOrderCommand.TransactionId
            });

            responseMessage.CustomResponseHeaders.Add("TrackingId", createOrderCommand.TransactionId);

            return(responseMessage);
        }
        public async Task <TransactionResponse> ProcessTransactionAsync(TransactionRequest transaction)
        {
            if (transaction == null)
            {
                throw (new ArgumentNullException("transDef"));
            }

            if (!IsValidTransaction(transaction, out var errorList))
            {
                return(new TransactionResponse(TransactionResponse.ResultCodesEnum.InvalidParametersError, errorList));
            }

            var request = new CreateOrderRequestDto(transaction);

            var apiClient = await InitApiClient(transaction.MerchantId);

            if (apiClient is null)
            {
                return(new TransactionResponse(BaseResponse.ResultCodesEnum.NotReady, _errorList));
            }

            CreateOrderResponseDto createResponse;

            try
            {
                createResponse = await apiClient.CreateOrderAsync(request);
            }
            catch (HttpRequestException e)
            {
                return(new TransactionResponse(TransactionResponse.ResultCodesEnum.CommunicationsError, "Error de comunicación con el host de MercardoPago: " + e.Message));
            }


            if (!createResponse.Success)
            {
                if (createResponse.Status == 500)
                {
                    return(new TransactionResponse(TransactionResponse.ResultCodesEnum.InternalProcessorError, "Error interno de MercadoPago durante CreatePayment: " + createResponse.ErrorMessage));
                }
                else
                {
                    return(new TransactionResponse(TransactionResponse.ResultCodesEnum.ProcessorError, "Error creando la orden: " + createResponse.ErrorMessage));
                }
            }

            var timer = new Stopwatch();
            SearchPaymentsResponseDto searchResponse = null;

            timer.Start();

            while (timer.Elapsed < TimeSpan.FromSeconds(_orderTimeoutSeconds + 5))
            {
                try
                {
                    searchResponse = await apiClient.SearchPaymentAsync(transaction.TransactionReference);
                }
                catch (HttpRequestException e)
                {
                    return(new TransactionResponse(TransactionResponse.ResultCodesEnum.CommunicationsError, "Error de comunicación con el host de MercardoPago durante SearchPayment: " + e.Message));
                }

                if (!searchResponse.Success)
                {
                    if (searchResponse.Status == 500)
                    {
                        return(new TransactionResponse(TransactionResponse.ResultCodesEnum.InternalProcessorError, "Error interno de MercadoPago durante SearchPayment: " + createResponse.ErrorMessage));
                    }
                    else
                    {
                        return(new TransactionResponse(TransactionResponse.ResultCodesEnum.ProcessorError, "Error buscando la orden: " + searchResponse.ErrorMessage));
                    }
                }

                foreach (var payment in searchResponse.Payments)
                {
                    if (payment.Payment_Status == "approved")
                    {
                        return(new TransactionResponse(TransactionResponse.ResultCodesEnum.Approved)
                        {
                            ResultDescription = "Transaccion Aprobada (" + payment.Payment_Status_Detail + ")",
                            TotalPaid = payment.TotalPaidAmount,
                            NetReceived = payment.NetReceivedAmount,
                            AuthCode = payment.AuthCode,
                            PaymentType = payment.PaymentType switch
                            {
                                "account_money" => PaymentType.AccountMoney,
                                "credit_card" => PaymentType.CreditCard,
                                "debit_card" => PaymentType.DebitCard,
                                "bank_transfer" => PaymentType.BankTransfer,
                                "atm" => PaymentType.Atm,
                                "ticket" => PaymentType.Ticket,
                                "prepaid_card" => PaymentType.PrepaidCard,
                                _ => throw new NotImplementedException()
                            }