Inheritance: ITransactionProcessResult, ITransactionCaptureResult, ITransactionPostProcessResult, ITransactionRefundResult, ITransactionVoidResult
        public ITransactionCaptureResult Capture(ITransactionCaptureRequest request)
        {
            //to capture a transaction, we'll need authorization id previously obtained from paypal
            var authorizationId = request.GetParameterAs<string>(PaymentParameterNames.AuthorizationId);

            var paypalCurrency = PayPalHelper.GetPaypalCurrency(request.CurrencyIsoCode);

            //create a capture request for paypal
            var doCaptureRequest = new DoCaptureReq() {
                DoCaptureRequest = new DoCaptureRequestType() {
                    Version = ApiVersion,
                    AuthorizationID = authorizationId,
                    Amount = new BasicAmountType() {
                        value = Math.Round(request.Amount, 2).ToString("N", new CultureInfo("en-us")),
                        currencyID = paypalCurrency
                    },
                    CompleteType = CompleteCodeType.COMPLETE
                }
            };

            //get the service for paypal api
            var service = GetPayPalApiInterfaceServiceService();
            var paypalResponse = service.DoCapture(doCaptureRequest);

            var result = new TransactionResult();

            string error;
            var success = PayPalHelper.ParseResponseSuccess(paypalResponse, out error);
            if (success)
            {
                result.Success = true;
                result.SetParameter(PaymentParameterNames.CaptureId, paypalResponse.DoCaptureResponseDetails.PaymentInfo.TransactionID);
                result.SetParameter(PaymentParameterNames.CaptureResult, paypalResponse.Ack);
            }
            else
            {
                result.SetParameter(PaymentParameterNames.ErrorMessage, error);
            }

            return result;
        }
        public ITransactionRefundResult Refund(ITransactionRefundRequest request)
        {
            //to refund a transaction, we'll need capture id previously obtained from paypal
            var captureId = request.GetParameterAs<string>(PaymentParameterNames.CaptureId);

            var paypalCurrency = PayPalHelper.GetPaypalCurrency(request.CurrencyIsoCode);

            //create a capture request for paypal
            var doRefundRequest = new RefundTransactionReq() {
                RefundTransactionRequest = new RefundTransactionRequestType() {
                    Version = ApiVersion,
                    TransactionID = captureId,
                    Amount = new BasicAmountType() {
                        value = Math.Round(request.Amount, 2).ToString("N", new CultureInfo("en-us")),
                        currencyID = paypalCurrency
                    },
                    RefundType = request.IsPartialRefund ? RefundType.PARTIAL : RefundType.FULL
                }
            };

            //get the service for paypal api
            var service = GetPayPalApiInterfaceServiceService();
            var paypalResponse = service.RefundTransaction(doRefundRequest);

            var result = new TransactionResult();

            string error;
            var success = PayPalHelper.ParseResponseSuccess(paypalResponse, out error);
            if (success)
            {
                result.Success = true;
                result.SetParameter(PaymentParameterNames.RefundId, paypalResponse.RefundTransactionID);
                result.SetParameter(PaymentParameterNames.RefundResult, paypalResponse.Ack);
            }
            else
            {
                result.SetParameter(PaymentParameterNames.ErrorMessage, error);
            }

            return result;
        }
        public ITransactionVoidResult Void(ITransactionVoidRequest request)
        {
            //to void a transaction, we'll need capture id or authorization id previously obtained from paypal
            var transactionId = request.GetParameterAs<string>(PaymentParameterNames.AuthorizationId);
            if(string.IsNullOrEmpty(transactionId))
                transactionId = request.GetParameterAs<string>(PaymentParameterNames.CaptureId);

            //create a capture request for paypal
            var doVoidRequest = new DoVoidReq() {
                DoVoidRequest = new DoVoidRequestType() {
                    Version = ApiVersion,
                    AuthorizationID = transactionId
                }
            };

            //get the service for paypal api
            var service = GetPayPalApiInterfaceServiceService();
            var paypalResponse = service.DoVoid(doVoidRequest);

            var result = new TransactionResult();

            string error;
            var success = PayPalHelper.ParseResponseSuccess(paypalResponse, out error);
            if (success)
            {
                result.Success = true;
                result.SetParameter(PaymentParameterNames.RefundId, paypalResponse.AuthorizationID);
                result.SetParameter(PaymentParameterNames.RefundResult, paypalResponse.Ack);
            }
            else
            {
                result.SetParameter(PaymentParameterNames.ErrorMessage, error);
            }

            return result;
        }
        public ITransactionProcessResult Process(ITransactionProcessRequest request, bool authorizeOnly = false)
        {
            var user = _userService.Get(request.UserId);
            if (user == null)
            {
                throw new mobSocialException($"Can't find the user with Id {request.UserId}");
            }
            var creditCard = new CreditCardDetailsType() {
                CreditCardNumber = request.GetParameterAs<string>(PaymentParameterNames.CardNumber),
                CVV2 = request.GetParameterAs<string>(PaymentParameterNames.SecurityCode),
                ExpMonth = request.GetParameterAs<int>(PaymentParameterNames.ExpireMonth),
                ExpYear = request.GetParameterAs<int>(PaymentParameterNames.ExpireYear),
                CreditCardType = PayPalHelper.GeCreditCardTypeType(request.GetParameterAs<string>(PaymentParameterNames.CardIssuerType)),
                CardOwner = new PayerInfoType()
            };

            var paypalCurrency = PayPalHelper.GetPaypalCurrency(request.CurrencyIsoCode);
            var doDirectPaymentRequestDetails = new DoDirectPaymentRequestDetailsType() {
                IPAddress = WebHelper.GetClientIpAddress(),
                PaymentAction = authorizeOnly ? PaymentActionCodeType.AUTHORIZATION : PaymentActionCodeType.SALE,
                CreditCard = creditCard,
                PaymentDetails = new PaymentDetailsType() {
                    OrderTotal = new BasicAmountType() {
                        value = Math.Round(request.Amount, 2).ToString("N", new CultureInfo("en-US")),
                        currencyID = paypalCurrency
                    },
                    Custom = request.TransactionUniqueId,
                    ButtonSource = "mobSocial"
                }
            };

            var doDirectPaymentRequest = new DoDirectPaymentRequestType {
                Version = ApiVersion,
                DoDirectPaymentRequestDetails = doDirectPaymentRequestDetails
            };

            var paymentRequest = new DoDirectPaymentReq {
                DoDirectPaymentRequest = doDirectPaymentRequest
            };

            var service = GetPayPalApiInterfaceServiceService();
            var paypalResponse = service.DoDirectPayment(paymentRequest);

            var result = new TransactionResult();

            string error;
            var success = PayPalHelper.ParseResponseSuccess(paypalResponse, out error);
            if (success)
            {
                result.Success = true;
                result.SetParameter(PaymentParameterNames.AvsCode, paypalResponse.AVSCode);
                result.SetParameter(PaymentParameterNames.Cvv2Code, paypalResponse.CVV2Code);

                if (authorizeOnly)
                {
                    result.SetParameter(PaymentParameterNames.AuthorizationId, paypalResponse.TransactionID);
                    result.SetParameter(PaymentParameterNames.AuthorizationResult, paypalResponse.Ack);
                }
                else
                {
                    result.SetParameter(PaymentParameterNames.CaptureId, paypalResponse.TransactionID);
                    result.SetParameter(PaymentParameterNames.CaptureResult, paypalResponse.Ack);
                }
            }
            else
            {
                result.SetParameter(PaymentParameterNames.ErrorMessage, error);
            }

            return result;
        }