Example #1
0
        public async Task <ActionResult> Create([FromBody] CreatePaymentRequestModel requestModel)
        {
            if (!EnsureMerchantValidity(out var merchant))
            {
                return(BadRequest(new ErrorResponseModel("missing or invalid merchant header")));
            }

            var creditCardInformation = new CreditCardInformation(requestModel.CreditCardNumber,
                                                                  new ExpiryDate(requestModel.CreditCardExpiryMonth, requestModel.CreditCardExpiryYear),
                                                                  requestModel.CreditCardCcv);

            var paymentAmount = new PaymentAmount(requestModel.Amount, requestModel.CurrencyCode);
            var payment       = Payment.Create(paymentAmount, creditCardInformation, merchant.MerchantId, requestModel.ExternalShopperIdentifier);

            bool wasPaymentSuccessful = await payment.AttemptPayment(merchant.CreditCardInformation, _bankConnectorDS);

            _paymentRepository.Add(payment);
            await _paymentRepository.PersistAsync();

            _logger.LogInformation($"New payment was created with PaymentId: {payment.PaymentId}");

            var responseModel = new CreatePaymentResponseModel
            {
                WasPaymentSuccessful = wasPaymentSuccessful,
                PaymentId            = payment.PaymentId
            };

            return(Accepted(responseModel));
        }
Example #2
0
        public async Task <IActionResult> CreateAsync([FromBody] CreatePaymentRequestModel model)
        {
            try
            {
                IReadOnlyList <string> settlementAssets =
                    await _assetSettingsService.ResolveSettlementAsync(model.MerchantId);

                if (!settlementAssets.Contains(model.SettlementAssetId))
                {
                    return(BadRequest(new PaymentRequestErrorModel
                    {
                        Code = CreatePaymentRequestErrorType.SettlementAssetNotAvailable
                    }));
                }

                IReadOnlyList <string> paymentAssets =
                    await _assetSettingsService.ResolvePaymentAsync(model.MerchantId, model.SettlementAssetId);

                if (!paymentAssets.Contains(model.PaymentAssetId))
                {
                    return(BadRequest(new PaymentRequestErrorModel
                    {
                        Code = CreatePaymentRequestErrorType.PaymentAssetNotAvailable
                    }));
                }

                var paymentRequest = Mapper.Map <PaymentRequest>(model);

                IPaymentRequest createdPaymentRequest = await _paymentRequestService.CreateAsync(paymentRequest);

                return(Ok(Mapper.Map <PaymentRequestModel>(createdPaymentRequest)));
            }
            catch (AssetUnknownException e)
            {
                _log.Error(e, e.Message, e.Asset);

                return(BadRequest(new PaymentRequestErrorModel
                {
                    Code = CreatePaymentRequestErrorType.RequestValidationCommonError
                }));
            }
            catch (AssetNetworkNotDefinedException e)
            {
                _log.Error(e, e.Message, e.AssetId);

                return(BadRequest(new PaymentRequestErrorModel
                {
                    Code = CreatePaymentRequestErrorType.RequestValidationCommonError
                }));
            }
        }
 public IActionResult CreatePaymentRequest([FromBody] CreatePaymentRequestModel requestModel)
 {
     //Generate the instamojo payment request id, udate the instamojo log collection, return the redirect url
     try
     {
         var result = helper.CreatePaymentRequest(requestModel.username, requestModel.amount, requestModel.responseurl);
         if (result != null && !string.IsNullOrEmpty(result.AbsoluteUri))
         {
             return(Ok(result.AbsoluteUri));
         }
     }
     catch (Exception ex)
     {
         return(null);
     }
     return(null);
 }
Example #4
0
        public async Task <IActionResult> CreateAsync([FromBody] CreatePaymentRequestModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(new ErrorResponse().AddErrors(ModelState)));
            }

            try
            {
                IReadOnlyList <string> settlementAssets =
                    await _assetsAvailabilityService.ResolveSettlementAsync(model.MerchantId);

                if (!settlementAssets.Contains(model.SettlementAssetId))
                {
                    return(BadRequest(ErrorResponse.Create("Settlement asset is not available")));
                }

                IReadOnlyList <string> paymentAssets =
                    await _assetsAvailabilityService.ResolvePaymentAsync(model.MerchantId, model.SettlementAssetId);

                if (!paymentAssets.Contains(model.PaymentAssetId))
                {
                    return(BadRequest(ErrorResponse.Create("Payment asset is not available")));
                }

                var paymentRequest = Mapper.Map <PaymentRequest>(model);

                IPaymentRequest createdPaymentRequest = await _paymentRequestService.CreateAsync(paymentRequest);

                return(Ok(Mapper.Map <PaymentRequestModel>(createdPaymentRequest)));
            }
            catch (AssetUnknownException assetEx)
            {
                await _log.WriteErrorAsync(nameof(PaymentRequestsController), nameof(CreateAsync),
                                           new { assetEx.Asset }.ToJson(), assetEx);

                return(BadRequest(ErrorResponse.Create($"Asset {assetEx.Asset} can't be resolved")));
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(CreateAsync), model.ToJson(), ex);

                throw;
            }
        }
        [ProducesResponseType(typeof(CreatePaymentResponseModel), 200)] // OK
        public async Task <IActionResult> CreatePayment(CreatePaymentRequestModel request)
        {
            _logger.LogInformation($"CreatePayment:{request}");
            var response = await _paymentService.CreatePayment(_mapper.Map <Payment>(request));

            var referenceCode = Guid.NewGuid();

            if (response.ErrorCode == Consts.DUPLICATE_REQUEST_CODE)
            {
                _logger.LogError($"DUPLICATE_REQUEST. ReferenceCode:{referenceCode}");
                return(Conflict(new ErrorResponseModel
                {
                    ErrorCode = Consts.DUPLICATE_REQUEST_CODE,
                    Message = _errorMapper.GetMessage(response.ErrorCode, request.RequestId),
                    RequestId = request.RequestId,
                    ReferenceCode = referenceCode.ToString()
                }));
            }
            if (response.ErrorCode == Consts.MERCHANT_INVALID_CODE)
            {
                _logger.LogError($"MERCHANT_INVALID. ReferenceCode:{referenceCode}");
                return(BadRequest(new ErrorResponseModel
                {
                    ErrorCode = Consts.MERCHANT_INVALID_CODE,
                    Message = _errorMapper.GetMessage(response.ErrorCode, request.MerchantId.ToString()),
                    RequestId = request.RequestId,
                    ReferenceCode = referenceCode.ToString()
                }));
            }
            if (response.ErrorCode == Consts.MERCHANT_NOT_PRESENT_CODE)
            {
                _logger.LogError($"MERCHANT_NOT_PRESENT. ReferenceCode:{referenceCode}");
                return(NotFound(new ErrorResponseModel
                {
                    ErrorCode = Consts.MERCHANT_NOT_PRESENT_CODE,
                    Message = _errorMapper.GetMessage(response.ErrorCode, request.MerchantId.ToString()),
                    RequestId = request.RequestId,
                    ReferenceCode = referenceCode.ToString()
                }));
            }

            _logger.LogInformation($"CreatePayment OK");
            return(Ok(_mapper.Map <CreatePaymentResponseModel>(response)));
        }
        public async Task <CreatePaymentResponseModel> PostPaymentRequestAsync(CreatePaymentRequestModel requestModel)
        {
            var url           = string.Empty;
            var stringContent = new StringContent(JsonSerializer.Serialize(requestModel), Encoding.UTF8, UsedMediaType);
            var responseRaw   = await _httpClient.PostAsync(url, stringContent).ConfigureAwait(false);

            // Possible improvement: Optimize resiliency with retry behavior

            if (!responseRaw.IsSuccessStatusCode)
            {
                var errorMessage = await TryGetErrorMessage(responseRaw).ConfigureAwait(false);

                throw new PaymentGatewayRequestException(responseRaw.StatusCode, responseRaw.ReasonPhrase, errorMessage);
            }

            var responseJson = await responseRaw.Content.ReadAsStringAsync().ConfigureAwait(false);

            var response = JsonSerializer.Deserialize <CreatePaymentResponseModel>(responseJson);

            return(response);
        }
Example #7
0
 public Task <PaymentRequestModel> CreatePaymentRequestAsync(CreatePaymentRequestModel model)
 {
     return(_runner.RunAsync(() => _paymentRequestsApi.CreateAsync(model), ExceptionFactories.CreatePaymentRequestException));
 }
Example #8
0
 public Task <PaymentRequestModel> CreatePaymentRequestAsync(CreatePaymentRequestModel model)
 {
     return(_runner.RunWithDefaultErrorHandlingAsync(() => _paymentRequestsApi.CreateAsync(model)));
 }