Exemple #1
0
        public async Task <Result <CreditCardVoidResult> > Void(CreditCardVoidMoneyRequest request,
                                                                CreditCardPaymentInfo paymentInfo,
                                                                string maskedNumber,
                                                                MoneyAmount moneyAmount,
                                                                string referenceCode,
                                                                UserInfo user,
                                                                int agentId)
        {
            return(await VoidInPayfort()
                   .Tap(WriteAuditLog));

            Task <Result <CreditCardVoidResult> > VoidInPayfort() => _payfortService.Void(request);

            Task WriteAuditLog(CreditCardVoidResult voidResult)
            {
                var eventData = new CreditCardLogEventData($"Void money for the payment '{referenceCode}'",
                                                           voidResult.ExternalCode,
                                                           voidResult.Message,
                                                           paymentInfo.InternalReferenceCode);

                return(_creditCardAuditService.Write(CreditCardEventType.Void,
                                                     maskedNumber,
                                                     moneyAmount.Amount,
                                                     user,
                                                     eventData,
                                                     referenceCode,
                                                     agentId,
                                                     moneyAmount.Currency));
            }
        }
Exemple #2
0
        public async Task <Result <CreditCardVoidResult> > Void(CreditCardVoidMoneyRequest 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 <CreditCardVoidResult>(ex.Message));
            }


            HttpContent GetSignedContent()
            {
                var paymentRequest = new PayfortVoidRequest(
                    signature: string.Empty,
                    accessCode: _options.AccessCode,
                    merchantIdentifier: _options.Identifier,
                    merchantReference: moneyRequest.MerchantReference,
                    language: moneyRequest.LanguageCode,
                    fortId: moneyRequest.ExternalId
                    );

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

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

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

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


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


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

                bool IsSuccess(PayfortVoidResponse captureResponse) => captureResponse.ResponseCode == PayfortConstants.VoidSuccessResponseCode;
            }
        }