If anyone needs to implement Moneris Checkout in ASP.Net MVC.
1 Answer
@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.
Go to moneris admin panel and create Moneris Checkout configuration
Copy the Moneris Checkout Id
Create a new View e.g Checkout.cshtml. Put all the HTML part of the code into Checkout.cshtml
Create an MVC controller and place all the controller part of code into it.
Create model classes as mentioned