Credid Card Capture Type for Shippable and non-Shippable Pro

Posted by Community Admin on 05-Aug-2018 15:37

Credid Card Capture Type for Shippable and non-Shippable Products

All Replies

Posted by Community Admin on 10-Sep-2014 00:00

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

Posted by Community Admin on 15-Sep-2014 00:00
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;
        
    

3) Go to Design > Widget Templates > Checkout and register the CustomPayment
in my case the example is in folder Examples:
<%@ Register TagPrefix="custom" Namespace="SitefinityWebApp.Examples" Assembly="SitefinityWebApp" %>

and update the Shipping options:
<telerik:RadPageview id="paymentView" runat="server" CssClass="sfStep2Wrp">
 <custom:CustomPayment id="paymentStep" runat="server" />
</telerik:RadPageview>

4) Build the solution.

In that way the payment options will depends on the product/s in the shopping cart.

Only one (appropriate) payment method will be added and displayed on Payment step or the list of Payment methods needed in case of extending the logic above.

Regards,
Svetoslav Manchev
Telerik
 
Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
 
Posted by Community Admin on 16-Sep-2014 00:00

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

 

 

This thread is closed