0

If anyone needs to implement Moneris Checkout in ASP.Net MVC.

1
  • What is the question? Commented Oct 9, 2024 at 8:00

1 Answer 1

1
@model MonerisSample.ViewModels.TokenRequest
@{
    Layout = "~/Views/Shared/_MonerisLayout.cshtml";
    var checkoutToken = ViewBag.CheckoutToken as string;
    ViewBag.Title = "Moneris Checkout";
}
<header>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <script src="https://gatewayt.moneris.com/chkt/js/chkt_v1.00.js"></script>

</header>
<body>
    <div id="outerDiv" style="width:400px" ; height"300px">
        <div id="monerisCheckout">Redirecting to moneris payment page. please wait...</div>
    </div>
    @using (Html.BeginForm("PaymentApproved", "Moneris", FormMethod.Post, new { id = "form-moneris-checkout", enctype = "multipart/form-data" }))
    {
        @Html.HiddenFor(x => x.Amount)
        @Html.HiddenFor(x => x.CustomerId)
        @Html.HiddenFor(x => x.OrderId)
        <input type="hidden" id="Token" name="Token" />
    }
    <script>
        initialize();

        function initialize() {
            var checkout = new monerisCheckout();
            checkout.setMode("qa");

            checkout.setCheckoutDiv("monerisCheckout");
            checkout.setCallback("cancel_transaction", myCancelTransaction);
            checkout.setCallback("error_event", myErrorEvent);
            checkout.setCallback("payment_receipt", myPaymentReceipt);
            checkout.setCallback("payment_complete", myPaymentComplete);

            checkout.startCheckout('@checkoutToken');
        }

        function myCancelTransaction(response) {
            if (response.response_code == '001') {
                //handle cancel transaction
            }
        }

        function myErrorEvent(response) {
            if (response.response_code == '001') {
                //handle error in transaction
            }
        }

        function myPaymentReceipt(response) {
            var objResp = JSON.parse(response);
            if (objResp.response_code == '001') {
                $.ajax({
                    type: 'POST',
                    url: '/Moneris/PaymentApproved',
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    data: JSON.stringify({ ticket: objResp.ticket }),
                    success: function (result) {
                        if (result.success) {
                            //handle success
                        }
                    },
                    error: function (jqXHR, textStatus, errorThrow) {
                        //handle error
                    }
                });

            }
        }

        function myPaymentComplete(response) {
            var objResp = JSON.parse(response);
            if (objResp.response_code == '001') {
                checkout.closeCheckout();
            }
        }
    </script>
</body>


using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Web.Mvc;
using System.Configuration;

namespace MonerisSample.Controllers
{
    public class MonerisController : Controller
    {
        private string monerisStoreId = ConfigurationManager.AppSettings.Get("MonerisStoreId");
        private string monerisApiToken = ConfigurationManager.AppSettings.Get("MonerisApiToken");
        private string monerisCheckoutId = ConfigurationManager.AppSettings.Get("MonerisApiToken");
        private readonly string monerisCheckoutUrl = ConfigurationManager.AppSettings.Get("MonerisCheckoutUrl");

        public async Task<ActionResult> Checkout(TokenRequest model)
        {
            // Call a method to generate the checkout token
            string checkoutToken = await GenerateCheckoutTokenAsync(model);

            // Pass the token to the view to render the Moneris Checkout form
            ViewBag.CheckoutToken = checkoutToken;
            return View(model);
        }

        private async Task<string> GenerateCheckoutTokenAsync(TokenRequest model)
        {
            // Create the payload to send to Moneris
            var payload = new
            {
                store_id = monerisStoreId,
                api_token = monerisApiToken,
                checkout_id = monerisCheckoutId,
                txn_total = model.Amount.ToString("F2"),  // Format the amount as a string with two decimal places
                order_no = model.OrderId,
                cust_id = model.TenantId,
                div_custom_back_link = "/",
                action = "preload",
                environment = ConfigurationManager.AppSettings.Get("MonerisEnvironment"),  // Use "production" for live transactions
            };

            // Send the request to Moneris
            using (HttpClient client = new HttpClient())
            {
                string payloadJson = JsonConvert.SerializeObject(payload);
                StringContent content = new StringContent(payloadJson, Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(monerisCheckoutUrl, content);

                if (response.IsSuccessStatusCode)
                {
                    // Parse the response to get the checkout token
                    var responseData = await response.Content.ReadAsStringAsync();
                    var checkoutResp = JsonConvert.DeserializeObject<TokenResponse>(responseData);

                    if (checkoutResp.Response.Success)
                    {
                        return checkoutResp.Response.Ticket;
                    }
                }
            }
            throw new Exception("Error generating token");
        }
        
        public async Task<JsonResult> PaymentApproved(CheckoutResponse model)
        {
            try
            {
                var receiptModel = await GetPaymentReceiptAsync(model);

                //if transaction is approved
                if (receiptModel.Response.Receipt.Result.Equals("a"))
                {
                    //do your code here
                }
                return Json(new { success = true }, JsonRequestBehavior.DenyGet);
            }
            catch (Exception ex)
            {
                return Json(new { success = false, Error = ex.Message }, JsonRequestBehavior.DenyGet);
            }
        }
        
        private async Task<ReceiptResponse> GetPaymentReceiptAsync(CheckoutResponse model)
        {
            // Create the payload to send to Moneris
            var payload = new
            {
                store_id = monerisStoreId,
                api_token = monerisApiToken,
                checkout_id = monerisCheckoutId,
                ticket = model.Ticket,
                action = "receipt",
                environment = ConfigurationManager.AppSettings.Get("MonerisEnvironment"),  // Use "production" for live transactions
            };

            // Send the request to Moneris
            using (HttpClient client = new HttpClient())
            {
                string payloadJson = JsonConvert.SerializeObject(payload);
                StringContent content = new StringContent(payloadJson, Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(monerisCheckoutUrl, content);

                if (response.IsSuccessStatusCode)
                {
                    // Parse the response to get the checkout token
                    var responseData = await response.Content.ReadAsStringAsync();
                    var receiptResp = JsonConvert.DeserializeObject<ReceiptResponse>(responseData);

                    if (receiptResp.Response.Success)
                    {
                        return receiptResp;
                    }
                }
            }
            throw new Exception("Error generating receipt");
        }
    }
}


namespace MonerisSample.ViewModels
{
    public class TokenRequest
    {
        public double Amount {  get; set; }
        public string OrderId {  get; set; }
        public string CustomerId { get; set; }
    }
    public class TokenResponse
    {
        public Response Response { get; set; }
    }

    public class Response
    {
        public bool Success { get; set; }
        public string Ticket { get; set; }
    }
    public class CheckoutResponse
    {
        public string Ticket { get; set; }
    }
        public class ReceiptResponse
        {
            public Result Response { get; set; }
        }
        
        public class Result
        {
            public bool Success { get; set; }
            public Request Request { get; set; }
            public Receipt Receipt { get; set; }
        }
        
        public class Request
        {
            public string Ticket { get; set; }
            public decimal CC_Total { get; set; }
            public decimal Txn_Total { get; set; }
            public string Cust_Id { get; set; }
            public string Order_No { get; set; }
            public string Eci { get; set; }
        }
        
        public class Receipt
        {
            public string Result { get; set; }
            public Cc Cc { get; set; }
        }
        
        public class Cc
        {
            public string Transaction_No { get; set; }
            public int Transaction_Type { get; set; }
            public DateTime Transaction_Date_Time { get; set; }
            public string Reference_No { get; set; }
            public string Card_Type { get; set; }
        
            public int GetCardTypeCrmOptionSet()
            {
                int value = -1;
                if (!String.IsNullOrEmpty(Card_Type))
                {
                    switch (Card_Type)
                    {
                        case "M":
                            value = 5;
                            break;
                        case "V":
                            value = 4;
                            break;
                        case "AX":
                            value = 6;
                            break;
                        case "NO":
                        case "DS":
                            value = 22;
                            break;
                        case "C1":
                        case "C":
                            value = 24;
                            break;
                        case "SE":
                            value = 25;
                            break;
                        case "CQ":
                        case "P":
                        case "D":
                            value = 19; //default
                            break;
                        default:
                            break;
                    }
                }
                return value;
            }
        }
}

An ASP.Net implementation for Moneris Checkout.

  1. Go to moneris admin panel and create Moneris Checkout configuration

  2. Copy the Moneris Checkout Id

  3. Create a new View e.g Checkout.cshtml. Put all the HTML part of the code into Checkout.cshtml

  4. Create an MVC controller and place all the controller part of code into it.

Create model classes as mentioned

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.