Ejemplo n.º 1
0
        public async Task <Result <CreditCardCaptureResult> > Capture(CreditCardCaptureMoneyRequest request,
                                                                      CreditCardPaymentInfo paymentInfo,
                                                                      string maskedNumber,
                                                                      Currencies currency,
                                                                      UserInfo user,
                                                                      int agentId)
        {
            return(await CaptureInPayfort()
                   .Tap(WriteAuditLog));

            Task <Result <CreditCardCaptureResult> > CaptureInPayfort() => _payfortService.Capture(request);

            Task WriteAuditLog(CreditCardCaptureResult captureResult)
            {
                var eventData = new CreditCardLogEventData($"Capture money for the payment '{request.MerchantReference}'",
                                                           captureResult.ExternalCode,
                                                           captureResult.Message,
                                                           paymentInfo.InternalReferenceCode);

                return(_creditCardAuditService.Write(CreditCardEventType.Capture,
                                                     maskedNumber,
                                                     request.Amount,
                                                     user,
                                                     eventData,
                                                     request.MerchantReference,
                                                     agentId,
                                                     currency));
            }
        }
Ejemplo n.º 2
0
        public async Task <Result <CreditCardCaptureResult> > Capture(CreditCardCaptureMoneyRequest request,
                                                                      CreditCardPaymentInfo paymentInfo,
                                                                      PaymentProcessors paymentProcessor,
                                                                      string maskedNumber,
                                                                      Currencies currency,
                                                                      ApiCaller apiCaller,
                                                                      int agentId)
        {
            return(await Capture()
                   .Tap(WriteAuditLog));

            Task <Result <CreditCardCaptureResult> > Capture()
            {
                return(paymentProcessor switch
                {
                    PaymentProcessors.Payfort => _payfortService.Capture(request),
                    PaymentProcessors.NGenius => _nGeniusPaymentService.Capture(paymentInfo.ExternalId, paymentInfo.InternalReferenceCode, request.Amount.ToMoneyAmount(request.Currency)),
                    _ => throw new NotSupportedException($"Payment processor `{nameof(paymentProcessor)}` not supported")
                });
Ejemplo n.º 3
0
        public async Task <Result <CreditCardCaptureResult> > Capture(CreditCardCaptureMoneyRequest moneyRequest)
        {
            try
            {
                var requestContent = GetSignedContent();
                var client         = _clientFactory.CreateClient(HttpClientNames.Payfort);
                using (var response = await client.PostAsync(_options.PaymentUrl, requestContent))
                {
                    return(await GetContent(response)
                           .Bind(Parse)
                           .Bind(CheckResponseSignature)
                           .Bind(CreateResult));
                }
            }
            catch (Exception ex)
            {
                _logger.LogPayfortClientException(ex);
                return(Result.Failure <CreditCardCaptureResult>(ex.Message));
            }


            HttpContent GetSignedContent()
            {
                var paymentRequest = new PayfortCaptureRequest(
                    signature: string.Empty,
                    accessCode: _options.AccessCode,
                    merchantIdentifier: _options.Identifier,
                    merchantReference: moneyRequest.MerchantReference,
                    amount: ToPayfortAmount(moneyRequest.Amount, moneyRequest.Currency),
                    currency: moneyRequest.Currency.ToString(),
                    language: moneyRequest.LanguageCode,
                    fortId: moneyRequest.ExternalId
                    );

                var jObject = JObject.FromObject(paymentRequest, PayfortSerializationSettings.Serializer);

                var(_, _, signature, _) = _signatureService.Calculate(jObject, SignatureTypes.Request);
                paymentRequest          = new PayfortCaptureRequest(paymentRequest, signature);
                var json = JsonConvert.SerializeObject(paymentRequest, PayfortSerializationSettings.SerializerSettings);

                return(new StringContent(json, Encoding.UTF8, "application/json"));
            }

            Result <(PayfortCaptureResponse model, JObject response)> Parse(string content)
            => GetJObject(content)
            .Bind(response => _payfortResponseParser.Parse <PayfortCaptureResponse>(response)
                  .Map(model => (model, response))
                  );


            Result <PayfortCaptureResponse> CheckResponseSignature((PayfortCaptureResponse model, JObject response) data)
            => _signatureService.Check(data.response, data.model);


            Result <CreditCardCaptureResult> CreateResult(PayfortCaptureResponse model)
            {
                return(IsSuccess(model)
                    ? Result.Success(new CreditCardCaptureResult(
                                         model.FortId,
                                         $"{model.ResponseCode}: {model.ResponseMessage}",
                                         model.MerchantReference))
                    : Result.Failure <CreditCardCaptureResult>($"Unable capture payment for the booking '{moneyRequest.MerchantReference}': '{model.ResponseMessage}'"));

                bool IsSuccess(PayfortCaptureResponse captureResponse) => captureResponse.ResponseCode == PayfortConstants.CaptureSuccessResponseCode;
            }
        }