public override string RecurringBillingCancelSubscription(String RecurringSubscriptionID, int OriginalRecurringOrderNumber, IDictionary <string, string> TransactionContext) { string profileID = string.Empty; string result = string.Empty; profileID = PayPalController.GetPPECProfileID(OriginalRecurringOrderNumber); if (profileID != string.Empty) { ManageRecurringPaymentsProfileStatusRequestDetailsType recurringRequestDetails = new ManageRecurringPaymentsProfileStatusRequestDetailsType(); recurringRequestDetails.Action = StatusChangeActionType.Cancel; recurringRequestDetails.ProfileID = profileID; ManageRecurringPaymentsProfileStatusRequestType recurringRequest = new ManageRecurringPaymentsProfileStatusRequestType(); recurringRequest.ManageRecurringPaymentsProfileStatusRequestDetails = recurringRequestDetails; recurringRequest.Version = API_VER; ManageRecurringPaymentsProfileStatusReq profileStatusRequest = new ManageRecurringPaymentsProfileStatusReq(); profileStatusRequest.ManageRecurringPaymentsProfileStatusRequest = recurringRequest; ManageRecurringPaymentsProfileStatusResponseType recurringResponse = new ManageRecurringPaymentsProfileStatusResponseType(); recurringResponse = IPayPal.ManageRecurringPaymentsProfileStatus(profileStatusRequest); if (recurringResponse != null && recurringResponse.Ack.ToString().StartsWith("success", StringComparison.InvariantCultureIgnoreCase)) { result = AppLogic.ro_OK; } else { if (recurringResponse.Errors != null) { bool first = true; for (int ix = 0; ix < recurringResponse.Errors.Length; ix++) { if (!first) { result += ", "; } result += recurringResponse.Errors[ix].LongMessage; first = false; } } } } else { result = "No matching Profile ID found for that order number"; SysLog.LogMessage("An attempt was made to cancel a PayPal recurring order with no matching Profile ID", "Original order ID was: " + OriginalRecurringOrderNumber.ToString(), MessageTypeEnum.Informational, MessageSeverityEnum.Alert); } return(result); }
public static void GetPaypalRequirements(out PayPalAPISoapBinding IPayPalRefund, out PayPalAPIAASoapBinding IPayPal) { IPayPal = new PayPalAPIAASoapBinding(); IPayPalRefund = new PayPalAPISoapBinding(); if (AppLogic.AppConfigBool("UseLiveTransactions")) { IPayPal.Url = AppLogic.AppConfig("PayPal.API.LiveURL"); } else { IPayPal.Url = AppLogic.AppConfig("PayPal.API.TestURL"); } IPayPalRefund.Url = IPayPal.Url; IPayPal.UserAgent = HttpContext.Current.Request.UserAgent; IPayPalRefund.UserAgent = IPayPal.UserAgent; UserIdPasswordType PayPalUser = new UserIdPasswordType(); if (PayPalController.GetAppropriateExpressType() == ExpressAPIType.PayPalAcceleratedBording) { PayPalUser.Subject = AppLogic.AppConfig("PayPal.API.AcceleratedBoardingEmailAddress"); } else { PayPalUser.Username = AppLogic.AppConfig("PayPal.API.Username"); PayPalUser.Password = AppLogic.AppConfig("PayPal.API.Password"); PayPalUser.Signature = AppLogic.AppConfig("PayPal.API.Signature"); //Subject should be the Sellers e-mail address (if you are using 3-part API calls) with the correct account permissions. You also have //set up permissions for this e-mail address for the "type" of transaction you want to allow. //This access changes are made in the Sandbox. //The name of the entity on behalf of which this profile is issuing calls //This is for Third-Party access // You have to set up Virtual Terminals and complete the Billing Agreement in the Sandbox before you can make Direct Payments PayPalUser.Subject = AppLogic.AppConfig("PayPal.API.MerchantEMailAddress"); } CustomSecurityHeaderType CSecHeaderType = new CustomSecurityHeaderType(); CSecHeaderType.Credentials = PayPalUser; CSecHeaderType.MustUnderstand = true; IPayPal.RequesterCredentials = CSecHeaderType; IPayPalRefund.RequesterCredentials = CSecHeaderType; }
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); }
public PayPal() { PayPalController.GetPaypalRequirements(out IPayPalRefund, out IPayPal); }
public string CancelPPECRecurringOrder(int OriginalOrderNumber, bool TriggeredByPayPal) { String result = AppLogic.ro_OK; Order originalOrder = new Order(OriginalOrderNumber); Customer customerToNotify = new Customer(originalOrder.CustomerID, true); //Cancel the recurring profile on PayPal's end if (TriggeredByPayPal == false) { result = PayPalController.CancelECRecurringProfile(OriginalOrderNumber); } if (result == AppLogic.ro_OK) { //Cancel the recurring profile in the cart DB.ExecuteSQL(String.Format("delete from kitcart where OriginalRecurringOrderNumber={0}", OriginalOrderNumber.ToString())); DB.ExecuteSQL(String.Format("delete from ShoppingCart where OriginalRecurringOrderNumber={0}", OriginalOrderNumber.ToString())); // now notify people of cancellation: try { // send email notification to customer string emailSubject = String.Format("{0} - Recurring Order Canceled", AppLogic.AppConfig("StoreName")); string emailBody = String.Format("Your recurring order has been canceled. The original order number was: {0}", OriginalOrderNumber.ToString()); AppLogic.SendMail(subject: emailSubject, body: emailBody + AppLogic.AppConfig("MailFooter"), useHtml: true, fromAddress: AppLogic.AppConfig("ReceiptEMailFrom"), fromName: AppLogic.AppConfig("ReceiptEMailFromName"), toAddress: customerToNotify.EMail, toName: customerToNotify.EMail, bccAddresses: String.Empty, server: AppLogic.MailServer()); // send email notification to admin if (AppLogic.AppConfig("GotOrderEMailTo").Length != 0 && !AppLogic.AppConfigBool("TurnOffStoreAdminEMailNotifications")) { String SendToList = AppLogic.AppConfig("GotOrderEMailTo").Replace(",", ";"); if (SendToList.IndexOf(';') != -1) { foreach (String s in SendToList.Split(';')) { AppLogic.SendMail(subject: emailSubject, body: emailBody + AppLogic.AppConfig("MailFooter"), useHtml: true, fromAddress: AppLogic.AppConfig("GotOrderEMailFrom"), fromName: AppLogic.AppConfig("GotOrderEMailFromName"), toAddress: s.Trim(), toName: s.Trim(), bccAddresses: String.Empty, server: AppLogic.MailServer()); } } else { AppLogic.SendMail(subject: emailSubject, body: emailBody + AppLogic.AppConfig("MailFooter"), useHtml: true, fromAddress: AppLogic.AppConfig("GotOrderEMailFrom"), fromName: AppLogic.AppConfig("GotOrderEMailFromName"), toAddress: SendToList, toName: SendToList, bccAddresses: String.Empty, server: AppLogic.MailServer()); } } } catch { SysLog.LogMessage(String.Format("Your recurring order has been canceled. The original order number was: {0}", OriginalOrderNumber.ToString()), result, MessageTypeEnum.Informational, MessageSeverityEnum.Message); } } return(result); }
public string CancelPPECRecurringOrder(int OriginalOrderNumber, bool TriggeredByPayPal) { String result = AppLogic.ro_OK; Order originalOrder = new Order(OriginalOrderNumber); Customer customerToNotify = new Customer(originalOrder.CustomerID, true); //Cancel the recurring profile on PayPal's end if (TriggeredByPayPal == false) { result = PayPalController.CancelECRecurringProfile(OriginalOrderNumber); } if (result == AppLogic.ro_OK) { //Cancel the recurring profile in the cart DB.ExecuteSQL(String.Format("delete from kitcart where OriginalRecurringOrderNumber={0}", OriginalOrderNumber.ToString())); DB.ExecuteSQL(String.Format("delete from ShoppingCart where OriginalRecurringOrderNumber={0}", OriginalOrderNumber.ToString())); // now notify people of cancellation: try { // send email notification to customer string emailSubject = String.Format(AppLogic.GetString("recurringorder.canceled.subject", customerToNotify.SkinID, customerToNotify.LocaleSetting), AppLogic.AppConfig("StoreName")); string emailBody = String.Format(AppLogic.GetString("recurringorder.canceled.body", customerToNotify.SkinID, customerToNotify.LocaleSetting), OriginalOrderNumber.ToString()); AppLogic.SendMail(emailSubject, emailBody + AppLogic.AppConfig("MailFooter"), true, AppLogic.AppConfig("ReceiptEMailFrom"), AppLogic.AppConfig("ReceiptEMailFromName"), customerToNotify.EMail, customerToNotify.EMail, String.Empty, AppLogic.MailServer()); // send email notification to admin if (AppLogic.AppConfig("GotOrderEMailTo").Length != 0 && !AppLogic.AppConfigBool("TurnOffStoreAdminEMailNotifications")) { String SendToList = AppLogic.AppConfig("GotOrderEMailTo").Replace(",", ";"); if (SendToList.IndexOf(';') != -1) { foreach (String s in SendToList.Split(';')) { AppLogic.SendMail(emailSubject, emailBody + AppLogic.AppConfig("MailFooter"), true, AppLogic.AppConfig("GotOrderEMailFrom"), AppLogic.AppConfig("GotOrderEMailFromName"), s.Trim(), s.Trim(), String.Empty, AppLogic.MailServer()); } } else { AppLogic.SendMail(emailSubject, emailBody + AppLogic.AppConfig("MailFooter"), true, AppLogic.AppConfig("GotOrderEMailFrom"), AppLogic.AppConfig("GotOrderEMailFromName"), SendToList, SendToList, String.Empty, AppLogic.MailServer()); } } } catch { SysLog.LogMessage(String.Format(AppLogic.GetStringForDefaultLocale("recurringorder.canceled.body"), OriginalOrderNumber.ToString()), result, MessageTypeEnum.Informational, MessageSeverityEnum.Message); } } return(result); }
public static String CancelECRecurringProfile(int OriginalOrderNumber) { PayPalAPISoapBinding IPayPalRefund; PayPalAPIAASoapBinding IPayPal; PayPalController.GetPaypalRequirements(out IPayPalRefund, out IPayPal); String profileID = String.Empty; String result = String.Empty; profileID = GetPPECProfileID(OriginalOrderNumber); if (profileID != String.Empty) { ManageRecurringPaymentsProfileStatusReq ECRecurringCancelRequest = new ManageRecurringPaymentsProfileStatusReq(); ManageRecurringPaymentsProfileStatusRequestType varECRecurringRequest = new ManageRecurringPaymentsProfileStatusRequestType(); ManageRecurringPaymentsProfileStatusRequestDetailsType varECRecurringRequestDetails = new ManageRecurringPaymentsProfileStatusRequestDetailsType(); ManageRecurringPaymentsProfileStatusResponseType varECRecurringResponse = new ManageRecurringPaymentsProfileStatusResponseType(); varECRecurringRequestDetails.Action = StatusChangeActionType.Cancel; varECRecurringRequestDetails.ProfileID = profileID; varECRecurringRequest.ManageRecurringPaymentsProfileStatusRequestDetails = varECRecurringRequestDetails; varECRecurringRequest.Version = API_VER; ECRecurringCancelRequest.ManageRecurringPaymentsProfileStatusRequest = varECRecurringRequest; varECRecurringResponse = IPayPal.ManageRecurringPaymentsProfileStatus(ECRecurringCancelRequest); if (varECRecurringResponse.Ack.ToString().StartsWith("success", StringComparison.InvariantCultureIgnoreCase)) { result = AppLogic.ro_OK; } else { if (varECRecurringResponse.Errors != null) { bool first = true; for (int ix = 0; ix < varECRecurringResponse.Errors.Length; ix++) { if (!first) { result += ", "; } result += varECRecurringResponse.Errors[ix].LongMessage; first = false; } } } } else { result = "No matching ProfileID found for that order number"; SysLog.LogMessage("An attempt was made to cancel a PayPal express recurring order with no matching ProfileID", "Original order ID was: " + OriginalOrderNumber.ToString(), MessageTypeEnum.Informational, MessageSeverityEnum.Alert); } return(result); }
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); }
public static String ProcessEC(ShoppingCart cart, decimal OrderTotal, int OrderNumber, String PayPalToken, String PayerID, String TransactionMode, out String AuthorizationResult, out String AuthorizationTransID) { PayPalAPISoapBinding IPayPalRefund; PayPalAPIAASoapBinding IPayPal; PayPalController.GetPaypalRequirements(out IPayPalRefund, out IPayPal); String result = String.Empty; AuthorizationResult = String.Empty; AuthorizationTransID = String.Empty; DoExpressCheckoutPaymentReq ECRequest = new DoExpressCheckoutPaymentReq(); DoExpressCheckoutPaymentRequestType varECRequest = new DoExpressCheckoutPaymentRequestType(); DoExpressCheckoutPaymentRequestDetailsType varECRequestDetails = new DoExpressCheckoutPaymentRequestDetailsType(); DoExpressCheckoutPaymentResponseType ECResponse = new DoExpressCheckoutPaymentResponseType(); DoExpressCheckoutPaymentResponseDetailsType varECResponse = new DoExpressCheckoutPaymentResponseDetailsType(); ECRequest.DoExpressCheckoutPaymentRequest = varECRequest; varECRequest.DoExpressCheckoutPaymentRequestDetails = varECRequestDetails; ECResponse.DoExpressCheckoutPaymentResponseDetails = varECResponse; varECRequestDetails.Token = PayPalToken; varECRequestDetails.PayerID = PayerID; varECRequestDetails.PaymentAction = PaymentActionCodeType.Authorization; if (TransactionMode == AppLogic.ro_TXModeAuthCapture || AppLogic.AppConfigBool("PayPal.ForceCapture") || PayPalController.GetAppropriateExpressType() == ExpressAPIType.PayPalAcceleratedBording) { varECRequestDetails.PaymentAction = PaymentActionCodeType.Sale; } varECRequestDetails.PaymentActionSpecified = true; PaymentDetailsType ECPaymentDetails = new PaymentDetailsType(); BasicAmountType ECPaymentOrderTotal = new BasicAmountType(); ECPaymentOrderTotal.Value = Localization.CurrencyStringForGatewayWithoutExchangeRate(OrderTotal); ECPaymentOrderTotal.currencyID = (CurrencyCodeType)Enum.Parse(typeof(CurrencyCodeType), AppLogic.AppConfig("Localization.StoreCurrency"), true); ECPaymentDetails.InvoiceID = OrderNumber.ToString(); ECPaymentDetails.Custom = cart.ThisCustomer.CustomerID.ToString(); ECPaymentDetails.ButtonSource = PayPalController.BN + "_EC_US"; ECPaymentDetails.NotifyURL = AppLogic.GetStoreHTTPLocation(true) + AppLogic.AppConfig("PayPal.NotificationURL"); varECRequest.Version = API_VER; ECPaymentDetails.OrderTotal = ECPaymentOrderTotal; List <PaymentDetailsType> ECPaymentDetailsList = new List <PaymentDetailsType>(); ECPaymentDetailsList.Add(ECPaymentDetails); varECRequestDetails.PaymentDetails = ECPaymentDetailsList.ToArray(); ECResponse = IPayPal.DoExpressCheckoutPayment(ECRequest); if (ECResponse.Ack.ToString().StartsWith("success", StringComparison.InvariantCultureIgnoreCase)) { AuthorizationTransID = CommonLogic.IIF(varECRequestDetails.PaymentAction == PaymentActionCodeType.Sale, "CAPTURE=", "AUTH=") + ECResponse.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0].TransactionID; result = AppLogic.ro_OK; AuthorizationResult = ECResponse.Ack.ToString(); SetECFaultRedirect(cart.ThisCustomer, string.Empty); } else { if (ECResponse.Errors != null) { if (ECResponse.Errors.Any(e => e.ErrorCode == ECFaultRedirectErrorCode.ToString())) { // Express Checkout failed funding recovery feature returns a 10486 which signifies that // the user should be redirected back to paypal. result = AuthorizationResult = AppLogic.ro_PMPayPalExpressRedirect; } else { result = AuthorizationResult = string.Join(",", ECResponse.Errors.Select(e => e.LongMessage).ToArray()); } } } return(result); }
public static string StartEC(ShoppingCart cart, bool boolBypassOrderReview, IDictionary <string, string> checkoutOptions) { var payPalRefund = new PayPalAPISoapBinding(); var payPalBinding = new PayPalAPIAASoapBinding(); var redirectUrl = new StringBuilder(); var ecOrderTotal = new BasicAmountType(); var request = new SetExpressCheckoutReq(); var requestType = new SetExpressCheckoutRequestType(); var requestDetails = new SetExpressCheckoutRequestDetailsType(); var response = new SetExpressCheckoutResponseType(); var result = string.Empty; var urlHelper = DependencyResolver.Current.GetService <UrlHelper>(); //Express checkout GetPaypalRequirements(out payPalRefund, out payPalBinding); ecOrderTotal.Value = Localization.CurrencyStringForGatewayWithoutExchangeRate(cart.Total(true)); if (cart.HasRecurringComponents() && AppLogic.AppConfigBool("Recurring.UseGatewayInternalBilling")) { //Have to send extra details on the SetExpressCheckoutReq or the token will be invalid for creating a recurring profile later var recurringAgreement = new BillingAgreementDetailsType(); var recurringAgreementList = new List <BillingAgreementDetailsType>(); recurringAgreement.BillingType = BillingCodeType.RecurringPayments; recurringAgreement.BillingAgreementDescription = "Recurring order created on " + System.DateTime.Now.ToShortDateString() + " from " + AppLogic.AppConfig("StoreName"); recurringAgreementList.Add(recurringAgreement); requestDetails.BillingAgreementDetails = recurringAgreementList.ToArray(); } request.SetExpressCheckoutRequest = requestType; requestType.SetExpressCheckoutRequestDetails = requestDetails; ecOrderTotal.currencyID = (CurrencyCodeType)Enum.Parse(typeof(CurrencyCodeType), AppLogic.AppConfig("Localization.StoreCurrency"), true); requestDetails.OrderTotal = ecOrderTotal; if (AppLogic.AppConfigBool("PayPal.RequireConfirmedAddress")) { requestDetails.ReqConfirmShipping = "1"; } else { requestDetails.ReqConfirmShipping = "0"; } requestDetails.ReturnURL = string.Format("{0}{1}", AppLogic.GetStoreHTTPLocation( useSsl: true, includeScriptLocation: true, noVirtualNoSlash: true), urlHelper.Action( actionName: ActionNames.PayPalExpressReturn, controllerName: ControllerNames.PayPalExpress)); if (boolBypassOrderReview) { requestDetails.ReturnURL = string.Format("{0}?BypassOrderReview=true", requestDetails.ReturnURL); } requestDetails.CancelURL = string.Format("{0}{1}", AppLogic.GetStoreHTTPLocation( useSsl: true, includeScriptLocation: true, noVirtualNoSlash: true), urlHelper.Action( actionName: ActionNames.Index, controllerName: ControllerNames.Checkout)); requestDetails.LocaleCode = AppLogic.AppConfig("PayPal.DefaultLocaleCode"); requestDetails.PaymentAction = PaymentActionCodeType.Authorization; if (AppLogic.TransactionModeIsAuthCapture() || AppLogic.AppConfigBool("PayPal.ForceCapture") || PayPalController.GetAppropriateExpressType() == ExpressAPIType.PayPalAcceleratedBording) { requestDetails.PaymentAction = PaymentActionCodeType.Sale; } requestDetails.SolutionType = SolutionTypeType.Sole; requestDetails.PaymentActionSpecified = true; requestType.Version = API_VER; if (!string.IsNullOrWhiteSpace(AppLogic.AppConfig("PayPal.Express.PageStyle"))) { requestDetails.PageStyle = AppLogic.AppConfig("PayPal.Express.PageStyle").Trim(); } if (!string.IsNullOrWhiteSpace(AppLogic.AppConfig("PayPal.Express.HeaderImage"))) { requestDetails.cppheaderimage = AppLogic.AppConfig("PayPal.Express.HeaderImage").Trim(); } if (!string.IsNullOrWhiteSpace(AppLogic.AppConfig("PayPal.Express.HeaderBackColor"))) { requestDetails.cppheaderbackcolor = AppLogic.AppConfig("PayPal.Express.HeaderBackColor").Trim(); } if (!string.IsNullOrWhiteSpace(AppLogic.AppConfig("PayPal.Express.HeaderBorderColor"))) { requestDetails.cppheaderbordercolor = AppLogic.AppConfig("PayPal.Express.HeaderBorderColor").Trim(); } if (!string.IsNullOrWhiteSpace(AppLogic.AppConfig("PayPal.Express.PayFlowColor"))) { requestDetails.cpppayflowcolor = AppLogic.AppConfig("PayPal.Express.PayFlowColor").Trim(); } if (checkoutOptions != null && checkoutOptions.ContainsKey("UserSelectedFundingSource") && checkoutOptions["UserSelectedFundingSource"] == "BML") { var fundingSourceDetails = new FundingSourceDetailsType(); fundingSourceDetails.AllowPushFunding = "0"; fundingSourceDetails.UserSelectedFundingSource = UserSelectedFundingSourceType.BML; fundingSourceDetails.UserSelectedFundingSourceSpecified = true; requestDetails.FundingSourceDetails = fundingSourceDetails; } try { response = payPalBinding.SetExpressCheckout(request); if (response.Ack.ToString().StartsWith("success", StringComparison.InvariantCultureIgnoreCase)) { result = AppLogic.ro_OK; } else { if (response.Errors != null) { bool first = true; for (int ix = 0; ix < response.Errors.Length; ix++) { if (!first) { result += ", "; } result += "Error: [" + response.Errors[ix].ErrorCode + "] " + response.Errors[ix].LongMessage; first = false; } } } } catch (Exception) { result = "Failed to start PayPal Express Checkout! Please try another payment method."; } if (result == AppLogic.ro_OK) { var useIntegratedCheckout = AppLogic.AppConfigBool("PayPal.Express.UseIntegratedCheckout"); if (AppLogic.AppConfigBool("UseLiveTransactions") == true) { redirectUrl.Append(useIntegratedCheckout ? AppLogic.AppConfig("PayPal.Express.IntegratedCheckout.LiveURL") : AppLogic.AppConfig("PayPal.Express.LiveURL")); } else { redirectUrl.Append(useIntegratedCheckout ? AppLogic.AppConfig("PayPal.Express.IntegratedCheckout.SandboxURL") : AppLogic.AppConfig("PayPal.Express.SandboxURL")); } redirectUrl.Append(useIntegratedCheckout ? "?token=" : "?cmd=_express-checkout&token="); redirectUrl.Append(response.Token); if (boolBypassOrderReview) { redirectUrl.Append("&useraction=commit"); } // Set active payment method to PayPalExpress DB.ExecuteSQL(string.Format("UPDATE Address SET PaymentMethodLastUsed={0} WHERE AddressID={1}", DB.SQuote(AppLogic.ro_PMPayPalExpress), cart.ThisCustomer.PrimaryBillingAddressID)); SetECFaultRedirect(cart.ThisCustomer, redirectUrl.ToString()); } else { var error = new ErrorMessage(HttpUtility.HtmlEncode(result)); redirectUrl.Append(urlHelper.BuildCheckoutLink(error.MessageId)); } return(redirectUrl.ToString()); }