public async Task <Result <CreditCardRefundResult> > Refund(CreditCardRefundMoneyRequest request,
                                                                    CreditCardPaymentInfo paymentInfo,
                                                                    string maskedNumber,
                                                                    string referenceCode,
                                                                    UserInfo user,
                                                                    int agentId)
        {
            return(await RefundInPayfort()
                   .Tap(WriteAuditLog));

            async Task <Result <CreditCardRefundResult> > RefundInPayfort() =>
            request.Amount.IsGreaterThan(0m)
                    ? await _payfortService.Refund(request)
                    : new CreditCardRefundResult(default, default, request.MerchantReference);
Exemple #2
0
        public async Task <Result <CreditCardRefundResult> > Refund(CreditCardRefundMoneyRequest request,
                                                                    CreditCardPaymentInfo paymentInfo,
                                                                    PaymentProcessors paymentProcessor,
                                                                    string maskedNumber,
                                                                    string referenceCode,
                                                                    int paymentId,
                                                                    ApiCaller apiCaller,
                                                                    int agentId)
        {
            return(await RefundInPayfort()
                   .Tap(WriteAuditLog));

            async Task <Result <CreditCardRefundResult> > RefundInPayfort()
            {
                return(request.Amount.IsGreaterThan(0m)
                    ? paymentProcessor == PaymentProcessors.Payfort
                        ? await _payfortService.Refund(request)
                        : await _nGeniusRefundService.Refund(paymentId, request.Amount.ToMoneyAmount(request.Currency), paymentInfo.ExternalId, request.MerchantReference)
                    : new CreditCardRefundResult(default, default, request.MerchantReference));
Exemple #3
0
        public async Task <Result <CreditCardRefundResult> > Refund(CreditCardRefundMoneyRequest 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 <CreditCardRefundResult>(ex.Message));
            }


            HttpContent GetSignedContent()
            {
                var paymentRequest = new PayfortRefundRequest(
                    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 PayfortRefundRequest(paymentRequest, signature);
                var json = JsonConvert.SerializeObject(paymentRequest, PayfortSerializationSettings.SerializerSettings);

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

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


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


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

                bool IsSuccess(PayfortRefundResponse refundResponse) => refundResponse.ResponseCode == PayfortConstants.RefundSuccessResponseCode;
            }
        }