/// <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; var service = GetService(); DoCaptureResponseType response = service.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> /// 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(); var country = EngineContext.Current.Resolve <ICountryService>().GetCountryById(customer.BillingAddress.CountryId); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(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 (!String.IsNullOrEmpty(customer.BillingAddress.StateProvinceId)) { var state = EngineContext.Current.Resolve <IStateProvinceService>().GetStateProvinceById(customer.BillingAddress.StateProvinceId); details.CreditCard.CardOwner.Address.StateOrProvince = state.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(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(); var country = EngineContext.Current.Resolve <ICountryService>().GetCountryById(customer.BillingAddress.CountryId); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(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 (!String.IsNullOrEmpty(customer.BillingAddress.StateProvinceId)) { var state = EngineContext.Current.Resolve <IStateProvinceService>().GetStateProvinceById(customer.BillingAddress.StateProvinceId); details.CreditCard.CardOwner.Address.StateOrProvince = state.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(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 (!String.IsNullOrEmpty(customer.ShippingAddress.StateProvinceId) && !String.IsNullOrEmpty(customer.ShippingAddress.CountryId)) { var state = EngineContext.Current.Resolve <IStateProvinceService>().GetStateProvinceById(customer.ShippingAddress.StateProvinceId); var countryshipping = EngineContext.Current.Resolve <ICountryService>().GetCountryById(customer.ShippingAddress.CountryId); 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 = state.Abbreviation; shippingAddress.PostalCode = customer.ShippingAddress.ZipPostalCode; shippingAddress.Country = (CountryCodeType)Enum.Parse(typeof(CountryCodeType), countryshipping.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); }