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