Credid Card Capture Type for Shippable and non-Shippable Products
We presently sell a number of on-demand training videos and documents that use the "Service" product type. The products are immediately available to the customer after they have completed checkout and payment process so our credit card payment method (Authorize.Net AIM) uses the "Authorize and Capture" payment type.
Since many of our orders come in outside of our business hours this works well for us; there's no need to manually process the order and the customer has instant access to their purchased content.
We're about to start adding shippable goods to our product catalog. I'm guessing that using "Authorize and Capture" before shipping the product is a no-no and that I should be using the "Authorize" payment type for shippable products. I'm running SF 6.1 and there doesn't seem to be a way to set payment type by product category.
Anyone have advice on how to best handle this?
Thanks -- Steve
Hello Steve,
In order to achieve your needs you can try the following solution:
1) Create two or more Payment Methods with different options you need.
2) Create a new class inheriting PaymentStep and add the following code sample:
using System;using System.Linq;using System.Web;using System.Web.Script.Serialization;using System.Web.UI.WebControls;using Telerik.Sitefinity.Configuration;using Telerik.Sitefinity.Ecommerce.Orders.Model;using Telerik.Sitefinity.Modules.Ecommerce;using Telerik.Sitefinity.Modules.Ecommerce.BusinessServices;using Telerik.Sitefinity.Modules.Ecommerce.Catalog;using Telerik.Sitefinity.Modules.Ecommerce.Orders;using Telerik.Sitefinity.Modules.Ecommerce.Orders.Configuration;using Telerik.Sitefinity.Modules.Ecommerce.Orders.Web.UI.CheckoutViews;namespace SitefinityWebApp.Examples public class CustomPayment : PaymentStep protected override void InitializeControls(Telerik.Sitefinity.Web.UI.GenericContainer container) base.InitializeControls(container); CartOrder shoppingCart = this.GetShoppingCartForUser(base.OrdersManager); // Check for at least one shippable product in the shopping cart CartDetail cartDetail = shoppingCart.Details.Where(d => d.IsShippable == true).SingleOrDefault(); var availablePaymentMethods = EcommerceBusinessServicesFactory .GetPaymentMethodService() .GetApplicablePaymentMethods(base.CheckoutState, this.GetShoppingCartForUser(base.OrdersManager)) .ToList(); if (cartDetail != null) // At least one shippable product is available in the Cart var paymentMethod = availablePaymentMethods .Where(po => po.Title == "method 1") .SingleOrDefault(); var isFreePayment = false; // Implement logic for free payment, if needed if (paymentMethod != null) bool methodSelected = false; base.PaymentMethodList.Items.Clear(); if (isFreePayment) var listItem = new ListItem(Telerik.Sitefinity.Localization.Res.Get<OrdersResources>().Free, Guid.Empty.ToString()); listItem.Attributes["data-notsupportingcc"] = Convert.ToString(true); this.PaymentMethodList.Items.Add(listItem); this.PaymentMethodList.SelectedIndex = 0; else var listItem = new ListItem(paymentMethod.Title, paymentMethod.Id.ToString()); if (paymentMethod.PaymentMethodType == PaymentMethodType.Offline || !IsPaymentMethodSupportingCards(paymentMethod)) listItem.Attributes["data-notsupportingcc"] = Convert.ToString(true); this.PaymentMethodList.Items.Add(listItem); if (!methodSelected) this.PaymentMethodList.SelectedIndex = 0; public static bool IsPaymentMethodSupportingCards(PaymentMethod paymentMethod) var serializer = new JavaScriptSerializer(); var paymentProcessorConfig = Config.Get<PaymentProcessorConfig>().PaymentProcessorProviders.Values.Where(x => x.IsActive && x.Id.ToString() == paymentMethod.PaymentProcessorId.ToString().ToUpperInvariant()).FirstOrDefault(); if (paymentProcessorConfig != null) Type settingsType = paymentProcessorConfig.SettingsType; dynamic settings = serializer.ConvertToType(serializer.Deserialize(paymentMethod.PaymentProcessorSettings, settingsType), settingsType); return (settings.ProcessorCreditCards != null && settings.ProcessorCreditCards.Length != 0); return false; public Guid GetShoopingCartId() HttpCookie shoppingCartCookie = HttpContext.Current.Request.Cookies[EcommerceConstants.OrdersConstants.ShoppingCartIdCookieName]; if (shoppingCartCookie == null || string.IsNullOrWhiteSpace(shoppingCartCookie.Value)) return Guid.Empty; if (!shoppingCartCookie.Value.IsGuid()) throw new InvalidOperationException("cartOrderId string cannot be parsed as a GUID; please provide a valid cartOrderId value."); return new Guid(shoppingCartCookie.Value); public CartOrder GetShoppingCartForUser(OrdersManager ordersManager) Guid shoppingCartId = GetShoopingCartId(); CartOrder shoppingCart = ordersManager.TryGetCartOrder(shoppingCartId); if (shoppingCart == null) shoppingCartId = Guid.NewGuid(); shoppingCart = ordersManager.CreateCartOrder(shoppingCartId, null); return shoppingCart; <%@ Register TagPrefix="custom" Namespace="SitefinityWebApp.Examples" Assembly="SitefinityWebApp" %><telerik:RadPageview id="paymentView" runat="server" CssClass="sfStep2Wrp"> <custom:CustomPayment id="paymentStep" runat="server" /></telerik:RadPageview>Hi Svetoslav,
Thanks! It may take a couple of days until I'm able to give this a go. I'll report back once I've had a chance to test it.
Steve