/// <summary> /// Voids a payment /// </summary> /// <param name="voidPaymentRequest">Request</param> /// <returns>Result</returns> public VoidPaymentResult Void(VoidPaymentRequest voidPaymentRequest) { var result = new VoidPaymentResult(); string transactionId = voidPaymentRequest.Order.AuthorizationTransactionId; if (String.IsNullOrEmpty(transactionId)) { transactionId = voidPaymentRequest.Order.CaptureTransactionId; } var req = new DoVoidReq(); req.DoVoidRequest = new DoVoidRequestType(); req.DoVoidRequest.Version = GetApiVersion(); req.DoVoidRequest.AuthorizationID = transactionId; using (var service2 = new PayPalAPIAASoapBinding()) { if (!_paypalDirectPaymentSettings.UseSandbox) { service2.Url = "https://api-3t.paypal.com/2.0/"; } else { service2.Url = "https://api-3t.sandbox.paypal.com/2.0/"; } service2.RequesterCredentials = new CustomSecurityHeaderType(); service2.RequesterCredentials.Credentials = new UserIdPasswordType(); service2.RequesterCredentials.Credentials.Username = _paypalDirectPaymentSettings.ApiAccountName; service2.RequesterCredentials.Credentials.Password = _paypalDirectPaymentSettings.ApiAccountPassword; service2.RequesterCredentials.Credentials.Signature = _paypalDirectPaymentSettings.Signature; service2.RequesterCredentials.Credentials.Subject = ""; DoVoidResponseType response = service2.DoVoid(req); string error = ""; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.NewPaymentStatus = PaymentStatus.Voided; //result.VoidTransactionID = response.RefundTransactionID; } else { result.AddError(error); } } return(result); }
/// <summary> /// Refunds a payment /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); string transactionId = refundPaymentRequest.Order.CaptureTransactionId; var req = new RefundTransactionReq(); req.RefundTransactionRequest = new RefundTransactionRequestType(); //NOTE: Specify amount in partial refund req.RefundTransactionRequest.RefundType = RefundType.Full; req.RefundTransactionRequest.RefundTypeSpecified = true; req.RefundTransactionRequest.Version = GetApiVersion(); req.RefundTransactionRequest.TransactionID = transactionId; using (var service1 = new PayPalAPISoapBinding()) { if (!_paypalDirectPaymentSettings.UseSandbox) { service1.Url = "https://api-3t.paypal.com/2.0/"; } else { service1.Url = "https://api-3t.sandbox.paypal.com/2.0/"; } service1.RequesterCredentials = new CustomSecurityHeaderType(); service1.RequesterCredentials.Credentials = new UserIdPasswordType(); service1.RequesterCredentials.Credentials.Username = _paypalDirectPaymentSettings.ApiAccountName; service1.RequesterCredentials.Credentials.Password = _paypalDirectPaymentSettings.ApiAccountPassword; service1.RequesterCredentials.Credentials.Signature = _paypalDirectPaymentSettings.Signature; service1.RequesterCredentials.Credentials.Subject = ""; RefundTransactionResponseType response = service1.RefundTransaction(req); string error = string.Empty; bool Success = PaypalHelper.CheckSuccess(response, out error); if (Success) { result.NewPaymentStatus = PaymentStatus.Refunded; //cancelPaymentResult.RefundTransactionID = response.RefundTransactionID; } else { result.AddError(error); } } return(result); }
/// <summary> /// Captures payment /// </summary> /// <param name="capturePaymentRequest">Capture payment request</param> /// <returns>Capture payment result</returns> public CapturePaymentResult Capture(CapturePaymentRequest capturePaymentRequest) { var result = new CapturePaymentResult(); string authorizationId = capturePaymentRequest.Order.AuthorizationTransactionId; var req = new DoCaptureReq(); req.DoCaptureRequest = new DoCaptureRequestType(); req.DoCaptureRequest.Version = GetApiVersion(); req.DoCaptureRequest.AuthorizationID = authorizationId; req.DoCaptureRequest.Amount = new BasicAmountType(); req.DoCaptureRequest.Amount.Value = Math.Round(capturePaymentRequest.Order.OrderTotal, 2).ToString("N", new CultureInfo("en-us")); req.DoCaptureRequest.Amount.currencyID = PaypalHelper.GetPaypalCurrency(_currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId)); req.DoCaptureRequest.CompleteType = CompleteCodeType.Complete; using (var service2 = new PayPalAPIAASoapBinding()) { if (!_paypalDirectPaymentSettings.UseSandbox) { service2.Url = "https://api-3t.paypal.com/2.0/"; } else { service2.Url = "https://api-3t.sandbox.paypal.com/2.0/"; } service2.RequesterCredentials = new CustomSecurityHeaderType(); service2.RequesterCredentials.Credentials = new UserIdPasswordType(); service2.RequesterCredentials.Credentials.Username = _paypalDirectPaymentSettings.ApiAccountName; service2.RequesterCredentials.Credentials.Password = _paypalDirectPaymentSettings.ApiAccountPassword; service2.RequesterCredentials.Credentials.Signature = _paypalDirectPaymentSettings.Signature; service2.RequesterCredentials.Credentials.Subject = ""; DoCaptureResponseType response = service2.DoCapture(req); string error = ""; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.NewPaymentStatus = PaymentStatus.Paid; result.CaptureTransactionId = response.DoCaptureResponseDetails.PaymentInfo.TransactionID; result.CaptureTransactionResult = response.Ack.ToString(); } else { result.AddError(error); } } return(result); }
/// <summary> /// Refunds a payment /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); string transactionId = refundPaymentRequest.Order.CaptureTransactionId; var req = new RefundTransactionReq(); req.RefundTransactionRequest = new RefundTransactionRequestType { Version = GetApiVersion(), TransactionID = transactionId }; if (refundPaymentRequest.IsPartialRefund) { req.RefundTransactionRequest.RefundType = RefundType.PARTIAL; req.RefundTransactionRequest.Amount = new BasicAmountType { currencyID = PaypalHelper.GetPaypalCurrency(_currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId)), value = refundPaymentRequest.AmountToRefund.ToString() }; } else { req.RefundTransactionRequest.RefundType = RefundType.FULL; } var service = GetService(); RefundTransactionResponseType response = service.RefundTransaction(req); string error; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.NewPaymentStatus = (refundPaymentRequest.IsPartialRefund && refundPaymentRequest.Order.RefundedAmount + refundPaymentRequest.AmountToRefund < refundPaymentRequest.Order.OrderTotal) ? PaymentStatus.PartiallyRefunded : PaymentStatus.Refunded; //set refund transaction id for preventing refund twice _genericAttributeService.SaveAttribute(refundPaymentRequest.Order, "RefundTransactionId", response.RefundTransactionID); } else { result.AddError(error); } return(result); }
/// <summary> /// Captures payment /// </summary> /// <param name="capturePaymentRequest">Capture payment request</param> /// <returns>Capture payment result</returns> public CapturePaymentResult Capture(CapturePaymentRequest capturePaymentRequest) { var result = new CapturePaymentResult(); try { var apiContext = PaypalHelper.GetApiContext(_paypalDirectPaymentSettings); var authorization = Authorization.Get(apiContext, capturePaymentRequest.Order.AuthorizationTransactionId); var currency = _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId); var capture = new Capture { amount = new Amount { total = capturePaymentRequest.Order.OrderTotal.ToString("N", new CultureInfo("en-US")), currency = currency != null ? currency.CurrencyCode : null }, is_final_capture = true }; capture = authorization.Capture(apiContext, capture); result.CaptureTransactionId = capture.id; result.CaptureTransactionResult = capture.state; result.NewPaymentStatus = GetPaymentStatus(capture.state); } catch (PayPal.PayPalException exc) { if (exc is PayPal.ConnectionException) { var error = JsonFormatter.ConvertFromJson <Error>((exc as PayPal.ConnectionException).Response); if (error != null) { result.AddError(string.Format("PayPal error: {0} ({1})", error.message, error.name)); if (error.details != null) { error.details.ForEach(x => result.AddError(string.Format("{0} {1}", x.field, x.issue))); } } } //if there are not the specific errors add exception message if (result.Success) { result.AddError(exc.InnerException != null ? exc.InnerException.Message : exc.Message); } } return(result); }
/// <summary> /// Cancels a recurring payment /// </summary> /// <param name="cancelPaymentRequest">Request</param> /// <returns>Result</returns> public CancelRecurringPaymentResult CancelRecurringPayment(CancelRecurringPaymentRequest cancelPaymentRequest) { var result = new CancelRecurringPaymentResult(); var order = cancelPaymentRequest.Order; var req = new ManageRecurringPaymentsProfileStatusReq(); req.ManageRecurringPaymentsProfileStatusRequest = new ManageRecurringPaymentsProfileStatusRequestType(); req.ManageRecurringPaymentsProfileStatusRequest.Version = GetApiVersion(); var details = new ManageRecurringPaymentsProfileStatusRequestDetailsType(); req.ManageRecurringPaymentsProfileStatusRequest.ManageRecurringPaymentsProfileStatusRequestDetails = details; details.Action = StatusChangeActionType.Cancel; //Recurring payments profile ID returned in the CreateRecurringPaymentsProfile response details.ProfileID = order.SubscriptionTransactionId; using (var service2 = new PayPalAPIAASoapBinding()) { if (!_paypalDirectPaymentSettings.UseSandbox) { service2.Url = "https://api-3t.paypal.com/2.0/"; } else { service2.Url = "https://api-3t.sandbox.paypal.com/2.0/"; } service2.RequesterCredentials = new CustomSecurityHeaderType(); service2.RequesterCredentials.Credentials = new UserIdPasswordType(); service2.RequesterCredentials.Credentials.Username = _paypalDirectPaymentSettings.ApiAccountName; service2.RequesterCredentials.Credentials.Password = _paypalDirectPaymentSettings.ApiAccountPassword; service2.RequesterCredentials.Credentials.Signature = _paypalDirectPaymentSettings.Signature; service2.RequesterCredentials.Credentials.Subject = ""; var response = service2.ManageRecurringPaymentsProfileStatus(req); string error = ""; if (!PaypalHelper.CheckSuccess(response, out error)) { result.AddError(error); } } return(result); }
/// <summary> /// Uninstall the plugin /// </summary> public override void Uninstall() { //delete webhook var settings = _settingService.LoadSetting <PayPalDirectPaymentSettings>(); if (!string.IsNullOrEmpty(settings.WebhookId)) { try { var apiContext = PaypalHelper.GetApiContext(settings); Webhook.Delete(apiContext, settings.WebhookId); } catch (PayPal.PayPalException) { } } //settings _settingService.DeleteSetting <PayPalDirectPaymentSettings>(); //locales this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.AdditionalFee"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.AdditionalFee.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.AdditionalFeePercentage"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.AdditionalFeePercentage.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.ClientId"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.ClientId.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.ClientSecret"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.ClientSecret.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.TransactMode"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.TransactMode.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.UseSandbox"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.UseSandbox.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.WebhookId"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.Fields.WebhookId.Hint"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.PaymentMethodDescription"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.WebhookCreate"); this.DeletePluginLocaleResource("Plugins.Payments.PayPalDirect.WebhookError"); base.Uninstall(); }
/// <summary> /// Cancels a recurring payment /// </summary> /// <param name="cancelPaymentRequest">Request</param> /// <returns>Result</returns> public CancelRecurringPaymentResult CancelRecurringPayment(CancelRecurringPaymentRequest cancelPaymentRequest) { var result = new CancelRecurringPaymentResult(); try { var apiContext = PaypalHelper.GetApiContext(_paypalDirectPaymentSettings); var subscription = Agreement.Get(apiContext, cancelPaymentRequest.Order.SubscriptionTransactionId); var reason = new AgreementStateDescriptor { note = string.Format("Cancel subscription {0}", cancelPaymentRequest.Order.OrderGuid) }; subscription.Cancel(apiContext, reason); } catch (PayPal.PayPalException exc) { if (exc is PayPal.ConnectionException) { var error = JsonFormatter.ConvertFromJson <Error>((exc as PayPal.ConnectionException).Response); if (error != null) { result.AddError(string.Format("PayPal error: {0} ({1})", error.message, error.name)); if (error.details != null) { error.details.ForEach(x => result.AddError(string.Format("{0} {1}", x.field, x.issue))); } } } //if there are not the specific errors add exception message if (result.Success) { result.AddError(exc.InnerException != null ? exc.InnerException.Message : exc.Message); } } return(result); }
/// <summary> /// Voids a payment /// </summary> /// <param name="voidPaymentRequest">Request</param> /// <returns>Result</returns> public VoidPaymentResult Void(VoidPaymentRequest voidPaymentRequest) { var result = new VoidPaymentResult(); try { var apiContext = PaypalHelper.GetApiContext(_paypalDirectPaymentSettings); var authorization = Authorization.Get(apiContext, voidPaymentRequest.Order.AuthorizationTransactionId); authorization = authorization.Void(apiContext); result.NewPaymentStatus = GetPaymentStatus(authorization.state); } catch (PayPal.PayPalException exc) { if (exc is PayPal.ConnectionException) { var error = JsonFormatter.ConvertFromJson <Error>((exc as PayPal.ConnectionException).Response); if (error != null) { result.AddError(string.Format("PayPal error: {0} ({1})", error.message, error.name)); if (error.details != null) { error.details.ForEach(x => result.AddError(string.Format("{0} {1}", x.field, x.issue))); } } } //if there are not the specific errors add exception message if (result.Success) { result.AddError(exc.InnerException != null ? exc.InnerException.Message : exc.Message); } } return(result); }
/// <summary> /// Process recurring payment /// </summary> /// <param name="processPaymentRequest">Payment info required for an order processing</param> /// <returns>Process payment result</returns> public ProcessPaymentResult ProcessRecurringPayment(ProcessPaymentRequest processPaymentRequest) { var result = new ProcessPaymentResult(); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); var req = new CreateRecurringPaymentsProfileReq(); req.CreateRecurringPaymentsProfileRequest = new CreateRecurringPaymentsProfileRequestType(); req.CreateRecurringPaymentsProfileRequest.Version = GetApiVersion(); var details = new CreateRecurringPaymentsProfileRequestDetailsType(); req.CreateRecurringPaymentsProfileRequest.CreateRecurringPaymentsProfileRequestDetails = details; details.CreditCard = new CreditCardDetailsType(); details.CreditCard.CreditCardNumber = processPaymentRequest.CreditCardNumber; details.CreditCard.CreditCardType = GetPaypalCreditCardType(processPaymentRequest.CreditCardType); details.CreditCard.ExpMonthSpecified = true; details.CreditCard.ExpMonth = processPaymentRequest.CreditCardExpireMonth; details.CreditCard.ExpYearSpecified = true; details.CreditCard.ExpYear = processPaymentRequest.CreditCardExpireYear; details.CreditCard.CVV2 = processPaymentRequest.CreditCardCvv2; details.CreditCard.CardOwner = new PayerInfoType(); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CreditCardTypeSpecified = true; details.CreditCard.CardOwner.Address = new AddressType(); details.CreditCard.CardOwner.Address.CountrySpecified = true; details.CreditCard.CardOwner.Address.Street1 = customer.BillingAddress.Address1; details.CreditCard.CardOwner.Address.Street2 = customer.BillingAddress.Address2; details.CreditCard.CardOwner.Address.CityName = customer.BillingAddress.City; if (customer.BillingAddress.StateProvince != null) { details.CreditCard.CardOwner.Address.StateOrProvince = customer.BillingAddress.StateProvince.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CardOwner.Address.PostalCode = customer.BillingAddress.ZipPostalCode; details.CreditCard.CardOwner.Payer = customer.BillingAddress.Email; details.CreditCard.CardOwner.PayerName = new PersonNameType(); details.CreditCard.CardOwner.PayerName.FirstName = customer.BillingAddress.FirstName; details.CreditCard.CardOwner.PayerName.LastName = customer.BillingAddress.LastName; //start date details.RecurringPaymentsProfileDetails = new RecurringPaymentsProfileDetailsType(); details.RecurringPaymentsProfileDetails.BillingStartDate = DateTime.UtcNow; details.RecurringPaymentsProfileDetails.ProfileReference = processPaymentRequest.OrderGuid.ToString(); //schedule details.ScheduleDetails = new ScheduleDetailsType(); details.ScheduleDetails.Description = "Recurring payment"; details.ScheduleDetails.PaymentPeriod = new BillingPeriodDetailsType(); details.ScheduleDetails.PaymentPeriod.Amount = new BasicAmountType(); details.ScheduleDetails.PaymentPeriod.Amount.Value = Math.Round(processPaymentRequest.OrderTotal, 2).ToString("N", new CultureInfo("en-us")); details.ScheduleDetails.PaymentPeriod.Amount.currencyID = PaypalHelper.GetPaypalCurrency(_currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId)); details.ScheduleDetails.PaymentPeriod.BillingFrequency = processPaymentRequest.RecurringCycleLength; switch (processPaymentRequest.RecurringCyclePeriod) { case RecurringProductCyclePeriod.Days: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Day; break; case RecurringProductCyclePeriod.Weeks: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Week; break; case RecurringProductCyclePeriod.Months: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Month; break; case RecurringProductCyclePeriod.Years: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Year; break; default: throw new NopException("Not supported cycle period"); } details.ScheduleDetails.PaymentPeriod.TotalBillingCycles = processPaymentRequest.RecurringTotalCycles; details.ScheduleDetails.PaymentPeriod.TotalBillingCyclesSpecified = true; using (var service2 = new PayPalAPIAASoapBinding()) { if (!_paypalDirectPaymentSettings.UseSandbox) { service2.Url = "https://api-3t.paypal.com/2.0/"; } else { service2.Url = "https://api-3t.sandbox.paypal.com/2.0/"; } service2.RequesterCredentials = new CustomSecurityHeaderType(); service2.RequesterCredentials.Credentials = new UserIdPasswordType(); service2.RequesterCredentials.Credentials.Username = _paypalDirectPaymentSettings.ApiAccountName; service2.RequesterCredentials.Credentials.Password = _paypalDirectPaymentSettings.ApiAccountPassword; service2.RequesterCredentials.Credentials.Signature = _paypalDirectPaymentSettings.Signature; service2.RequesterCredentials.Credentials.Subject = ""; CreateRecurringPaymentsProfileResponseType response = service2.CreateRecurringPaymentsProfile(req); string error = ""; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.NewPaymentStatus = PaymentStatus.Pending; if (response.CreateRecurringPaymentsProfileResponseDetails != null) { result.SubscriptionTransactionId = response.CreateRecurringPaymentsProfileResponseDetails.ProfileID; } } else { result.AddError(error); } } return(result); }
protected ProcessPaymentResult AuthorizeOrSale(ProcessPaymentRequest processPaymentRequest, bool authorizeOnly) { var result = new ProcessPaymentResult(); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); if (customer == null) { throw new Exception("Customer cannot be loaded"); } var req = new DoDirectPaymentReq(); req.DoDirectPaymentRequest = new DoDirectPaymentRequestType(); req.DoDirectPaymentRequest.Version = GetApiVersion(); var details = new DoDirectPaymentRequestDetailsType(); req.DoDirectPaymentRequest.DoDirectPaymentRequestDetails = details; details.IPAddress = _webHelper.GetCurrentIpAddress(); if (authorizeOnly) { details.PaymentAction = PaymentActionCodeType.Authorization; } else { details.PaymentAction = PaymentActionCodeType.Sale; } //credit card details.CreditCard = new CreditCardDetailsType(); details.CreditCard.CreditCardNumber = processPaymentRequest.CreditCardNumber; details.CreditCard.CreditCardType = GetPaypalCreditCardType(processPaymentRequest.CreditCardType); details.CreditCard.ExpMonthSpecified = true; details.CreditCard.ExpMonth = processPaymentRequest.CreditCardExpireMonth; details.CreditCard.ExpYearSpecified = true; details.CreditCard.ExpYear = processPaymentRequest.CreditCardExpireYear; details.CreditCard.CVV2 = processPaymentRequest.CreditCardCvv2; details.CreditCard.CardOwner = new PayerInfoType(); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CreditCardTypeSpecified = true; //billing address details.CreditCard.CardOwner.Address = new AddressType(); details.CreditCard.CardOwner.Address.CountrySpecified = true; details.CreditCard.CardOwner.Address.Street1 = customer.BillingAddress.Address1; details.CreditCard.CardOwner.Address.Street2 = customer.BillingAddress.Address2; details.CreditCard.CardOwner.Address.CityName = customer.BillingAddress.City; if (customer.BillingAddress.StateProvince != null) { details.CreditCard.CardOwner.Address.StateOrProvince = customer.BillingAddress.StateProvince.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CardOwner.Address.PostalCode = customer.BillingAddress.ZipPostalCode; details.CreditCard.CardOwner.Payer = customer.BillingAddress.Email; details.CreditCard.CardOwner.PayerName = new PersonNameType(); details.CreditCard.CardOwner.PayerName.FirstName = customer.BillingAddress.FirstName; details.CreditCard.CardOwner.PayerName.LastName = customer.BillingAddress.LastName; //order totals var payPalCurrency = PaypalHelper.GetPaypalCurrency(_currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId)); details.PaymentDetails = new PaymentDetailsType(); details.PaymentDetails.OrderTotal = new BasicAmountType(); details.PaymentDetails.OrderTotal.Value = Math.Round(processPaymentRequest.OrderTotal, 2).ToString("N", new CultureInfo("en-us")); details.PaymentDetails.OrderTotal.currencyID = payPalCurrency; details.PaymentDetails.Custom = processPaymentRequest.OrderGuid.ToString(); details.PaymentDetails.ButtonSource = "nopCommerceCart"; //pass product names and totals to PayPal //if (_paypalDirectPaymentSettings.PassProductNamesAndTotals) //{ // //individual items //var cart = customer.ShoppingCartItems // .Where(x=>x.ShoppingCartType == ShoppingCartType.ShoppingCart) // .Where(x=>x.StoreId == processPaymentRequest.StoreId) // .ToList(); // var cartItems = new PaymentDetailsItemType[cart.Count]; // for (int i = 0; i < cart.Count; i++) // { // var sc = cart[i]; // decimal taxRate = decimal.Zero; // var customer = processPaymentRequest.Customer; // decimal scUnitPrice = _priceCalculationService.GetUnitPrice(sc, true); // decimal scSubTotal = _priceCalculationService.GetSubTotal(sc, true); // decimal scUnitPriceInclTax = _taxService.GetProductPrice(sc.ProductVariant, scUnitPrice, true, customer, out taxRate); // decimal scUnitPriceExclTax = _taxService.GetProductPrice(sc.ProductVariant, scUnitPrice, false, customer, out taxRate); // //decimal scSubTotalInclTax = _taxService.GetProductPrice(sc.ProductVariant, scSubTotal, true, customer, out taxRate); // //decimal scSubTotalExclTax = _taxService.GetProductPrice(sc.ProductVariant, scSubTotal, false, customer, out taxRate); // cartItems[i] = new PaymentDetailsItemType() // { // Name = sc.ProductVariant.FullProductName, // Number = sc.ProductVariant.Id.ToString(), // Quantity = sc.Quantity.ToString(), // Amount = new BasicAmountType() // { // currencyID = payPalCurrency, // Value = scUnitPriceExclTax.ToString("N", new CultureInfo("en-us")), // }, // Tax = new BasicAmountType() // { // currencyID = payPalCurrency, // Value = (scUnitPriceInclTax - scUnitPriceExclTax).ToString("N", new CultureInfo("en-us")), // }, // }; // }; // details.PaymentDetails.PaymentDetailsItem = cartItems; // //other totals (undone) // details.PaymentDetails.ItemTotal = null; // details.PaymentDetails.ShippingTotal = null; // details.PaymentDetails.TaxTotal = null; // details.PaymentDetails.HandlingTotal = null; //} //shipping if (customer.ShippingAddress != null) { if (customer.ShippingAddress.StateProvince != null && customer.ShippingAddress.Country != null) { var shippingAddress = new AddressType(); shippingAddress.Name = customer.ShippingAddress.FirstName + " " + customer.ShippingAddress.LastName; shippingAddress.Street1 = customer.ShippingAddress.Address1; shippingAddress.CityName = customer.ShippingAddress.City; shippingAddress.StateOrProvince = customer.ShippingAddress.StateProvince.Abbreviation; shippingAddress.PostalCode = customer.ShippingAddress.ZipPostalCode; shippingAddress.Country = (CountryCodeType)Enum.Parse(typeof(CountryCodeType), customer.ShippingAddress.Country.TwoLetterIsoCode, true); shippingAddress.CountrySpecified = true; details.PaymentDetails.ShipToAddress = shippingAddress; } } //send request using (var service2 = new PayPalAPIAASoapBinding()) { if (!_paypalDirectPaymentSettings.UseSandbox) { service2.Url = "https://api-3t.paypal.com/2.0/"; } else { service2.Url = "https://api-3t.sandbox.paypal.com/2.0/"; } service2.RequesterCredentials = new CustomSecurityHeaderType(); service2.RequesterCredentials.Credentials = new UserIdPasswordType(); service2.RequesterCredentials.Credentials.Username = _paypalDirectPaymentSettings.ApiAccountName; service2.RequesterCredentials.Credentials.Password = _paypalDirectPaymentSettings.ApiAccountPassword; service2.RequesterCredentials.Credentials.Signature = _paypalDirectPaymentSettings.Signature; service2.RequesterCredentials.Credentials.Subject = ""; DoDirectPaymentResponseType response = service2.DoDirectPayment(req); string error = ""; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.AvsResult = response.AVSCode; result.AuthorizationTransactionCode = response.CVV2Code; if (authorizeOnly) { result.AuthorizationTransactionId = response.TransactionID; result.AuthorizationTransactionResult = response.Ack.ToString(); result.NewPaymentStatus = PaymentStatus.Authorized; } else { result.CaptureTransactionId = response.TransactionID; result.CaptureTransactionResult = response.Ack.ToString(); result.NewPaymentStatus = PaymentStatus.Paid; } } else { result.AddError(error); } } return(result); }
/// <summary> /// Process recurring payment /// </summary> /// <param name="processPaymentRequest">Payment info required for an order processing</param> /// <returns>Process payment result</returns> public ProcessPaymentResult ProcessRecurringPayment(ProcessPaymentRequest processPaymentRequest) { var result = new ProcessPaymentResult(); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); var req = new CreateRecurringPaymentsProfileReq(); req.CreateRecurringPaymentsProfileRequest = new CreateRecurringPaymentsProfileRequestType(); req.CreateRecurringPaymentsProfileRequest.Version = GetApiVersion(); var details = new CreateRecurringPaymentsProfileRequestDetailsType(); req.CreateRecurringPaymentsProfileRequest.CreateRecurringPaymentsProfileRequestDetails = details; details.CreditCard = new CreditCardDetailsType(); details.CreditCard.CreditCardNumber = processPaymentRequest.CreditCardNumber; details.CreditCard.CreditCardType = GetPaypalCreditCardType(processPaymentRequest.CreditCardType); details.CreditCard.ExpMonth = processPaymentRequest.CreditCardExpireMonth; details.CreditCard.ExpYear = processPaymentRequest.CreditCardExpireYear; details.CreditCard.CVV2 = processPaymentRequest.CreditCardCvv2; details.CreditCard.CardOwner = new PayerInfoType(); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CardOwner.Address = new AddressType(); details.CreditCard.CardOwner.Address.Street1 = customer.BillingAddress.Address1; details.CreditCard.CardOwner.Address.Street2 = customer.BillingAddress.Address2; details.CreditCard.CardOwner.Address.CityName = customer.BillingAddress.City; if (customer.BillingAddress.StateProvince != null) { details.CreditCard.CardOwner.Address.StateOrProvince = customer.BillingAddress.StateProvince.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CardOwner.Address.PostalCode = customer.BillingAddress.ZipPostalCode; details.CreditCard.CardOwner.Payer = customer.BillingAddress.Email; details.CreditCard.CardOwner.PayerName = new PersonNameType(); details.CreditCard.CardOwner.PayerName.FirstName = customer.BillingAddress.FirstName; details.CreditCard.CardOwner.PayerName.LastName = customer.BillingAddress.LastName; //start date details.RecurringPaymentsProfileDetails = new RecurringPaymentsProfileDetailsType(); details.RecurringPaymentsProfileDetails.BillingStartDate = DateTime.UtcNow.ToString("s", CultureInfo.InvariantCulture); details.RecurringPaymentsProfileDetails.ProfileReference = processPaymentRequest.OrderGuid.ToString(); //schedule details.ScheduleDetails = new ScheduleDetailsType(); details.ScheduleDetails.Description = "Recurring payment"; details.ScheduleDetails.PaymentPeriod = new BillingPeriodDetailsType(); details.ScheduleDetails.PaymentPeriod.Amount = new BasicAmountType(); details.ScheduleDetails.PaymentPeriod.Amount.value = Math.Round(processPaymentRequest.OrderTotal, 2).ToString("N", new CultureInfo("en-us")); details.ScheduleDetails.PaymentPeriod.Amount.currencyID = PaypalHelper.GetPaypalCurrency(_currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId)); details.ScheduleDetails.PaymentPeriod.BillingFrequency = processPaymentRequest.RecurringCycleLength; switch (processPaymentRequest.RecurringCyclePeriod) { case RecurringProductCyclePeriod.Days: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.DAY; break; case RecurringProductCyclePeriod.Weeks: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.WEEK; break; case RecurringProductCyclePeriod.Months: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.MONTH; break; case RecurringProductCyclePeriod.Years: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.YEAR; break; default: throw new NopException("Not supported cycle period"); } details.ScheduleDetails.PaymentPeriod.TotalBillingCycles = processPaymentRequest.RecurringTotalCycles; var service = GetService(); CreateRecurringPaymentsProfileResponseType response = service.CreateRecurringPaymentsProfile(req); string error; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.NewPaymentStatus = PaymentStatus.Pending; if (response.CreateRecurringPaymentsProfileResponseDetails != null) { result.SubscriptionTransactionId = response.CreateRecurringPaymentsProfileResponseDetails.ProfileID; } } else { result.AddError(error); } return(result); }
protected ProcessPaymentResult AuthorizeOrSale(ProcessPaymentRequest processPaymentRequest, bool authorizeOnly) { var result = new ProcessPaymentResult(); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); if (customer == null) { throw new Exception("Customer cannot be loaded"); } var req = new DoDirectPaymentReq(); req.DoDirectPaymentRequest = new DoDirectPaymentRequestType(); req.DoDirectPaymentRequest.Version = GetApiVersion(); var details = new DoDirectPaymentRequestDetailsType(); req.DoDirectPaymentRequest.DoDirectPaymentRequestDetails = details; details.IPAddress = _webHelper.GetCurrentIpAddress() ?? ""; if (authorizeOnly) { details.PaymentAction = PaymentActionCodeType.AUTHORIZATION; } else { details.PaymentAction = PaymentActionCodeType.SALE; } //credit card details.CreditCard = new CreditCardDetailsType(); details.CreditCard.CreditCardNumber = processPaymentRequest.CreditCardNumber; details.CreditCard.CreditCardType = GetPaypalCreditCardType(processPaymentRequest.CreditCardType); details.CreditCard.ExpMonth = processPaymentRequest.CreditCardExpireMonth; details.CreditCard.ExpYear = processPaymentRequest.CreditCardExpireYear; details.CreditCard.CVV2 = processPaymentRequest.CreditCardCvv2; details.CreditCard.CardOwner = new PayerInfoType(); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(customer.BillingAddress.Country); //billing address details.CreditCard.CardOwner.Address = new AddressType(); details.CreditCard.CardOwner.Address.Street1 = customer.BillingAddress.Address1; details.CreditCard.CardOwner.Address.Street2 = customer.BillingAddress.Address2; details.CreditCard.CardOwner.Address.CityName = customer.BillingAddress.City; if (customer.BillingAddress.StateProvince != null) { details.CreditCard.CardOwner.Address.StateOrProvince = customer.BillingAddress.StateProvince.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(customer.BillingAddress.Country); details.CreditCard.CardOwner.Address.PostalCode = customer.BillingAddress.ZipPostalCode; details.CreditCard.CardOwner.Payer = customer.BillingAddress.Email; details.CreditCard.CardOwner.PayerName = new PersonNameType(); details.CreditCard.CardOwner.PayerName.FirstName = customer.BillingAddress.FirstName; details.CreditCard.CardOwner.PayerName.LastName = customer.BillingAddress.LastName; //order totals var payPalCurrency = PaypalHelper.GetPaypalCurrency(_currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId)); details.PaymentDetails = new PaymentDetailsType(); details.PaymentDetails.OrderTotal = new BasicAmountType(); details.PaymentDetails.OrderTotal.value = Math.Round(processPaymentRequest.OrderTotal, 2).ToString("N", new CultureInfo("en-us")); details.PaymentDetails.OrderTotal.currencyID = payPalCurrency; details.PaymentDetails.Custom = processPaymentRequest.OrderGuid.ToString(); details.PaymentDetails.ButtonSource = "nopCommerceCart"; //shipping if (customer.ShippingAddress != null) { if (customer.ShippingAddress.StateProvince != null && customer.ShippingAddress.Country != null) { var shippingAddress = new AddressType(); shippingAddress.Name = customer.ShippingAddress.FirstName + " " + customer.ShippingAddress.LastName; shippingAddress.Street1 = customer.ShippingAddress.Address1; shippingAddress.Street2 = customer.ShippingAddress.Address2; shippingAddress.CityName = customer.ShippingAddress.City; shippingAddress.StateOrProvince = customer.ShippingAddress.StateProvince.Abbreviation; shippingAddress.PostalCode = customer.ShippingAddress.ZipPostalCode; shippingAddress.Country = (CountryCodeType)Enum.Parse(typeof(CountryCodeType), customer.ShippingAddress.Country.TwoLetterIsoCode, true); details.PaymentDetails.ShipToAddress = shippingAddress; } } //send request var service = GetService(); DoDirectPaymentResponseType response = service.DoDirectPayment(req); string error; bool success = PaypalHelper.CheckSuccess(response, out error); if (success) { result.AvsResult = response.AVSCode; result.AuthorizationTransactionCode = response.CVV2Code; if (authorizeOnly) { result.AuthorizationTransactionId = response.TransactionID; result.AuthorizationTransactionResult = response.Ack.ToString(); result.NewPaymentStatus = PaymentStatus.Authorized; } else { result.CaptureTransactionId = response.TransactionID; result.CaptureTransactionResult = response.Ack.ToString(); result.NewPaymentStatus = PaymentStatus.Paid; } } else { result.AddError(error); } return(result); }
/// <summary> /// Process recurring payment /// </summary> /// <param name="processPaymentRequest">Payment info required for an order processing</param> /// <returns>Process payment result</returns> public ProcessPaymentResult ProcessRecurringPayment(ProcessPaymentRequest processPaymentRequest) { var result = new ProcessPaymentResult(); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); if (customer == null) { throw new Exception("Customer cannot be loaded"); } try { var apiContext = PaypalHelper.GetApiContext(_paypalDirectPaymentSettings); var currency = _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId); //check that webhook exists if (string.IsNullOrEmpty(_paypalDirectPaymentSettings.WebhookId)) { result.AddError("Recurring payments are not available until you create a webhook"); return(result); } Webhook.Get(apiContext, _paypalDirectPaymentSettings.WebhookId); //create the plan var url = _webHelper.GetStoreLocation(_storeContext.CurrentStore.SslEnabled); var billingPlan = new Plan { name = processPaymentRequest.OrderGuid.ToString(), description = string.Format("nopCommerce billing plan for the {0} order", processPaymentRequest.OrderGuid), type = "fixed", merchant_preferences = new MerchantPreferences { return_url = url, cancel_url = url, auto_bill_amount = "YES", //setting setup fee as the first payment (workaround for the processing first payment immediately) setup_fee = new PayPal.Api.Currency { currency = currency != null ? currency.CurrencyCode : null, value = processPaymentRequest.OrderTotal.ToString("N", new CultureInfo("en-US")) } }, payment_definitions = new List <PaymentDefinition> { new PaymentDefinition { name = "nopCommerce payment for the billing plan", type = "REGULAR", frequency_interval = processPaymentRequest.RecurringCycleLength.ToString(), frequency = processPaymentRequest.RecurringCyclePeriod.ToString().TrimEnd('s'), cycles = (processPaymentRequest.RecurringTotalCycles - 1).ToString(), amount = new PayPal.Api.Currency { currency = currency != null ? currency.CurrencyCode : null, value = processPaymentRequest.OrderTotal.ToString("N", new CultureInfo("en-US")) } } } }.Create(apiContext); //activate the plan var patchRequest = new PatchRequest() { new Patch() { op = "replace", path = "/", value = new Plan { state = "ACTIVE" } } }; billingPlan.Update(apiContext, patchRequest); //create subscription var subscription = new Agreement { name = string.Format("nopCommerce subscription for the {0} order", processPaymentRequest.OrderGuid), //we set order guid in the description, then use it in the webhook handler description = processPaymentRequest.OrderGuid.ToString(), //setting start date as the next date of recurring payments as the setup fee was the first payment start_date = GetStartDate(processPaymentRequest.RecurringCyclePeriod, processPaymentRequest.RecurringCycleLength), #region payer payer = new Payer() { payment_method = "credit_card", #region credit card info funding_instruments = new List <FundingInstrument> { new FundingInstrument { credit_card = new CreditCard { type = processPaymentRequest.CreditCardType.ToLowerInvariant(), number = processPaymentRequest.CreditCardNumber, cvv2 = processPaymentRequest.CreditCardCvv2, expire_month = processPaymentRequest.CreditCardExpireMonth, expire_year = processPaymentRequest.CreditCardExpireYear } } }, #endregion #region payer info payer_info = new PayerInfo { #region billing address billing_address = customer.BillingAddress == null ? null : new Address { country_code = customer.BillingAddress.Country != null ? customer.BillingAddress.Country.TwoLetterIsoCode : null, state = customer.BillingAddress.StateProvince != null ? customer.BillingAddress.StateProvince.Abbreviation : null, city = customer.BillingAddress.City, line1 = customer.BillingAddress.Address1, line2 = customer.BillingAddress.Address2, phone = customer.BillingAddress.PhoneNumber, postal_code = customer.BillingAddress.ZipPostalCode }, #endregion email = customer.BillingAddress.Email, first_name = customer.BillingAddress.FirstName, last_name = customer.BillingAddress.LastName } #endregion }, #endregion #region shipping address shipping_address = customer.ShippingAddress == null ? null : new ShippingAddress { country_code = customer.ShippingAddress.Country != null ? customer.ShippingAddress.Country.TwoLetterIsoCode : null, state = customer.ShippingAddress.StateProvince != null ? customer.ShippingAddress.StateProvince.Abbreviation : null, city = customer.ShippingAddress.City, line1 = customer.ShippingAddress.Address1, line2 = customer.ShippingAddress.Address2, phone = customer.ShippingAddress.PhoneNumber, postal_code = customer.ShippingAddress.ZipPostalCode }, #endregion plan = new Plan { id = billingPlan.id } }.Create(apiContext); //if first payment failed, try again if (string.IsNullOrEmpty(subscription.agreement_details.last_payment_date)) { subscription.BillBalance(apiContext, new AgreementStateDescriptor { amount = subscription.agreement_details.outstanding_balance }); } result.SubscriptionTransactionId = subscription.id; } catch (PayPal.PayPalException exc) { if (exc is PayPal.ConnectionException) { var error = JsonFormatter.ConvertFromJson <Error>((exc as PayPal.ConnectionException).Response); if (error != null) { result.AddError(string.Format("PayPal error: {0} ({1})", error.message, error.name)); if (error.details != null) { error.details.ForEach(x => result.AddError(string.Format("{0} {1}", x.field, x.issue))); } } } //if there are not the specific errors add exception message if (result.Success) { result.AddError(exc.InnerException != null ? exc.InnerException.Message : exc.Message); } } return(result); }
/// <summary> /// Process a payment /// </summary> /// <param name="processPaymentRequest">Payment info required for an order processing</param> /// <returns>Process payment result</returns> public ProcessPaymentResult ProcessPayment(ProcessPaymentRequest processPaymentRequest) { var result = new ProcessPaymentResult(); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); if (customer == null) { throw new Exception("Customer cannot be loaded"); } try { var apiContext = PaypalHelper.GetApiContext(_paypalDirectPaymentSettings); var currency = _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId); var payment = new Payment() { #region payer payer = new Payer() { payment_method = "credit_card", #region credit card info funding_instruments = new List <FundingInstrument> { new FundingInstrument { credit_card = new CreditCard { type = processPaymentRequest.CreditCardType.ToLowerInvariant(), number = processPaymentRequest.CreditCardNumber, cvv2 = processPaymentRequest.CreditCardCvv2, expire_month = processPaymentRequest.CreditCardExpireMonth, expire_year = processPaymentRequest.CreditCardExpireYear } } }, #endregion #region payer info payer_info = new PayerInfo { #region billing address billing_address = customer.BillingAddress == null ? null : new Address { country_code = customer.BillingAddress.Country != null ? customer.BillingAddress.Country.TwoLetterIsoCode : null, state = customer.BillingAddress.StateProvince != null ? customer.BillingAddress.StateProvince.Abbreviation : null, city = customer.BillingAddress.City, line1 = customer.BillingAddress.Address1, line2 = customer.BillingAddress.Address2, phone = customer.BillingAddress.PhoneNumber, postal_code = customer.BillingAddress.ZipPostalCode }, #endregion email = customer.BillingAddress != null ? customer.BillingAddress.Email : null, first_name = customer.BillingAddress != null ? customer.BillingAddress.FirstName : null, last_name = customer.BillingAddress != null ? customer.BillingAddress.LastName : null } #endregion }, #endregion #region transaction transactions = new List <Transaction>() { new Transaction { #region amount amount = new Amount { total = processPaymentRequest.OrderTotal.ToString("N", new CultureInfo("en-US")), currency = currency != null ? currency.CurrencyCode : null }, #endregion #region shipping address item_list = customer.ShippingAddress == null ? null : new ItemList { shipping_address = new ShippingAddress { country_code = customer.ShippingAddress.Country != null ? customer.ShippingAddress.Country.TwoLetterIsoCode : null, state = customer.ShippingAddress.StateProvince != null ? customer.ShippingAddress.StateProvince.Abbreviation : null, city = customer.ShippingAddress.City, line1 = customer.ShippingAddress.Address1, line2 = customer.ShippingAddress.Address2, phone = customer.ShippingAddress.PhoneNumber, postal_code = customer.ShippingAddress.ZipPostalCode, recipient_name = string.Format("{0} {1}", customer.ShippingAddress.FirstName, customer.ShippingAddress.LastName) } }, #endregion invoice_number = processPaymentRequest.OrderGuid != Guid.Empty ? processPaymentRequest.OrderGuid.ToString() : null } }, #endregion intent = _paypalDirectPaymentSettings.TransactMode == TransactMode.Authorize ? "authorize" : "sale", }.Create(apiContext); if (payment.transactions[0].related_resources.Any() && payment.transactions[0].related_resources[0] != null) { if (_paypalDirectPaymentSettings.TransactMode == TransactMode.Authorize) { var authorization = payment.transactions[0].related_resources[0].authorization; if (authorization != null) { if (authorization.fmf_details != null) { result.AuthorizationTransactionResult = string.Format("Authorization is {0}. Based on fraud filter: {1}. {2}", authorization.fmf_details.filter_type, authorization.fmf_details.name, authorization.fmf_details.description); result.NewPaymentStatus = GetPaymentStatus(Authorization.Get(apiContext, authorization.id).state); } else { result.AuthorizationTransactionResult = authorization.state; result.NewPaymentStatus = GetPaymentStatus(authorization.state); } result.AuthorizationTransactionId = authorization.id; } } else { var sale = payment.transactions[0].related_resources[0].sale; if (sale != null) { if (sale.fmf_details != null) { result.CaptureTransactionResult = string.Format("Sale is {0}. Based on fraud filter: {1}. {2}", sale.fmf_details.filter_type, sale.fmf_details.name, sale.fmf_details.description); result.NewPaymentStatus = GetPaymentStatus(Sale.Get(apiContext, sale.id).state); } else { result.CaptureTransactionResult = sale.state; result.NewPaymentStatus = GetPaymentStatus(sale.state); } result.CaptureTransactionId = sale.id; result.AvsResult = sale.processor_response != null ? sale.processor_response.avs_code : string.Empty; } } } else { result.AddError("PayPal error"); } } catch (PayPal.PayPalException exc) { if (exc is PayPal.ConnectionException) { var error = JsonFormatter.ConvertFromJson <Error>((exc as PayPal.ConnectionException).Response); if (error != null) { result.AddError(string.Format("PayPal error: {0} ({1})", error.message, error.name)); if (error.details != null) { error.details.ForEach(x => result.AddError(string.Format("{0} {1}", x.field, x.issue))); } } } //if there are not the specific errors add exception message if (result.Success) { result.AddError(exc.InnerException != null ? exc.InnerException.Message : exc.Message); } } return(result); }