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)); } }
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; } }