Documentation

Ucommerce includes full API reference documentation and lots of helpful articles to help you build your e-commerce site as effortlessly as possible.

Topics Payment Providers
v7.18

Integrating Ucommerce with a Payment Provider

You will learn how to create a Payment Method Service, which integrates Ucommerce with an online payment provider such as Sage, DIBS, PayPal, Cyber Source, or another provider used during checkout.

Implement Interface IPaymentMethodService

The IPaymentMethodService interface gives you full control over the behavior of the service. Alternatively you can inherit from AbstractPaymentService, which gives a default implementation for ProcessPaymentRequest, which will give you a properly initialized Payment.

Ucommerce.Transactions.Payments.IPaymentMethodService

Description

Interface for implementing a Payment Method Service for payment processing.

Methods


RequestPayment

  • Description
    Requests payment from backing service.
  • Arguments
    • Ucommerce.Transactions.Payments.PaymentRequest request
  • Return type Ucommerce.EntitiesV2.Payment

ProcessPaymentRequest

  • Description
    Processes the payment locally once the request is completed.
  • Arguments
    • Ucommerce.Transactions.Payments.PaymentRequest request
  • Return type Ucommerce.EntitiesV2.Payment

AcquirePayment

  • Description
    Acquires the payment.
  • Arguments
    • Ucommerce.EntitiesV2.Payment paymentToAcquire
  • Return type Ucommerce.EntitiesV2.Payment

CancelPayment

  • Description
    Cancels the payment.
  • Arguments
    • Ucommerce.EntitiesV2.Payment paymentToCancel
  • Return type Ucommerce.EntitiesV2.Payment

CalculatePaymentFee

  • Description
    Calculates the fee for a given PaymentMethod.
  • Arguments
    • Ucommerce.Transactions.Payments.PaymentRequest request
  • Return type Ucommerce.Money

Implement RequestPayment(PaymentRequest)

RequestPayment can be used in one of two ways: 1) Either to redirect the customer to the remote server handling payment information there, e.g. credit card information, or 2) to simply send payment information received on your server directly to the provider.

1)

    public Payment RequestPayment(PaymentRequest request) 
    {
        // Package up information for the backend service, 
        // in the form of a http request 
        // Redirect customer to backend service with 
        // the needed information 
        // Payment would be set pending authorization status (the status will have to be added to the Ucommerce_PaymentStatus table) 
        return new Payment();
    }
    

2)

    public Payment RequestPayment(PaymentRequest request) 
    {
        // Processing is happening synchronously so we just
        // call the backend service with ProcessPaymentRequest
        return ProcessPaymentRequest(request);
    }
    

Implement ProcessPaymentRequest(PaymentRequest)

ProcessPaymentRequest is used to handle any processing before or callbacks from the remote server in the case of a payment processing being handled exclusively by a remote party.

1) In the case of a callback scenario you use ProcessPaymentRequest to handle the callback and do any needed processing like updating order status. To receive the callback an endpoint needs to be exposed to the remote party such an http handler or a module. The handler or module will call ProcessPaymentRequest to complete the payment.

    public Payment ProcessPaymentRequest(PaymentRequest request) 
    {
        // Update payment according to received status from remote 
        // party, e.g. Accepted, Declined
    
        // Grab any transaction ids and put them on the payment before 
        // returning the Payment
        return new Payment();
    }
    

2) For a synchronous scenario ProcessPaymentRequest would be used to perform the query to the backing system and create a new Payment according to the result received.

    public Payment RequestPayment(PaymentRequest request) 
    {
        // Package up information for the backend service, 
        // in the form of a http request 
        // Redirect customer to backend service with 
        // the needed information 
        // Payment would be set pending authorization status 
        return new Payment();
    
    }
    

Implement AcquirePayment(Payment)

For legal reason you usually can’t withdraw money from the customer until you actually ship their order. AcquirePayment is meant for this very scenario where you first authorize the payment and later withdraw from their account.

AcquirePayment(Payment) is used for capturing the payment from the customer.

    public Payment ProcessPaymentRequest(PaymentRequest request) 
    {
        // Send request to remote party
    
        // Update payment according to received status from remote 
        // party, e.g. Accepted, Declined
    
        // Grab any transaction ids and put them on the payment before 
        // returning the Payment
        
        return new Payment();
    }
    

Implement CancelPayment(Payment)

If you wish to cancel a payment with your payment method service you need to implement CancelPayment, and have it reach out the remote payment processor. Typical scenarios for cancelling a payment includes a customer return, cancelled order and typically requires you to handle two scenarios: Payment authorized but not capture and payment authorized and captured.

    public Payment CancelPayment(Payment payment) 
    {
        // Update payment according to received status from remote 
        // party, e.g. Cancelled
    
        // Grab any transaction ids and put them on the payment before 
        // returning the Payment
        return new Payment();
    }
    

Implement CalculatePaymentFee(PaymentRequest)

If applicable, used for calculating the fee associated with the payment method.

    public virtual Money CalculatePaymentFee(PaymentRequest request) 
    {
        var order = request.PurchaseOrder;
        var paymentMethod = request.PaymentMethod;
    
        var fee = paymentMethod.GetFeeForCurrency(order.BillingCurrency);
    
        if (!order.SubTotal.HasValue)
            return new Money(0,
                Ucommerce.Infrastructure.ObjectFactory.Instance.Resolve<Ucommerce.Infrastructure.Globalization.Globalization>().CurrentCulture, order.BillingCurrency.ISOCode);
    
        return new Money(order.SubTotal.Value
            * (paymentMethod.FeePercent / 100)
            + fee.Fee,
            Ucommerce.Infrastructure.ObjectFactory.Instance.Resolve<Ucommerce.Infrastructure.Globalization.Globalization>().CurrentCulture, order.BillingCurrency.ISOCode);
    }
    

Optionally Implement IPaymentFactory Interface on Your Provider

You can create a payment placeholder for the choices made by a user and then later perform the actual payment request to the backend service.

If you need this functionality your service should implement the interface IPaymentFactory, which will be used for creating the new Payment.

    /// <summary>
    /// Creates a new payment fully initialized
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public Payment CreatePayment(PaymentRequest request)
    {
    	PurchaseOrder order = request.PurchaseOrder;
    
    	var payment = new Payment
    	{
    		TransactionId = Guid.NewGuid().ToString(),
    		PurchaseOrder = order,
    		PaymentMethodName = request.PaymentMethod.Name,
    		Created = DateTime.Now,
    		PaymentMethod = request.PaymentMethod,
    		Fee = CalculatePaymentFee(request).Value,
    		FeePercentage = request.PaymentMethod.FeePercent,
    		PaymentStatus = PaymentStatus.Get(1),
    		Amount = request.Amount.Value
    	};
    
    	return payment;
    }
          

Copy Assembly to Your Site

Copy MyUCommerceApp.Library.dll to the /bin folder of your site.

Setup Payment Method Service

**Register Your Payment Method Service **

Register your new payment method service by adding a new file called Payments.config to Ucommerce/Apps/MyApp to make it available in the backend:

    
    <configuration>
    	<components>
    		<component id="MyPaymentMethodService"
    			service="Ucommerce.Transactions.Payments.IPaymentMethodService, Ucommerce"
    			type="MyUcommerceApp.Library.MyPaymentService, MyUcommerceApp" />
    	</components>
    </configuration>
    

Configure Payment Method to Use Your Service

Configure Payment Method to use your new service in Ucommerce Back office.

Image

Request a payment for your integration

To execute your Payment Service directly from .NET code you use the following snippet:

Usage

    public void ExecutePaymentMethodService(PaymentMethod paymentMethod, 
        PurchaseOrder purchaseOrder, decimal amount) 
    {
        var cultureInfo = new Globalization().CurrentCulture;
    
        // Create a new payment request to 
        var paymentRequest = new PaymentRequest(
                    purchaseOrder,
                    paymentMethod,
                    new Money(
                        amount,
                        cultureInfo,
                        purchaseOrder.BillingCurrency.ISOCode));
    
        Payment payment = paymentMethod
                        .GetPaymentMethodService()
                        .RequestPayment(paymentRequest);
    }