Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
This topic explains how to create a payment provider for purchasing gift cards. Functionality to deduct or add to the balance of the gift card is not included here -- that must to be added. You also create a new Business Foundation object and tie that to the existing Contact object. With this in place, you can create a gift card and assign that to a contact (customer). To use the gift card payment provider, you create classes and user controls. You must also complete a back-end customization and set up.
Classes in this topic are available in the Mediachase.Commerce.Orders namespace.
Creating classes
Create a class that implements the IPaymentGateway interface.
Example: implementing the payment gateway interface
public class GiftGateway : IPaymentGateway
{
#region IPaymentGateway Members
IDictionary<string, string> _ConfigData;
public bool ProcessPayment(Payment payment, ref string message)
{
OtherPayment p = (OtherPayment)payment;
if (!String.IsNullOrEmpty(p.ValidationCode))
{
GiftManager.DeactivateGiftCard(Settings["GiftCardMetaClass"]
, PrimaryKeyId.Parse(p.ValidationCode));
p.Status = "Processed";
}
return true;
}
/// <summary>
/// Returns the configuration data associated with a gateway.
/// Sets the configuration gateway data. This data typically includes
/// information like gateway URL, account info and so on.
/// </summary>
/// <value>The settings.</value>
/// <returns></returns>public virtual IDictionary
<string, string> Settings
{
get
{
return _ConfigData;
}
set
{
_ConfigData = value;
}
}
#endregion
}
Note : You can ignore error messages that occur at this step.
Example: creating the GiftManager
public static class GiftManager
{
public const string ContactIdFieldName = "ContactId";
public const string AmountFieldName = "Amount";
public const string BalanceFieldName = "Balance";
public const string ContactFieldName = "Contact";
public const string IsActiveFieldName = "IsActive"public const string RedemptionCodeFieldName = "RedemptionCode";
public const string TitleFieldName = "Title";
public static EntityObject[] GetClientGiftCards(string giftCardMetaClass, PrimaryKeyId contactId)
{
return BusinessManager.List(giftCardMetaClass,
new FilterElement[]
{
FilterElement.EqualElement(ContactIdFieldName, contactId),
FilterElement.EqualElement(IsActiveFieldName, true)
});
}
public static void DeactivateGiftCard(string giftCardMetaClass, PrimaryKeyId giftCardId)
{
// Load Gift Card
EntityObject giftCard = BusinessManager.Load(giftCardMetaClass, giftCardId);
// Update field
giftCard[IsActiveFieldName] = false;
// Save Changes
BusinessManager.Update(giftCard);
}
}
Create the user controls needed for the gift card payment provider.
Create a user control called ConfigurePayment.ascx. This user control needs to inherit from System.Web.UI.UserControl, IGatewayControl. See the following code comments in the examples.
Example: creating the ConfigurePayment user control (part 1)
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ConfigurePayment.ascx.cs"
Inherits="GiftCardPaymentProvider.ConfigurePayment" %>
<div id="DataForm">
<table cellpadding="0" cellspacing="2">
<tr>
<td class="FormLabelCell" colspan="2"><b>Configure Gift Card</b></td>
</tr>
</table>
<br />
<table class="DataForm">
<tr>
<td class="FormLabelCell"><asp:Literal ID="Literal4" runat="server" Text="MetaClass name" />:</td>
<td class="FormFieldCell"><asp:TextBox Runat="server" ID="MetaClassName"
Width="230"></asp:TextBox><br>
<asp:RequiredFieldValidator ControlToValidate="MetaClassName" Display="dynamic"
Font-Name="verdana" Font-Size="9pt" ErrorMessage="'MetaClass name' must not be left blank."
runat="server" id="RequiredFieldValidator2"></asp:RequiredFieldValidator>
</td>
</tr>
</table>
</div>
Example: creating the ConfigurePayment user control (part 2)
public partial class ConfigurePayment : System.Web.UI.UserControl, IGatewayControl
{
string _ValidationGroup = String.Empty;
private PaymentMethodDto _PaymentMethodDto = null;
private const string _MetaClassParameterName = "GiftCardMetaClass";
/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Page_Load(object sender, System.EventArgs e)
{
BindData();
}
/// <summary>
/// Binds a data source to the invoked server control and all its child controls.
/// </summary>
public override void DataBind()
{
//BindData();base.DataBind();
}
/// <summary>
/// Binds the data.
/// </summary>public void BindData()
{
// fill in the form fieldsif (_PaymentMethodDto != null && _PaymentMethodDto.PaymentMethodParameter != null)
{
PaymentMethodDto.PaymentMethodParameterRow param = null;
param = GetParameterByName(_MetaClassParameterName);
if (param != null)
MetaClassName.Text = param.Value;
}
elsethis.Visible = false;
}
#region IGatewayControl Members
/// <summary>
/// Saves the object changes.
/// </summary>
/// <param name="dto">The dto.</param>
public void SaveChanges(object dto)
{
if (this.Visible)
{
_PaymentMethodDto = dto as PaymentMethodDto;
if (_PaymentMethodDto != null && _PaymentMethodDto.PaymentMethodParameter != null)
{
Guid paymentMethodId = Guid.Empty;
if (_PaymentMethodDto.PaymentMethod.Count > 0)
paymentMethodId = _PaymentMethodDto.PaymentMethod[0].PaymentMethodId;
PaymentMethodDto.PaymentMethodParameterRow param = null
param = GetParameterByName(_MetaClassParameterName);
if (param != null)
param.Value = MetaClassName.Text;
else
CreateParameter(_PaymentMethodDto, _MetaClassParameterName, MetaClassName.Text, paymentMethodId);
}
}
}
/// <summary>
/// Gets the name of the parameter by.
/// </summary>
/// <param name="name">The name.</param>
/// <returns></returns>
private PaymentMethodDto.PaymentMethodParameterRow GetParameterByName(string name)
{
PaymentMethodDto.PaymentMethodParameterRow[] rows =
(PaymentMethodDto.PaymentMethodParameterRow[])
_PaymentMethodDto.PaymentMethodParameter.Select(String.Format("Parameter = '{0}'", name));
if (rows != null && rows.Length > 0)
return rows[0];
elsereturn null;
}
/// <summary>
/// Creates the parameter.
/// </summary>
/// <param name="dto">The dto.</param>
/// <param name="name">The name.</param>
/// <param name="value">The value.</param>
/// <param name="paymentMethodId">The payment method id.</param>
private void CreateParameter(PaymentMethodDto dto,
string name, string value, Guid paymentMethodId)
{
PaymentMethodDto.PaymentMethodParameterRow newRow =
dto.PaymentMethodParameter.NewPaymentMethodParameterRow();
newRow.PaymentMethodId = paymentMethodId;
newRow.Parameter = name;
newRow.Value = value;
// add the row to the dtoif (newRow.RowState == DataRowState.Detached)
dto.PaymentMethodParameter.Rows.Add(newRow);
}
/// <summary>
/// Loads the object.
/// </summary>
/// <param name="dto">The dto.</param>
public void LoadObject(object dto)
{
_PaymentMethodDto = dto as PaymentMethodDto;
}
/// <summary>
/// Gets or sets the validation group.
/// </summary>
/// <value>The validation group.</value>
public string ValidationGroup
{
get
{
return _ValidationGroup;
}
set
{
_ValidationGroup = value;
}
}
#endregion
}
Create another user control. In this user control, render a radio button for the Gift Card payment option. Call the PaymentMethod.ascx user control.
using Mediachase.BusinessFoundation.Data;
using Mediachase.BusinessFoundation.Data.Business;
using Mediachase.Commerce.Website.BaseControls;
using Mediachase.Commerce.Website;
using Mediachase.Commerce.Security;
using Mediachase.Commerce.Orders.Dto;
using Mediachase.Commerce.Orders.Managers;
using Mediachase.Commerce.Orders;
using System.Threading;
Example: adding a radio button
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PaymentMethod.ascx.cs"
Inherits="GiftCardPaymentProvider.PaymentMethod" %>
<asp:RadioButtonList runat="server" ID="rbList">
</asp:RadioButtonList>
<asp:Label ID="Label1" runat="server" Text="RedemptionCode: "></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" BackColor="White"
BorderStyle="Dashed"></asp:TextBox>
Example: adding a payment method
public partial class PaymentMethod : BaseStoreUserControl, IPaymentOption
{
private void Page_Load(object sender, System.EventArgs e)
{
EntityObject[] objs = GiftManager.GetClientGiftCards(GetGiftCardMetaClassName()
, (PrimaryKeyId)SecurityContext.Current.CurrentUserId);
foreach (EntityObject obj in objs)
{
rbList.Items.Add(new ListItem((string)obj[GiftManager.TitleFieldName],
obj.PrimaryKeyId.ToString()));
}
}
private string GetGiftCardMetaClassName()
{
string GiftCardMetaClass = "GiftCard";
PaymentMethodDto method = PaymentManager.GetPaymentMethodBySystemName
("GiftCard", Thread.CurrentThread.CurrentCulture.Name);
PaymentMethodDto.PaymentMethodParameterRow[] rows =
(PaymentMethodDto.PaymentMethodParameterRow[])
method.PaymentMethodParameter.Select("Parameter = 'GiftCardMetaClass'");
if (rows.Length > 0)
{
GiftCardMetaClass = rows[0].Value;
}
return GiftCardMetaClass;
}
#region IPaymentOption Members
public bool ValidateData()
{
this.Page.Validate(this.ID);
return this.Page.IsValid;
}
public Payment PreProcess(OrderForm form)
{
OtherPayment otherPayment = new OtherPayment();
otherPayment.BillingAddressId = form.BillingAddressId;
otherPayment.ValidationCode = rbList.SelectedValue;
return (Payment)otherPayment;
}
public bool PostProcess(OrderForm form)
{
return true;
}
#endregion
}
Deploy the GiftCardPaymentProvider assembly to the Commerce Manager and the Episerver Commerce sites. We also deploy the user controls into specific folders.
To make the gift card available to customers and to create easy management from back-end, use the Business Foundation (BF) Relationship feature. To track and record relevant data, business objects must be related to other objects, whether they are 1-to-many, many-to-1, or many-to-many.
Note: The Related Object has the Primary Object appear under the opposite relationship (N:1) on its configuration form.
Create a new payment method by using the Gift Card object.
Last updated: Oct 12, 2015