private void setKeyResponseObjects(PayPalAPIInterfaceServiceService service, CreateRecurringPaymentsProfileResponseType response) { Dictionary <string, string> responseParams = new Dictionary <string, string>(); responseParams.Add("API Status", response.Ack.ToString()); HttpContext CurrContext = HttpContext.Current; CurrContext.Items.Add("Response_redirectURL", null); if (response.Ack.Equals(AckCodeType.FAILURE) || (response.Errors != null && response.Errors.Count > 0)) { CurrContext.Items.Add("Response_error", response.Errors); } else { CurrContext.Items.Add("Response_error", null); responseParams.Add("Transaction Id", response.CreateRecurringPaymentsProfileResponseDetails.TransactionID); responseParams.Add("Profile Id", response.CreateRecurringPaymentsProfileResponseDetails.ProfileID); responseParams.Add("Profile Status", response.CreateRecurringPaymentsProfileResponseDetails.ProfileStatus.ToString()); } CurrContext.Items.Add("Response_keyResponseObject", responseParams); CurrContext.Items.Add("Response_apiName", "CreateRecurringPaymentsProfile"); CurrContext.Items.Add("Response_requestPayload", service.getLastRequest()); CurrContext.Items.Add("Response_responsePayload", service.getLastResponse()); Server.Transfer("../APIResponse.aspx"); }
protected void Submit_Click(object sender, EventArgs e) { // Create request object CreateRecurringPaymentsProfileRequestType request = new CreateRecurringPaymentsProfileRequestType(); populateRequest(request); // Invoke the API CreateRecurringPaymentsProfileReq wrapper = new CreateRecurringPaymentsProfileReq(); wrapper.CreateRecurringPaymentsProfileRequest = request; // Configuration map containing signature credentials and other required configuration. // For a full list of configuration parameters refer in wiki page // [https://github.com/paypal/sdk-core-dotnet/wiki/SDK-Configuration-Parameters] Dictionary <string, string> configurationMap = Configuration.GetAcctAndConfig(); // Create the PayPalAPIInterfaceServiceService service object to make the API call PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService(configurationMap); // # API call // Invoke the CreateRecurringPaymentsProfile method in service wrapper object CreateRecurringPaymentsProfileResponseType createRPProfileResponse = service.CreateRecurringPaymentsProfile(wrapper); // Check for API return status setKeyResponseObjects(service, createRPProfileResponse); }
public void CreateRecurringPaymentsProfile() { CreateRecurringPaymentsProfileSample sample = new CreateRecurringPaymentsProfileSample(); CreateRecurringPaymentsProfileResponseType responseCreateRecurringPaymentsProfileResponseType = sample.CreateRecurringPaymentsProfileAPIOperation(); Assert.IsNotNull(responseCreateRecurringPaymentsProfileResponseType); Assert.AreEqual(responseCreateRecurringPaymentsProfileResponseType.Ack.ToString().ToUpper(), "SUCCESS"); Assert.IsNotNull(responseCreateRecurringPaymentsProfileResponseType.CreateRecurringPaymentsProfileResponseDetails.ProfileID); }
public string CreateRecurringPaymentsProfileCode(string token, DateTime date, string amount, int BF, BillingPeriodType BP, CurrencyCodeType currencyCodeType) { CallerServices caller = new CallerServices(); IAPIProfile profile = ProfileFactory.createSignatureAPIProfile(); /* * WARNING: Do not embed plaintext credentials in your application code. * Doing so is insecure and against best practices. * Your API credentials must be handled securely. Please consider * encrypting them for use in any production environment, and ensure * that only authorized individuals may view or modify them. */ // Set up your API credentials, PayPal end point, and API version. profile.APIUsername = "******"; profile.APIPassword = "******"; profile.APISignature = "AsaWhdg.F1DEJUmkrAOGADAhmx2zAhz6qMKqOp5lTasZcyA1TAVoQrzO"; profile.Environment = "live"; caller.APIProfile = profile; // Create the request object. CreateRecurringPaymentsProfileRequestType pp_request = new CreateRecurringPaymentsProfileRequestType(); pp_request.Version = "51.0"; // Add request-specific fields to the request. pp_request.CreateRecurringPaymentsProfileRequestDetails = new CreateRecurringPaymentsProfileRequestDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.Token = ""; pp_request.CreateRecurringPaymentsProfileRequestDetails.RecurringPaymentsProfileDetails = new RecurringPaymentsProfileDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.RecurringPaymentsProfileDetails.BillingStartDate = date; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails = new ScheduleDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod = new BillingPeriodDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount = new BasicAmountType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount.Value = amount; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount.currencyID = currencyCodeType; //Enum for currency code is CurrencyCodeType.USD pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.BillingFrequency = BF; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.BillingPeriod = BP; ////Enum for BillingPeriod is BillingPeriodType.Day // Execute the API operation and obtain the response. CreateRecurringPaymentsProfileResponseType pp_response = new CreateRecurringPaymentsProfileResponseType(); pp_response = (CreateRecurringPaymentsProfileResponseType)caller.Call("CreateRecurringPaymentsProfile", pp_request); return(pp_response.Errors[0].LongMessage); }
/// <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) { using (var payPalApiaaInterfaceClient = _payPalInterfaceService.GetAAService()) { var customSecurityHeaderType = _payPalSecurityService.GetRequesterCredentials(); CreateRecurringPaymentsProfileResponseType response = payPalApiaaInterfaceClient.CreateRecurringPaymentsProfile(ref customSecurityHeaderType, _payPalRequestService.GetCreateRecurringPaymentsProfileRequest(processPaymentRequest)); return(response.HandleResponse(new ProcessPaymentResult(), (paymentResult, type) => paymentResult.NewPaymentStatus = PaymentStatus.Pending, (paymentResult, type) => response.Errors.AddErrors(paymentResult.AddError), processPaymentRequest.OrderGuid)); } }
protected void Submit_Click(object sender, EventArgs e) { // Create request object CreateRecurringPaymentsProfileRequestType request = new CreateRecurringPaymentsProfileRequestType(); populateRequest(request); // Invoke the API CreateRecurringPaymentsProfileReq wrapper = new CreateRecurringPaymentsProfileReq(); wrapper.CreateRecurringPaymentsProfileRequest = request; PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService(); CreateRecurringPaymentsProfileResponseType createRPProfileResponse = service.CreateRecurringPaymentsProfile(wrapper); // Check for API return status setKeyResponseObjects(service, createRPProfileResponse); }
public string CreateRecurringPaymentsProfileCode(string token, DateTime date, string amount, int BF, BillingPeriodType BP, CurrencyCodeType currencyCodeType) { CallerServices caller = new CallerServices(); IAPIProfile profile = ProfileFactory.createSignatureAPIProfile(); /* WARNING: Do not embed plaintext credentials in your application code. Doing so is insecure and against best practices. Your API credentials must be handled securely. Please consider encrypting them for use in any production environment, and ensure that only authorized individuals may view or modify them. */ // Set up your API credentials, PayPal end point, and API version. profile.APIUsername = "******"; profile.APIPassword = "******"; profile.APISignature = "AsaWhdg.F1DEJUmkrAOGADAhmx2zAhz6qMKqOp5lTasZcyA1TAVoQrzO"; profile.Environment = "live"; caller.APIProfile = profile; // Create the request object. CreateRecurringPaymentsProfileRequestType pp_request = new CreateRecurringPaymentsProfileRequestType(); pp_request.Version = "51.0"; // Add request-specific fields to the request. pp_request.CreateRecurringPaymentsProfileRequestDetails = new CreateRecurringPaymentsProfileRequestDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.Token = ""; pp_request.CreateRecurringPaymentsProfileRequestDetails.RecurringPaymentsProfileDetails = new RecurringPaymentsProfileDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.RecurringPaymentsProfileDetails.BillingStartDate = date; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails = new ScheduleDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod = new BillingPeriodDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount = new BasicAmountType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount.Value = amount; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount.currencyID = currencyCodeType;//Enum for currency code is CurrencyCodeType.USD pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.BillingFrequency = BF; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.BillingPeriod = BP;////Enum for BillingPeriod is BillingPeriodType.Day // Execute the API operation and obtain the response. CreateRecurringPaymentsProfileResponseType pp_response = new CreateRecurringPaymentsProfileResponseType(); pp_response = (CreateRecurringPaymentsProfileResponseType)caller.Call("CreateRecurringPaymentsProfile", pp_request); return pp_response.Errors[0].LongMessage; }
public override string RecurringBillingCreateSubscription(String SubscriptionDescription, Customer ThisCustomer, Address UseBillingAddress, Address UseShippingAddress, Decimal RecurringAmount, DateTime StartDate, int RecurringInterval, DateIntervalTypeEnum RecurringIntervalType, int OriginalRecurringOrderNumber, string XID, IDictionary <string, string> TransactionContext, out String RecurringSubscriptionID, out String RecurringSubscriptionCommand, out String RecurringSubscriptionResult) { string result = string.Empty; try { //Re-Use the Internal Gateway Recurring Billing logic for calculating how much of the order is recurring ShoppingCart recurringCart = new ShoppingCart(ThisCustomer.SkinID, ThisCustomer, CartTypeEnum.RecurringCart, OriginalRecurringOrderNumber, false); CreditCardDetailsType creditCard = new CreditCardDetailsType(); if (UseBillingAddress.CardNumber != null && UseBillingAddress.CardNumber.Length > 0) { creditCard.CreditCardNumber = UseBillingAddress.CardNumber; creditCard.ExpMonth = Localization.ParseUSInt(UseBillingAddress.CardExpirationMonth); creditCard.ExpYear = Localization.ParseUSInt(UseBillingAddress.CardExpirationYear); creditCard.ExpMonthSpecified = true; creditCard.ExpYearSpecified = true; creditCard.CVV2 = XID; if (UseBillingAddress.CardType == "AmericanExpress") { creditCard.CreditCardType = (CreditCardTypeType)Enum.Parse(typeof(CreditCardTypeType), "Amex", true); } else { creditCard.CreditCardType = (CreditCardTypeType)Enum.Parse(typeof(CreditCardTypeType), UseBillingAddress.CardType, true); } creditCard.CreditCardTypeSpecified = true; } else { creditCard.CreditCardTypeSpecified = false; } BasicAmountType recurringAmount = new BasicAmountType(); recurringAmount.currencyID = (CurrencyCodeType)Enum.Parse(typeof(CurrencyCodeType), AppLogic.AppConfig("Localization.StoreCurrency"), true); recurringAmount.Value = RecurringAmount.ToString(); DateIntervalTypeEnum recurringIntervalType = recurringCart.CartItems[0].RecurringIntervalType; //We currently only support 1 interval per recurring order, so grabbing the first as a default should be safe int recurringInterval = recurringCart.CartItems[0].RecurringInterval; BillingPeriodDetailsType billingPeriodDetails = PayPalController.GetECRecurringPeriodDetails(recurringIntervalType, recurringInterval); billingPeriodDetails.Amount = recurringAmount; billingPeriodDetails.TotalBillingCyclesSpecified = false; ScheduleDetailsType scheduleDetails = new ScheduleDetailsType(); scheduleDetails.Description = string.Format("Recurring order created on {0} from {1}", System.DateTime.Now.ToShortDateString(), AppLogic.AppConfig("StoreName")); scheduleDetails.MaxFailedPayments = 0; scheduleDetails.MaxFailedPaymentsSpecified = true; scheduleDetails.AutoBillOutstandingAmount = AutoBillType.NoAutoBill; scheduleDetails.AutoBillOutstandingAmountSpecified = true; scheduleDetails.PaymentPeriod = billingPeriodDetails; RecurringPaymentsProfileDetailsType profileDetails = new RecurringPaymentsProfileDetailsType(); profileDetails.SubscriberName = ThisCustomer.FirstName + " " + ThisCustomer.LastName; profileDetails.BillingStartDate = StartDate; CreateRecurringPaymentsProfileRequestDetailsType profileRequestDetails = new CreateRecurringPaymentsProfileRequestDetailsType(); profileRequestDetails.ScheduleDetails = scheduleDetails; profileRequestDetails.RecurringPaymentsProfileDetails = profileDetails; profileRequestDetails.CreditCard = creditCard; if (!(UseBillingAddress.CardNumber != null && UseBillingAddress.CardNumber.Length > 0)) { profileRequestDetails.Token = XID; } if (recurringCart.IsAllDownloadComponents()) { PaymentDetailsItemType paymentDetailsItem = new PaymentDetailsItemType(); paymentDetailsItem.ItemCategory = ItemCategoryType.Digital; paymentDetailsItem.ItemCategorySpecified = true; List <PaymentDetailsItemType> paymentDetailsList = new List <PaymentDetailsItemType>(); paymentDetailsList.Add(paymentDetailsItem); profileRequestDetails.PaymentDetailsItem = paymentDetailsList.ToArray(); } CreateRecurringPaymentsProfileRequestType profileRequest = new CreateRecurringPaymentsProfileRequestType(); profileRequest.Version = API_VER; profileRequest.CreateRecurringPaymentsProfileRequestDetails = profileRequestDetails; CreateRecurringPaymentsProfileReq request = new CreateRecurringPaymentsProfileReq(); request.CreateRecurringPaymentsProfileRequest = profileRequest; CreateRecurringPaymentsProfileResponseType profileResponse = new CreateRecurringPaymentsProfileResponseType(); profileResponse = IPayPal.CreateRecurringPaymentsProfile(request); if (profileResponse != null && profileResponse.Ack.ToString().StartsWith("success", StringComparison.InvariantCultureIgnoreCase)) { result = AppLogic.ro_OK; } else { if (profileResponse.Errors != null) { bool first = true; for (int ix = 0; ix < profileResponse.Errors.Length; ix++) { if (!first) { result += ", "; } result += profileResponse.Errors[ix].LongMessage; first = false; } } } RecurringSubscriptionID = (profileResponse.CreateRecurringPaymentsProfileResponseDetails.ProfileID == null ? "No ProfileID provided" : profileResponse.CreateRecurringPaymentsProfileResponseDetails.ProfileID); RecurringSubscriptionCommand = string.Empty; RecurringSubscriptionResult = (profileResponse.CreateRecurringPaymentsProfileResponseDetails.DCCProcessorResponse == null ? "No response provided" : profileResponse.CreateRecurringPaymentsProfileResponseDetails.DCCProcessorResponse); //Log the transaction OrderTransactionCollection ecRecurringOrderTransaction = new OrderTransactionCollection(OriginalRecurringOrderNumber); ecRecurringOrderTransaction.AddTransaction("PayPal Express Checkout Recurring Profile Creation", request.ToString(), result, string.Empty, (profileResponse.CreateRecurringPaymentsProfileResponseDetails.ProfileID == null ? "No ProfileID provided" : profileResponse.CreateRecurringPaymentsProfileResponseDetails.ProfileID), AppLogic.ro_PMPayPalExpress, null, RecurringAmount); } catch { result = "Recurring Profile Creation Failed."; RecurringSubscriptionID = string.Empty; RecurringSubscriptionCommand = string.Empty; RecurringSubscriptionResult = result; } 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); }
/// <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); }
/// <summary> /// Process recurring payment /// </summary> /// <param name="paymentInfo">Payment info required for an order processing</param> /// <param name="customer">Customer</param> /// <param name="orderGuid">Unique order identifier</param> /// <param name="processPaymentResult">Process payment result</param> public void ProcessRecurringPayment(PaymentInfo paymentInfo, Customer customer, Guid orderGuid, ref ProcessPaymentResult processPaymentResult) { InitSettings(); CreateRecurringPaymentsProfileReq req = new CreateRecurringPaymentsProfileReq(); req.CreateRecurringPaymentsProfileRequest = new CreateRecurringPaymentsProfileRequestType(); req.CreateRecurringPaymentsProfileRequest.Version = this.APIVersion; CreateRecurringPaymentsProfileRequestDetailsType details = new CreateRecurringPaymentsProfileRequestDetailsType(); req.CreateRecurringPaymentsProfileRequest.CreateRecurringPaymentsProfileRequestDetails = details; details.CreditCard = new CreditCardDetailsType(); details.CreditCard.CreditCardNumber = paymentInfo.CreditCardNumber; details.CreditCard.CreditCardType = GetPaypalCreditCardType(paymentInfo.CreditCardType); details.CreditCard.ExpMonthSpecified = true; details.CreditCard.ExpMonth = paymentInfo.CreditCardExpireMonth; details.CreditCard.ExpYearSpecified = true; details.CreditCard.ExpYear = paymentInfo.CreditCardExpireYear; details.CreditCard.CVV2 = paymentInfo.CreditCardCvv2; details.CreditCard.CardOwner = new PayerInfoType(); details.CreditCard.CardOwner.PayerCountry = GetPaypalCountryCodeType(paymentInfo.BillingAddress.Country); details.CreditCard.CreditCardTypeSpecified = true; details.CreditCard.CardOwner.Address = new AddressType(); details.CreditCard.CardOwner.Address.CountrySpecified = true; details.CreditCard.CardOwner.Address.Street1 = paymentInfo.BillingAddress.Address1; details.CreditCard.CardOwner.Address.Street2 = paymentInfo.BillingAddress.Address2; details.CreditCard.CardOwner.Address.CityName = paymentInfo.BillingAddress.City; if (paymentInfo.BillingAddress.StateProvince != null) { details.CreditCard.CardOwner.Address.StateOrProvince = paymentInfo.BillingAddress.StateProvince.Abbreviation; } else { details.CreditCard.CardOwner.Address.StateOrProvince = "CA"; } details.CreditCard.CardOwner.Address.Country = GetPaypalCountryCodeType(paymentInfo.BillingAddress.Country); details.CreditCard.CardOwner.Address.PostalCode = paymentInfo.BillingAddress.ZipPostalCode; details.CreditCard.CardOwner.Payer = paymentInfo.BillingAddress.Email; details.CreditCard.CardOwner.PayerName = new PersonNameType(); details.CreditCard.CardOwner.PayerName.FirstName = paymentInfo.BillingAddress.FirstName; details.CreditCard.CardOwner.PayerName.LastName = paymentInfo.BillingAddress.LastName; //start date details.RecurringPaymentsProfileDetails = new RecurringPaymentsProfileDetailsType(); details.RecurringPaymentsProfileDetails.BillingStartDate = DateTime.UtcNow; details.RecurringPaymentsProfileDetails.ProfileReference = orderGuid.ToString(); //schedule details.ScheduleDetails = new ScheduleDetailsType(); details.ScheduleDetails.Description = string.Format("{0} - {1}", IoC.Resolve <ISettingManager>().StoreName, "recurring payment"); details.ScheduleDetails.PaymentPeriod = new BillingPeriodDetailsType(); details.ScheduleDetails.PaymentPeriod.Amount = new BasicAmountType(); details.ScheduleDetails.PaymentPeriod.Amount.Value = paymentInfo.OrderTotal.ToString("N", new CultureInfo("en-us")); details.ScheduleDetails.PaymentPeriod.Amount.currencyID = PaypalHelper.GetPaypalCurrency(IoC.Resolve <ICurrencyService>().PrimaryStoreCurrency); details.ScheduleDetails.PaymentPeriod.BillingFrequency = paymentInfo.RecurringCycleLength; switch (paymentInfo.RecurringCyclePeriod) { case (int)RecurringProductCyclePeriodEnum.Days: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Day; break; case (int)RecurringProductCyclePeriodEnum.Weeks: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Week; break; case (int)RecurringProductCyclePeriodEnum.Months: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Month; break; case (int)RecurringProductCyclePeriodEnum.Years: details.ScheduleDetails.PaymentPeriod.BillingPeriod = BillingPeriodType.Year; break; default: throw new NopException("Not supported cycle period"); } details.ScheduleDetails.PaymentPeriod.TotalBillingCycles = paymentInfo.RecurringTotalCycles; details.ScheduleDetails.PaymentPeriod.TotalBillingCyclesSpecified = true; CreateRecurringPaymentsProfileResponseType response = service2.CreateRecurringPaymentsProfile(req); string error = string.Empty; bool Success = PaypalHelper.CheckSuccess(response, out error); if (Success) { processPaymentResult.PaymentStatus = PaymentStatusEnum.Pending; if (response.CreateRecurringPaymentsProfileResponseDetails != null) { processPaymentResult.SubscriptionTransactionId = response.CreateRecurringPaymentsProfileResponseDetails.ProfileID; } } else { processPaymentResult.Error = error; processPaymentResult.FullError = error; } }
// # CreateRecurringPaymentsProfile API Operation // The CreateRecurringPaymentsProfile API operation creates a recurring payments profile. // You must invoke the CreateRecurringPaymentsProfile API operation for each profile you want to create. // The API operation creates a profile and an associated billing agreement. // Note: // There is a one-to-one correspondence between billing agreements and recurring payments profiles. // To associate a recurring payments profile with its billing agreement, // you must ensure that the description in the recurring payments profile matches the description of a billing agreement. // For version 54.0 and later, use SetExpressCheckout to initiate creation of a billing agreement. public CreateRecurringPaymentsProfileResponseType CreateRecurringPaymentsProfileAPIOperation() { // Create the CreateRecurringPaymentsProfileResponseType object CreateRecurringPaymentsProfileResponseType responseCreateRecurringPaymentsProfileResponseType = new CreateRecurringPaymentsProfileResponseType(); try { // Create the CreateRecurringPaymentsProfileReq object CreateRecurringPaymentsProfileReq createRecurringPaymentsProfile = new CreateRecurringPaymentsProfileReq(); // Create the CreateRecurringPaymentsProfileRequestType object CreateRecurringPaymentsProfileRequestType createRecurringPaymentsProfileRequest = new CreateRecurringPaymentsProfileRequestType(); // You can include up to 10 recurring payments profiles per request. The // order of the profile details must match the order of the billing // agreement details specified in the SetExpressCheckout request which // takes mandatory argument: // // * `billing start date` - The date when billing for this profile begins. // `Note: // The profile may take up to 24 hours for activation.` RecurringPaymentsProfileDetailsType recurringPaymentsProfileDetails = new RecurringPaymentsProfileDetailsType("2013-12-31T13:01:19+00:00"); // Billing amount for each billing cycle during this payment period. // This amount does not include shipping and tax amounts. // `Note: // All amounts in the CreateRecurringPaymentsProfile request must have // the same currency.` BasicAmountType billingAmount = new BasicAmountType(CurrencyCodeType.USD, "3.00"); // Regular payment period for this schedule which takes mandatory // params: // // * `Billing Period` - Unit for billing during this subscription period. It is one of the // following values: // * Day // * Week // * SemiMonth // * Month // * Year // For SemiMonth, billing is done on the 1st and 15th of each month. // `Note: // The combination of BillingPeriod and BillingFrequency cannot exceed // one year.` // * `Billing Frequency` - Number of billing periods that make up one billing cycle. // The combination of billing frequency and billing period must be less // than or equal to one year. For example, if the billing cycle is // Month, the maximum value for billing frequency is 12. Similarly, if // the billing cycle is Week, the maximum value for billing frequency is // 52. // `Note: // If the billing period is SemiMonth, the billing frequency must be 1.` // * `Billing Amount` BillingPeriodDetailsType paymentPeriod = new BillingPeriodDetailsType(BillingPeriodType.DAY, Convert.ToInt32("5"), billingAmount); // Describes the recurring payments schedule, including the regular // payment period, whether there is a trial period, and the number of // payments that can fail before a profile is suspended which takes // mandatory params: // // * `Description` - Description of the recurring payment. // `Note: // You must ensure that this field matches the corresponding billing // agreement description included in the SetExpressCheckout request.` // * `Payment Period` ScheduleDetailsType scheduleDetails = new ScheduleDetailsType("description", paymentPeriod); // `CreateRecurringPaymentsProfileRequestDetailsType` which takes // mandatory params: // // * `Recurring Payments Profile Details` // * `Schedule Details` CreateRecurringPaymentsProfileRequestDetailsType createRecurringPaymentsProfileRequestDetails = new CreateRecurringPaymentsProfileRequestDetailsType(recurringPaymentsProfileDetails, scheduleDetails); // Either EC token or a credit card number is required.If you include // both token and credit card number, the token is used and credit card number is // ignored // In case of setting EC token, // `createRecurringPaymentsProfileRequestDetails.Token = "EC-5KH01765D1724703R";` // A timestamped token, the value of which was returned in the response // to the first call to SetExpressCheckout. Call // CreateRecurringPaymentsProfile once for each billing // agreement included in SetExpressCheckout request and use the same // token for each call. Each CreateRecurringPaymentsProfile request // creates a single recurring payments profile. // `Note: // Tokens expire after approximately 3 hours.` // Credit card information for recurring payments using direct payments. CreditCardDetailsType creditCard = new CreditCardDetailsType(); // Type of credit card. For UK, only Maestro, MasterCard, Discover, and // Visa are allowable. For Canada, only MasterCard and Visa are // allowable and Interac debit cards are not supported. It is one of the // following values: // // * Visa // * MasterCard // * Discover // * Amex // * Solo // * Switch // * Maestro: See note. // `Note: // If the credit card type is Maestro, you must set currencyId to GBP. // In addition, you must specify either StartMonth and StartYear or // IssueNumber.` creditCard.CreditCardType = CreditCardTypeType.VISA; // Credit Card Number creditCard.CreditCardNumber = "4442662639546634"; // Credit Card Expiration Month creditCard.ExpMonth = Convert.ToInt32("12"); // Credit Card Expiration Year creditCard.ExpYear = Convert.ToInt32("2016"); createRecurringPaymentsProfileRequestDetails.CreditCard = creditCard; createRecurringPaymentsProfileRequest.CreateRecurringPaymentsProfileRequestDetails = createRecurringPaymentsProfileRequestDetails; createRecurringPaymentsProfile.CreateRecurringPaymentsProfileRequest = createRecurringPaymentsProfileRequest; // # Create the service wrapper object to make the API call PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService(); // # API call // Invoke the CreateRecurringPaymentsProfile method responseCreateRecurringPaymentsProfileResponseType = service.CreateRecurringPaymentsProfile(createRecurringPaymentsProfile); if (responseCreateRecurringPaymentsProfileResponseType != null) { // Response envelope acknowledgement string acknowledgement = "CreateRecurringPaymentsProfile API Operation - "; acknowledgement += responseCreateRecurringPaymentsProfileResponseType.Ack.ToString(); logger.Info(acknowledgement + "\n"); Console.WriteLine(acknowledgement + "\n"); // # Success values if (responseCreateRecurringPaymentsProfileResponseType.Ack.ToString().Trim().ToUpper().Equals("SUCCESS")) { // A unique identifier for future reference to the details of this recurring payment logger.Info("Profile ID : " + responseCreateRecurringPaymentsProfileResponseType.CreateRecurringPaymentsProfileResponseDetails.ProfileID + "\n"); Console.WriteLine("Profile ID : " + responseCreateRecurringPaymentsProfileResponseType.CreateRecurringPaymentsProfileResponseDetails.ProfileID + "\n"); } // # Error Values else { List <ErrorType> errorMessages = responseCreateRecurringPaymentsProfileResponseType.Errors; foreach (ErrorType error in errorMessages) { logger.Debug("API Error Message : " + error.LongMessage); Console.WriteLine("API Error Message : " + error.LongMessage + "\n"); } } } } // # Exception log catch (System.Exception ex) { // Log the exception message logger.Debug("Error Message : " + ex.Message); Console.WriteLine("Error Message : " + ex.Message); } return(responseCreateRecurringPaymentsProfileResponseType); }
public static String MakeECRecurringProfile(ShoppingCart cart, int orderNumber, String payPalToken, String payerID, DateTime nextRecurringShipDate) { PayPalAPISoapBinding IPayPalRefund; PayPalAPIAASoapBinding IPayPal; PayPalController.GetPaypalRequirements(out IPayPalRefund, out IPayPal); String result = String.Empty; CreateRecurringPaymentsProfileReq ECRecurringRequest = new CreateRecurringPaymentsProfileReq(); CreateRecurringPaymentsProfileRequestType varECRequest = new CreateRecurringPaymentsProfileRequestType(); CreateRecurringPaymentsProfileRequestDetailsType varECRequestDetails = new CreateRecurringPaymentsProfileRequestDetailsType(); CreateRecurringPaymentsProfileResponseType ECRecurringResponse = new CreateRecurringPaymentsProfileResponseType(); //Re-Use the Internal Gateway Recurring Billing logic for calculating how much of the order is recurring ShoppingCart cartRecur = new ShoppingCart(cart.ThisCustomer.SkinID, cart.ThisCustomer, CartTypeEnum.RecurringCart, orderNumber, false); Decimal CartTotalRecur = Decimal.Round(cartRecur.Total(true), 2, MidpointRounding.AwayFromZero); Decimal RecurringAmount = CartTotalRecur - CommonLogic.IIF(cartRecur.Coupon.CouponType == CouponTypeEnum.GiftCard, CommonLogic.IIF(CartTotalRecur < cartRecur.Coupon.DiscountAmount, CartTotalRecur, cartRecur.Coupon.DiscountAmount), 0); DateIntervalTypeEnum ecRecurringIntervalType = cartRecur.CartItems[0].RecurringIntervalType; //We currently only support 1 interval per recurring order, so grabbing the first as a default should be safe int ecRecurringInterval = cartRecur.CartItems[0].RecurringInterval; BasicAmountType ecRecurringAmount = new BasicAmountType(); ecRecurringAmount.currencyID = (CurrencyCodeType)Enum.Parse(typeof(CurrencyCodeType), AppLogic.AppConfig("Localization.StoreCurrency"), true); ecRecurringAmount.Value = RecurringAmount.ToString(); BillingPeriodDetailsType varECSchedulePaymentDetails = GetECRecurringPeriodDetails(ecRecurringIntervalType, ecRecurringInterval); varECSchedulePaymentDetails.Amount = ecRecurringAmount; varECSchedulePaymentDetails.TotalBillingCyclesSpecified = false; ScheduleDetailsType varECSchedule = new ScheduleDetailsType(); //Need a better description, but it must match the one sent in StartEC varECSchedule.Description = "Recurring order created on " + System.DateTime.Now.ToShortDateString() + " from " + AppLogic.AppConfig("StoreName"); varECSchedule.MaxFailedPayments = 0; //Cancel the order if a recurrence fails varECSchedule.MaxFailedPaymentsSpecified = true; varECSchedule.AutoBillOutstandingAmount = AutoBillType.NoAutoBill; varECSchedule.AutoBillOutstandingAmountSpecified = true; varECSchedule.PaymentPeriod = varECSchedulePaymentDetails; RecurringPaymentsProfileDetailsType varECProfileDetails = new RecurringPaymentsProfileDetailsType(); varECProfileDetails.SubscriberName = cart.ThisCustomer.FirstName + " " + cart.ThisCustomer.LastName; varECProfileDetails.BillingStartDate = nextRecurringShipDate; varECRequestDetails.ScheduleDetails = varECSchedule; varECRequestDetails.Token = payPalToken; varECRequestDetails.RecurringPaymentsProfileDetails = varECProfileDetails; if (cart.IsAllDownloadComponents()) { PaymentDetailsItemType varECPaymentDetails = new PaymentDetailsItemType(); varECPaymentDetails.ItemCategory = ItemCategoryType.Digital; varECPaymentDetails.ItemCategorySpecified = true; List <PaymentDetailsItemType> ECPaymentDetailsList = new List <PaymentDetailsItemType>(); ECPaymentDetailsList.Add(varECPaymentDetails); varECRequestDetails.PaymentDetailsItem = ECPaymentDetailsList.ToArray(); } varECRequest.Version = API_VER; varECRequest.CreateRecurringPaymentsProfileRequestDetails = varECRequestDetails; ECRecurringRequest.CreateRecurringPaymentsProfileRequest = varECRequest; ECRecurringResponse = IPayPal.CreateRecurringPaymentsProfile(ECRecurringRequest); if (ECRecurringResponse.Ack.ToString().StartsWith("success", StringComparison.InvariantCultureIgnoreCase)) { result = AppLogic.ro_OK; } else { if (ECRecurringResponse.Errors != null) { bool first = true; for (int ix = 0; ix < ECRecurringResponse.Errors.Length; ix++) { if (!first) { result += ", "; } result += ECRecurringResponse.Errors[ix].LongMessage; first = false; } } } //Log the transaction OrderTransactionCollection ecRecurringOrderTransaction = new OrderTransactionCollection(orderNumber); ecRecurringOrderTransaction.AddTransaction("PayPal Express Checkout Recurring Profile Creation", ECRecurringRequest.ToString(), result, payerID, //PNREF = payerID (ECRecurringResponse.CreateRecurringPaymentsProfileResponseDetails.ProfileID == null ? "No ProfileID provided" : ECRecurringResponse.CreateRecurringPaymentsProfileResponseDetails.ProfileID), //Code = ProfileID AppLogic.ro_PMPayPalExpress, null, RecurringAmount); return(result); }