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