My Unified API Guide Dot NET V1.2.4

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 486

DownloadMy  Unified API Guide - Dot NET V1.2.4
Open PDF In BrowserView PDF
Java - Moneris Gateway API - Integration Guide
Version: 1.2.4

Copyright © Moneris Solutions, 2018
All rights reserved. No part of this publication may be reproduced,
stored in retrieval systems, or transmitted, in any form or by any means,
electronic, mechanical, photocopying, recording, or otherwise, without
the prior written permission of Moneris Solutions Corporation.

Moneris Gateway API - Integration Guide

Security and Compliance
Your solution may be required to demonstrate compliance with the card associations’ PCI/CISP/PABP
requirements. For more information on how to make your application PCI-DSS compliant, contact the
Moneris Sales Center and visit https://developer.moneris.com to download the PCI_DSS Implementation Guide.
All Merchants and Service Providers that store, process, or transmit cardholder data must comply with
PCI DSS and the Card Association Compliance Programs. However, certification requirements vary by
business and are contingent upon your "Merchant Level" or "Service Provider Level".
The card association has some data security standards that define specific requirements for all organizations that store, process, or transmit cardholder data. As a Moneris client or partner using this
method of integration, your solution must demonstrate compliance to the Payment Card Industry Data
Security Standard (PCI DSS) and/or the Payment Application Data Security Standard (PA DSS). These
standards are designed to help the cardholders and merchants in such ways as they ensure credit card
numbers are encrypted when transmitted/stored in a database and that merchants have strong access
control measures.
Non-compliant solutions may prevent merchant boarding with Moneris. A non-compliant merchant can
also be subject to fines, fees, assessments or termination of processing services.
For further information on PCI DSS & PA DSS requirements, visit http://www.pcisecuritystandards.org.

Confidentiality
You have a responsibility to protect cardholder and merchant related confidential account information.
Under no circumstances should ANY confidential information be sent via email while attempting to diagnose integration or production issues. When sending sample files or code for analysis by Moneris staff,
all references to valid card numbers, merchant accounts and transaction tokens should be removed and
or obscured. Under no circumstances should live cardholder accounts be used in the test environment.

November 2018

Moneris Gateway API - Integration Guide

Changes in v1.2.4
Changes limits in Amount, Transaction Amount, Completion Amount request variables to reflect 10
decimals.

Previous version changes
Changes in v1.2.3
This version adds information about passing Offlinx™ data for the Card Match pixel tag via Unified
API transactions.

November 2018

Table of Contents
Security and Compliance
Confidentiality

2
2

Changes in v1.2.4

3

1 About This Documentation
1.1 Purpose
Getting Help
1.2 Who Is This Guide For?

10
10
10
11

2 Basic Transaction Set
2.1 Basic Transaction Type Definitions
2.2 Purchase
2.3 Pre-Authorization
2.4 Pre-Authorization Completion
2.5 Re-Authorization
2.6 Force Post
2.7 Purchase Correction
2.8 Refund
2.9 Independent Refund
2.10 Card Verification with AVS and CVD
2.11 Batch Close
2.12 Open Totals

12
12
14
19
25
28
31
33
35
38
40
45
46

3 Credential on File
3.1 About Credential on File
3.2 Credential on File Info Object and Variables
3.3 Credential on File Transaction Types
3.4 Initial Transactions in Credential on File
3.5 Vault Tokenize Credit Card and Credential on File
3.6 Credential on File and Converting Temporary Tokens
3.7 Card Verification and Credential on File Transactions
3.7.1 When to Use Card Verification With COF
3.7.2 Credential on File and Vault Add Token
3.7.3 Credential on File and Vault Update Credit Card
3.7.4 Credential on File and Vault Add Credit Card
3.7.5 Credential on File and Recurring Billing

49
49
49
49
50
50
50
51
51
51
52
52
52

4 Vault
4.1 About the Vault Transaction Set
4.2 Vault Transaction Types
4.2.1 Administrative Vault Transaction types
4.2.2 Financial Vault Transaction types
4.3 Vault Administrative Transactions
4.3.1 Vault Add Credit Card – ResAddCC
4.3.1.1 Vault Data Key
4.3.1.2 Vault Encrypted Add Credit Card – EncResAddCC
4.3.2 Vault Temporary Token Add – ResTempAdd
4.3.3 Vault Update Credit Card – ResUpdateCC
4.3.3.1 Vault Encrypted Update CC - EncResUpdateCC
4.3.4 Vault Delete - ResDelete
4.3.5 Vault Lookup Full - ResLookupFull
4.3.6 Vault Lookup Masked - ResLookupMasked
4.3.7 Vault Get Expiring - ResGetExpiring

53
53
53
53
55
55
55
59
59
62
64
68
71
73
74
76

4.3.8 Vault Is Corporate Card - ResIscorporateCard
4.3.9 Vault Add Token – ResAddToken
4.3.10 Vault Tokenize Credit Card – ResTokenizeCC
4.4 Vault Financial Transactions
4.4.1 Customer ID Changes
4.4.2 Purchase with Vault – ResPurchaseCC
4.4.3 Pre-Authorization with Vault – ResPreauthCC
4.4.4 Vault Independent Refund CC - ResIndRefundCC
4.4.5 Force Post with Vault - ResForcePostCC
4.4.6 Card Verification with Vault – ResCardVerificationCC
4.5 Hosted Tokenization

77
78
82
86
86
87
92
96
99
101
106

5 INTERAC® Online Payment
5.1 About INTERAC® Online Payment Transactions
5.2 Other Documents and References
5.3 Website and Certification Requirements
5.3.1 Things to provide to Moneris
5.3.2 Certification process
5.3.3 Client Requirements
5.3.4 Delays
5.4 Transaction Flow for INTERAC® Online Payment
5.5 Sending an INTERAC® Online Payment Purchase Transaction
5.5.1 Fund-Guarantee Request
5.5.2 Online Banking Response and Fund-Confirmation Request
5.6 INTERAC® Online Payment Purchase
5.7 INTERAC® Online Payment Refund
5.8 INTERAC® Online Payment Field Definitions

107
107
107
108
108
108
109
109
110
111
111
112
112
115
117

6 Mag Swipe Transaction Set
6.1 Mag Swipe Transaction Type Definitions
6.1.1 Encrypted Mag Swipe Transactions
6.2 Mag Swipe Purchase
6.2.1 Encrypted Mag Swipe Purchase
6.3 Mag Swipe Pre-Authorization
6.3.1 Encrypted Mag Swipe Pre-Authorization
6.4 Mag Swipe Completion
6.5 Mag Swipe Force Post
6.5.1 Encrypted Mag Swipe Force Post
6.6 Mag Swipe Purchase Correction
6.7 Mag Swipe Refund
6.8 Mag Swipe Independent Refund
6.8.1 Encrypted Mag Swipe Independent Refund

120
120
121
121
124
127
129
132
134
136
139
141
143
146

7 Level 2/3 Transactions
7.1 About Level 2/3 Transactions
7.2 Level 2/3 Visa Transactions
7.2.1 Level 2/3 Transaction Types for Visa
7.2.2 Level 2/3 Transaction Flow for Visa
7.2.3 VS Completion
7.2.4 VS Purchase Correction
7.2.5 VS Force Post
7.2.6 VS Refund
7.2.7 VS Independent Refund
7.2.8 VS Corpais
7.2.8.1 VS Purcha - Corporate Card Common Data
7.2.8.2 VS Purchl - Line Item Details
7.2.8.3 Sample Code for VS Corpais

149
149
149
149
151
151
156
158
163
168
173
174
179
182

7.3 Level 2/3 MasterCard Transactions
7.3.1 Level 2/3 Transaction Types for MasterCard
7.3.2 Level 2/3 Transaction Flow for MasterCard
7.3.3 MC Completion
7.3.4 MC Force Post
7.3.5 MC Purchase Correction
7.3.6 MC Refund
7.3.7 MC Independent Refund
7.3.8 MC Corpais - Corporate Card Common Data with Line Item Details
7.3.8.1 MC Corpac - Corporate Card Common Data
7.3.8.2 MC Corpal - Line Item Details
7.3.8.3 Tax Array Object - MC Corpais
7.3.8.4 Sample Code for MC Corpais
7.4 Level 2/3 American Express Transactions
7.4.1 Level 2/3 Transaction Types for Amex
7.4.2 Level 2/3 Transaction Flow for Amex
7.4.3 Level 2/3 Data Objects in Amex
7.4.3.1 About the Level 2/3 Data Objects for Amex
7.4.3.2 Defining the AxLevel23 Object
Table 1 Object
Table 1 - Setting the N1Loop Object
Table 1 - Setting the AxRef Object

221

Table 2 Object
Table 2 - Setting the AxIt1Loop Object

222
223

Table 2 - Setting the AxIt106s Object

226

Table 2 - Setting the AxTxi Object

226

Table 3 Object
Table 3 - Setting the AxTxi Object

230
231

7.4.4
7.4.5
7.4.6
7.4.7
7.4.8
8 MPI
8.1
8.2
8.3
8.4
8.5
8.6

184
184
186
186
188
191
193
195
198
199
206
209
211
214
214
216
217
217
217
218
219

AX Completion
AX Force Post
AX Purchase Correction
AX Refund
AX Independent Refund

About MPI Transactions
3-D Secure Implementations (VbV, MCSC, SafeKey)
Activating VbV and MCSC
Activating Amex SafeKey
Transaction Flow for MPI
MPI Transactions
8.6.1 VbV, MCSC and SafeKey Responses
8.6.2 MpiTxn Request Transaction
8.6.2.1 TXN Response and Creating the Popup
8.6.3 Vault MPI Transaction – ResMpiTxn
8.6.4 MPI ACS Request Transaction
8.6.4.1 ACS Response and Forming a Transaction
8.6.5 Purchase with 3-D Secure – cavvPurchase
8.6.5.1 Purchase with 3-D Secure and Recurring Billing
8.6.6 Pre-Authorization with 3-D Secure – cavvPreauth
8.6.7 Cavv Result Codes for Verified by Visa
8.6.8 Vault Cavv Purchase
8.6.9 Vault Cavv Pre-Authorization

234
238
242
244
248
253
253
253
254
254
254
255
256
258
260
260
262
264
265
273
275
282
283
286

9 e-Fraud Tools
9.1 Address Verification Service
9.1.1 About Address Verification Service (AVS)
9.1.2 AVS Info Object
9.1.3 AVS Response Codes
9.1.4 AVS Sample Code
9.2 Card Validation Digits (CVD)
9.2.1 About Card Validation Digits (CVD)
9.2.2 Transactions Where CVD Is Required
9.2.3 CVD Info Object
9.2.4 CVD Result Codes
9.2.5 Sample Purchase with CVD Info Object
9.3 Transaction Risk Management Tool
9.3.1 About the Transaction Risk Management Tool
9.3.2 Introduction to Queries
9.3.3 Session Query
9.3.3.1 Session Query Transaction Flow
9.3.4 Attribute Query
9.3.4.1 Attribute Query Transaction Flow
9.3.5 Handling Response Information
9.3.5.1 TRMT Response Fields
9.3.5.2 Understanding the Risk Score
9.3.5.3 Understanding the Rule Codes, Rule Names and Rule Messages
9.3.5.4 Examples of Risk Response
Session Query
Attribute Query
9.3.6 Inserting the Profiling Tags Into Your Website
9.4 Encorporating All Available Fraud Tools
9.4.1 Implementation Options for TRMT
9.4.2 Implementation Checklist
9.4.3 Making a Decision

289
291
291
291
292
295
296
296
296
297
298
298
299
299
299
300
306
307
311
311
312
315
316
323
323
324
324
326
326
326
328

10 Apple Pay In-App and on the Web Integration
10.1 About Apple Pay In-App and on the Web Integration
10.2 About API Integration of Apple Pay
10.2.1 Transaction Types That Use Apple Pay
10.3 Apple Pay In-App Process Flows
10.4 Cavv Purchase – Apple Pay
10.5 Cavv Pre-Authorization – Apple Pay

329
329
329
329
330
331
336

11 Offlinx™
11.1 What Is a Pixel Tag?
11.2 Offlinx™ and API Transactions

342
342
342

12 Convenience Fee
12.1 About Convenience Fee
12.2 Purchase with Convenience Fee
12.3 Convenience Fee Purchase w/ Customer Information
12.4 Convenience Fee Purchase with VbV, MCSC and Amex SafeKey

343
343
343
346
349

13 Recurring Billing
13.1 About Recurring Billing
13.2 Purchase with Recurring Billing
13.3 Recurring Billing Update
13.4 Recurring Billing Response Fields and Codes
13.5 Credential on File and Recurring Billing

353
353
353
356
360
361

14 Customer Information

363

14.1 Using the Customer Information Object
14.1.1 CustInfo Object – Miscellaneous Properties
14.1.2 CustInfo Object – Billing and Shipping Information
14.1.2.1 Set Methods for Billing and Shipping Info
14.1.2.2 Using Hash Tables for Billing and Shipping Info
14.1.3 CustInfo Object – Item Information
14.1.3.1 Set Methods for Item Information
14.1.3.2 Using Hash Tables for Item Information
14.2 Customer Information Sample Code

363
364
364
365
365
366
366
366
367

15 Status Check
15.1 About Status Check
15.2 Using Status Check Response Fields
15.3 Sample Purchase with Status Check

369
369
369
370

16 Visa Checkout
16.1 About Visa Checkout
16.2 Transaction Types - Visa Checkout
16.3 Integrating Visa Checkout Lightbox
16.4 Transaction Flow for Visa Checkout
16.5 Visa Checkout Purchase
16.6 Visa Checkout Pre-Authorization
16.7 Visa Checkout Completion
16.8 Visa Checkout Purchase Correction
16.9 Visa Checkout Refund
16.10 Visa Checkout Information

371
371
371
372
373
374
376
378
380
382
385

17 Testing a Solution
17.1 About the Merchant Resource Center
17.2 Logging In to the QA Merchant Resource Center
17.3 Test Credentials for Merchant Resource Center
17.4 Getting a Unique Test Store ID and API Token
17.5 Processing a Transaction
17.5.1 Overview
17.5.2 HttpsPostRequest Object
17.5.3 Receipt Object
17.6 Testing INTERAC® Online Payment Solutions
17.7 Testing MPI Solutions
17.8 Testing Visa Checkout
17.8.1 Creating a Visa Checkout Configuration for Testing
17.9 Test Card Numbers
17.9.1 Test Card Numbers for Level 2/3
17.9.2 Test Cards for Visa Checkout
17.10 Simulator Host

387
387
387
387
389
391
391
392
393
394
395
396
397
397
398
398
398

18 Moving to Production
18.1 Activating a Production Store Account
18.2 Configuring a Store for Production
18.2.1 Configuring an INTERAC® Online Payment Store for Production
18.2.1.1 Completing the Certification Registration - Merchants
18.2.1.2 Third-Party Service/Shopping Cart Provider
18.3 Receipt Requirements
18.3.1 Certification Requirements

401
401
401
402
402
403
404
404

Appendix A Definitions of Request Fields
A.1 Definitions of Request Fields – Credential on File
A.2 Definition of Request Fields – Recurring
A.3 Definition of Request Fields for Level 2/3 - Visa

405
416
417
418

A.4 Definition of Request Fields for Level 2/3 - MasterCard
A.5 Definition of Request Fields for Level 2/3 - Amex
A.6 Definition of Request Fields – Offlinx™

427
437
446

Appendix B Definitions of Response Fields

447

Appendix C Error Messages

461

Appendix D Process Flow for Basic Pre-Auth, Re-Auth and Completion Transactions

463

Appendix E Merchant Checklists for INTERAC® Online Payment Certification Testing

464

Appendix F Third-Party Service Provider Checklists for INTERAC® Online Payment Certification Testing

468

Appendix G Merchant Checklists for INTERAC® Online Payment Certification

473

Appendix H INTERAC® Online Payment Certification Test Case Detail
H.1 Common Validations
H.2 Test Cases
H.3 Merchant front-end test case values

476
476
476
480

Copyright Notice

485

Trademarks

485

1 About This Documentation
1.1 Purpose
This document describes the transaction information for using the Java API for sending credit card transactions. In particular, it describes the format for sending transactions and the corresponding responses
you will receive.
This document contains information about the following features:
l
l
l
l
l
l
l
l
l
l
l

Basic transactions
MPI – Verified by Visa, MasterCard Secure Code and American Express SafeKey
INTERAC® Online Payment
Vault
MSR (Magnetic Swipe Reader) and Encrypted MSR
Apple Pay and Android Pay In-App
Transaction Risk Management Tool
Convenience fee
Visa Checkout
MasterCard MasterPass
Level 2/3 Transactions

Getting Help
Moneris has help for you at every stage of the integration process.
Getting Started
Contact our Client
Integration Specialists:
clientintegrations@moneris.com
Hours: Monday – Friday, 8:30am
to 8 pm ET

During Development

Production

If you are already working
with an integration specialist and need technical
development assistance,
contact our eProducts
Technical Consultants:

If your application is already live
and you need production support,
contact Moneris Customer Service:

1-866-319-7450

Available 24/7

onlinepayments@moneris.com
1-866-319-7450

eproducts@moneris.com
Hours: 8am to 8pm ET

For additional support resources, you can also make use of our community forums at
http://community.moneris.com/product-forums/

November 2018

Page 10 of 486

Moneris Gateway API - Integration Guide

1.2 Who Is This Guide For?
The Moneris Gateway API - Integration Guide is intended for developers integrating with the Moneris
Gateway.
This guide assumes that the system you are trying to integrate meets the requirements outlined below
and that you have some familiarity with the Java programming language.

System Requirements
l
l
l

[[[Undefined variable GlobalVariables.ProgrammingLanguageMinimumRequired]]] or above
Port 443 open for bi-directional communication
Web server with a SSL certificate

Page 11 of 486

November 2018

2 Basic Transaction Set
l
l
l
l
l
l
l
l
l
l
l
l

2.1 Basic Transaction Type Definitions
2.2 Purchase
2.3 Pre-Authorization
2.4 Pre-Authorization Completion
2.5 Re-Authorization
2.6 Force Post
2.7 Purchase Correction
2.8 Refund
2.9 Independent Refund
2.10 Card Verification with AVS and CVD
2.11 Batch Close
2.12 Open Totals

2.1 Basic Transaction Type Definitions
The following is a list of basic transactions that are supported by the Moneris Java API.
Purchase
Verifies funds on the customer’s card, removes the funds and prepares them for deposit into
the merchant’s account.
Pre-Authorization
Verifies and locks funds on the customer’s credit card. The funds are locked for a specified
amount of time based on the card issuer.
To retrieve the funds that have been locked by a Pre-Authorization transaction so that they
may be settled in the merchant’s account, a Completion transaction must be performed. A
Pre-Authorization transaction may only be "completed" once.
Completion
Retrieves funds that have been locked (by either a Pre-Authorization or a Re-Authorization
transaction), and prepares them for settlement into the merchant’s account.
Re-Authorization
If a Pre-Authorization transaction has already taken place, and not all the locked funds were
released by a Completion transaction, a Re-Authorization allows you to lock the remaining
funds so that they can be released by another Completion transaction in the future.
Re-Authorization is necessary because funds that have been locked by a Pre-Authorization
transaction can only be released by a Completion transaction one time. If the Completion
amount is less than the Pre-Authorization amount, the remaining money cannot be "completed".
Force Post
Retrieves the locked funds and prepares them for settlement into the merchant’s account.
This is used when a merchant obtains the authorization number directly from the issuer by a
third-party authorization method (such as by phone).
Purchase Correction
Restores the full amount of a previous Purchase, Completion or Force Post transaction to the
cardholder's card, and removes any record of it from the cardholder's statement.

November 2018

Page 12 of 486

Moneris Gateway API - Integration Guide
This transaction is sometimes referred to as "void".
This transaction can be used against a Purchase or Completion transaction that occurred
same day provided that the batch containing the original transaction remains open. When
using the automated closing feature, Batch Close occurs daily between 10 and 11pm Eastern
Time.
Refund
Restores all or part of the funds from a Purchase, Completion or Force Post transaction to the
cardholder's card. Unlike a Purchase Correction, there is a record of both the initial charge
and the refund on the cardholder's statement.
Independent Refund
Credits a specified amount to the cardholder’s credit card. The credit card number and expiry
date are mandatory.
It is not necessary for the transaction that you are refunding to have been processed via the
Moneris Gateway
Card Verification
Verifies the validity of the credit card, expiry date and any additional details (such as the Card
Verification Digits or Address Verification details). It does not verify the available amount or
lock any funds on the credit card.
Recur Update
Alters characteristics of a previously registered Recurring Billing transaction.
This transaction is commonly used to update a customer’s credit card information and the
number of recurs to the account.
Recurring billing is explained in more detail in Section 1 (page 1). The Recur Update transaction
is specifically discussed in Section 1.2 (page 1).
Batch Close
Takes the funds from all Purchase, Completion, Refund and Force Post transactions so that
they will be deposited or debited the following business day.
For funds to be deposited the following business day, the batch must close before 11pm
Eastern Time.
Open Totals
Returns the details about the currently open batch.
This transaction is similar to the Batch Close. The difference is that it does not close the batch
for settlement.

Page 13 of 486

November 2018

2 Basic Transaction Set

2.2 Purchase
Purchase transaction object definition
Purchase purchase = new Purchase();

HttpsPostRequest object for Purchase transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(purchase);

Purchase transaction values
Table 1: Purchase transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

purchase.SetOrderId(order_
id);

Amount

String

10-character decimal

purchase.SetAmount(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Credit card number

String

20-character alphanumeric

purchase.SetPan(pan);

Expiry date

String

4-character alphanumeric

purchase.SetExpdate(expiry_
date);

(YYMM format)
E-commerce indicator

November 2018

String

1-character alphanumeric

purchase.SetCryptType(crypt);

Page 14 of 486

Moneris Gateway API - Integration Guide
Table 2: Purchase transaction object optional values
Value

Type

Limits

Set method

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Card Match ID

String

50-character alphanumeric

purchase.SetCmId(transaction_
id);

Customer information

Object

N/A

purchase.SetCustInfo
(customer);

AVS

Object

N/A

purchase.SetAvsInfo
(avsCheck);

CVD

Object

N/A

purchase.SetCvdInfo
(cvdCheck);

Object

N/A

purchase.SetConvFeeInfo
(convFeeInfo);

Object

N/A

purchase.SetRecur(recurring_
cycle);

NOTE: Applies to Offlinx™ only; must be
unique value for each
transaction

NOTE: When storing
credentials on the initial transaction, the
CVD object must be
sent; for subsequent
transactions using
stored credentials, CVD
can be sent with cardholder-initiated transactions only—
merchants must not
store CVD information.

Convenience fee
NOTE: This variable
does not apply to Credential on File transactions.

Recurring billing

Page 15 of 486

November 2018

2 Basic Transaction Set
Table 2: Purchase transaction object optional values
Value

Type

Limits

Set method

Dynamic descriptor

String

20-character alphanumeric

purchase.SetDynamicDescriptor
(dynamic_descriptor);

Wallet indicator1

String

3-character alphanumeric

purchase.SetWalletIndicator
(wallet_indicator);

Object

N/A

purchase.SetCofInfo(cof);

NOTE: For basic
Purchase and Preauthorization, the wallet
indicator applies to
Visa Checkout and
MasterCard MasterPass only. For more,
see Appendix A Definitions of Request Fields

Credential on File Info
cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

1Available to Canadian integrations only.

November 2018

Page 16 of 486

Moneris Gateway API - Integration Guide

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Payment Indicator

Limits
15-character alphanumeric
variable length

String

1-character alphabetic

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

cof.SetPaymentIndicator
("PAYMENT_INDICATOR_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Payment Information

String

1-character numeric

cof.SetPaymentInformation
("PAYMENT_INFO_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Purchase
using System;
using System.Collections.Generic;
using System.Text;
using Moneris;
namespace CanadaPurchaseConsoleTest
{
class CanadaPurchaseTest
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string store_id = "store5";
string api_token = "yesguy";

Page 17 of 486

November 2018

2 Basic Transaction Set

Sample Purchase
string amount = "5.00";
string pan = "4242424242424242";
string expdate = "1901"; //YYMM format
string crypt = "7";
string processing_country_code = "CA";
bool status_check = false;
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("12345678901234");
Purchase purchase = new Purchase();
purchase.SetOrderId(order_id);
purchase.SetAmount(amount);
purchase.SetPan(pan);
purchase.SetExpDate("2011");
purchase.SetCryptType(crypt);
purchase.SetDynamicDescriptor("2134565");
//purchase.SetWalletIndicator(""); //Refer to documentation for details
purchase.SetCofInfo(cof);
//Optional - Set for Multi-Currency only
//setAmount must be 0.00 when using multi-currency
//purchase.SetMCPAmount("500"); //penny value amount 1.25 = 125
//purchase.SetMCPCurrencyCode("840"); //ISO-4217 country currency number
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(purchase);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("HostId = " + receipt.GetHostId());
Console.WriteLine("MCPAmount = " + receipt.GetMCPAmount());
Console.WriteLine("MCPCurrencyCode = " + receipt.GetMCPCurrencyCode());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);

November 2018

Page 18 of 486

Moneris Gateway API - Integration Guide

Sample Purchase
}
}
}
}

2.3 Pre-Authorization
Things to Consider:
l

l

l

If a Pre-Authorization transaction is not followed by a Completion transaction, it must
be reversed via a Completion transaction for 0.00. See "Pre-Authorization Completion"
on page 25
A Pre-Authorization transaction may only be "completed" once . If the Completion
transaction is for less than the original amount, a Re-Authorization transaction is
required to collect the remaining funds by another Completion transaction. See ReAuthorization (page 28).
For a process flow, see "Process Flow for Basic Pre-Auth, Re-Auth and Completion Transactions" on page 463

Pre-Authorization transaction object definition
PreAuth preauth = new PreAuth();

HttpsPostRequest object for Pre-Authorization transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(preauth);

Pre-Authorization transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields

Page 19 of 486

November 2018

2 Basic Transaction Set
Table 3: Pre-Authorization object required values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

preauth.SetOrderId(order_id);

Amount

String

10-character decimal

preauth.SetAmount(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Credit card number

String

20-character numeric

preauth.SetPan(pan);

Expiry date

String

4-character numeric

preauth.SetExpdate(expiry_
date);

E-Commerce indicator

String

1-character alphanumeric

preauth.SetCryptType(crypt);

Table 4: Pre-Authorization object optional values
Value

Type

Limits

Set method

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Dynamic descriptor

String

20-character alphanumeric

preauth.SetDynamicDescriptor
(dynamic_descriptor);

Card Match ID

String

50-character alphanumeric

preauth.SetCmId(transaction_
id);

Customer information

Object

N/A

preauth.SetCustInfo
(customer);

AVS

Object

N/A

preauth.SetAvsInfo(avsCheck);

NOTE: Applies to Offlinx™ only; must be
unique value for each
transaction

November 2018

Page 20 of 486

Moneris Gateway API - Integration Guide

Value

Type

Limits

Set method

Object

N/A

preauth.SetCvdInfo(cvdCheck);

Customer ID

String

50-character alphanumeric

preauth.SetCustId(cust_id);

Wallet indicator1

String

3-character alphanumeric

preauth.SetWalletIndicator
(wallet_indicator);

Object

N/A

cof.SetCofInfo(cof);

CVD
NOTE: When storing
credentials on the initial transaction, the
CVD object must be
sent; for subsequent
transactions using
stored credentials, CVD
can be sent with cardholder-initiated transactions only—
merchants must not
store CVD information.

NOTE: For basic
Purchase and Preauthorization, the wallet
indicator applies to
Visa Checkout and
MasterCard MasterPass only. For more,
see Appendix A Definitions of Request Fields

Credential on File Info
cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

1Available to Canadian integrations only.

Page 21 of 486

November 2018

2 Basic Transaction Set

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Payment Indicator

Limits
15-character alphanumeric

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");

variable length

String

1-character alphabetic

NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

cof.SetPaymentIndicator
("PAYMENT_INDICATOR_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Payment Information

String

1-character numeric

cof.SetPaymentInformation
("PAYMENT_INFO_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Pre-Authorization
using System;
using System.Collections.Generic;
using System.Text;
using Moneris;
namespace CanadaPurchaseConsoleTest
{
class CanadaPreauthTest
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");

November 2018

Page 22 of 486

Moneris Gateway API - Integration Guide

Sample Pre-Authorization
string amount = "5.00";
string pan = "4242424242424242";
string expdate = "0412";
string crypt = "7";
string processing_country_code = "CA";
bool status_check = false;
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("12345678901234");
PreAuth preauth = new PreAuth();
preauth.SetOrderId(order_id);
preauth.SetAmount(amount);
preauth.SetPan(pan);
preauth.SetExpDate(expdate);
preauth.SetCryptType(crypt);
//preauth.SetWalletIndicator(""); //Refer to documentation for details
preauth.SetCofInfo(cof);
//Optional - Set for Multi-Currency only
//setAmount must be 0.00 when using multi-currency
//preauth.SetMCPAmount("500"); //penny value amount 1.25 = 125
//preauth.SetMCPCurrencyCode("840"); //ISO-4217 country currency number
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(preauth);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
//Console.WriteLine("StatusCode = " + receipt.GetStatusCode());
//Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage());
Console.WriteLine("MCPAmount = " + receipt.GetMCPAmount());
Console.WriteLine("MCPCurrencyCode = " + receipt.GetMCPCurrencyCode());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}

Page 23 of 486

November 2018

2 Basic Transaction Set

Sample Pre-Authorization
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Moneris;
namespace CanadaPurchaseConsoleTest
{
class CanadaPreauthTest
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string amount = "5.00";
string pan = "4242424242424242";
string expdate = "0412";
string crypt = "7";
string processing_country_code = "CA";
bool status_check = false;
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("168451306048014");
PreAuth preauth = new PreAuth();
preauth.SetOrderId(order_id);
preauth.SetAmount(amount);
preauth.SetPan(pan);
preauth.SetExpDate(expdate);
preauth.SetCryptType(crypt);
//preauth.SetWalletIndicator(""); //Refer to documentation for details
preauth.SetCofInfo(cof);
//Optional - Set for Multi-Currency only
//setAmount must be 0.00 when using multi-currency
//preauth.SetMCPAmount("500"); //penny value amount 1.25 = 125
//preauth.SetMCPCurrencyCode("840"); //ISO-4217 country currency number
//preauth.SetCmId("8nAK8712sGaAkls56"); //set only for usage with Offlinx - Unique max 50
alphanumeric characters transaction id generated by merchant
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(preauth);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());

November 2018

Page 24 of 486

Moneris Gateway API - Integration Guide

Sample Pre-Authorization
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
//Console.WriteLine("StatusCode = " + receipt.GetStatusCode());
//Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage());
Console.WriteLine("MCPAmount = " + receipt.GetMCPAmount());
Console.WriteLine("MCPCurrencyCode = " + receipt.GetMCPCurrencyCode());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

2.4 Pre-Authorization Completion
Things to Consider:
l
l

l

l

l

Completion is also known as "capture" or "pre-authorization completion".
A Pre-Authorization or Re-Authorization transaction can only be completed once. Refer
to the Re-Authorization transaction (page 28 for more information on how to perform
multiple Completion transactions.
To reverse the full amount of a Pre-Authorization transaction, use the Completion transaction with the amount set to 0.00.
To process this transaction, you need the order ID and transaction number from the original Pre-Authorization transaction.
For a process flow, see "Process Flow for Basic Pre-Auth, Re-Auth and Completion Transactions" on page 463

Completion transaction object
Completion completion = new Completion();

HttpsPostRequest object for Completion transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(completion);

Page 25 of 486

November 2018

2 Basic Transaction Set

Completion transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 5: Completion transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character
alphanumeric

completion.SetOrderId(order_
id);

Completion Amount

String

10-character decimal

completion.SetCompAmount(comp_
amount);

Up to 7 digits (dollars) +
decimal point (.) + 2
digits (cents) after the
decimal point
EXAMPLE: 1234567.89

Transaction number

String

255-character
alphanumeric

completion.SetTxnNumber(txn_
number);

E-Commerce indicator

String

1-character
alphanumeric

completion.SetCryptType
(crypt);

Table 6: Completion transaction optional values
Value

Type

Limits

Set method

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Customer ID

String

50-character alphanumeric

completion.SetCustId(cust_
id);

Dynamic descriptor

String

20-character alphanumeric

completion
.SetDynamicDescriptor
(dynamic_descriptor);

Shipping indicator1

String

1-character alphanumeric

completion.SetShipIndicator
(ship_indicator);

1Available to Canadian integrations only.

November 2018

Page 26 of 486

Moneris Gateway API - Integration Guide

Sample Basic Pre-Authorization Completion
namespace Moneris
{
using System;
public class TestCanadaCompletion
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string order_id = "Test20160815041528";
string amount = "2.00";
string txn_number = "118149-0_10";
string crypt = "7";
string cust_id = "my customer id";
string dynamic_descriptor = "my descriptor";
string ship_indicator = "F";
string processing_country_code = "CA";
bool status_check = false;
Completion completion = new Completion();
completion.SetOrderId(order_id);
completion.SetCompAmount(amount);
completion.SetTxnNumber(txn_number);
completion.SetCryptType(crypt);
completion.SetCustId(cust_id);
completion.SetDynamicDescriptor(dynamic_descriptor);
//completion.SetShipIndicator(ship_indicator); //optional
//Optional - Set for Multi-Currency only
//setAmount must be 0.00 when using multi-currency
//completion.SetMCPAmount("300"); //penny value amount 1.25 = 125
//completion.SetMCPCurrencyCode("840"); //ISO-4217 country currency number
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(completion);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("MCPAmount = " + receipt.GetMCPAmount());

Page 27 of 486

November 2018

2 Basic Transaction Set

Sample Basic Pre-Authorization Completion
Console.WriteLine("MCPCurrencyCode = " + receipt.GetMCPCurrencyCode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

2.5 Re-Authorization
For a process flow, Process Flow for Basic Pre-Auth, Re-Auth and Completion Transactions (page 463).

Re-Authorization transaction object definition
ReAuth reauth = new ReAuth();

HttpsPostRequest object for Re-Authorization transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(reauth);

Re-Authorization transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 7: Re-Authorization transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

reauth.SetOrderId(order_id);;

Original order ID

String

50-character alphanumeric

reauth.SetOrigOrderId(orig_
order_id);

Amount

String

10-character decimal

reauth.SetAmount(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Transaction number

November 2018

String

255-character

reauth.SetTxnNumber(txn_

Page 28 of 486

Moneris Gateway API - Integration Guide
Table 7: Re-Authorization transaction object mandatory values
Value

E-Commerce indicator

Type

String

Limits

Set method

variable character

number);

1-character alphanumeric

reauth.SetCryptType(crypt);

Table 1 Re-Authorization transaction optional values
Value

Type

Limits

Set Method

Customer ID

String

50-character alphanumeric

reauth.SetCustId(cust_id);

Status check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Dynamic descriptor

String

20-character alphanumeric

reauth.SetDynamicDescriptor
(dynamic_descriptor);

Customer information

Object

N/A

reauth.SetCustInfo(customer);

AVS

Object

N/A

reauth.SetAvsInfo(avsCheck);

CVD

Object

N/A

reauth.SetCvdInfo(cvdCheck);

NOTE: When storing
credentials on the initial transaction, the
CVD object must be
sent; for subsequent
transactions using
stored credentials, CVD
can be sent with cardholder-initiated transactions only—
merchants must not
store CVD information.

Sample Re-Authorization
namespace Moneris
{
using System;
public class TestCanadaReauth
{
public static void Main(string[] args)

Page 29 of 486

November 2018

2 Basic Transaction Set

Sample Re-Authorization
{
string store_id = "store5";
string api_token = "yesguy";
string order_id = "mvt2713557ss83ss9ssdfsdfsdf";
string orig_order_id = "mvt3525350028";
string amount = "1.00";
string txn_number = "113457-0_10";
string crypt = "8";
string dynamic_descriptor = "123456";
string cust_id = "my customer id";
string processing_country_code = "CA";
bool status_check = false;
ReAuth reauth = new ReAuth();
reauth.SetOrderId(order_id);
reauth.SetCustId(cust_id);
reauth.SetOrigOrderId(orig_order_id);
reauth.SetTxnNumber(txn_number);
reauth.SetAmount(amount);
reauth.SetCryptType(crypt);
reauth.SetDynamicDescriptor(dynamic_descriptor);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(reauth);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

November 2018

Page 30 of 486

Moneris Gateway API - Integration Guide

2.6 Force Post
Things to Consider:
l

l

l

This transaction is an independent completion where the original Pre-Authorization
transaction was not processed via the same Moneris Gateway merchant account.
It is not required for the transaction that you are submitting to have been processed via
the Moneris Gateway. However, a credit card number, expiry date and original authorization number are required.
Force Post transactions are not supported for UnionPay

ForcePost transaction object definition
ForcePost forcepost = new ForcePost();

HttpsPostRequest object for ForcePost transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(forcepost);

Force Post transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 8: Force Post transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

forcepost.SetOrderId(order_
id);

Amount

String

10-character decimal

forcepost.SetAmount(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Credit card number

Page 31 of 486

String

20-character numeric

forcepost.SetPan(pan);

November 2018

2 Basic Transaction Set
Table 8: Force Post transaction object mandatory values
Value

Type

Limits

Set method

Expiry date

String

4-character numeric

forcepost.SetExpdate(expiry_
date);

Authorization code

String

8-character alphanumeric

forcepost.SetAuthCode(auth_
code);

E-Commerce indicator

String

1-character alphanumeric

forcepost.SetCryptType
(crypt);

Table 9: Force Post transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

forcepost.SetCustId(cust_id);

Dynamic descriptor

String

20-character alphanumeric

forcepost
.SetDynamicDescriptor
(dynamic_descriptor);

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Sample Basic Force Post
using System;
namespace Moneris
{
public class TestCanadaForcePost
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string cust_id = "my customer id";
string store_id = "moneris";
string api_token = "hurgle";
string amount = "59.00";
string pan = "4242424242424242";
string expdate = "1901"; //YYMM format
string auth_code = "88864";
string crypt = "7";
string dynamic_descriptor = "my descriptor";
string processing_country_code = "CA";
bool status_check = false;
ForcePost forcepost = new ForcePost();
forcepost.SetOrderId(order_id);
forcepost.SetCustId(cust_id);
forcepost.SetAmount(amount);
forcepost.SetPan(pan);

November 2018

Page 32 of 486

Moneris Gateway API - Integration Guide

Sample Basic Force Post
forcepost.SetExpDate(expdate);
forcepost.SetAuthCode(auth_code);
forcepost.SetCryptType(crypt);
forcepost.SetDynamicDescriptor(dynamic_descriptor);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(forcepost);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("CorporateCard = " + receipt.GetCorporateCard());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
//Console.WriteLine("MessageId = " + receipt.GetMessageId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

2.7 Purchase Correction
Things to Consider:
l
l

Purchase correction is also known as "void" or "correction".
To process this transaction, you need the order ID and the transaction number from
the original Completion, Purchase or Force Post transaction.

Page 33 of 486

November 2018

2 Basic Transaction Set

Purchase Correction transaction object definition
PurchaseCorrection purchasecorrection = new PurchaseCorrection();

HttpsPostRequest object for Purchase Correction transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(purchasecorrection);

Purchase Correction transaction object values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 10: Purchase Correction transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

purchasecorrection.SetOrderId
(order_id);

Transaction number

String

255-character variable
character

purchasecorrection
.SetTxnNumber(txn_number);

E-Commerce indicator

String

1-character alphanumeric

purchasecorrection
.SetCryptType(crypt);

Table 11: Purchase Correction transaction optional values
Value

Type

Limits

Set method

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Customer ID

String

50-character alphanumeric

purchasecorrection.SetCustId
(cust_id);

Dynamic descriptor

String

20-character alphanumeric

purchasecorrection
.SetDynamicDescriptor
(dynamic_descriptor);

Sample Purchase Correction
namespace Moneris
{
using System;
public class TestCanadaPurchaseCorrection
{
public static void Main(string[] args)
{
string store_id = "store5";

November 2018

Page 34 of 486

Moneris Gateway API - Integration Guide

Sample Purchase Correction
string api_token = "yesguy";
string order_id = "Test20150723031154";
string txn_number = "165745-0_10";
string crypt = "8";
string dynamic_descriptor = "123456";
string processing_country_code = "CA";
bool status_check = false;
PurchaseCorrection purchasecorrection = new PurchaseCorrection();
purchasecorrection.SetOrderId(order_id);
purchasecorrection.SetTxnNumber(txn_number);
purchasecorrection.SetCryptType(crypt);
purchasecorrection.SetDynamicDescriptor(dynamic_descriptor);
purchasecorrection.SetCustId("my customer id");
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(purchasecorrection);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

2.8 Refund
To process this transaction, you need the order ID and transaction number from the original Completion, Purchase or Force Post transaction.

Refund transaction object definition
Refund refund = new Refund();

Page 35 of 486

November 2018

2 Basic Transaction Set

HttpsPostRequest object for Refund transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(refund);

Refund transaction object values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 12: Refund transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

refund.SetOrderId(order_id);

Amount

String

10-character decimal

refund.SetAmount(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Transaction number

String

255-character

refund.SetTxnNumber(txn_
number);

variable character
E-Commerce indicator

String

1-character alphanumeric

refund.SetCryptType(crypt);

Table 13: Refund transaction optional values
Value
Status Check

Type
Boolean

Limits
true/false

Set method
mpgReq.SetStatusCheck(status_
check);

Sample Refund
namespace Moneris
{
using System;
public class TestCanadaRefund
{
public static void Main(string[] args)

November 2018

Page 36 of 486

Moneris Gateway API - Integration Guide

Sample Refund
{
string store_id = "store1";
string api_token = "yesguy";
string amount = "1.00";
string crypt = "7";
string dynamic_descriptor = "123456";
string custid = "mycust9";
string order_id = "mvt3230836758";
string txn_number = "21964-0_10";
string processing_country_code = "CA";
bool status_check = false;
Refund refund = new Refund();
refund.SetTxnNumber(txn_number);
refund.SetOrderId(order_id);
refund.SetAmount(amount);
refund.SetCryptType(crypt);
refund.SetCustId(custid);
refund.SetDynamicDescriptor(dynamic_descriptor);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(refund);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Page 37 of 486

November 2018

2 Basic Transaction Set

2.9 Independent Refund
Things to Consider:
l

Because of the potential for fraud, permission for this transaction is not granted to all
accounts by default. If it is required for your business, it must be requested via your
account manager.

Independent Refund transaction object definition
IndependentRefund indrefund = new IndependentRefund();

HttpsPostRequest object for Independent Refund transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(indrefund);

Independent Refund transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 14: Independent Refund transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

indrefund.SetOrderId(order_
id);

Amount

String

10-character decimal

indrefund.SetAmount(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Credit card number

November 2018

String

20-character alphanumeric

indrefund.SetPan(pan);

Page 38 of 486

Moneris Gateway API - Integration Guide
Table 14: Independent Refund transaction object mandatory values (continued)
Value

Type

Expiry date

String

Limits
4-character alphanumeric

Set method
indrefund.SetExpdate(expiry_
date);

(YYMM format)
E-Commerce indicator

String

1-character alphanumeric

indrefund.SetCryptType
(crypt);

Table 15: Independent Refund transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

indrefund.SetCustId(cust_id);

Dynamic descriptor

String

20-character alphanumeric

indrefund
.SetDynamicDescriptor
(dynamic_descriptor);

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Sample Independent Refund
namespace Moneris
{
using System;
public class TestCanadaIndependentRefund
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string store_id = "store5";
string api_token = "yesguy";
string cust_id = "my customer id";
string amount = "20.00";
string pan = "4242424242424242";
string expdate = "1901"; //YYMM
string crypt = "7";
string processing_country_code = "CA";
bool status_check = false;
IndependentRefund indrefund = new IndependentRefund();
indrefund.SetOrderId(order_id);
indrefund.SetCustId(cust_id);
indrefund.SetAmount(amount);
indrefund.SetPan(pan);
indrefund.SetExpdate(expdate);
indrefund.SetCryptType(crypt);
indrefund.SetDynamicDescriptor("123456");
HttpsPostRequest mpgReq = new HttpsPostRequest();

Page 39 of 486

November 2018

2 Basic Transaction Set

Sample Independent Refund
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(indrefund);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

2.10 Card Verification with AVS and CVD

Things to Consider:
l
l

l
l
l

The Card Verification transaction is only supported by Visa, MasterCard and Discover
For some Credential on File transactions, Card Verification with AVS and CVD is used as
a prior step to get the Issuer ID used in the subsequent transaction
For Card Verification, CVD is supported by Visa, MasterCard and Discover.
For Card Verification, AVS is supported by Visa, MasterCard and Discover.
When testing Card Verification, please use the Visa and MasterCard test card numbers
provided in the MasterCard Card Verification and Visa Card Verification tables available
in CVD & AVS (E-Fraud) Simulator.

November 2018

Page 40 of 486

Moneris Gateway API - Integration Guide

l

For a full list of possible AVS & CVD result codes refer to the CVD and AVS Result Code
tables.

Card Verification object definition
CardVerification cardVerification = new CardVerification();

HttpsPostRequest object for Card Verification transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(cardVerification);

Card Verification transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 16: Card Verification transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

cardVerification.SetOrderId
(order_id);

Credit card number

String

20-character alphanumeric

cardVerification.SetPan(pan);

Expiry date

String

4-character alphanumeric

cardVerification.SetExpdate
(expiry_date);

(YYMM format)

Page 41 of 486

November 2018

2 Basic Transaction Set
Table 16: Card Verification transaction object mandatory values
Value

Type

Limits

Set method

E-commerce indicator

String

1-character alphanumeric

cardVerification.SetCryptType
(crypt);

AVS

Object

N/A

cardVerification.SetAvsInfo
(avsCheck);

CVD

Object

N/A

cardVerification.SetCvdInfo
(cvdCheck);

NOTE: When storing
credentials on the initial transaction, the
CVD object must be
sent; for subsequent
transactions using
stored credentials, CVD
can be sent with cardholder-initiated transactions only—
merchants must not
store CVD information.

Table 17: Basic Card Verification transaction object optional values
Value

Type

Credential on File Info

Object

Limits
N/A

Set Method
cardVerification.SetCofInfo
(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

November 2018

Page 42 of 486

Moneris Gateway API - Integration Guide

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Payment Indicator

Limits
15-character alphanumeric

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");

variable length

String

1-character alphabetic

NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

cof.SetPaymentIndicator
("PAYMENT_INDICATOR_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Payment Information

String

1-character numeric

cof.SetPaymentInformation
("PAYMENT_INFO_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Card Verification
namespace Moneris
{
using System;
public class TestCanadaCardVerficiation
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string pan = "4242424242424242";
string expdate = "1901"; //YYMM format
string crypt = "7";
string processing_country_code = "CA";
bool status_check = false;

Page 43 of 486

November 2018

2 Basic Transaction Set

Sample Card Verification
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
CvdInfo cvdCheck = new CvdInfo();
cvdCheck.SetCvdIndicator("1");
cvdCheck.SetCvdValue("099");
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("12345678901234");
CardVerification cardVerification = new CardVerification();
cardVerification.SetOrderId(order_id);
cardVerification.SetPan(pan);
cardVerification.SetExpDate(expdate);
cardVerification.SetCryptType(crypt);
cardVerification.SetAvsInfo(avsCheck);
cardVerification.SetCvdInfo(cvdCheck);
cardVerification.SetCofInfo(cof);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(cardVerification);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

November 2018

Page 44 of 486

Moneris Gateway API - Integration Guide

2.11 Batch Close
Batch Close transaction object definition
BatchClose batchclose = new BatchClose();

HttpsPostRequest object for Batch Close transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(batchclose);

Batch Close transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 18: Batch Close transaction object mandatory values
Value
ECR (electronic cash
register) number

Type

Limits

Set method

String

No limit (value
provided by Moneris)

batchclose.SetEcrno(ecr_no);

Sample Batch Close
namespace Moneris
{
using System;
public class TestCanadaBatchClose
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string ecr_no = "66013455"; //ecr within store
string processing_country_code = "CA";
bool status_check = false;
BatchClose batchclose = new BatchClose();
batchclose.SetEcrno(ecr_no);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(batchclose);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
if ((receipt.GetReceiptId()).Equals("Global Error Receipt"))
{
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());

Page 45 of 486

November 2018

2 Basic Transaction Set

Sample Batch Close
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = null");
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
}
else
{
foreach (string ecr in receipt.GetTerminalIDs())
{
Console.WriteLine("ECR: " + ecr);
foreach (string cardType in receipt.GetCreditCards(ecr))
{
Console.WriteLine("\tCard Type: " + cardType);
Console.WriteLine("\t\tPurchase: Count = "
+ receipt.GetPurchaseCount(ecr, cardType)
+ " Amount = "
+ receipt.GetPurchaseAmount(ecr,
cardType));
Console.WriteLine("\t\tRefund: Count = "
+ receipt.GetRefundCount(ecr, cardType)
+ " Amount = "
+ receipt.GetRefundAmount(ecr, cardType));
Console.WriteLine("\t\tCorrection: Count = "
+ receipt.GetCorrectionCount(ecr, cardType)
+ " Amount = "
+ receipt.GetCorrectionAmount(ecr,
cardType));
}
}
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

2.12 Open Totals
Open Totals transaction object definition
OpenTotals opentotals = new OpenTotals();

HttpsPostRequest object for Open Totals transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();

November 2018

Page 46 of 486

Moneris Gateway API - Integration Guide
mpgReq.SetTransaction(opentotals);

Open Totals transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 19: Open Totals transaction object mandatory values
Value
ECR (electronic cash
register) number

Type

Limits

Set method

String

No limit (value
provided by Moneris)

opentotals.SetEcrno(ecr_no);

Sample Open Totals
namespace Moneris
{
using System;
public class TestCanadaOpenTotals
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string ecr_no = "66013455";
//string ecr_no = "66013455";
string processing_country_code = "CA";
OpenTotals opentotals = new OpenTotals();
opentotals.SetEcrno(ecr_no);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(opentotals);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
if ((receipt.GetReceiptId()).Equals("Global Error Receipt") ||
receipt.GetReceiptId().Equals("") ||
receipt.GetReceiptId().Equals("null"))
{
Console.WriteLine("CardType = null ");
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = null");
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());

Page 47 of 486

November 2018

2 Basic Transaction Set

Sample Open Totals
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
}
else
{
foreach (string ecr in receipt.GetTerminalIDs())
{
Console.WriteLine("ECR: " + ecr);
foreach (string cardType in receipt.GetCreditCards(ecr))
{
Console.WriteLine("\tCard Type: " + cardType);
Console.WriteLine("\t\tPurchase: Count = "
+ receipt.GetPurchaseCount(ecr, cardType)
+ " Amount = "
+ receipt.GetPurchaseAmount(ecr,
cardType));
Console.WriteLine("\t\tRefund: Count = "
+ receipt.GetRefundCount(ecr, cardType)
+ " Amount = "
+ receipt.GetRefundAmount(ecr, cardType));
Console.WriteLine("\t\tCorrection: Count = "
+ receipt.GetCorrectionCount(ecr, cardType)
+ " Amount = "
+ receipt.GetCorrectionAmount(ecr,
cardType));
}
}
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

November 2018

Page 48 of 486

3 Credential on File
l
l
l
l
l
l

3.1
3.2
3.3
3.4
3.5
3.7

About Credential on File
Credential on File Info Object and Variables
Credential on File Transaction Types
Initial Transactions in Credential on File
Vault Tokenize Credit Card and Credential on File
Card Verification and Credential on File Transactions

3.1 About Credential on File
When storing customers' credit card credentials for use in future authorizations, or when using these credentials in subsequent transactions, card brands now require merchants to indicate this in the transaction request.
In the Moneris API, this is handled by the Moneris Gateway via the inclusion of the Credential on File info
object and its variables in the transaction request.
While the requirements for handling Credential on File transactions relate to Visa, Mastercard and Discover only, in order to avoid confusion and prevent error, please implement these changes for all card
types and the Moneris system will then correctly flow the relevant card data values as appropriate.
While in the testing phase, we recommend that you test with Visa cards because implementation for the
other card brands is still in process.

NOTE: If either the first transaction or a Card Verification authorization is declined when
attempting to store cardholder credentials, those credentials cannot be stored —therefore
the merchant must not use the credential for any subsequent transactions.

3.2 Credential on File Info Object and Variables
The Credential on File Info object is nested within the request for the applicable transaction types.
Object:
cof
Variables in the cof object:
Payment Indicator
Payment Information
Issuer ID
For more information, see Definitions of Request Fields – Credential on File.

3.3 Credential on File Transaction Types
The Credential on File Info object applies to the following transaction types:

November 2018

Page 49 of 486

Moneris Gateway API - Integration Guide

l
l
l
l
l
l
l
l
l
l
l
l
l
l

Purchase
Pre-Authorization
Purchase with 3-D Secure – cavvPurchase
Purchase with 3-D Secure and Recurring Billing
Pre-Authorization with 3-D Secure – cavvPreauth
Purchase with Vault – ResPurchaseCC
Pre-Authorization with Vault – ResPreauthCC
Card Verification with AVS and CVD
Card Verification with Vault – ResCardVerificationCC
Vault Add Credit Card – ResAddCC
Vault Update Credit Card – ResUpdateCC
Vault Add Token – ResAddToken
Vault Tokenize Credit Card – ResTokenizeCC
Recurring Billing

3.4 Initial Transactions in Credential on File
When sending an initial transaction with the Credential on File Info object, i.e., a transaction request
where the cardholder's credentials are being stored for the first time, it is important to understand the
following:
l
l

l
l

You must send the cardholder's Card Verification Digits (CVD)
Issuer ID will be sent without a value on the initial transaction, because it is received in the
response to that initial transaction; for all subsequent merchant-intiated transactions and all
administrative transactions you send this Issuer ID
The payment information field should always be set to a value of 0 on the first transaction
The payment indicator field should be set to the value that is appropriate for the transaction

3.5 Vault Tokenize Credit Card and Credential on File
When you want to store cardholder credentials from previous transactions into the Vault, you use the
Vault Tokenize Credit Card transaction request. Credential on File rules require that only previous transactions with the Credential on File Info object can be tokenized to the Vault.
For more information about this transaction, see 4.3.10 Vault Tokenize Credit Card – ResTokenizeCC.

3.6 Credential on File and Converting Temporary Tokens
In the event you decide to convert a temporary token representing cardholder credentials into a permanent token, these credentials become stored credentials, and therefore necessary to send Credential
on File information.
For Temporary Token Add transactions where you subsequently decide to convert the temporary token
into a permanent token (stored credentials):

Page 50 of 486

November 2018

3 Credential on File
1. Send a transaction request that includes the Credential on File Info object to get the Issuer ID; this
can be a Card Verification, Purchase or Pre-Authorization request
2. After completing the transaction, send the Vault Add Token request with the Credential on File
object (Issuer ID only) in order to convert the temporary token to a permanent one.

3.7 Card Verification and Credential on File Transactions
In the absence of a Purchase or Pre-Authorization, a Card Verification transaction is used to get the
unique Issuer ID value (issuerId) that is used in subsequent Credential on File transactions. Issuer ID is a
variable included in the nested Credential on File Info object.
For all first-time transactions, including Card Verification transactions, you must also request the cardholder's Card Verification Details (CVD). For more on CVD, see 9.2 Card Validation Digits (CVD).
For a complete list of these variables, see each transaction type or Definitions of Request Fields – Credential on File
The Card Verification request, including the Credential on File Info object, must be sent immediately prior
to storing cardholder credentials.
For information about Card Verification, see 2.10 Card Verification with AVS and CVD.

3.7.1 When to Use Card Verification With COF
If you are not sending a Purchase or Pre-Authorization transaction (i.e., you are not charging the customer immediately), you must use Card Verification (or in the case of Vault Add Token, Card Verification
with Vault) first before running the transaction in order to get the Issuer ID.
Transactions this applies to:
Vault Add Credit Card – ResAddCC
Vault Update Credit Card – ResUpdateCC
Vault Add Token – ResAddToken
Recurring Billing transactions, if:
l the first transaction is set to start on a future date

3.7.2 Credential on File and Vault Add Token
For Vault Add Token transactions:
1. Send Card Verification with Vault transaction request including the Credential on File object to get
the Issuer ID
2. Send the Vault Add Token request including the Credential on File object (with Issuer ID only;
other fields are not applicable)
For more on this transaction type, see 4.3.9 Vault Add Token – ResAddToken.

November 2018

Page 51 of 486

Moneris Gateway API - Integration Guide

3.7.3 Credential on File and Vault Update Credit Card
For Vault Update Credit Card transactions where you are updating the credit card number:
1. Send Card Verification transaction request including the Credential on File object to get the
Issuer ID
2. Send the Vault Update Credit Card request including the Credential on File Info object (Issuer ID
only).
For more on this transaction type, see 4.3.3 Vault Update Credit Card – ResUpdateCC.

3.7.4 Credential on File and Vault Add Credit Card
For Vault Add Credit Card transactions:
1. Send Card Verification transaction request including the Credential on File object to get the
Issuer ID
2. Send the Vault Add Credit Card request including the Credential on File Info object (Issuer ID only)
For more on this transaction type, see 4.3.1 Vault Add Credit Card – ResAddCC.

3.7.5 Credential on File and Recurring Billing

NOTE: The value of the payment indicator field must be R when sending Recurring Billing
transactions.

For Recurring Billing transactions which are set to start immediately:
1. Send a Purchase transaction request with both the Recurring Billing and Credential on File info
objects
For Recurring Billing transactions which are set to start on a future date:
1. Send Card Verification transaction request including the Credential on File info object to get the
Issuer ID
2. Send Purchase transaction request with the Recur and Credential on File info objects included
For updating a Recurring Billing series where you are updating the card number (does not apply if you are
only modifying the schedule or amount in a recurring series):
1. Send Card Verification request including the Credential on File info object to get the Issuer ID
2. Send a Recurring Billing Update transaction
For more information about the Recurring Billing object, see Definition of Request Fields – Recurring.

Page 52 of 486

November 2018

4 Vault
l
l
l
l
l

4.1
4.2
4.3
4.4
4.5

About the Vault Transaction Set
Vault Transaction Types
Vault Administrative Transactions
Vault Financial Transactions
Hosted Tokenization

4.1 About the Vault Transaction Set
The Vault feature allows merchants to create customer profiles, edit those profiles, and use them to process transactions without having to enter financial information each time. Customer profiles store customer data essential to processing transactions, including credit and signature debit.
The Vault is a complement to the recurring payment module. It securely stores customer account information on Moneris secure servers. This allows merchants to bill customers for routine products or services
when an invoice is due.

4.2 Vault Transaction Types
The Vault API supports both administrative and financial transactions.

4.2.1 Administrative Vault Transaction types
ResAddCC
Creates a new credit card profile, and generates a unique data key which can be obtained
from the Receipt object.
This data key is the profile identifier that all future financial Vault transactions will use to associate with the saved information.
EncResAddCC
Creates a new credit card profile, but requires the card data to be either swiped or manually
keyed in via a Moneris-provided encrypted mag swipe reader.
ResTempAdd
Creates a new temporary token credit card profile. This transaction requires a duration to be
set to indicate how long the temporary token is to be stored for.
During the lifetime of this temporary token, it may be used for any other vault transaction
before it is permanently deleted from the system.
ResUpdateCC
Updates a Vault profile (based on the data key) to contain credit card information.
All information contained within a credit card profile is updated as indicated by the submitted
fields.
EncResUpdateCC
Updates a profile (based on the data key) to contain credit card information. The encrypted
version of this transaction requires the card data to either be swiped or manually keyed in via
a Moneris-provided encrypted mag swipe reader.

November 2018

Page 53 of 486

Moneris Gateway API - Integration Guide
ResDelete
Deletes an existing Vault profile of any type using the unique data key that was assigned when
the profile was added.
It is important to note that after a profile is deleted, the information which was saved within
can no longer be retrieved.
ResLookupFull
Verifies what is currently saved under the Vault profile associated with the given data key. The
response to this transaction returns the latest active data for that profile.
Unlike ResLookupMasked (which returns the masked credit card number), this transaction
returns both the masked and the unmasked credit card numbers.
ResLookupMasked
Verifies what is currently saved under the Vault profile associated with the given data key. The
response to this transaction returns the latest active data for that profile.
Unlike ResLookupFull (which only returns both the masked and the unmasked credit card
numbers), this transaction only returns the masked credit card number.
ResGetExpiring
Verifies which profiles have credit cards that are expiring during the current and next calendar
month. For example, if you are processing this transaction on September 30, then it will
return all cards that expire(d) in September and October of this year.
When generating a list of profiles with expiring credit cards, only the masked credit card numbers are returned.
This transaction can be performed no more than 2 times on any given calendar day, and it
only applies to credit card profiles.
ResIscorporatecard
Determines whether a profile has a corporate card registered within it.
After sending the transaction, the response field to the Receipt object's getCorporateCard
method is either true or false depending on whether the associated card is a corporate
card.
ResAddToken
Converts a Hosted Tokenization temporary token to a permanent Vault token.
A temporary token is valid for 15 minutes after it is created.
ResTokenizeCC
Creates a new credit card profile using the credit card number, expiry date and e-commerce
indicator that were submitted in a previous financial transaction. A transaction that was previously done in Moneris Gateway is taken, and the card data from that transaction is stored
in the Moneris Vault.
As with ResAddCC, a unique data key is generated and returned to the merchant via the
Receipt object. This is the profile identifier that all future financial Vault transactions will use to
associate with the saved information.

Page 54 of 486

November 2018

4 Vault

4.2.2 Financial Vault Transaction types
ResPurchaseCC
Uses the data key to identify a previously registered credit card profile. The details saved
within the profile are then submitted to perform a Purchase transaction.
ResPreauthCC
Uses the data key to identify a previously registered credit card profile. The details within the
profile are submitted to perform a Pre-Authorization transaction.
ResIndRefundCC
Uses the unique data key to identify a previously registered credit card profile, and credits a
specified amount to that credit card.
ResMpiTxn
Uses the data key (as opposed to a credit card number) in a VBV/SecureCode Txn MPI transaction. The merchant uses the data key with ResMpiTxn request, and then reads the
response fields to verify whether the card is enrolled in Verified by Visa or MasterCard
SecureCode. Retrieves the vault transaction value to pass on to Visa or MasterCard.
After it has been validated that the data key is is enrolled in 3-D Secure, a window appears in
which the customer can enter the 3-D Secure password. The merchant may initiate the forming of the validation form getMpiInLineForm().
For more information on integrating with MonerisMPI, refer to 8 MPI

4.3 Vault Administrative Transactions
Administrative transactions allow you to perform such tasks as creating new Vault profiles, deleting existing Vault profiles and updating profile information.
Some Vault Administrative Transactions require the Credential on File object to be sent with the issuer ID
field only.

4.3.1 Vault Add Credit Card – ResAddCC
ResAddCC transaction object definition
ResAddCC resaddcc = new ResAddCC();

HttpsPostRequest object for ResAddCC transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resaddcc);

ResAddCC transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields

November 2018

Page 55 of 486

Moneris Gateway API - Integration Guide
Table 20: Vault Add Credit Card transaction object mandatory values
Value

Type

Limits

Set method

Credit card number

String

20-character alphanumeric

resaddcc.SetPan(pan);

Expiry date

String

4-character alphanumeric

resaddcc.SetExpdate(expiry_
date);

(YYMM format)
E-commerce indicator

String

1-character alphanumeric

resaddcc.SetCryptType(crypt);

Credential on File Info

Object

N/A

resaddcc.SetCofInfo(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

Table 21: Vault Add Credit Card transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

resaddcc.SetCustId(cust_id);

AVS information

Object

N/A

resaddcc.SetAvsInfo
(avsCheck);

Email address

String

30-character alphanumeric

resaddcc.SetEmail(email);

Page 56 of 486

November 2018

4 Vault
Table 21: Vault Add Credit Card transaction optional values
Value

Type

Limits

Set method

Phone number

String

30-character alphanumeric

resaddcc.SetPhone(phone);

Note

String

30-character alphanumeric

resaddcc.SetNote(note);

Data key format

String

2-character alphanumeric

resaddcc.SetDataKeyFormat
(data_key_format)

Credential on File Transaction Object Request Fields
Value
Issuer ID
NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Type
String

Limits
15-character alphanumeric
variable length

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Vault Add Credit Card
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResAddCC
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string pan = "4242424242424242";
string expdate = "1912";
string phone = "0000000000";
string email = "bob@smith.com";
string note = "my note";

November 2018

Page 57 of 486

Moneris Gateway API - Integration Guide

Sample Vault Add Credit Card
string cust_id = "customer1";
string crypt_type = "7";
string data_key_format = "0";
string processing_country_code = "CA";
bool status_check = false;
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
CofInfo cof = new CofInfo();
cof.SetIssuerId("168451306048014");
ResAddCC resaddcc = new ResAddCC();
resaddcc.SetPan(pan);
resaddcc.SetExpDate(expdate);
resaddcc.SetCryptType(crypt_type);
resaddcc.SetCustId(cust_id);
resaddcc.SetPhone(phone);
resaddcc.SetEmail(email);
resaddcc.SetNote(note);
resaddcc.SetAvsInfo(avsCheck);
resaddcc.SetGetCardType("true");
//resaddcc.SetDataKeyFormat(data_key_format); //optional
resaddcc.SetCofInfo(cof);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resaddcc);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);

Page 58 of 486

November 2018

4 Vault

Sample Vault Add Credit Card
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.1.1 Vault Data Key
The ResAddCC sample code includes the following instruction from the Receipt object:
Console.WriteLine("DataKey = " + receipt.GetDataKey());

The data key response field is populated when you send a Vault Add Credit Card – ResAddCC (page 55),
Vault Encrypted Add Credit Card – EncResAddCC (page 59), Vault Tokenize Credit Card – ResTokenizeCC
(page 82), Vault Temporary Token Add – ResTempAdd (page 62) or Vault Add Token – ResAddToken
(page 78) transaction. It is the profile identifier that all future financial Vault transactions will use to associate with the saved information.
The data key is a maximum 28-character alphanumeric string.

4.3.1.2 Vault Encrypted Add Credit Card – EncResAddCC
Vault Encrypted Add Credit Card transaction object definition
EncResAddCC encresaddcc = new EncResAddCC();

HttpsPostRequest object for Vault Encrypted Add Credit Card transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(encresaddcc);

Vault Encrypted Add Credit Card transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields

November 2018

Page 59 of 486

Moneris Gateway API - Integration Guide
Table 22: Vault Encrypted Add Credit Card transaction object mandatory values
Value

Type

Limits

Set method

Encrypted Track2 data

String

40-character numeric

encresaddcc.SetEncTrack2(enc_
track2);

Device type

String

30-character alphanumeric

encresaddcc.SetDeviceType
(device_type);

E-commerce indicator

String

1-character alphanumeric

encresaddcc.SetCryptType
(crypt);

Table 23: Vault Encrypted Add Credit Card transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

encresaddcc.SetCustId(cust_
id);

AVS information

Object

Not applicable. Click
hereSee 9.1 (page
291).

encresaddcc.SetAvsInfo
(avsCheck);

Email address

String

30-character alphanumeric

encresaddcc.SetEmail(email);

Phone number

String

30-character alphanumeric

encresaddcc.SetPhone(phone);

Note

String

30-character alphanumeric

encresaddcc.SetNote(note);

Data key format1

String

2-character alphanumeric

encresaddcc.SetDataKeyFormat
(data_key_format)

Sample Vault Encrypted Add Credit Card
namespace Moneris
{
using System;
public class TestCanadaEncResAddCC
{
public static void Main(string[] args)

1Available to Canadian integrations only.

Page 60 of 486

November 2018

4 Vault

Sample Vault Encrypted Add Credit Card
{
/******************* REQUEST VARIABLES*******************************/
string store_id = "store5";
string api_token = "yesguy";
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string cust_id = "nqa";
string amount = "1.00";
string device_type = "idtech_bdk";
string crypt = "7";
string enc_track2 = "ENCRYPTEDTRACK2DATA";
string data_key_format = "0";
string processing_country_code = "CA";
bool status_check = false;
EncResAddCC encresaddcc = new EncResAddCC();
encresaddcc.SetEncTrack2(enc_track2);
encresaddcc.SetDeviceType(device_type);
encresaddcc.SetCryptType(crypt);
encresaddcc.SetCustId(cust_id);
encresaddcc.SetNote("Just a note");
encresaddcc.SetEmail("example@test.com");
encresaddcc.SetPhone("866-319-7450");
//encresaddcc.SetDataKeyFormat(data_key_format); //optional
/*************** Address Verification Service **********************/
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
encresaddcc.SetAvsInfo(avsCheck);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(encresaddcc);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
//ResolveData
Console.WriteLine("\nCust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());

November 2018

Page 61 of 486

Moneris Gateway API - Integration Guide

Sample Vault Encrypted Add Credit Card
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.2 Vault Temporary Token Add – ResTempAdd
Creates a new temporary token credit card profile. This transaction requires a duration to be set to indicate how long the temporary token is to be stored for.
During the lifetime of this temporary token, it may be used for any other Vault transaction before it is permanently deleted from the system.
Things to Consider:
l

The duration, or lifetime, of the temporary token can be set to be a maximum of 15
minutes.

Vault Temporary Token Add transaction object definition
ResTempAdd resTempAdd = new ResTempAdd();

HttpsPostRequest object for Vault Temporary Token Add transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resTempAdd);

Vault Temporary Token Add transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields

Page 62 of 486

November 2018

4 Vault
Table 24: Vault Temporary Token Add transaction object mandatory values
Value

Type

Limits

Set method

Credit card number

String

20-character numeric

resTempAdd.SetPan(pan);

Expiry date

String

4-character numeric

resTempAdd.SetExpdate(expiry_
date);

Duration

String

3-character numeric

resTempAdd.SetDuration
(duration);

maximum 15 minutes
E-commerce indicator

String

1-character alphanumeric

resTempAdd.SetCryptType
(crypt);

Table 25: Vault Temporary Token Add transaction optional values
Value
Data key format1

Type
String

Limits
2-character alphanumeric

Set method
resTempAdd.SetDataKeyFormat
(data_key_format)

Sample Vault Temporary Token Add
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResTempAdd
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string pan = "5454545454545454";
string expdate = "1901"; //YYMM format
string crypt_type = "7";
string duration = "900";
string data_key_format = "0";
string processing_country_code = "CA";
bool status_check = false;
ResTempAdd resTempAdd = new ResTempAdd();
resTempAdd.SetPan(pan);
resTempAdd.SetExpDate(expdate);
resTempAdd.SetDuration(duration);
resTempAdd.SetCryptType(crypt_type);
//resTempAdd.SetDataKeyFormat(data_key_format); //optional
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);

1Available to Canadian integrations only.

November 2018

Page 63 of 486

Moneris Gateway API - Integration Guide

Sample Vault Temporary Token Add
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resTempAdd);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.3 Vault Update Credit Card – ResUpdateCC
Updates a Vault profile (based on the data key) to contain credit card information. All information contained within a credit card profile is updated as indicated by the submitted fields.
Things to Consider:
l

l

This will update a profile to contain Credit Card information by referencing the profile’s
unique data key. If the profile which is being updated was already a Credit Card profile,
all information contained within it will simply be updated as indicated by the submitted
fields. This means that all fields are optional, and only those fields that are submitted
will be updated.
To update a specific field on the profile, only set that specific element using the corresponding set method.

Page 64 of 486

November 2018

4 Vault

Vault Update Credit Card transaction object definition
ResUpdateCC resUpdateCC = new ResUpdateCC();

HttpsPostRequest object for Vault Update Credit Card transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resUpdateCC);

Vault Update Credit Card transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 26: Vault Update Credit Card transaction object mandatory values
Value

Type

Data key

String

Limits
25-character alphanumeric

Set method
resUpdateCC.SetData(data_
key);

Optional values that are submitted to the ResUpdateCC object are updated. Unsubmitted optional values (with one exception) remain unchanged. This allows you to change only the fields you want.
If a profile contains AVS information, but a Vault Update Credit Card transaction is submitted without an
AVS Info object, the existing AVS Info details are deactivated and the new credit card information is
registered without AVS.
Table 27: Vault Update Credit Card transaction optional values
Value

Type

Limits

Set method

Credit card number

String

20-character alphanumeric

resUpdateCC.SetPan(pan);

Expiry date

String

4-character alphanumeric

resUpdateCC.SetExpdate
(expiry_date);

(YYMM format)
E-commerce indicator

String

1-character alphanumeric

resUpdateCC.SetCryptType
(crypt);

Customer ID

String

50-character alphanumeric

resUpdateCC.SetCustId(cust_
id);

AVS information

Object

n/a

resUpdateCC.SetAvsInfo
(avsCheck);

Email address

String

30-character alphanumeric

resUpdateCC.SetEmail(email);

November 2018

Page 65 of 486

Moneris Gateway API - Integration Guide

Value

Type

Limits

Set method

Phone number

String

30-character alphanumeric

resUpdateCC.SetPhone(phone);

Note

String

30-character alphanumeric

resUpdateCC.SetNote(note);

Credential on File Info

Object

N/A

resUpdateCC.SetCofInfo(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

Credential on File Transaction Object Request Fields
Value
Issuer ID
NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Type
String

Limits
15-character alphanumeric
variable length

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Vault Update Credit Card
namespace Moneris
{

Page 66 of 486

November 2018

4 Vault

Sample Vault Update Credit Card
using System;
using System.Text;
using System.Collections;
public class TestCanadaResUpdateCC
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string data_key = "cIjurYyhGCAiGuCKdp94AspE7";
string pan = "4242424242424242";
string expdate = "1901";
string phone = "0000000000";
string email = "bob@smith.com";
string note = "my note";
string cust_id = "customer1";
string crypt_type = "7";
string processing_country_code = "CA";
bool status_check = false;
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
CofInfo cof = new CofInfo();
cof.SetIssuerId("168451306048014");
ResUpdateCC resUpdateCC = new ResUpdateCC();
resUpdateCC.SetDataKey(data_key);
resUpdateCC.SetAvsInfo(avsCheck);
resUpdateCC.SetCustId(cust_id);
resUpdateCC.SetPan(pan);
resUpdateCC.SetExpDate(expdate);
resUpdateCC.SetPhone(phone);
resUpdateCC.SetEmail(email);
resUpdateCC.SetNote(note);
resUpdateCC.SetCryptType(crypt_type);
resUpdateCC.SetCofInfo(cof);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resUpdateCC);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());

November 2018

Page 67 of 486

Moneris Gateway API - Integration Guide

Sample Vault Update Credit Card
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.3.1 Vault Encrypted Update CC - EncResUpdateCC
Vault Encrypted Update CC transaction object definition
EncResUpdateCC encresupdatecc = new EncResUpdateCC();

HttpsPostRequest object for Vault Encrypted Update CC transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(encresupdatecc);

Vault Encrypted Update CC transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 28: Vault Encrypted Update CC transaction object mandatory values
Value

Type

Limits

Set method

Data key

String

25-character alphanumeric

encresupdatecc.SetData(data_
key);

Encrypted Track2 data

String

Variable length

encresupdatecc.SetEncTrack2
(enc_track2);

Device type

String

30-character alphanumeric

encresupdatecc.SetDeviceType
(device_type);

Page 68 of 486

November 2018

4 Vault
Optional values that are submitted to the ResUpdateCC object are updated, while unsubmitted optional
values (with one exception) remain unchanged. This allows you to change only the fields you want.
The exception is that if you are making changes to the payment type, all of the variables in the optional
values table below must be submitted.
If you update a profile to a different payment type, it is automatically deactivated and a new credit card
profile is created and assigned to the data key. The only values from the prior profile that will remain
unchanged are the customer ID, phone number, email address, and note.
EXAMPLE: If a profile contains AVS information, but a ResUpdateCC transaction is submitted without an AVSInfo object, the existing AVSInfo details are deactivated and the new
credit card information is registered without AVS.
Table 29: Vault Encrypted Update CC transaction optional values
Value

Type

Limits

Set method

E-commerce indicator

String

1-character alphanumeric

encresupdatecc.SetCryptType
(crypt);

Customer ID

String

50-character alphanumeric

encresupdatecc.SetCustId
(cust_id);

AVS information

Object

Not applicable. Click
hereSee 9.1 (page
291).

encresupdatecc.SetAvsInfo
(avsCheck);

Email address

String

30-character alphanumeric

encresupdatecc.SetEmail
(email);

Phone number

String

30-character alphanumeric

encresupdatecc.SetPhone
(phone);

Note

String

30-character alphanumeric

encresupdatecc.SetNote(note);

Sample Vault Encrypted Update CC - CA
namespace Moneris
{
using System;
public class TestCanadaEncResUpdateCC
{
public static void Main(string[] args)
{
/******************* REQUEST VARIABLES*******************************/

November 2018

Page 69 of 486

Moneris Gateway API - Integration Guide

Sample Vault Encrypted Update CC - CA
string store_id = "store5";
string api_token = "yesguy";
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string cust_id = "nqa";
string device_type = "idtech_bdk";
string crypt = "7";
string enc_track2 = "ENCRYPTEDTRACK2DATA";
string processing_country_code = "CA";
string data_key = "gF5IpsWD3s42r2TZxZyecE9Gs";
bool status_check = false;
EncResUpdateCC encresupdatecc = new EncResUpdateCC();
encresupdatecc.SetDataKey(data_key);
encresupdatecc.SetCustId(cust_id);
encresupdatecc.SetNote("Just a note2");
encresupdatecc.SetEmail("example1@test.com");
encresupdatecc.SetPhone("866-319-7450");
encresupdatecc.SetEncTrack2(enc_track2);
encresupdatecc.SetDeviceType(device_type);
encresupdatecc.SetCryptType(crypt);
/*************** Address Verification Service **********************/
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("3300");
avsCheck.SetAvsStreetName("Bloor Street");
avsCheck.SetAvsZipCode("M2X2X2");
encresupdatecc.SetAvsInfo(avsCheck);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(encresupdatecc);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
//ResolveData
Console.WriteLine("\nCust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());

Page 70 of 486

November 2018

4 Vault

Sample Vault Encrypted Update CC - CA
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.4 Vault Delete - ResDelete

NOTE: After a profile has been deleted, the details can no longer be retrieved.

Vault Delete transaction object definition
ResDelete resDelete = new ResDelete(data_key);

HttpsPostRequest object for Vault Delete transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resDelete);

Vault Delete transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 30: Vault Delete transaction object mandatory values
Value
Data key

Type
String

Limits
25-character alphanumeric

Set method
resDelete.SetData(data_key);

Sample Vault Delete
namespace Moneris
{
using System;

November 2018

Page 71 of 486

Moneris Gateway API - Integration Guide

Sample Vault Delete
using System.Text;
using System.Collections;
public class TestCanadaResDelete
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string data_key = "PjVKjtEmc1FvFyjxHE4EwBMxi";
string processing_country_code = "CA";
bool status_check = false;
ResDelete resDelete = new ResDelete(data_key);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resDelete);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
//ResolveData
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

Page 72 of 486

November 2018

4 Vault

4.3.5 Vault Lookup Full - ResLookupFull
Vault Lookup Full transaction object definition
ResLookupFull resLookupFull = new ResLookupFull(data_key);

HttpsPostRequest object for Vault Lookup Full transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resLookupFull);

Vault Lookup Full transaction values
Table 31: Vault Lookup Full transaction object mandatory values
Value
Data key

Type
String

Limits
25-character alphanumeric

Set method
resLookupFull.SetData(data_
key);

Sample Vault Lookup Full
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResLookupFull
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string data_key = "pi3ZMZoTTM8pLM9wuwws2KBxw";
string processing_country_code = "CA";
bool status_check = false;
ResLookupFull resLookupFull = new ResLookupFull(data_key);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resLookupFull);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());

November 2018

Page 73 of 486

Moneris Gateway API - Integration Guide

Sample Vault Lookup Full
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("Pan = " + receipt.GetResDataPan());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.6 Vault Lookup Masked - ResLookupMasked
Vault Lookup Masked transaction object definition
ResLookupMasked resLookupMasked = new ResLookupMasked();

HttpsPostRequest object for Vault Lookup Masked transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resLookupMasked);

Vault Lookup Masked transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 32: Vault Lookup Masked transaction object mandatory values
Value
Data key

Page 74 of 486

Type
String

Limits

Set method

25-character alphanumeric

November 2018

4 Vault

Sample Vault Lookup Masked - CA
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResLookupMasked
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string data_key = "pi3ZMZoTTM8pLM9wuwws2KBxw";
string processing_country_code = "CA";
bool status_check = false;
ResLookupMasked resLookupMasked = new ResLookupMasked();
resLookupMasked.SetData(data_key);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resLookupMasked);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

November 2018

Page 75 of 486

Moneris Gateway API - Integration Guide

4.3.7 Vault Get Expiring - ResGetExpiring
Vault Get Expiring transaction object definition
ResGetExpiring resGetExpiring = new ResGetExpiring();

HttpsPostRequest object for Vault Get Expiring transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resGetExpiring);

Vault Get Expiring transaction values
ResGetExpiring transaction object mandatory values: None.
Sample Vault Get Expiring - CA
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResGetExpiring
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string processing_country_code = "CA";
bool status_check = false;
ResGetExpiring resGetExpiring = new ResGetExpiring();
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resGetExpiring);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
//ResolveData
foreach (string dataKey in receipt.GetDataKeys())
{
Console.WriteLine("\nDataKey = " + dataKey);
Console.WriteLine("Payment Type = " + receipt.GetExpPaymentType(dataKey));
Console.WriteLine("Cust ID = " + receipt.GetExpCustId(dataKey));
Console.WriteLine("Phone = " + receipt.GetExpPhone(dataKey));

Page 76 of 486

November 2018

4 Vault

Sample Vault Get Expiring - CA
Console.WriteLine("Email = " + receipt.GetExpEmail(dataKey));
Console.WriteLine("Note = " + receipt.GetExpNote(dataKey));
Console.WriteLine("Masked Pan = " + receipt.GetExpMaskedPan(dataKey));
Console.WriteLine("Exp Date = " + receipt.GetExpExpdate(dataKey));
Console.WriteLine("Crypt Type = " + receipt.GetExpCryptType(dataKey));
Console.WriteLine("Avs Street Number = " + receipt.GetExpAvsStreetNumber(dataKey));
Console.WriteLine("Avs Street Name = " + receipt.GetExpAvsStreetName(dataKey));
Console.WriteLine("Avs Zipcode = " + receipt.GetExpAvsZipCode(dataKey));
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.8 Vault Is Corporate Card - ResIscorporateCard
Vault Is Corporate Card transaction object definition
ResIscorporatecard resIscorporatecard = new ResIscorporatecard();

HttpsPostRequest object for Vault Is Corporate Card transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resIscorporatecard);

Vault Is Corporate Card transaction values
Table 33: Vault Is Corporate Card transaction object mandatory values
Value
Data key

Type
String

Limits
25-character alphanumeric

Set method
resIscorporatecard.SetData
(data_key);

Sample Vault Is Corporate Card - CA
namespace Moneris
{
using System;

November 2018

Page 77 of 486

Moneris Gateway API - Integration Guide

Sample Vault Is Corporate Card - CA
using System.Text;
using System.Collections;
public class TestCanadaResIscorporatecard
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string data_key = "eLqsADfwqHDxIpJG9vLnELx01";
string processing_country_code = "CA";
bool status_check = false;
ResIscorporatecard resIscorporatecard = new ResIscorporatecard();
resIscorporatecard.SetData(data_key);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resIscorporatecard);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("CorporateCard = " + receipt.GetCorporateCard());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.9 Vault Add Token – ResAddToken
This transaction is used to convert a temporary token into a permanent token for storage in the Moneris
Vault

Page 78 of 486

November 2018

4 Vault

Things to Consider:
l
l

l

If you intend to store the token for use in future transactions (i.e., Credential on File
transactions), first you must send either a Vault financial transaction (Purchase
with Vault or Pre-Authorization with Vault) or a Card Verification with Vault in order to
get the Issuer ID
The Vault Add Token request uses the Issuer ID to indicate that it is referencing stored
credentials

Vault Add Token transaction object definition
ResAddToken resAddToken = new ResAddToken(data_key, crypt_type);

HttpsPostRequest object for Vault Add Token transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resAddToken);

Vault Add Token transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 34: Vault Add Token transaction object mandatory values
Value

Type

Limits

Set method

Data key

String

28-character alphanumeric

resAddToken.SetData(data_
key);

E-commerce indicator

String

1-character alphanumeric

resAddToken.SetCryptType
(crypt);

Credential on File Info

Object

N/A

resaddcc.SetCofInfo(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

November 2018

Page 79 of 486

Moneris Gateway API - Integration Guide
Table 35: Vault Add Token transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

resAddToken.SetCustId(cust_
id);

AVS information

Object

N/A

resAddToken.SetAvsInfo
(avsCheck);

Email address

String

30-character alphanumeric

resAddToken.SetEmail(email);

Phone number

String

30-character alphanumeric

resAddToken.SetPhone(phone);

Note

String

30-character alphanumeric

resAddToken.SetNote(note);

Data key format1

String

2-character alphanumeric

resAddToken.SetDataKeyFormat
(data_key_format)

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type

Limits

String

15-character numeric

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");

variable length
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Vault Add Token
namespace Moneris
{

1Available to Canadian integrations only.

Page 80 of 486

November 2018

4 Vault

Sample Vault Add Token
using System;
using System.Text;
using System.Collections;
public class TestCanadaResAddToken
{
public static void Main(string[] args)
{
string store_id = "moneris";
string api_token = "hurgle";
string data_key = "ot-A8R8m9sjsUgltcyTIDNmOVuq9";
string expdate = "1602";
string phone = "0000000000";
string email = "bob@smith.com";
string note = "my note";
string cust_id = "customer1";
string crypt_type = "7";
string data_key_format = "0";
string processing_country_code = "CA";
bool status_check = false;
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
CofInfo cof = new CofInfo();
cof.SetIssuerId("168451306048014");
ResAddToken resAddToken = new ResAddToken(data_key, crypt_type);
resAddToken.SetExpDate(expdate);
resAddToken.SetCustId(cust_id);
resAddToken.SetPhone(phone);
resAddToken.SetEmail(email);
resAddToken.SetNote(note);
resAddToken.SetAvsInfo(avsCheck);
resAddToken.SetCofInfo(cof);
//resAddToken.SetDataKeyFormat(data_key_format); //optional
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resAddToken);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());

November 2018

Page 81 of 486

Moneris Gateway API - Integration Guide

Sample Vault Add Token
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.3.10 Vault Tokenize Credit Card – ResTokenizeCC
Creates a new credit card profile using the credit card number, expiry date and e-commerce indicator
that were submitted in a previous financial transaction. Previous transactions to be tokenized must have
included the Credential on File Info object.
The Issuer ID received in the previous transaction response is sent in the Vault Tokenize Credit Card
request to reference that this is a stored credential.
Basic transactions that can be tokenized are:
l
l
l

Purchase
Pre-Authorization
Card Verification

The tokenization process is outlined below :

Figure 1: Tokenize process diagram

Page 82 of 486

November 2018

4 Vault

Vault Tokenize Credit Card transaction object definition
ResTokenizeCC resTokenizeCC = new ResTokenizeCC();

HttpsPostRequest object for Vault Tokenize Credit Card transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resTokenizeCC);

Vault Tokenize Credit Card transaction values
These mandatory values reference a previously processed credit card financial transaction. The credit
card number, expiry date, and e-commerce indicator from the original transaction are registered in the
Vault for future financial Vault transactions.
Table 36: Vault Tokenize Credit Card transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

resTokenizeCC.SetOrderId
(order_id);

Transaction number

String

255-character alphanumeric

resTokenizeCC.SetTxnNumber
(txn_number);

Table 37: Vault Tokenize Credit Card transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

resTokenizeCC.SetCustId(cust_
id);

Email address

String

30-character alphanumeric

resTokenizeCC.SetEmail
(email);

Phone number

String

30-character alphanumeric

resTokenizeCC.SetPhone
(phone);

Note

String

30-character alphanumeric

resTokenizeCC.SetNote(note);

November 2018

Page 83 of 486

Moneris Gateway API - Integration Guide

Value

Type

Limits

Set method

AVS information

Object

N/A

resTokenizeCC.SetAvsInfo
(avsCheck);

Data key format1

String

2-character alphanumeric

resTokenizeCC
.SetDataKeyFormat(data_key_
format)

Credential on File Info

Object

N/A

resTokenizeCC.SetCofInfo
(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Limits
15-character alphanumeric
variable length

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

1Available to Canadian integrations only.

Page 84 of 486

November 2018

4 Vault
Any field that is not set in the tokenize request is not stored with the transaction. That is, Moneris Gateway does not automatically take the optional information that was part of the original transaction.
The ResolveData that is returned in the response fields indicates what values were registered for this profile.
Sample Vault Tokenize Credit Card
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResTokenizeCC
{
public static void Main(string[] args)
{
string store_id = "store1";
string api_token = "yesguy";
string order_id = "1000189096";
string txn_number = "880416-0_10";
string phone = "0000000000";
string email = "bob@smith.com";
string note = "my note";
string cust_id = "customer1";
string data_key_format = "0";
string processing_country_code = "CA";
bool status_check = false;
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
CofInfo cof = new CofInfo();
cof.SetIssuerId("168451306048014");
ResTokenizeCC resTokenizeCC = new ResTokenizeCC();
resTokenizeCC.SetOrderId(order_id);
resTokenizeCC.SetTxnNumber(txn_number);
resTokenizeCC.SetCustId(cust_id);
resTokenizeCC.SetPhone(phone);
resTokenizeCC.SetEmail(email);
resTokenizeCC.SetNote(note);
resTokenizeCC.SetAvsInfo(avsCheck);
resTokenizeCC.SetCofInfo(cof);
//resTokenizeCC.SetDataKeyFormat(data_key_format); //optional
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resTokenizeCC);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Complete = " + receipt.GetComplete());

November 2018

Page 85 of 486

Moneris Gateway API - Integration Guide

Sample Vault Tokenize Credit Card
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
//ResolveData
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("MaskedPan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.4 Vault Financial Transactions
After a financial transaction is complete, the response fields indicate all the values that are currently
saved under the profile that was used.

4.4.1 Customer ID Changes
Some financial transactions take the customer ID as an optional value. The customer ID may or may not
already be in the Vault profile when the transaction is sent. Therefore, it is possible to change the value of
the customer ID by performing a financial transaction
The table below shows what the customer ID will be in the response field after a financial transaction is
performed.
Table 38: Customer ID use in response fields
Already in profile?

Passed in?

Version used in response

No

No

Customer ID not used in transaction

No

Yes

Passed in

Page 86 of 486

November 2018

4 Vault

Already in profile?

Passed in?

Version used in response

Yes

No

Profile

Yes

Yes

Passed in

4.4.2 Purchase with Vault – ResPurchaseCC
Purchase with Vault transaction object definition
ResPurchaseCC resPurchaseCC = new ResPurchaseCC();

HttpsPostRequest object for Purchase with Vault transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resPurchaseCC);

Purchase with Vault transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 39: Purchase with Vault transaction object mandatory values
Value

Type

Limits

Set method

Data key

String

25-character alphanumeric

resPurchaseCC.SetData(data_
key);

Order ID

String

50-character alphanumeric

resPurchaseCC.SetOrderId
(order_id);

Amount

String

10-character decimal

resPurchaseCC.SetAmount
(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

November 2018

Page 87 of 486

Moneris Gateway API - Integration Guide

Value

Type

Limits

Set method

E-commerce indicator

String

1-character alphanumeric

resPurchaseCC.SetCryptType
(crypt);

Credential on File Info

Object

N/A

cof.SetCofInfo(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

Table 40: Purchase with Vault transaction optional values
Value

Type

Limits

Set method

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Expiry date

String

4-character numeric

resPurchaseCC.SetExpdate
(expiry_date);

YYMM format.
(Note that this is
reversed from the
date displayed on the
card, which is MMYY)
Customer ID

String

50-character alphanumeric

resPurchaseCC.SetCustId(cust_
id);

Dynamic descriptor

String

20-character alphanumeric

resPurchaseCC
.SetDynamicDescriptor
(dynamic_descriptor);

Customer information

Object

N/A

resPurchaseCC.SetCustInfo
(customer);

Page 88 of 486

November 2018

4 Vault

Value

Type

Limits

Set method

AVS information

Object

N/A

resPurchaseCC.SetAvsInfo
(avsCheck);

CVD information

Object

N/A

resPurchaseCC.SetCvdInfo
(cvdCheck);

Object

N/A

resPurchaseCC.SetRecur
(recurring_cycle);

NOTE: When storing
credentials on the initial transaction, the
CVD object must be
sent; for subsequent
transactions using
stored credentials, CVD
can be sent with cardholder-initiated transactions only—
merchants must not
store CVD information.

Recurring billing

November 2018

Page 89 of 486

Moneris Gateway API - Integration Guide

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Payment Indicator

Limits
15-character alphanumeric
variable length

String

1-character alphabetic

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

cof.SetPaymentIndicator
("PAYMENT_INDICATOR_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Payment Information

String

1-character numeric

cof.SetPaymentInformation
("PAYMENT_INFO_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Purchase with Vault
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResPurchaseCC
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string store_id = "store1";
string api_token = "yesguy";
string data_key = "eLqsADfwqHDxIpJG9vLnELx01";
string amount = "1.00";
string cust_id = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be

Page 90 of 486

November 2018

4 Vault

Sample Purchase with Vault
used
string crypt_type = "1";
string descriptor = "my descriptor";
string processing_country_code = "CA";
bool status_check = false;
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("12345678901234");
ResPurchaseCC resPurchaseCC = new ResPurchaseCC();
resPurchaseCC.SetDataKey(data_key);
resPurchaseCC.SetOrderId(order_id);
resPurchaseCC.SetCustId(cust_id);
resPurchaseCC.SetAmount(amount);
resPurchaseCC.SetCryptType(crypt_type);
resPurchaseCC.SetDynamicDescriptor(descriptor);
resPurchaseCC.SetCofInfo(cof);
//resPurchaseCC.SetExpDate("1511"); //optional - use for temp token only
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resPurchaseCC);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();

November 2018

Page 91 of 486

Moneris Gateway API - Integration Guide

Sample Purchase with Vault
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.4.3 Pre-Authorization with Vault – ResPreauthCC
Pre-Authorization with Vault transaction object definition
ResPreauthCC resPreauthCC = new ResPreauthCC();

HttpsPostRequest object for Pre-Authorization with Vault transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resPreauthCC);

Pre-Authorization with Vault transaction values
Table 41: Pre-Authorization with Vault transaction object mandatory values
Value

Type

Limits

Set method

Data key

String

25- character alphanumeric

resPreauthCC.SetData(data_
key);

Order ID

String

50-character alphanumeric

resPreauthCC.SetOrderId
(order_id);

Amount

String

10-character decimal

resPreauthCC.SetAmount
(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

E-commerce indicator

Page 92 of 486

String

1-character alpha-

resPreauthCC.SetCryptType

November 2018

4 Vault
Table 41: Pre-Authorization with Vault transaction object mandatory values (continued)
Value

Type

Credential on File Info

Object

Limits

Set method

numeric

(crypt);

N/A

resPreauthCC.SetCofInfo(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

Table 42: Pre-Authorization with Vault transaction optional values
Value

Type

Limits

Set method

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Expiry date

String

4-character alphanumeric

resPreauthCC.SetExpdate
(expiry_date);

(YYMM format)
Customer ID

November 2018

String

50-character alphanumeric

resPreauthCC.SetCustId(cust_
id);

Page 93 of 486

Moneris Gateway API - Integration Guide

Value

Type

Limits

Set method

Customer information

Object

N/A

resPreauthCC.SetCustInfo
(customer);

AVS information

Object

N/A

resPreauthCC.SetAvsInfo
(avsCheck);

CVD information

Object

N/A

resPreauthCC.SetCvdInfo
(cvdCheck);

NOTE: When storing
credentials on the initial transaction, the
CVD object must be
sent; for subsequent
transactions using
stored credentials, CVD
can be sent with cardholder-initiated transactions only—
merchants must not
store CVD information.

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Payment Indicator

Limits
15-character alphanumeric
variable length

String

1-character alphabetic

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

cof.SetPaymentIndicator
("PAYMENT_INDICATOR_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Payment Information

Page 94 of 486

String

1-character numeric

cof.SetPaymentInformation
("PAYMENT_INFO_VALUE");

November 2018

4 Vault

Value

Type

Limits

Set Method
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Pre-Authorization with Vault
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResPreauthCC
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string store_id = "store1";
string api_token = "yesguy";
string data_key = "YeMnLZ8i2p02gbwSB8i8Q02Fo";
string amount = "1.00";
string cust_id = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be
used
string crypt_type = "1";
string dynamic_descriptor = "my descriptor";
string processing_country_code = "CA";
bool status_check = false;
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("12345678901234");
ResPreauthCC resPreauthCC = new ResPreauthCC();
resPreauthCC.SetDataKey(data_key);
resPreauthCC.SetOrderId(order_id);
resPreauthCC.SetCustId(cust_id);
resPreauthCC.SetAmount(amount);
resPreauthCC.SetCryptType(crypt_type);
resPreauthCC.SetDynamicDescriptor(dynamic_descriptor);
resPreauthCC.SetCofInfo(cof);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resPreauthCC);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Message = " + receipt.GetMessage());

November 2018

Page 95 of 486

Moneris Gateway API - Integration Guide

Sample Pre-Authorization with Vault
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.4.4 Vault Independent Refund CC - ResIndRefundCC
Vault Independent Refund transaction object definition
ResIndRefundCC resIndRefundCC = new ResIndRefundCC();

HttpsPostRequest object for Vault Independent Refund transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resIndRefundCC);

Vault Independent Refund transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields

Page 96 of 486

November 2018

4 Vault
Table 43: Vault Independent Refund transaction object mandatory values
Value

Type

Limits

Set method

Data key

String

25-character alphanumeric

resIndRefundCC.SetData(data_
key);

Order ID

String

50-character alphanumeric

resIndRefundCC.SetOrderId
(order_id);

Amount

String

10-character decimal

resIndRefundCC.SetAmount
(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

E-commerce indicator

String

1-character alphanumeric

resIndRefundCC.SetCryptType
(crypt);

Table 44: Vault Independent Refund transaction optional values
Value

Type

Limits

Set method

Customer ID

String

50-character alphanumeric

resIndRefundCC.SetCustId
(cust_id);

Expiry date

String

4-character alphanumeric

resIndRefundCC.SetExpdate
(expiry_date);

(YYMM format)
Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Dynamic descriptor

String

20-character alphanumeric

resIndRefundCC
.SetDynamicDescriptor
(dynamic_descriptor);

Sample Vault Independent Refund
namespace Moneris
{

November 2018

Page 97 of 486

Moneris Gateway API - Integration Guide

Sample Vault Independent Refund
using System;
using System.Text;
using System.Collections;
public class TestCanadaResIndRefundCC
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string store_id = "store1";
string api_token = "yesguy";
string data_key = "qJD5kCZiCjsfabKH7WuxoHyZx";
string amount = "1.00";
string cust_id = "customer1";
string crypt_type = "1";
string processing_country_code = "CA";
bool status_check = false;
ResIndRefundCC resIndRefundCC = new ResIndRefundCC();
resIndRefundCC.SetOrderId(order_id);
resIndRefundCC.SetCustId(cust_id);
resIndRefundCC.SetAmount(amount);
resIndRefundCC.SetCryptType(crypt_type);
resIndRefundCC.SetData(data_key);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resIndRefundCC);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());

Page 98 of 486

November 2018

4 Vault

Sample Vault Independent Refund
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

Vault response fields
For a list and explanation of (Receipt object) response fields that are available after sending this Vault
transaction, see Definitions of Response Fields (page 447).

4.4.5 Force Post with Vault - ResForcePostCC
Force Post with Vault transaction object definition
ResForcePostCC resForcePostCC = new ResForcePostCC();

HttpsPostRequest object for Force Post with Vault transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(resForcePostCC);

Force Post with Vault transaction object values
Table 1 Force Post with Vault transaction object mandatory values
Value
Amount

Type
String

Limits
10-character decimal

Set Method
resForcePostCC.SetAmount
(amount);

Up to 7 digits
(dollars) + decimal
point (.) + 2 digits
(cents) after the
decimal point
EXAMPLE: 1234567.89

Data key

String

25-character alphanumeric

resForcePostCC.SetData(data_
key);

Authorization code

String

8-character alphanumeric

resForcePostCC.SetAuthCode
(auth_code);

November 2018

Page 99 of 486

Moneris Gateway API - Integration Guide

Value

Type

E-commerce indicator

String

Limits
1-character alphanumeric

Set Method
resForcePostCC.SetCryptType
(crypt);

Table 2 Force Post with Vault transaction object optional values
Value

Type

Limits

Set Method

Customer ID

String

50-character alphanumeric

resForcePostCC.SetCustId
(cust_id);

Dynamic Descriptor

String

20-character alphanumeric

resForcePostCC
.SetDynamicDescriptor
(dynamic_descriptor);

Status Check

Boolean

true/false

mpgReq.SetStatusCheck(status_
check);

Sample Force Post with Vault
namespace Moneris
{
using System;
using System.Text;
using System.Collections;
public class TestCanadaResForcePostCC
{
public static void Main(string[] args)
{
string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss");
string store_id = "store1";
string api_token = "yesguy";
string data_key = "eLqsADfwqHDxIpJG9vLnELx01";
string amount = "1.00";
string cust_id = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be
used
string auth_code = "245465";
string crypt_type = "7";
string descriptor = "my descriptor";
string processing_country_code = "CA";
bool status_check = false;
ResForcePostCC resForcePostCC = new ResForcePostCC();
resForcePostCC.SetDataKey(data_key);
resForcePostCC.SetOrderId(order_id);
resForcePostCC.SetCustId(cust_id);
resForcePostCC.SetAmount(amount);
resForcePostCC.SetAuthCode(auth_code);
resForcePostCC.SetCryptType(crypt_type);
resForcePostCC.SetDynamicDescriptor(descriptor);
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);

Page 100 of 486

November 2018

4 Vault

Sample Force Post with Vault
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(resForcePostCC);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("DataKey = " + receipt.GetDataKey());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("ResSuccess = " + receipt.GetResSuccess());
Console.WriteLine("PaymentType = " + receipt.GetPaymentType());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("Cust ID = " + receipt.GetResDataCustId());
Console.WriteLine("Phone = " + receipt.GetResDataPhone());
Console.WriteLine("Email = " + receipt.GetResDataEmail());
Console.WriteLine("Note = " + receipt.GetResDataNote());
Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan());
Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate());
Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType());
Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber());
Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName());
Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

4.4.6 Card Verification with Vault – ResCardVerificationCC
Things to Consider:
l
l

This transaction type only applies to Visa, Mastercard and Discover transactions
The card number and expiry date for this transaction are passed using a token, as represented by the data key value

November 2018

Page 101 of 486

Moneris Gateway API - Integration Guide

l

When using a temporary token (e.g., such as with Hosted Tokenization) and you intend
to store the cardholder credentials, this transaction must be run prior to running the
Vault Add Token transaction

Card Verification with Vault object definition
CardVerification rescardverify = new CardVerification();

HttpsPostRequest object for Card Verification with Vault transaction
HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetTransaction(rescardverify);

Card Verification with Vault transaction values
For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields
Table 45: Card Verification with Vault transaction object mandatory values
Value

Type

Limits

Set method

Order ID

String

50-character alphanumeric

rescardverify.SetOrderId
(order_id);

Data key

String

25-character alphanumeric

rescardverify
.SetDataKeyFormat(data_key_
format)

E-commerce indicator

String

1-character alphanumeric

rescardverify.SetCryptType
(crypt);

Page 102 of 486

November 2018

4 Vault
Table 45: Card Verification with Vault transaction object mandatory values
Value

Type

Limits

Set method

AVS

Object

N/A

rescardverify.SetAvsInfo
(avsCheck);

CVD

Object

N/A

rescardverify.SetCvdInfo
(cvdCheck);

Credential on File Info

Object

N/A

rescardverify.SetCofInfo
(cof);

cof
NOTE: This is a nested
object within the transaction, and required
when storing or using
the customer's stored
credentials. The Credential on File Info
object has its own
request variables, listed in blue in the table
below, "Credential on
File Object Request
Variables".

November 2018

Page 103 of 486

Moneris Gateway API - Integration Guide

Credential on File Transaction Object Request Fields
Value
Issuer ID

Type
String

NOTE: This variable is
required for all merchant-intiated transactions following the
first one; upon sending
the first transaction,
the Issuer ID value is
received in the transaction response and
then used in subsequent transaction
requests.

Payment Indicator

Limits
15-character alphanumeric
variable length

String

1-character alphabetic

Set Method
cof.SetIssuerId("VALUE_FOR_
ISSUER_ID");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

cof.SetPaymentIndicator
("PAYMENT_INDICATOR_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Payment Information

String

1-character numeric

cof.SetPaymentInformation
("PAYMENT_INFO_VALUE");
NOTE: For a list and explanation of the possible values to send for this variable, see
Definitions of Request Fields – Credential
on File

Sample Card Verification with Vault
namespace Moneris
{
using System;
public class TestResCardVerificationCC
{
public static void Main(string[] args)
{
string store_id = "store5";
string api_token = "yesguy";
string data_key = "V6F9PJKdXQj6vKiCMNrWbsyJ2";
string order_id = "Test_P_033333_6";
string cust_id = "Customer1";
string crypt = "7";
string processing_country_code = "CA";
bool status_check = false;

Page 104 of 486

November 2018

4 Vault

Sample Card Verification with Vault
/*************** Address Verification Service **********************/
AvsInfo avsCheck = new AvsInfo();
avsCheck.SetAvsStreetNumber("212");
avsCheck.SetAvsStreetName("Payton Street");
avsCheck.SetAvsZipCode("M1M1M1");
/****************** Card Validation
CvdInfo cvdCheck = new CvdInfo();
cvdCheck.SetCvdIndicator("1");
cvdCheck.SetCvdValue("099");
/*************** Credential on File
CofInfo cof = new CofInfo();
cof.SetPaymentIndicator("U");
cof.SetPaymentInformation("2");
cof.SetIssuerId("12345678901234");
ResCardVerificationCC rescardverify
rescardverify.SetDataKey(data_key);
rescardverify.SetOrderId(order_id);
rescardverify.SetCustId(cust_id);
//rescardverify.SetExpDate("1612");
rescardverify.SetCryptType(crypt);
rescardverify.SetAvsInfo(avsCheck);
rescardverify.SetCvdInfo(cvdCheck);
rescardverify.SetCofInfo(cof);

Digits *************************/

*************************************/

= new ResCardVerificationCC();

//for use with Temp Tokens only

HttpsPostRequest mpgReq = new HttpsPostRequest();
mpgReq.SetProcCountryCode(processing_country_code);
mpgReq.SetTestMode(true); //false or comment out this line for production transactions
mpgReq.SetStoreId(store_id);
mpgReq.SetApiToken(api_token);
mpgReq.SetTransaction(rescardverify);
mpgReq.SetStatusCheck(status_check);
mpgReq.Send();
try
{
Receipt receipt = mpgReq.GetReceipt();
Console.WriteLine("CardType = " + receipt.GetCardType());
Console.WriteLine("TransAmount = " + receipt.GetTransAmount());
Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber());
Console.WriteLine("ReceiptId = " + receipt.GetReceiptId());
Console.WriteLine("TransType = " + receipt.GetTransType());
Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum());
Console.WriteLine("ResponseCode = " + receipt.GetResponseCode());
Console.WriteLine("ISO = " + receipt.GetISO());
Console.WriteLine("BankTotals = " + receipt.GetBankTotals());
Console.WriteLine("Message = " + receipt.GetMessage());
Console.WriteLine("AuthCode = " + receipt.GetAuthCode());
Console.WriteLine("Complete = " + receipt.GetComplete());
Console.WriteLine("TransDate = " + receipt.GetTransDate());
Console.WriteLine("TransTime = " + receipt.GetTransTime());
Console.WriteLine("Ticket = " + receipt.GetTicket());
Console.WriteLine("TimedOut = " + receipt.GetTimedOut());
Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit());
Console.WriteLine("IssuerId = " + receipt.GetIssuerId());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);

November 2018

Page 105 of 486

Moneris Gateway API - Integration Guide

Sample Card Verification with Vault
}
}
} // end TestResCardVerificationCC
}

4.5 Hosted Tokenization
Moneris Hosted Tokenization is a solution for online e-commerce merchants who do not want to handle
credit card numbers directly on their websites, yet want the ability to fully customize their check-out web
page appearance.
When an hosted tokenization transaction is initiated, the Moneris Gateway displays (on the merchant’s
behalf) a single text box on the merchant’s checkout page. The cardholder can then securely enter the
credit card information into the text box. Upon submission of the payment information on the checkout
page, Moneris Gateway returns a temporary token representing the credit card number to the merchant. This is then used in an API call to process a financial transaction directly with Moneris to charge
the card. After receiving a response to the financial transaction, the merchant generates a receipt and
allows the cardholder to continue with online shopping.
For more details on how to implement the Moneris Hosted Tokenization feature, see the Hosted Solutions Integration Guide. The guide can be downloaded from the Moneris Developer Portal
(https://developer.moneris.com).

Page 106 of 486

November 2018

5 INTERAC® Online Payment
l
l
l
l
l
l
l
l

5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8

About INTERAC® Online Payment Transactions
Other Documents and References
Website and Certification Requirements
Transaction Flow for INTERAC® Online Payment
Sending an INTERAC® Online Payment Purchase Transaction
INTERAC® Online Payment Purchase
INTERAC® Online Payment Refund
INTERAC® Online Payment Field Definitions

5.1 About INTERAC® Online Payment Transactions
The INTERAC® Online Payment method offers cardholders the ability to pay using online banking. This
payment method can be combined with the Moneris Gateway API solution to allow online payments
using credit and debit cards.
INTERAC® Online Payment transactions via the API require two steps:
1. The cardholder guarantees the funds for the purchase amount using their online banking process.
2. The merchant confirms the payment by sending an INTERAC® Online Payment purchase request
to Moneris using the API.
Any of the transaction objects that are defined in this section can be passed to the HttpsPostRequest
connection object defined in Section 17.5 (page 391)here.
INTERAC® Online Payment transactions are available to Canadian integrations only.

5.2 Other Documents and References
INTERAC® Online Payment is offered by Acxsys Corporation, which is also a licensed user of the Interac
logo. Refer to the following documentation and websites for additional details.

INTERAC® Online PaymentMerchant Guideline
Visit the Moneris Developer Portal (https://developer.moneris.com) to access the latest documentation
and downloads.
This details the requirements for each page consumers visit on a typical INTERAC® Online Payment merchant website. It also details the requirements that can be displayed on any page (that is, requirements
that are not page-specific).

Logos
Visit the Moneris Developer Portal (https://developer.moneris.com) to access the logos and downloads.

November 2018

Canada Only

Page 107 of 486

Moneris Gateway API - Integration Guide

5.3 Website and Certification Requirements
5.3.1 Things to provide to Moneris
Refer to the Merchant Guidelines referenced in Section 5.2 for instructions on proper use of logos and
the term "INTERAC® Online Payment". You need to provide Moneris with the following registration
information:
l

l

l

l

l

Merchant logo to be displayed on the INTERAC® Online Payment Gateway page
l In both French and English
l 120 × 30 pixels
l Only PNG format is supported.
Merchant business name
l In both English and French
l Maximum 30 characters.
List of all referrer URLs. That is, URLs from which the customer may be redirected to the INTERAC®
Online Payment gateway.
List of all URLs that may appear in the IDEBIT_FUNDEDURL field of the https form POST to the
INTERAC® Online Payment Gateway.
List of all URLs that may appear in the IDEBIT_NOTFUNDEDURL field of the https form POST to the
INTERAC® Online Payment Gateway.

Note that if your test and production environments are different, provide the above information for
both environments.

5.3.2 Certification process
Test cases
All independent merchants and third-party service/shopping cart providers must pass the certification
process by conducting all the test cases outlined in Appendix E (page 464) and "Third-Party Service Provider Checklists for INTERAC® Online Payment Certification Testing" on page 468 respectively. This is
required after you have completed all of your testing.
Any major changes to your website after certification (with respect to the INTERAC® Online Payment functionality) require the site to be re-certified by completing the test cases again.
Appendix H (page 476) is the Certification Test Case Detail showing all the information and requirements
for each test case.

Page 108 of 486

Canada Only

November 2018

5 INTERAC® Online Payment

Screenshots
You must provide Moneris with screenshots of your check-out process showing examples of approved
and declined transactions using the INTERAC® Online Payment service.

Checklists
To consistently portray the INTERAC Online service as a secure payment option, you must complete the
respective Merchant Requirement checklist inAppendix E (page 464) or Appendix F (page 468)accordingly.
The detailed descriptions of the requirements in these checklists can be found in the INTERAC® Online
Payment Merchant Guidelines document referred to in 5.2 (page 107). If any item does not apply, mark it
as "N/A".
After completion, fax or email the results to the Moneris Integration Support help desk for review before
implementing the change into the production environment.

5.3.3 Client Requirements
Checklists
As a merchant using an INTERAC® Online Payment-certified third-party solution, your clients must complete the Merchant Checklists for INTERAC® Online Payment Certification form (Appendix G, page 473).
They will not be required to complete any of the test cases.
Your clients must also complete the Merchant Requirement checklist (Appendix G, page 473). Ensure that
your product documentation properly instructs your clients to fax or email the results to the Moneris
Integration Support helpdesk for registration purposes.

Screenshots
Your clients must provide Moneris with screenshots of their check-out process that show examples of
approved and declined transactions using INTERAC® Online Payment.

5.3.4 Delays
Note that merchants that fall under the following category codes listed in Table 46 may experience delays
in the certification or registration process of up to 7 days.
Table 46: Category codes that might introduce certification/registration delays
Category code

Merchant type/name

4812

Telecommunication equipment including telephone sales

4829

Money transfer—merchant

5045

Computers, computer peripheral equipment, software

5732

Electronic sales

6012

Financial institution—merchandise and services

6051

Quasi cash—merchant

November 2018

Canada Only

Page 109 of 486

Moneris Gateway API - Integration Guide
Category code

Merchant type/name

6530

Remote stored value load—merchant

6531

Payment service provider—money transfer for a purchase

6533

Payment service provider—merchant—payment transaction

5.4 Transaction Flow for INTERAC® Online Payment

Figure 2: INTERAC® Online Payment transaction flow diagram
1. Customer selects the INTERAC® Online Payment option on the merchant's web store.
2. Merchant redirects the customer to the IOP gateway to select a financial institution (issuer) of
choice. This step involves form-posting the following required variables over the HTTPS protocol:
l
l
l
l
l
l
l
l
l

IDEBIT_MERCHNUM
IDEBIT_AMOUNT1
IDEBIT_CURRENCY
IDEBIT_FUNDEDURL
IDEBIT_NOTFUNDEDURL
IDEBIT_MERCHLANG
IDEBIT_VERSIONIDEBIT_TERMID - optional
IDEBIT_INVOICE - optional
IDEBIT_MERCHDATA - optional

3. Customer selects an issuer, and is directed to the online banking site. Customer completes the
online banking process and guarantees the funds for the purchase.

1This value is expressed in cents. Therefore, $1 is input as 100

Page 110 of 486

Canada Only

November 2018

5 INTERAC® Online Payment
4. Depending on the results of step 5.4, the issuer re-directs the customer through the IOP Gateway to either the merchant's non-funded URL (4a) or funded URL (4b). Both URLs can appear on
the same page. The funded/non-funded URLs must validate the variables posted back according
to 5.8 (page 117) before continuing.
5.4 shows the variables that are posted back in the re-direction.
If the customer is directed to the non-funded URL, return to step 5.4 and ask for another means
of payment.
If the customer is directed to the funded URL, continue to the next step.
5. Merchant sends an INTERAC® Online Payment purchase request to Moneris Gateway while displaying the "Please wait...." message to the customer. This should be done within 30 minutes of
receiving the response in step 5.4.
6. Moneris' processing host sends a request for payment confirmation to the issuer.
7. The issuer sends a response (either approved or declined) to Moneris host.
8. Moneris Gateway relays the response back to the merchant. If the payment was approved, the
merchant fulfills the order.
Table 47: Funded and non-funded URL variables
To funded URL only

To funded and non-funded URL

IDEBIT_TRACK2

IDEBIT_VERSION

IDEBIT_ISSCONF

IDEBIT_ISSLANG

IDEBIT_ISSNAME

IDEBIT_TERMID (optional)
IDEBIT_INVOICE (optional)
IDEBIT_MERCHDATA (optional)

5.5 Sending an INTERAC® Online Payment Purchase Transaction
5.5.1 Fund-Guarantee Request
After choosing to pay by INTERAC® Online Payment, the customer is redirected using an HTML form post
to the INTERAC® Online PaymentGateway page. Below is a sample code that is used to post the request
to the Gateway.
November 2018 Canada Only Page 111 of 486 Moneris Gateway API - Integration Guide 5.5.2 Online Banking Response and Fund-Confirmation Request The response variables are posted back in an HTML form to either the funded or non-funded URL that was provided to INTERAC®. The following variables must be validated (5.8, page 117): l l l l l l IDEBIT_TRACK2 IDEBIT_ISSCONF IDEBIT_ISSNAME IDEBIT_VERSION IDEBIT_ISSLANG IDEBIT_INVOICE Note that IDEBIT_ISSCONF and IDEBIT_ISSNAME must be displayed on the client’s receipt that is generated by the merchant. After validation, IDEBIT_TRACK2 is used to form an IDebitPurchase transaction that is sent to Moneris Gateway to confirm the fund. If the validation fails, redirect the client to the main page and ask for a different means of payment. If the validation passes, an IDebitPurchase transaction can be sent to Moneris Gateway. 5.6 INTERAC® Online Payment Purchase INTERAC® Online Payment Purchase transaction object definition IDebitPurchase IOP_Txn = new IDebitPurchase(); HttpsPostRequest object for INTERAC® Online Payment Purchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(IOP_Txn); INTERAC® Online Payment Purchase transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Page 112 of 486 Canada Only November 2018 5 INTERAC® Online Payment Table 48: INTERAC® Online Payment transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric IOP_Txn.SetOrderId(order_id); Amount String 10-character decimal IOP_Txn.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Track2 data String IOP_Txn.SetTrack2(track2); 40-character alphanumeric Table 49: INTERAC® Online Payment Purchase transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric IOP_Txn.SetCustId(cust_id); Dynamic descriptor String 20-character alphanumeric IOP_Txn.SetDynamicDescriptor (dynamic_descriptor); Customer information Object Not applicable. Click hereSee IOP_Txn.SetCustInfo(customer); Section 14 (page 363). Sample INTERAC® Online Payment Purchase namespace Moneris { using System; public class TestCanadaIDebitPurchase { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "Lance_Briggs_55"; string amount = "5.00"; string track2 = "5268051119993326=0609AAAAAAAAAAAAA000"; string processing_country_code = "CA"; bool status_check = false; /********************* Billing/Shipping Variables ****************************/ string first_name = "Bob"; November 2018 Canada Only Page 113 of 486 Moneris Gateway API - Integration Guide Sample INTERAC® Online Payment Purchase string last_name = "Smith"; string company_name = "ProLine Inc."; string address = "623 Bears Ave"; string city = "Chicago"; string province = "Illinois"; string postal_code = "M1M2M1"; string country = "Canada"; string phone = "777-999-7777"; string fax = "777-999-7778"; string tax1 = "10.00"; string tax2 = "5.78"; string tax3 = "4.56"; string shipping_cost = "10.00"; /********************* Order Line Item Variables *****************************/ string[] item_description = new string[] { "Chicago Bears Helmet", "Soldier Field Poster" }; string[] item_quantity = new string[] { "1", "1" }; string[] item_product_code = new string[] { "CB3450", "SF998S" }; string[] item_extended_amount = new string[] { "150.00", "19.79" }; /********************** Customer Information Object **************************/ CustInfo customer = new CustInfo(); /********************** Set Customer Billing Information **********************/ customer.SetBilling(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); /******************** Set Customer Shipping Information ***********************/ customer.SetShipping(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); /***************************** Order Line Items ******************************/ customer.SetItem(item_description[0], item_quantity[0], item_product_code[0], item_extended_amount[0]); customer.SetItem(item_description[1], item_quantity[1], item_product_code[1], item_extended_amount[1]); /************************** Request *************************/ IDebitPurchase IOP_Txn = new IDebitPurchase(); IOP_Txn.SetOrderId(order_id); IOP_Txn.SetCustId(cust_id); IOP_Txn.SetAmount(amount); IOP_Txn.SetIdebitTrack2(track2); IOP_Txn.SetCustInfo(customer); //IOP_Txn.SetDynamicDescriptor("dynamicdescriptor1"); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(IOP_Txn); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Page 114 of 486 Canada Only November 2018 5 INTERAC® Online Payment Sample INTERAC® Online Payment Purchase Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 5.7 INTERAC® Online Payment Refund To process this transaction, you need the order ID and transaction number from the original INTERAC® Online Payment Purchase transaction. INTERAC® Online Payment Refund transaction object definition IDebitRefund refund = new IDebitRefund(); HttpsPostRequest object for INTERAC® Online Payment Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(refund); INTERAC® Online Payment Refund transaction object values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields November 2018 Canada Only Page 115 of 486 Moneris Gateway API - Integration Guide Table 50: INTERAC® Online Payment Refund transaction object mandatory variables Value Type Limits Set method Order ID String 50-character alphanumeric refund.SetOrderId(order_id); Amount String 10-character decimal refund.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number String 255-character alphanumeric refund.SetTxnNumber(txn_ number); Table 51: INTERAC® Online Payment Refund transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric refund.SetCustId(cust_id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample code Sample INTERAC® Online Payment Refund namespace Moneris { using System; public class TestCanadaIDebitRefund { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test20150625014816"; string amount = "5.00"; string txn_number = "113524-0_10"; string processing_country_code = "CA"; bool status_check = false; IDebitRefund refund = new IDebitRefund(); refund.SetOrderId(order_id); Page 116 of 486 Canada Only November 2018 5 INTERAC® Online Payment Sample INTERAC® Online Payment Refund refund.SetAmount(amount); refund.SetTxnNumber(txn_number); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(refund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 5.8 INTERAC® Online Payment Field Definitions Table 52: Field Definitions Characters Limits Value Description IDEBIT_ MERCHNUM 5-14 Numbers and uppercase letters This field is provided by Moneris. For example, 0003MONMPGXXXX. IDEBIT_TERMID 8 Numbers and uppercase letters Optional field November 2018 Canada Only Page 117 of 486 Moneris Gateway API - Integration Guide Table 52: Field Definitions (continued) Characters Limits Value Description IDEBIT_ AMOUNT 1-12 IDEBIT_ CURRENCY 3 Numbers Amount expressed in cents (for example, 1245 for $12.45) to charge to the card. "CAD" or "USD" National currency of the transaction. IDEBIT_INVOICE 1-20 ISO-8859-1 encoded characters restricted to: l l l l l Uppercase and lowercase Numbers ÀÁÂÄÈÉÊËÎ Ï Ô ÙÛÜÇàáâäèéêëîïôù û ü ÿ ç Spaces #$. , -/ =?@' Optional field Can be the Order ID when used with Moneris Gateway fund confirmation transactions. IDEBIT_ MERCHDATA 1024 ISO-8859-1 restricted to single-byte codes, hex 20 to 7E (consistent with US-ASCII and ISO-8859-1 Latin-1). Note that the following character combinations may not be accepted in the IDEBIT_MERCHDATA field: l "/..", "/%2E.", "/.%2E", "/%2E%2E", "\\%2E%2E", "\\%2E.", "\\.%2E", "\\%2E%2E", "&#", "<", "%3C", ">", "%3E" Free form data provided by the merchant that will be passed back unchanged to the merchant once the payment has been guaranteed in online banking. This may be used to identify the customer, session or both. IDEBIT_ FUNDEDURL 1024 ISO-8859-1 restricted to single-byte codes, restricted to: l l l Uppercase and lowercase letters Numbers ;/ ?:@&=+$, -_. !~*‘ ()% Https address to which the issuer will redirect cardholders after guaranteeing the fund through online banking. Page 118 of 486 Canada Only November 2018 5 INTERAC® Online Payment Table 52: Field Definitions (continued) Characters Limits Value Description IDEBIT_ 1024 NOTFUNDEDURL ISO-8859-1, restricted to single-byte codes, restricted to: l l l Uppercase and lowercase letters Numbers ;/ ?:@&=+$, -_. !~*‘ ()% Https address to which the issuer redirects cardholders after failing or canceling the online banking process. IDEBIT_ MERCHLANG 2 “en” or “fr” Customer's current language at merchant. IDEBIT_VERSION 3 Numbers Initially, the value is 1. IDEBIT_ISSLANG 2 “en” or “fr” Customer’s current language at issuer. IDEBIT_TRACK2 37 ISO-8859-1 (restricted to single-byte codes), hex 20 to 7E (consistent with US-ASCII and ISO-8859-1 Latin-1) Value returned by the issuer. It includes the PAN, expiry date, and transaction ID. IDEBIT_ISSCONF 15 ISO-8859-1 encoded characters restricted to: l l l l l Uppercase and lowercase letters Numbers ÀÁÂÄÈÉÊËÎ Ï Ô ÙÛÜÇàáâäèéêëîïôù û ü ÿ ç Spaces #$. , -/ =?@' Confirmation number returned from the issuer to be displayed on the merchant’s confirmation page and on the receipt. IDEBIT_ ISSNAME 30 ISO-8859-1 encoded characters restricted to: l l l l l Uppercase and lowercase letters Numbers ÀÁÂÄÈÉÊËÎ Ï Ô ÙÛÜÇàáâäèéêëîïôù û ü ÿ ç Spaces #$. , -/ =?@•' Issuer name to be displayed on the merchant’s confirmation page and on the receipt. November 2018 Canada Only Page 119 of 486 6 Mag Swipe Transaction Set l l l l l l l l 6.1 Mag Swipe Transaction Type Definitions 6.2 Mag Swipe Purchase l 6.2.1 Encrypted Mag Swipe Purchase 6.3 Mag Swipe Pre-Authorization l 6.3.1 Encrypted Mag Swipe Pre-Authorization 6.4 Mag Swipe Completion 6.5 Mag Swipe Force Post l 6.5.1 Encrypted Mag Swipe Force Post 6.6 Mag Swipe Purchase Correction 6.7 Mag Swipe Refund 6.8 Mag Swipe Independent Refund l 6.8.1 Encrypted Mag Swipe Independent Refund Mag Swipe transactions allow customers to swipe a credit card and submit the Track2 details. These transactions support the submission of Track2 as well as a manual entry of the credit card number and expiry date. If all three fields are submitted, the Track2 details are used to process the transaction. 6.1 Mag Swipe Transaction Type Definitions Purchase Verifies funds on the customer’s card, removes the funds and prepares them for deposit into the merchant’s account. Pre-Authorization Verifies and locks funds on the customer’s credit card. The funds are locked for a specified amount of time based on the card issuer. To retrieve the funds that have been locked by a Pre-Authorization transaction so that they may be settled in the merchant’s account, a Completion transaction must be performed. A Pre-Authorization may only be "completed" once. Completion Retrieves funds that have been locked (by a Mag Swipe Pre-Authorization transaction), and prepares them for settlement into the merchant’s account. Force Post Retrieves the locked funds and prepares them for settlement into the merchant’s account. This is used when a merchant obtains the authorization number directly from the issuer by a third-party authorization method (such as by phone). Purchase Correction Restores the full amount of a previous Mag Swipe Purchase or Mag Swipe Completion transaction to the cardholder's card, and removes any record of it from the cardholder's statement. The order ID and transaction number from the original transaction are required, but the credit card does not need to be re-swiped. This transaction can be used against a Purchase or Completion transaction that occurred same day provided that the batch containing the original transaction remains open. When using the automated closing feature, Batch Close occurs daily between 10 and 11 pm Eastern Time. November 2018 Page 120 of 486 Moneris Gateway API - Integration Guide This transaction is sometimes referred to as "void". Refund Restores all or part of the funds from a Mag Swipe Purchase or Mag Swipe Completion transaction to the cardholder's card. Unlike a Purchase Correction, there is a record of the refund. Independent Refund Credits a specified amount to the cardholder’s credit card. This does not require a previous transaction (such as Mag Swipe Purchase) to be logged in the Moneris Gateway. However, a credit card must be swiped to provide the Track2 data. 6.1.1 Encrypted Mag Swipe Transactions Encrypted Mag Swipe transactions allow the customer to swipe or key in a credit card using a Monerisprovided encrypted mag swipe reader, and submit the encrypted Track2 details. The encrypted mag swipe reader can be used for processing: l l l Swiped card-present transactions Manually keyed card-present transactions Manually keyed card-not-present transactions. Encrypted Mag Swipe transactions are identical to the regular Mag Swipe transactions from the customer's perspective. However, the card data must be swiped or keyed in via a Moneris-provided encrypted mag swipe reader. Contact Moneris for more details. Only Mag Swipe Purchase and Mag Swipe Pre-Authorization have encrypted versions. Their explanations appear in this document as subsections of the regular (unencrypted) Mag Swipe Purchase and Mag Swipe Pre-Authorization transactions respectively. 6.2 Mag Swipe Purchase Mag Swipe Purchase transaction object definition Track2Purchase track2purchase = new Track2Purchase(); HttpsPostRequest object for Mag Swipe Purchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2purchase); Mag Swipe Purchase transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Page 121 of 486 November 2018 6 Mag Swipe Transaction Set Table 53: Mag Swipe Purchase transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2purchase.SetOrderId (order_id); Amount String 10-character decimal track2purchase.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 20-character numeric track2purchase.SetPan(pan); OR OR OR Track2 data 40-character numeric track2purchase.SetTrack2 (track2); 4-character alphanumeric track2purchase.SetExpdate (expiry_date); Credit card number Expiry date String String (YYMM format) POS code String 2-character numeric track2purchase.SetPosCode (pos_code); Table 54: Mag Swipe Purchase transaction optional values Value Type Limits Set method AVS information Object N/A track2purchase.SetAvsInfo (avsCheck); Customer ID String 50-character alphanumeric track2purchase.SetCustId (cust_id); CVD information Object N/A track2purchase.SetCvdInfo (cvdCheck); November 2018 Page 122 of 486 Moneris Gateway API - Integration Guide Table 54: Mag Swipe Purchase transaction optional values Value Type Limits Set method Dynamic descriptor String 20-character alphanumeric track2purchase .SetDynamicDescriptor (dynamic_descriptor); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample Mag Swipe Purchase namespace Moneris { using System; using System.Text.RegularExpressions; public class TestCanadaTrack2Purchase { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "LBriggs"; string amount = "1.00"; string track2 = ""; //string track2 = ";5258968987035454=06061015454001060101?"; string pan = "4242424242424242"; string exp_date = "1903"; //must send '0000' if swiped string pos_code = "00"; string processing_country_code = "CA"; bool status_check = false; Track2Purchase track2purchase = new Track2Purchase(); track2purchase.SetOrderId(order_id); track2purchase.SetCustId(cust_id); track2purchase.SetAmount(amount); track2purchase.SetTrack2(track2); track2purchase.SetPan(pan); track2purchase.SetExpdate(exp_date); track2purchase.SetPosCode(pos_code); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2purchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Page 123 of 486 November 2018 6 Mag Swipe Transaction Set Sample Mag Swipe Purchase Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 6.2.1 Encrypted Mag Swipe Purchase Encrypted Mag Swipe Purchase transaction object definition EncTrack2Purchase encpurchase = new EncTrack2Purchase(); HttpsPostRequest object for Encrypted Mag Swipe Purchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(encpurchase); Encrypted Mag Swipe Purchase transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields November 2018 Page 124 of 486 Moneris Gateway API - Integration Guide Table 55: Encrypted Mag Swipe Purchase transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric encpurchase.SetOrderId(order_ id); Amount String 10-character decimal encpurchase.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Encrypted Track2 data String n/a encpurchase.SetEncTrack2(enc_ track2); POS code String 2-character numeric encpurchase.SetPosCode(pos_ code); Device type String 30-character alphanumeric encpurchase.SetDeviceType (device_type); Table 56: Encrypted Mag Swipe Purchase transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric encpurchase.SetCustId(cust_ id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); AVS information Object n/a encpurchase.SetAvsInfo (avsCheck); Dynamic descriptor String 20-character alphanumeric encpurchase .SetDynamicDescriptor (dynamic_descriptor); Sample Encrypted Mag Swipe Purchase namespace Moneris { Page 125 of 486 November 2018 6 Mag Swipe Transaction Set Sample Encrypted Mag Swipe Purchase using System; using System.Text.RegularExpressions; public class TestCanadaEncTrack2Purchase { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "LBriggs"; string amount = "1.00"; string pos_code = "00"; string device_type = "idtech_bdk"; string processing_country_code = "CA"; bool status_check = false; string dynamic_descriptor = "my descriptor"; string enc_track2 = "ENCRYPTEDTRACK2DATA"; EncTrack2Purchase encpurchase = new EncTrack2Purchase(); encpurchase.SetOrderId(order_id); encpurchase.SetCustId(cust_id); encpurchase.SetAmount(amount); encpurchase.SetEncTrack2(enc_track2); encpurchase.SetPosCode(pos_code); encpurchase.SetDeviceType(device_type); encpurchase.SetDynamicDescriptor(dynamic_descriptor); AvsInfo avsCheck = new AvsInfo(); avsCheck.SetAvsStreetNumber("212"); avsCheck.SetAvsStreetName("Payton Street"); avsCheck.SetAvsZipCode("M1M1M1"); encpurchase.SetAvsInfo(avsCheck); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(encpurchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("MaskedPan = " + receipt.GetMaskedPan()); Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); Console.WriteLine("AVS Response = " + receipt.GetAvsResultCode()); November 2018 Page 126 of 486 Moneris Gateway API - Integration Guide Sample Encrypted Mag Swipe Purchase } catch (Exception e) { Console.WriteLine(e); } } } } 6.3 Mag Swipe Pre-Authorization Mag Swipe Pre-Authorization transaction object definition Track2PreAuth track2preauth = new Track2PreAuth(); HttpsPostRequest object for Mag Swipe Pre-Authorization transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2preauth); Mag Swipe Pre-Authorization transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 57: Mag Swipe Pre-Authorization transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2preauth.SetOrderId (order_id); Amount String 10-character decimal track2preauth.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 20-character numeric track2preauth.SetPan(pan); OR OR OR Track2 data 40-character numeric track2preauth.SetPan(pan); 4-character alpha- track2preauth.SetExpdate (expiry_date); Credit card number Expiry date Page 127 of 486 String String November 2018 6 Mag Swipe Transaction Set Table 57: Mag Swipe Pre-Authorization transaction object mandatory values (continued) Value Type Limits Set method numeric (YYMM format) POS code String 2-character numeric track2preauth.SetPosCode(pos_ code); Table 58: Mag Swipe Pre-Authorization transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric track2preauth.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric track2preauth .SetDynamicDescriptor (dynamic_descriptor); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample Mag Swipe Pre-Authorization namespace Moneris { using System; using System.Text.RegularExpressions; public class TestCanadaTrack2Preauth { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "LBriggs"; string amount = "5.00"; //string track2 = ";5258968987035454=06061015454001060101?"; string track2 = ""; string pan = "4242424242424242"; string exp = "1906"; //must send '0000' if swiped string pos_code = "00"; string processing_country_code = "CA"; bool status_check = false; Track2PreAuth track2preauth = new Track2PreAuth(); track2preauth.SetOrderId(order_id); track2preauth.SetCustId(cust_id); track2preauth.SetAmount(amount); track2preauth.SetTrack2(track2); track2preauth.SetPan(pan); track2preauth.SetExpdate(exp); track2preauth.SetPosCode(pos_code); November 2018 Page 128 of 486 Moneris Gateway API - Integration Guide Sample Mag Swipe Pre-Authorization HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2preauth); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 6.3.1 Encrypted Mag Swipe Pre-Authorization Encrypted Mag Swipe Pre-Authorization transaction object definition EncTrack2PreAuth enctrack2preauth = new EncTrack2PreAuth(); HttpsPostRequest object for Encrypted Mag Swipe Pre-Authorization transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(enctrack2preauth); Encrypted Mag Swipe Pre-Authorization transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Page 129 of 486 November 2018 6 Mag Swipe Transaction Set Table 59: Encrypted Mag Swipe Pre-Authorization transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric enctrack2preauth.SetOrderId (order_id); Amount String 10-character decimal enctrack2preauth.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 20-character numeric enctrack2preauth.SetPan(pan); OR OR OR Encrypted Track2 n/a enctrack2preauth.SetEncTrack2 (enc_track2); Credit card number String POS code String 2-character numeric enctrack2preauth.SetPosCode (pos_code); Device type String 30-character alphanumeric enctrack2preauth .SetDeviceType(device_type); Table 60: Encrypted Mag Swipe Pre-Authorization transaction optional values Value Type Limits Customer ID String 50-character alphanumeric Status Check Boolean true/false Set method enctrack2preauth.SetCustId (cust_id); mpgReq.SetStatusCheck(status_ check); Sample Encrypted Mag Swipe Pre-Authorization namespace Moneris { using System; using System.Text.RegularExpressions; public class TestCanadaEncTrack2Preauth { public static void Main(string[] args) { November 2018 Page 130 of 486 Moneris Gateway API - Integration Guide Sample Encrypted Mag Swipe Pre-Authorization string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "LBriggs"; string amount = "5.00"; string pos_code = "00"; string device_type = "idtech_bdk"; string processing_country_code = "CA"; bool status_check = false; string enc_track2 = "ENCRYPTEDTRACK2DATA"; string descriptor = "nqa"; EncTrack2PreAuth enctrack2preauth = new EncTrack2PreAuth(); enctrack2preauth.SetOrderId(order_id); enctrack2preauth.SetCustId(cust_id); enctrack2preauth.SetAmount(amount); enctrack2preauth.SetEncTrack2(enc_track2); enctrack2preauth.SetPosCode(pos_code); enctrack2preauth.SetDeviceType(device_type); enctrack2preauth.SetDynamicDescriptor(descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(enctrack2preauth); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("MaskedPan = " + receipt.GetMaskedPan()); Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); } catch (Exception e) { Console.WriteLine(e); } } } } Page 131 of 486 November 2018 6 Mag Swipe Transaction Set 6.4 Mag Swipe Completion Mag Swipe Completion transaction object definition Track2Completion track2completion = new Track2Completion(); HttpsPostRequest object for Mag Swipe Completion transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2completion); Mag Swipe Completion transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 61: Mag Swipe Completion transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2completion.SetOrderId (order_id); Transaction number String 255-character track2completion.SetTxnNumber (txn_number); variable character Completion Amount String 10-character decimal track2completion.SetCompAmount (comp_amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 POS code String 2-character numeric track2completion.SetPosCode (pos_code); Table 62: Mag Swipe Completion transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric track2completion.SetCustId (cust_id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Dynamic descriptor String 20-character alpha- track2completion .SetDynamicDescriptor November 2018 Page 132 of 486 Moneris Gateway API - Integration Guide Table 62: Mag Swipe Completion transaction optional values (continued) Value Type Limits numeric Set method (dynamic_descriptor); Sample Mag Swipe Completion namespace Moneris { using System; public class TestCanadaTrack2Completion { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test20150625035422"; string txn_number = "87028-0_10"; string amount = "1.00"; string pos_code = "00"; string dynamic_descriptor = "123456"; string processing_country_code = "CA"; bool status_check = false; Track2Completion track2completion = new Track2Completion(); track2completion.SetOrderId(order_id); track2completion.SetTxnNumber(txn_number); track2completion.SetAmount(amount); track2completion.SetPosCode(pos_code); track2completion.SetDynamicDescriptor(dynamic_descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2completion); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Page 133 of 486 November 2018 6 Mag Swipe Transaction Set Sample Mag Swipe Completion Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 6.5 Mag Swipe Force Post Mag Swipe Force Post transaction object definition Track2ForcePost track2forcePost = new Track2ForcePost(); HttpsPostRequest object for Mag Swipe Force Post transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2forcePost); Mag Swipe Force Post transaction mandatory arguments For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 63: Mag Swipe Force Post transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2forcePost.SetOrderId (order_id); Amount String 10-character decimal track2forcePost.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 20-character numeric track2forcePost.SetPan(pan); OR OR OR Track2 data 40-character numeric track2forcePost.SetTrack2 (track2); Credit card number November 2018 String Page 134 of 486 Moneris Gateway API - Integration Guide Table 63: Mag Swipe Force Post transaction object mandatory values Value Expiry date Type String Limits 4-character alphanumeric Set method track2forcePost.SetExpdate (expiry_date); (YYMM format) POS code String 2-character numeric track2forcePost.SetPosCode (pos_code); Authorization code String 8-character alphanumeric track2forcePost.SetAuthCode (auth_code); Table 64: Mag Swipe Force Post transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric track2forcePost.SetCustId (cust_id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Dynamic descriptor String 20-character alphanumeric track2forcePost .SetDynamicDescriptor (dynamic_descriptor); Sample Mag Swipe Force Post namespace Moneris { using System; public class TestCanadaTrack2ForcePost { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "10.00"; string track2 = ""; string pan = "4242424242424242"; string expiry_date = "1212"; string pos_code = "00"; string auth_code = "AU4R6"; string processing_country_code = "CA"; bool status_check = false; Track2ForcePost track2forcePost = new Track2ForcePost(); track2forcePost.SetOrderId(order_id); track2forcePost.SetAmount(amount); Page 135 of 486 November 2018 6 Mag Swipe Transaction Set Sample Mag Swipe Force Post track2forcePost.SetTrack2(track2); track2forcePost.SetPan(pan); track2forcePost.SetExpdate(expiry_date); track2forcePost.SetPosCode(pos_code); track2forcePost.SetAuthCode(auth_code); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2forcePost); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 6.5.1 Encrypted Mag Swipe Force Post The Encrypted Mag Swipe Force Post is used when a merchant obtains the authorization number directly from the issuer using a phone or any third-party authorization method. This transaction does not require that an existing order be logged in the Moneris Gateway. However, the credit card must be swiped or keyed in using a Moneris-provided encrypted mag swipe reader, and the encrypted Track2 details must be submitted. There are also optional fields that may be submitted such as cust_id and dynamic_descriptor. To complete the transaction, the authorization number obtained from the issuer must be entered. November 2018 Page 136 of 486 Moneris Gateway API - Integration Guide Encrypted Mag Swipe Force Post transaction object definition EncTrack2Forcepost enctrack2fp = new EncTrack2Forcepost(); HttpsPostRequest object for Encrypted Mag Swipe Force Post transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(enctrack2fp); Encrypted Mag Swipe Force Post transaction object values Table 1 Encrypted Mag Swipe Force Post transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric enctrack2fp.SetOrderId(order_ id); Amount String 10-character decimal enctrack2fp.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Encrypted Track2 data String n/a enctrack2fp.SetEncTrack2(enc_ track2); POS Code String 2-character numeric enctrack2fp.SetPosCode(pos_ code); Device type String 30-character alphanumeric enctrack2fp.SetDeviceType (device_type); Authorization Code String 8-character alphanumeric enctrack2fp.SetAuthCode(auth_ code); Page 137 of 486 November 2018 6 Mag Swipe Transaction Set Table 2 Encrypted Mag Swipe Force Post transaction object optional values Value Type Limits Set Method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric enctrack2fp.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric enctrack2fp .SetDynamicDescriptor (dynamic_descriptor); Sample Encrypted Mag Swipe Force Post namespace Moneris { using System; public class TestCanadaEncTrack2Forcepost { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "my customer id"; string amount = "5.00"; string pos_code = "00"; string device_type = "idtech_bdk"; string auth_code = "123456"; string processing_country_code = "CA"; bool status_check = false; string descriptor = "my descriptor"; string enc_track2 = "ENCRYPTEDTRACK2DATA"; EncTrack2Forcepost enctrack2fp = new EncTrack2Forcepost(); enctrack2fp.SetOrderId(order_id); enctrack2fp.SetCustId(cust_id); enctrack2fp.SetAmount(amount); enctrack2fp.SetEncTrack2(enc_track2); enctrack2fp.SetPosCode(pos_code); enctrack2fp.SetDeviceType(device_type); enctrack2fp.SetAuthCode(auth_code); enctrack2fp.SetDynamicDescriptor(descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(enctrack2fp); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); November 2018 Page 138 of 486 Moneris Gateway API - Integration Guide Sample Encrypted Mag Swipe Force Post Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("MaskedPan = " + receipt.GetMaskedPan()); Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); } catch (Exception e) { Console.WriteLine(e); } } } } 6.6 Mag Swipe Purchase Correction Mag Swipe Purchase Correction transaction object definition Track2PurchaseCorrection track2void = new Track2PurchaseCorrection(); HttpsPostRequest object for Mag Swipe Purchase Correction transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2void); Mag Swipe Purchase Correction transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 65: Mag Swipe Purchase Correction transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2purchasecorrection .SetOrderId(order_id); Transaction number String 255-character alphanumeric track2purchasecorrection .SetTxnNumber(txn_number); Page 139 of 486 November 2018 6 Mag Swipe Transaction Set Table 66: Mag Swipe Purchase Correction transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric track2purchasecorrection .SetCustId(cust_id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample Mag Swipe Purchase Correction namespace Moneris { using System; public class TestCanadaTrack2PurchaseCorrection { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test20150625030621"; string txn_number = "86949-0_10"; string dynamic_descriptor = "123456"; string cust_id = "my customer id"; string processing_country_code = "CA"; bool status_check = false; Track2PurchaseCorrection track2void = new Track2PurchaseCorrection(); track2void.SetOrderId(order_id); track2void.SetCustId(cust_id); track2void.SetTxnNumber(txn_number); track2void.SetDynamicDescriptor(dynamic_descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2void); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); November 2018 Page 140 of 486 Moneris Gateway API - Integration Guide Sample Mag Swipe Purchase Correction Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 6.7 Mag Swipe Refund Mag Swipe Refund transaction object definition Track2Refund track2refund = new Track2Refund(); HttpsPostRequest object for Mag Swipe Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2refund); Mag Swipe Refund transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 67: Mag Swipe Refund transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2refund.SetOrderId (order_id); Amount String 10-character decimal track2refund.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number Page 141 of 486 String 255-character alphanumeric track2refund.SetTxnNumber (txn_number); November 2018 6 Mag Swipe Transaction Set Table 68: Mag Swipe Refund transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric track2refund.SetCustId(cust_ id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Dynamic descriptor String 20-character alphanumeric track2refund .SetDynamicDescriptor (dynamic_descriptor); Sample Mag Swipe Refund namespace Moneris { using System; public class TestCanadaTrack2Refund { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test20150625035152"; //will prompt user for input string txn_number = "87017-0_10"; string amount = "1.00"; string dynamic_descriptor = "123456"; string cust_id = "customer id"; string processing_country_code = "CA"; bool status_check = false; Track2Refund track2refund = new Track2Refund(); track2refund.SetOrderId(order_id); track2refund.SetAmount(amount); track2refund.SetCustId(cust_id); track2refund.SetTxnNumber(txn_number); track2refund.SetDynamicDescriptor(dynamic_descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2refund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); November 2018 Page 142 of 486 Moneris Gateway API - Integration Guide Sample Mag Swipe Refund Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 6.8 Mag Swipe Independent Refund NOTE: If you receive a TRANSACTION NOT ALLOWED error, it may mean the Mag Swipe Independent Refund transaction is not supported on your account. Contact Moneris to have it temporarily (re-)enabled. Mag Swipe Independent Refund transaction object definition Track2IndependentRefund track2indrefund = new Track2IndependentRefund(); HttpsPostRequest object for Mag Swipe Independent Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(track2indrefund); Page 143 of 486 November 2018 6 Mag Swipe Transaction Set Mag Swipe Independent Refund transaction values Table 69: Mag Swipe Independent Refund transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric track2indrefund.SetOrderId (order_id); Amount String 10-character decimal track2indrefund.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character numeric track2indrefund.SetPan(pan); Track2 data String 40-character numeric track2indrefund.SetTrack2 (track2); Expiry date String 4-character alphanumeric track2indrefund.SetExpdate (expiry_date); (YYMM format) POS code String 2-character numeric track2indrefund.SetPosCode (pos_code); Table 70: Mag Swipe Independent Refund transaction optional values Value Type Limits Set method Customer ID String 50-character alphanumeric track2indrefund.SetCustId (cust_id); Dynamic descriptor String 20-character alphanumeric track2indrefund .SetDynamicDescriptor(dynamic_ descriptor); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample Mag Swipe Independent Refund namespace Moneris November 2018 Page 144 of 486 Moneris Gateway API - Integration Guide Sample Mag Swipe Independent Refund { using System; public class TestCanadaTrack2IndependentRefund { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "Ced_Benson32"; string amount = "5.00"; string track2 = ""; string pan = "4242424242424242"; string exp = "1903"; //must send '0000' if swiped string pos_code = "00"; string processing_country_code = "CA"; bool status_check = false; Track2IndependentRefund track2indrefund = new Track2IndependentRefund(); track2indrefund.SetOrderId(order_id); track2indrefund.SetCustId(cust_id); track2indrefund.SetAmount(amount); track2indrefund.SetTrack2(track2); track2indrefund.SetPan(pan); track2indrefund.SetExpdate(exp); track2indrefund.SetPosCode(pos_code); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(track2indrefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); Page 145 of 486 November 2018 6 Mag Swipe Transaction Set Sample Mag Swipe Independent Refund } } } } 6.8.1 Encrypted Mag Swipe Independent Refund The Encrypted Mag Swipe Independent Refund credits a specified amount to the cardholder’s credit card. The Encrypted Mag Swipe Independent Refund does not require an existing order to be logged in the Moneris Gateway. However, the credit card must be swiped using the Moneris-provided encrypted mag swipe reader to provide the encrypted track2 details. There are also optional fields that may be submitted such as cust_id and dynamic_descriptor. The transaction format is almost identical to Encrypted Mag Swipe Purchase and Encrypted Mag Swipe PreAuth. NOTE: The Encrypted Mag Swipe Independent Refund transaction may not be supported on your account. This may yield a TRANSACTION NOT ALLOWED error when attempting the transaction. To temporarily enable (or re-enable) the Independent Refund transaction type, contact Moneris Encrypted Mag Swipe Independent Refund transaction object definition EncTrack2IndependentRefund encindrefund = new EncTrack2IndependentRefund(); HttpsPostRequest object for Encrypted Mag Swipe Independent Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(encindrefund); November 2018 Page 146 of 486 Moneris Gateway API - Integration Guide Encrypted Mag Swipe Independent Refund transaction object values Table 1 Encrypted Mag Swipe Independent Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric encindrefund.SetOrderId (order_id); Amount String 10-character decimal encindrefund.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Encrypted Track 2 data String n/a encindrefund.SetEncTrack2 (enc_track2); Device Type String 30-character alphanumeric encindrefund.SetDeviceType (device_type); POS Code String 2-character numeric encindrefund.SetPosCode(pos_ code); Table 2 Encrypted Mag Swipe Independent Refund transaction object optional values Value Type Limits Set Method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric encindrefund.SetCustId(cust_ id); Sample Encrypted Mag Swipe Independent Refund namespace Moneris { using System; public class TestCanadaEncTrack2IndependentRefund { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "my customer id"; Page 147 of 486 November 2018 6 Mag Swipe Transaction Set Sample Encrypted Mag Swipe Independent Refund string amount = "5.00"; string pos_code = "00"; string device_type = "idtech_bdk"; string processing_country_code = "CA"; string enc_track2 = "ENCRYPTEDTRACK2DATA"; string descriptor = "nqa"; EncTrack2IndependentRefund encindrefund = new EncTrack2IndependentRefund(); encindrefund.SetOrderId(order_id); encindrefund.SetCustId(cust_id); encindrefund.SetAmount(amount); encindrefund.SetEncTrack2(enc_track2); encindrefund.SetPosCode(pos_code); encindrefund.SetDeviceType(device_type); encindrefund.SetDynamicDescriptor(descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(encindrefund); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("MaskedPan = " + receipt.GetMaskedPan()); Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); } catch (Exception e) { Console.WriteLine(e); } } } } November 2018 Page 148 of 486 7 Level 2/3 Transactions l l l l 7.1 7.2 7.3 7.4 About Level 2/3 Transactions Level 2/3 Visa Transactions Level 2/3 MasterCard Transactions Level 2/3 American Express Transactions 7.1 About Level 2/3 Transactions The Moneris Gateway API supports passing Level 2/3 purchasing card transaction data for Visa, MasterCard and American Express corporate cards. All Level 2/3 transactions use the same Pre-Authorization transaction as described in the topic PreAuthorization (page 19). 7.2 Level 2/3 Visa Transactions l l l l l l l l 7.2.1 7.2.2 7.2.3 7.2.5 7.2.4 7.2.6 7.2.7 7.2.8 Level 2/3 Transaction Types for Visa Level 2/3 Transaction Flow for Visa VS Completion VS Force Post VS Purchase Correction VS Refund VS Independent Refund VS Corpais 7.2.1 Level 2/3 Transaction Types for Visa This transaction set includes a suite of corporate card financial transactions as well as a transaction that allows for the passing of Level 2/3 data. Please ensure that Visa Level 2/3 support is enabled on your merchant account. Batch Close, Open Totals and Pre-authorization are identical to the transactions outlined in the section Basic Transaction Set (page 12). l l When the Pre-authorization response contains CorporateCard equal to true then you can submit the Visa transactions. If CorporateCard is false then the card does not support Level 2/3 data and non Level 2/3 transaction are to be used. If the card is not a corporate card, please refer to the section 2 Basic Transaction Set for the appropriate non-corporate card transactions. NOTE: This transaction set is intended for transactions where Corporate Card is true and Level 2/3 data will be submitted. If the credit card is found to be a corporate card but you do November 2018 Page 149 of 486 Moneris Gateway API - Integration Guide not wish to send any Level 2/3 data then you may submit Visa transactions using the basic transaction set outlined in 2 Basic Transaction Set. Pre-authorization– (authorization/pre-authorization) Pre-authorization verifies and locks funds on the customer’s credit card. The funds are locked for a specified amount of time, based on the card issuer. To retrieve the funds from a preauth so that they may be settled in the merchant account a capture must be performed. CorporateCard will return as true if the card supports Level 2/3. VS Completion – (Capture/Pre-authorization Completion) Once a Pre-authorization is obtained the funds that are locked need to be retrieved from the customer’s credit card. The capture retrieves the locked funds and readies them for settlement into the merchant account. Prior to performing a VS Completion, a Pre-authorization must be performed. Once the transaction is completed, VS Corpais must be used to process the Level 2/3 data. VS Force Post – (Force Capture/Pre-authorization Completion) This transaction is an alternative to VS Completion to obtain the funds locked on Pre-auth obtained from IVR or equivalent terminal. The VS Force Post retrieves the locked funds and readies them for settlement in to the merchant account. Once the transaction is completed, VS Corpais must be used to process the Level 2/3 data. VS Purchase Correction (Void, Correction) VS Completion and VS Force Post can be voided the same day* that they occur. A VS Purchase Correction must be for the full amount of the transaction and will remove any record of it from the cardholder statement. VS Refund – (Credit) A VS Refund can be performed against a VS Completion to refund any part or all of the transaction. Once the transaction is completed, VS Corpais must be used to process the Level 2/3 data. VS Independent Refund – (Credit) A VS Independent Refund can be performed against a purchase or a capture to refund any part, or all of the transaction. Independent refund is used when the originating transaction was not performed through Moneris Gateway. Once the transaction is completed, VS Corpais must be used to process the Level 2/3 data. NOTE: the Independent Refund transaction may or may not be supported on your account. If you receive a transaction not allowed error when attempting an independent refund, it may mean the transaction is not supported on your account. If you wish to have the Independent Refund transaction type temporarily enabled (or reenabled), please contact the Service Centre at 1-866-319-7450. VS Corpais – (Level 2/3 Data) VS Corpais will contain all the required and optional data fields for Level 2/3 Business to Business data. VS Corpais data can be sent when the card has been identified in the Pre-authorization transaction request as being a corporate card. Page 150 of 486 November 2018 7 Level 2/3 Transactions * A VS Purchase Correction can be performed against a transaction as long as the batch that contains the original transaction remains open. When using the automated closing feature, the batch close occurs daily between 10 – 11 pm EST. 7.2.2 Level 2/3 Transaction Flow for Visa Pre-authorization/Completion Transaction Flow Purchase Correction Transaction Flow 7.2.3 VS Completion Once a Pre-authorization is obtained, the funds that are locked need to be retrieved from the customer’s credit card. This VS Completion transaction is used to secure the funds locked by a pre-authorization transaction and readies them for settlement into the merchant account. NOTE: Once you have completed this transaction successfully, to submit the complete supplemental level 2/3 data, please proceed to VS Corpais. VS Completion transaction object definition VsCompletion vsCompletion = new VsCompletion(); HttpsPostRequest object for VS Completion transaction object HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vsCompletion); November 2018 Page 151 of 486 Moneris Gateway API - Integration Guide VS Completion transaction object values Table 1 VS Completion transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vsCompletion.SetOrderId (order_id); Completion amount String 10-character decimal vsCompletion.SetCompAmount (comp_amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number String 255-character alphanumeric vsCompletion.SetTxnNumber (txn_number); E-Commerce Indicator String 1-character alphanumeric vsCompletion.SetCryptType (crypt); Table 2 Visa - Corporate Card Common Data - Level 2 Request Fields Req* Y Value National Tax Limits 12-character decimal Set Method vsCompletion .SetNationalTax (national_tax); Description Must reflect the amount of National Tax (GST or HST) appearing on the invoice. Minimum - 0.01 Maximum 999999.99. Must have 2 decimal places. Y Merchant VAT Registration/Single Business Reference 20-character alphanumeric vsCompletion .SetMerchantVatNo (merchant_vat_no); Merchant’s Tax Registration Number must be provided if tax is included on the invoice Page 152 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description NOTE: Must not be all spaces or all zeroes C Local Tax 12-character decimal vsCompletion .SetLocalTax (local_tax); Must reflect the amount of Local Tax (PST or QST) appearing on the invoice If Local Tax included then must not be all spaces or all zeroes; Must be provided if Local Tax (PST or QST) applies Minimum = 0.01 Maximum = 999999.99 Must have 2 decimal places C Local Tax (PST or QST) Registration Number 15-character alphanumeric vsCompletion .SetLocalTaxNo (local_tax_no); Merchant's Local Tax (PST/QST) Registration Number Must be provided if tax is included on the invoice; If Local Tax included then must not be all spaces or all zeroes Must be November 2018 Page 153 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description provided if Local Tax (PST or QST) applies C Customer VAT Registration Number 13-character alphanumeric vsCompletion .SetCustomerVatNo (customer_vat_no); If the Customer’s Tax Registration Number appears on the invoice to support tax exempt transactions it must be provided here C Customer Code/Customer Reference Identifier (CRI) 16-character alphanumeric vsCompletion .SetCri(cri); Value which the customer may choose to provide to the supplier at the point of sale – must be provided if given by the customer N Customer Code 17-character alphanumeric vsCompletion .SetCustomerCode (customer_code); Optional customer code field that will not be passed along to Visa, but will be included on Moneris reporting N Invoice Number 17-character alphanumeric vsCompletion .SetInvoiceNumber (invoice_number); Optional invoice number field that will not be passed along to Visa, but will be included on Moneris reporting *Y = Required, N = Optional, C = Conditional Page 154 of 486 November 2018 7 Level 2/3 Transactions Sample VS Completion namespace Moneris { using System; using System.Collections; using System.Text; public class TestVsCompletion { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="ord-210916-15:14:46"; string comp_amount="5.00"; string txn_number = "19002-0_11"; string crypt="7"; string national_tax = "1.23"; string merchant_vat_no = "gstno111"; string local_tax = "2.34"; string customer_vat_no = "gstno999"; string cri = "CUST-REF-002"; string customer_code="ccvsfp"; string invoice_number="invsfp"; string local_tax_no="ltaxno"; VsCompletion vsCompletion = new VsCompletion(); vsCompletion.SetOrderId(order_id); vsCompletion.SetCompAmount(comp_amount); vsCompletion.SetTxnNumber(txn_number); vsCompletion.SetCryptType(crypt); vsCompletion.SetNationalTax(national_tax); vsCompletion.SetMerchantVatNo(merchant_vat_no); vsCompletion.SetLocalTax(local_tax); vsCompletion.SetCustomerVatNo(customer_vat_no); vsCompletion.SetCri(cri); vsCompletion.SetCustomerCode(customer_code); vsCompletion.SetInvoiceNumber(invoice_number); vsCompletion.SetLocalTaxNo(local_tax_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vsCompletion); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); November 2018 Page 155 of 486 Moneris Gateway API - Integration Guide Sample VS Completion Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.2.4 VS Purchase Correction The VS Purchase Correction (also known as a "void") transaction is used to cancel a transaction that was performed in the current batch. No amount is required because a void is always for 100% of the original transaction. The only transaction that can be voided using VS Purchase Correction is a VS Completion or VS Force Post. To send a void the order_id and txn_number from the VS Completion/VS Force Post are required. VS Purchase Correction transaction object definition VsPurchaseCorrection vsPurchaseCorrection = new VsPurchaseCorrection(); HttpsPostRequest object for VS Purchase Correction transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vsPurchaseCorrection); VS Purchase Correction transaction object values Table 1 VS Purchase Correction transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vsPurchaseCorrection .SetOrderId(order_id); Transaction number String 255-character alphanumeric vsPurchaseCorrection .SetTxnNumber(txn_number); E-Commerce Indicator String 1-character alphanumeric vsPurchaseCorrection .SetCryptType(crypt); Page 156 of 486 November 2018 7 Level 2/3 Transactions Sample VS Purchase Correction namespace Moneris { using System; using System.Collections; using System.Text; public class TestVsPurchaseCorrection { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test20170116050230"; string txn_number = "39016-0_11"; string crypt="7"; VsPurchaseCorrection vsPurchaseCorrection = new VsPurchaseCorrection(); vsPurchaseCorrection.SetOrderId(order_id); vsPurchaseCorrection.SetTxnNumber(txn_number); vsPurchaseCorrection.SetCryptType(crypt); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vsPurchaseCorrection); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } November 2018 Page 157 of 486 Moneris Gateway API - Integration Guide 7.2.5 VS Force Post The VS Force Post transaction is used to secure the funds locked by a pre-authorization transaction performed over IVR or equivalent terminal. When sending a force post request, you will need Order ID, Amount, Credit Card Number, Expiry Date, E-commerce Indicator and the Authorization Code received in the pre-authorization response. NOTE: Once you have completed this transaction successfully, to submit the complete supplemental level 2/3 data, please proceed to VS Corpais. VS Force Post transaction object definition VsForcePost vsForcePost = new VsForcePost(); HttpsPostRequest object for VS Force Post transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vsForcePost); VS Force Post transaction object values Table 1 VS Force Post transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vsForcePost.SetOrderId(order_ id); Amount String 10-character decimal vsForcePost.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number Page 158 of 486 String 20-character numeric vsForcePost.SetPan(pan); November 2018 7 Level 2/3 Transactions Value Type Expiry Date String Limits 4-character numeric Set Method vsForcePost.SetExpdate (expiry_date); YYMM format Authorization code String 8-character alphanumeric vsForcePost.SetAuthCode(auth_ code); E-commerce Indicator String 1-character alphanumeric vsForcePost.SetCryptType (crypt); Table 2 VS Force Post transaction object optional values Value Type Customer ID String Limits 50-character alphanumeric Set Method vsForcePost.SetCustId(cust_ id); Table 3 Visa - Corporate Card Common Data - Level 2 Request Fields Req* Y Value National Tax Limits 12-character decimal Set Method vsForcePost .SetNationalTax (national_tax); Description Must reflect the amount of National Tax (GST or HST) appearing on the invoice. Minimum 0.01 Maximum - 999999.99. Must have 2 decimal places. Y Merchant VAT Registration/Single Business Reference 20-character alphanumeric vsForcePost .SetMerchantVatNo (merchant_vat_no); Merchant’s Tax Registration Number must be provided if tax is included on the invoice NOTE: Must not be all spaces or all November 2018 Page 159 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description zeroes C Local Tax 12-character decimal vsForcePost .SetLocalTax (local_tax); Must reflect the amount of Local Tax (PST or QST) appearing on the invoice If Local Tax included then must not be all spaces or all zeroes; Must be provided if Local Tax (PST or QST) applies Minimum = 0.01 Maximum = 999999.99 Must have 2 decimal places C Local Tax (PST or QST) Registration Number 15-character alphanumeric vsForcePost .SetLocalTaxNo (local_tax_no); Merchant's Local Tax (PST/QST) Registration Number Must be provided if tax is included on the invoice; If Local Tax included then must not be all spaces or all zeroes Must be provided if Local Tax (PST Page 160 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description or QST) applies C Customer VAT Registration Number 13-character alphanumeric vsForcePost .SetCustomerVatNo (customer_vat_no); If the Customer’s Tax Registration Number appears on the invoice to support tax exempt transactions it must be provided here C Customer Code/Customer Reference Identifier (CRI) 16-character alphanumeric vsForcePost .SetCri(cri); Value which the customer may choose to provide to the supplier at the point of sale – must be provided if given by the customer N Customer Code 17-character alphanumeric vsForcePost .SetCustomerCode (customer_code); Optional customer code field that will not be passed along to Visa, but will be included on Moneris reporting N Invoice Number 17-character alphanumeric vsForcePost .SetInvoiceNumber (invoice_number); Optional invoice number field that will not be passed along to Visa, but will be included on Moneris reporting *Y = Required, N = Optional, C = Conditional November 2018 Page 161 of 486 Moneris Gateway API - Integration Guide Sample VS Force Post namespace Moneris { using System; using System.Collections; using System.Text; public class TestVsForcePost { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id="CUST13343"; string amount="5.00"; string pan="4242424254545454"; string expiry_date="2012"; //YYMM string auth_code="123456"; string crypt="7"; string national_tax = "1.23"; string merchant_vat_no = "gstno111"; string local_tax = "2.34"; string customer_vat_no = "gstno999"; string cri = "CUST-REF-002"; string customer_code="ccvsfp"; string invoice_number="invsfp"; string local_tax_no="ltaxno"; VsForcePost vsForcePost = new VsForcePost(); vsForcePost.SetOrderId(order_id); vsForcePost.SetCustId(cust_id); vsForcePost.SetAmount(amount); vsForcePost.SetPan(pan); vsForcePost.SetExpDate(expiry_date); vsForcePost.SetAuthCode(auth_code); vsForcePost.SetCryptType(crypt); vsForcePost.SetNationalTax(national_tax); vsForcePost.SetMerchantVatNo(merchant_vat_no); vsForcePost.SetLocalTax(local_tax); vsForcePost.SetCustomerVatNo(customer_vat_no); vsForcePost.SetCri(cri); vsForcePost.SetCustomerCode(customer_code); vsForcePost.SetInvoiceNumber(invoice_number); vsForcePost.SetLocalTaxNo(local_tax_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vsForcePost); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Page 162 of 486 November 2018 7 Level 2/3 Transactions Sample VS Force Post Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.2.6 VS Refund VS Refund will credit a specified amount to the cardholder’s credit card. A refund can be sent up to the full value of the original VS Completion or VS Force Post. To send a VS Refund you will require the Order ID and Transaction Number from the original VS Completion or VS Force Post. NOTE: Once you have completed this transaction successfully, to submit the complete supplemental level 2/3 data, please proceed to VS Corpais. VS Refund transaction object definition VsRefund vsRefund = new VsRefund(); HttpsPostRequest object for VS Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vsRefund); November 2018 Page 163 of 486 Moneris Gateway API - Integration Guide VS Refund transaction object values Table 1 VS Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vsRefund.SetOrderId(order_ id); Transaction number String 255-character alphanumeric vsRefund.SetTxnNumber(txn_ number); Amount String 10-character decimal vsRefund.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 E-Commerce Indicator String 1-character alphanumeric vsRefund.SetCryptType(crypt); Table 2 Visa - Corporate Card Common Data - Level 2 Request Fields Req* Y Value National Tax Limits 12-character decimal Set Method vsRefund .SetNationalTax (national_tax); Description Must reflect the amount of National Tax (GST or HST) appearing on the invoice. Minimum 0.01 Maximum - 999999.99. Must have 2 decimal places. Y Merchant VAT Registration/Single Business Reference 20-character alphanumeric vsRefund .SetMerchantVatNo (merchant_vat_no); Merchant’s Tax Registration Number must be Page 164 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description provided if tax is included on the invoice NOTE: Must not be all spaces or all zeroes C Local Tax 12-character decimal vsRefund .SetLocalTax (local_tax); Must reflect the amount of Local Tax (PST or QST) appearing on the invoice If Local Tax included then must not be all spaces or all zeroes; Must be provided if Local Tax (PST or QST) applies Minimum = 0.01 Maximum = 999999.99 Must have 2 decimal places C Local Tax (PST or QST) Registration Number 15-character alphanumeric vsRefund .SetLocalTaxNo (local_tax_no); Merchant's Local Tax (PST/QST) Registration Number Must be provided if tax is included on the invoice; If Local Tax included then November 2018 Page 165 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description must not be all spaces or all zeroes Must be provided if Local Tax (PST or QST) applies C Customer VAT Registration Number 13-character alphanumeric vsRefund .SetCustomerVatNo (customer_vat_no); If the Customer’s Tax Registration Number appears on the invoice to support tax exempt transactions it must be provided here C Customer Code/Customer Reference Identifier (CRI) 16-character alphanumeric vsRefund .SetCri(cri); Value which the customer may choose to provide to the supplier at the point of sale – must be provided if given by the customer N Customer Code 17-character alphanumeric vsRefund .SetCustomerCode (customer_code); Optional customer code field that will not be passed along to Visa, but will be included on Moneris reporting N Invoice Number 17-character alphanumeric vsRefund .SetInvoiceNumber (invoice_number); Optional invoice number field that will not be passed along to Visa, Page 166 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description but will be included on Moneris reporting *Y = Required, N = Optional, C = Conditional Sample VS Refund namespace Moneris { using System; using System.Collections; using System.Text; public class TestVsRefund { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test20170116043144"; string amount="5.00"; string txn_number = "39011-0_11"; string crypt="7"; string national_tax = "1.23"; string merchant_vat_no = "gstno111"; string local_tax = "2.34"; string customer_vat_no = "gstno999"; string cri = "CUST-REF-002"; string customer_code="ccvsfp"; string invoice_number="invsfp"; string local_tax_no="ltaxno"; VsRefund vsRefund = new VsRefund(); vsRefund.SetOrderId(order_id); vsRefund.SetAmount(amount); vsRefund.SetTxnNumber(txn_number); vsRefund.SetCryptType(crypt); vsRefund.SetNationalTax(national_tax); vsRefund.SetMerchantVatNo(merchant_vat_no); vsRefund.SetLocalTax(local_tax); vsRefund.SetCustomerVatNo(customer_vat_no); vsRefund.SetCri(cri); vsRefund.SetCustomerCode(customer_code); vsRefund.SetInvoiceNumber(invoice_number); vsRefund.SetLocalTaxNo(local_tax_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vsRefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { November 2018 Page 167 of 486 Moneris Gateway API - Integration Guide Sample VS Refund Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.2.7 VS Independent Refund VS Independent Refund will credit a specified amount to the cardholder’s credit card. The independent refund does not require an existing order to be logged in the Moneris Gateway; however, the credit card number and expiry date will need to be passed. The transaction format is almost identical to a pre-authorization. NOTE: Once you have completed this transaction successfully, to submit the complete supplemental level 2/3 data, please proceed to VS Corpais. VS Independent Refund transaction object definition VsIndependentRefund vsIndependentRefund = new VsIndependentRefund(); HttpsPostRequest object for VS Independent Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vsIndependentRefund); Page 168 of 486 November 2018 7 Level 2/3 Transactions VS Independent Refund transaction object values Table 1 VS Independent Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vsIndependentRefund .SetOrderId(order_id); Amount String 10-character decimal vsIndependentRefund.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character numeric vsIndependentRefund.SetPan (pan); Expiry date String 4-character numeric vsIndependentRefund .SetExpdate(expiry_date); YYMM format E-commerce indicator String 1-character alphanumeric vsIndependentRefund .SetCryptType(crypt); Table 2 VS Independent Refund transaction object optional values Value Type Customer ID String Limits 50-character alphanumeric Set Method vsIndependentRefund.SetCustId (cust_id); Table 3 Visa - Corporate Card Common Data - Level 2 Request Fields Req* Y Value National Tax Limits Set Method Description 12-character decimal vsIndependentRefund .SetNationalTax (national_tax); Must reflect the amount of National Tax (GST or HST) appearing on the invoice. Minimum 0.01 Maximum November 2018 Page 169 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description - 999999.99. Must have 2 decimal places. Y Merchant VAT Registration/Single Business Reference 20-character alphanumeric vsIndependentRefund .SetMerchantVatNo (merchant_vat_no); Merchant’s Tax Registration Number must be provided if tax is included on the invoice NOTE: Must not be all spaces or all zeroes C Local Tax 12-character decimal vsIndependentRefund .SetLocalTax(local_ tax); Must reflect the amount of Local Tax (PST or QST) appearing on the invoice If Local Tax included then must not be all spaces or all zeroes; Must be provided if Local Tax (PST or QST) applies Minimum = 0.01 Maximum = 999999.99 Must have 2 decimal places C Local Tax (PST or QST) Registration Number Page 170 of 486 15-character alphanumeric vsIndependentRefund .SetLocalTaxNo (local_tax_no); Merchant's Local Tax November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description (PST/QST) Registration Number Must be provided if tax is included on the invoice; If Local Tax included then must not be all spaces or all zeroes Must be provided if Local Tax (PST or QST) applies C Customer VAT Registration Number 13-character alphanumeric vsIndependentRefund .SetCustomerVatNo (customer_vat_no); If the Customer’s Tax Registration Number appears on the invoice to support tax exempt transactions it must be provided here C Customer Code/Customer Reference Identifier (CRI) 16-character alphanumeric vsIndependentRefund .SetCri(cri); Value which the customer may choose to provide to the supplier at the point of sale – must be provided if given by the customer N Customer Code 17-character alphanumeric vsIndependentRefund .SetCustomerCode (customer_code); Optional customer code field that will not be passed along to Visa, November 2018 Page 171 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description but will be included on Moneris reporting N Invoice Number 17-character alphanumeric vsIndependentRefund .SetInvoiceNumber (invoice_number); Optional invoice number field that will not be passed along to Visa, but will be included on Moneris reporting *Y = Required, N = Optional, C = Conditional Sample VS Independent Refund namespace Moneris { using System; using System.Collections; using System.Text; public class TestVsIndependentRefund { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id="CUST13343"; string amount="5.00"; string pan="4242424254545454"; string expiry_date="2012"; //YYMM string crypt="7"; string national_tax = "1.23"; string merchant_vat_no = "gstno111"; string local_tax = "2.34"; string customer_vat_no = "gstno999"; string cri = "CUST-REF-002"; string customer_code="ccvsfp"; string invoice_number="invsfp"; string local_tax_no="ltaxno"; VsIndependentRefund vsIndependentRefund = new VsIndependentRefund(); vsIndependentRefund.SetOrderId(order_id); vsIndependentRefund.SetCustId(cust_id); vsIndependentRefund.SetAmount(amount); vsIndependentRefund.SetPan(pan); vsIndependentRefund.SetExpDate(expiry_date); vsIndependentRefund.SetCryptType(crypt); vsIndependentRefund.SetNationalTax(national_tax); Page 172 of 486 November 2018 7 Level 2/3 Transactions Sample VS Independent Refund vsIndependentRefund.SetMerchantVatNo(merchant_vat_no); vsIndependentRefund.SetLocalTax(local_tax); vsIndependentRefund.SetCustomerVatNo(customer_vat_no); vsIndependentRefund.SetCri(cri); vsIndependentRefund.SetCustomerCode(customer_code); vsIndependentRefund.SetInvoiceNumber(invoice_number); vsIndependentRefund.SetLocalTaxNo(local_tax_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vsIndependentRefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.2.8 VS Corpais VS Corpais will contain all the required and optional data fields for Level 2/3 Purchasing Card Addendum data. VS Corpais data can be sent when the card has been identified in the Pre-authorization transaction request as being a corporate card. In addition to the Order ID and Transaction number, this transaction also contains two objects: l l VS Purcha – Corporate Card Common Data VS Purchl – Line Item Details November 2018 Page 173 of 486 Moneris Gateway API - Integration Guide VS Corpais request must be preceded by a financial transaction (VS Completion, VS Force Post, VS Refund, VS Independent Refund) and the Corporate Card flag must be set to “true” in the Pre-authorization response. VS Corpais transaction object definition VsCorpais vsCorpais = new VsCorpais(); HttpsPostRequest object for VS Corpais transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vsCorpais); VS Corpais transaction object values Table 1 VS Corpais transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vsCorpais.SetOrderId(order_ id); Transaction number String 255-character alphanumeric vsCorpais.SetTxnNumber(txn_ number); vsPurcha Object n/a VsPurcha vsPurcha = new VsPurcha(); vsCorpais.SetVsPurch (vsPurcha,vsPurchl); For a list of the variables that appear in this object, see the table below vsPurchl Object VsPurchl vsPurchl = new VsPurchl(); n/a For a list of the variables that appear in this object, see the table below vsCorpais.SetVsPurch (vsPurcha,vsPurchl); *Y = Required, N = Optional, C = Conditional 7.2.8.1 VS Purcha - Corporate Card Common Data VS Corpais transactions use the VS Purcha object to contain Level 2 data. Table 1 Corporate Card Common Data - Level 2 Request Fields - VSPurcha Req* C Value Buyer Name Page 174 of 486 Limits 30-character alphanumeric Set Method vsPurcha.SetBuyerName (buyer_name); Description Buyer/Recipient Name November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description NOTE: Name required by CRA on transactions >$150 C Local Tax Rate 4-character decimal vsPurchaSetLocalTaxRate (local_tax_rate); Indicates the detailed tax rate applied in relationship to a local tax amount EXAMPLE: 8% PST should be 8.0 Minimum = 0.01 Maximum = 99.99 NOTE: Must be provided if Local Tax (PST or QST) applies. N Duty Amount 9-character decimal vsPurchaSetDutyAmount (duty_amount); Duty on total purchase amount A minus sign means 'amount is a credit', plus sign or no sign means 'amount is a debit' maximum without sign is 999999.99 N Invoice Discount Treatment 1-character numeric vsPurcha .SetDiscountTreatment (discount_treatment); Indicates how the merchant is managing discounts Must be one of the following values: 0 - if no invoice level discounts apply for this invoice 1 - if Tax was calculated on Post-Discount totals November 2018 Page 175 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description 2 - if Tax was calculated on Pre-Discount totals N Invoice Level Discount Amount 9-character decimal vsPurcha.SetDiscountAmt (discount_amt); Amount of discount (if provided at the invoice level according to the Invoice Discount Treatment) Must be non-zero if Invoice Discount Treatment is 1 or 2 Minimum amount is 0.00 and maximum is 999999.99 C Ship To Postal Code / Zip Code 10-character alphanumeric vsPurcha .SetShipToPostalCode (ship_to_pos_code); The postal code or zip code for the destination where goods will be delivered NOTE: Required if shipment is involved Full alpha postal code - Valid ANANAN format required if shipping to an address within Canada C Ship From Postal Code / Zip Code 10-character alphanumeric vsPurcha .SetShipFromPostalCode (ship_from_pos_code); The postal code or zip code from which items were shipped For Canadian addresses,requires full alpha postal code for the merchant with Valid ANANAN Page 176 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description format C Destination Country Code 2-character alphanumeric vsPurcha.SetDesCouCode (des_cou_code); Code of country where purchased goods will be delivered Use ISO 3166-1 alpha-2 format NOTE: Required if it appears on the invoice for an international transaction Y Unique VAT Invoice Reference Number 25-character alphanumeric vsPurcha.SetVatRefNum (vat_ref_num); Unique Value Added Tax Invoice Reference Number Must be populated with the invoice number and this cannot be all spaces or zeroes Y Tax Treatment 1-character alphanumeric vsPurcha .SetTaxTreatment(tax_ treatment); Must be one of the following values: 0 = Net Prices with tax calculated at line item level; 1 = Net Prices with tax calculated at invoice level; 2 = Gross prices given with tax information provided at line item level; 3 = Gross prices given with tax information provided at invoice level; 4 = No tax applies (small merchant) on the invoice for the transaction November 2018 Page 177 of 486 Moneris Gateway API - Integration Guide Req* N Value Freight/Shipping Amount (Ship Amount) Limits 9-character decimal Set Method vsPurcha .SetFreightAmount (freight_amount); Description Freight charges on total purchase If shipping is not provided as a line item it must be provided here, if applicable Signed monetary amount: Minus (-) sign means 'amount is a credit', Plus (+) sign or no sign means 'amount is a debit' Maximum without sign is 999999.99 C GST HST Freight Rate 4-character decimal vsPurcha .SetGstHstFreightRate (gst_hst_freight_rate); Rate of GST (excludes PST) or HST charged on the shipping amount (in accordance with the Tax Treatment) If Freight/Shipping Amount is provided then this (National GST or HST) tax rate must be provided. Monetary amount, maximum is 99.99. Such as 13% HST is 13.00 C GST HST Freight Amount 9-character decimal vsPurcha .SetGstHstFreightAmount (gst_hst_freight_ amount); Amount of GST (excludes PST) or HST charged on the shipping amount If Freight/Shipping Amount is Page 178 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description provided then this (National GST or HST) tax amount must be provided if taxTreatment is 0 or 2 Signed monetary amount: maximum without sign is 999999.99. 7.2.8.2 VS Purchl - Line Item Details VS Corpais transactions use the VS Purchl object to contain Level 3 data. Line Item Details for VS Purchl string[] item_com_code = {"X3101", "X84802"}; string[] product_code = {"CHR123", "DDSK200"}; string[] item_description = {"Office Chair", "Disk Drive"}; string[] item_quantity = {"3", "1"}; string[] item_uom = {"EA", "EA"}; string[] unit_cost = {"0.20", "0.40"}; string[] vat_tax_amt = {"0.00", "0.00"}; string[] vat_tax_rate = {"13.00", "13.00"}; string[] discount_treatmentL = {"0", "0"}; string[] discount_amtL = {"0.00", "0.00"}; Setting VS Purchl Line Item Details vsPurchl.SetVsPurchl(item_com_code[0], product_code[0], item_description[0], item_quantity[0], item_uom[0], unit_cost[0], vat_tax_amt[0], vat_tax_rate[0], discount_treatmentL[0], discount_amtL[0]); vsPurchl.SetVsPurchl(item_com_code[1], product_code[1], item_description[1], item_quantity[1], item_uom[1], unit_cost[1], vat_tax_amt[1], vat_tax_rate[1], discount_treatmentL[1], discount_amtL[1]); November 2018 Page 179 of 486 Moneris Gateway API - Integration Guide Table 1 Corporate Card Common Data - Level 3 Request Fields - VSPurchl Req* Value Limits Variable/Field Description C Item Commodity Code 12-character alphanumeric item_com_code Line item Comodity Code (if this field is not sent, then Product Code must be sent) Y Product Code 12-character alphanumeric product_code Product code for this line item – merchant’s product code, manufacturer’s product code or buyer’s product code Typically this will be the SKU or identifier by which the merchant tracks and prices the item or service This should always be provided for every line item Y Item Description 35-character alphanumeric item_description Line item description Y Item Quantity 12-character decimal item_quantity Quantity invoiced for this line item Up to 4 decimal places supported, whole numbers are accepted Minimum = 0.0001 Maximum = 999999999999 Y Item Unit of Measure Page 180 of 486 2-character alphanumeric item_uom Unit of measure Use ANSI X-12 EDI Allowable Units of Measure and November 2018 7 Level 2/3 Transactions Req* Value Limits Variable/Field Description Codes Y Item Unit Cost 12-character decimal unit_cost Line item cost per unit 2-4 decimal places accepted Minimum = 0.0001 Maximum = 999999.9999 N VAT Tax Amount 12-character decimal vat_tax_amt Any value-added tax or other sales tax amount Must have 2 decimal places Minimum = 0.01 Maximum = 999999.99 N VAT Tax Rate 4-character decimal vat_tax_rate Sales tax rate EXAMPLE: 8% PST should be 8.0 maximum 99.99 Y Discount Treatment 1-character numeric discount_treatmentL Must be one of the following values: 0 if no invoice level discounts apply for this invoice 1 if Tax was calculated on Post-Discount totals 2 if Tax was calculated on Pre-Discount totals C Discount Amount November 2018 12-character decimal discount_amtL Amount of discount, if provided for this line item according to the Line Item Discount Page 181 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable/Field Description Treatment Must be non-zero if Line Item Discount Treatment is 1 or 2 Must have 2 decimal places Minimum = 0.01 Maximum = 999999.99 7.2.8.3 Sample Code for VS Corpais Sample VS Corpais namespace Moneris { using System; using System.Collections; using System.Text; public class TestVsCorpais { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="ord-160916-15:31:39"; string txn_number="18306-0_11"; string buyer_name = "Buyer Manager"; string local_tax_rate = "13.00"; string duty_amount = "0.00"; string discount_treatment = "0"; string discount_amt = "0.00"; string freight_amount = "0.20"; string ship_to_pos_code = "M8X 2W8"; string ship_from_pos_code = "M1K 2Y7"; string des_cou_code = "CAN"; string vat_ref_num = "VAT12345"; string tax_treatment = "3";//3 = Gross prices given with tax information provided at invoice level string gst_hst_freight_amount = "0.00"; string gst_hst_freight_rate = "13.00"; string[] item_com_code = {"X3101", "X84802"}; string[] product_code = {"CHR123", "DDSK200"}; string[] item_description = {"Office Chair", "Disk Drive"}; string[] item_quantity = {"3", "1"}; string[] item_uom = {"EA", "EA"}; string[] unit_cost = {"0.20", "0.40"}; Page 182 of 486 November 2018 7 Level 2/3 Transactions Sample VS Corpais string[] vat_tax_amt = {"0.00", "0.00"}; string[] vat_tax_rate = {"13.00", "13.00"}; string[] discount_treatmentL = {"0", "0"}; string[] discount_amtL = {"0.00", "0.00"}; //Create and set VsPurcha VsPurcha vsPurcha = new VsPurcha(); vsPurcha.SetBuyerName(buyer_name); vsPurcha.SetLocalTaxRate(local_tax_rate); vsPurcha.SetDutyAmount(duty_amount); vsPurcha.SetDiscountTreatment(discount_treatment); vsPurcha.SetDiscountAmt(discount_amt); vsPurcha.SetFreightAmount(freight_amount); vsPurcha.SetShipToPostalCode(ship_to_pos_code); vsPurcha.SetShipFromPostalCode(ship_from_pos_code); vsPurcha.SetDesCouCode(des_cou_code); vsPurcha.SetVatRefNum(vat_ref_num); vsPurcha.SetTaxTreatment(tax_treatment); vsPurcha.SetGstHstFreightAmount(gst_hst_freight_amount); vsPurcha.SetGstHstFreightRate(gst_hst_freight_rate); //Create and set VsPurchl VsPurchl vsPurchl = new VsPurchl(); vsPurchl.SetVsPurchl(item_com_code[0], product_code[0], item_description[0], item_quantity[0], item_uom[0], unit_cost[0], vat_tax_amt[0], vat_tax_rate[0], discount_treatmentL[0], discount_amtL [0]); vsPurchl.SetVsPurchl(item_com_code[1], product_code[1], item_description[1], item_quantity[1], item_uom[1], unit_cost[1], vat_tax_amt[1], vat_tax_rate[1], discount_treatmentL[1], discount_amtL [1]); VsCorpais vsCorpais = new VsCorpais(); vsCorpais.SetOrderId(order_id); vsCorpais.SetTxnNumber(txn_number); vsCorpais.SetVsPurch(vsPurcha, vsPurchl); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vsCorpais); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); November 2018 Page 183 of 486 Moneris Gateway API - Integration Guide Sample VS Corpais Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.3 Level 2/3 MasterCard Transactions l l l l l l l l 7.3.1 7.3.2 7.3.3 7.3.4 7.3.5 7.3.6 7.3.7 7.3.8 Level 2/3 Transaction Types for MasterCard Level 2/3 Transaction Flow for MasterCard MC Completion MC Force Post MC Purchase Correction MC Refund MC Independent Refund MC Corpais - Corporate Card Common Data with Line Item Details 7.3.1 Level 2/3 Transaction Types for MasterCard This transaction set includes a suite of corporate card financial transactions as well as a transaction that allows for the passing of Level 2/3 data. Please ensure MC Level 2/3 processing support is enabled on your merchant account. Batch Close, Open Totals and Pre-authorization are identical to the transactions outlined in the section Basic Transaction Set (page 12). When the Preauth response contains CorporateCard equal to true then you can submit the MC transactions. If CorporateCard is false then the card does not support Level 2/3 data and non Level 2/3 transaction are to be used. If the card is not a corporate card, please refer to section 4 for the appropriate non-corporate card transactions. NOTE: This transaction set is intended for transactions where Corporate Card is true and Level 2/3 data will be submitted. If the credit card is found to be a corporate card but you do not wish to send any Level 2/3 data then you may submit MC transactions using the transaction set outlined in Basic Transaction Set (page 12). Page 184 of 486 November 2018 7 Level 2/3 Transactions Pre-auth – (authorization/pre-authorization) The pre-auth verifies and locks funds on the customer’s credit card. The funds are locked for a specified amount of time, based on the card issuer. To retrieve the funds from a pre-auth so that they may be settled in the merchant account a capture must be performed. Level 2/3 data submission is not supported as part of a pre-auth as a pre-auth is not settled. When CorporateCard is returned true then Level 2/3 data may be submitted. MC Completion – (Capture/Preauth Completion) Once a Pre-authorization is obtained the funds that are locked need to be retrieved from the customer’s credit card. The capture retrieves the locked funds and readies them for settlement in to the merchant account. Prior to performing an MCCompletion a Pre-auth must be performed. MC Force Post – (Force Capture/Preauth Completion) This transaction is an alternative to MC Completion to obtain the funds locked on Preauth obtained from IVR or equivalent terminal. The MC Force Post requires that the original Preauthorization’s auth code is provided and it retrieves the locked funds and readies them for settlement in to the merchant account. MC Purchase Correction – (Void, Correction) MC Completions can be voided the same day* that they occur. A void must be for the full amount of the transaction and will remove any record of it from the cardholder statement. * An MC Purchase Correction can be performed against a transaction as long as the batch that contains the original transaction remains open. When using the automated closing feature batch close occurs daily between 10 – 11 pm EST. MC Refund – (Credit) A MC Refund can be performed against an MC Completion or MC Force Post to refund an amount less than or equal to the amount of the original transaction. MC Independent Refund – (Credit) A MC Indpendent Refund can be performed against an completion to refund any part, or all of the transaction. Independent refund is used when the originating transaction was not performed through Moneris Gateway. Please note, the MC Independent Refund transaction may or may not be supported on your account. If you receive a transaction not allowed error when attempting an MC Independent Refund, it may mean the transaction is not supported on your account. If you wish to have the MC Independent Refund transaction type temporarily enabled (or re-enabled), please contact the Service Centre at 1-866-319-7450. MC Corpais Common Line Item – (Level 2/3 Data) MC Corpais Common Line Item will contain the entire required and optional data field for Level 2/3 data. MCCorpais Common Line Item data can be sent when the card has been identified in the transaction request as being a corporate card. This transaction supports multiple data types and combinations: l November 2018 Purchasing Card Data: l Corporate card common data with Line Item Details Page 185 of 486 Moneris Gateway API - Integration Guide 7.3.2 Level 2/3 Transaction Flow for MasterCard Pre-authorization/Completion Transaction Flow Purchase Correction Transaction Flow 7.3.3 MC Completion The MC Completion transaction is used to secure the funds locked by a pre-authorization transaction. When sending a capture request you will need two pieces of information from the original pre-authorization– the Order ID and the transaction number from the returned response. Once you have completed this transaction successfully, to submit the complete supplemental level 2/3 data, please proceed to MC Corpais. MC Completion transaction object definition McCompletion mcCompletion = new McCompletion(); HttpsPostRequest object for MC Completion transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mcCompletion); Page 186 of 486 November 2018 7 Level 2/3 Transactions MC Completion transaction object values Table 1 MC Completion transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric mcCompletion.SetOrderId (order_id); Completion amount String 10-character decimal mcCompletion.SetCompAmount (comp_amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number String 255-character alphanumeric mcCompletion.SetTxnNumber (txn_number); Merchant reference number String 19-character alphanumeric mcCompletion.SetMerchantRefNo (merchant_ref_no); E-commerce indicator String 1-character alphanumeric mcCompletion.SetCryptType (crypt); Sample MC Completion namespace Moneris { using System; using System.Collections; using System.Text; public class TestMcCompletion { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test20170112020548"; string comp_amount="5.00"; string txn_number="660117311792017012140548199-0_11"; string crypt="7"; string merchant_ref_no = "319038"; McCompletion mcCompletion = new McCompletion(); mcCompletion.SetOrderId(order_id); November 2018 Page 187 of 486 Moneris Gateway API - Integration Guide Sample MC Completion mcCompletion.SetCompAmount(comp_amount); mcCompletion.SetTxnNumber(txn_number); mcCompletion.SetCryptType(crypt); mcCompletion.SetMerchantRefNo(merchant_ref_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mcCompletion); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.3.4 MC Force Post MC Force Post transaction is used to secure the funds locked by a pre-authorization transaction performed over IVR or equivalent terminal`. When sending a force post request, you will need order_id, amount, pan (card number), expiry date, crypt type and the authorization code received in the preauthorization response. MC Force Post transaction object definition McForcePost mcforcepost= new McForcePost(); Page 188 of 486 November 2018 7 Level 2/3 Transactions HttpsPostRequest object for MC Force Post transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mcforcepost); MC Force Post transaction object values Table 1 MC Force Post transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric mcforcepost.SetOrderId(order_ id); Amount String 10-character decimal mcforcepost.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character alphanumeric mcforcepost.SetPan(pan); Expiry date String 4-character alphanumeric mcforcepost.SetExpdate (expiry_date); (YYMM format) Authorization code String 8-character alphanumeric mcforcepost.SetAuthCode(auth_ code); E-commerce indicator String 1-character alphanumeric mcforcepost.SetCryptType (crypt); Merchant reference number String 19-character alphanumeric mcforcepost.SetMerchantRefNo (merchant_ref_no); Table 2 MC Force Post transaction object optional values Value Customer ID November 2018 Type String Limits 50-character alphanumeric Set Method mcforcepost.SetCustId(cust_ id); Page 189 of 486 Moneris Gateway API - Integration Guide Sample MC Force Post namespace Moneris { using System; using System.Collections; using System.Text; public class TestMcForcePost { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUST13343"; string amount = "5.00"; string pan = "5454545442424242"; string expiry_date = "1912"; //YYMM string auth_code = "123456"; string crypt = "7"; string merchant_ref_no = "319038"; McForcePost mcforcepost = new McForcePost(); mcforcepost.SetOrderId(order_id); mcforcepost.SetCustId(cust_id); mcforcepost.SetAmount(amount); mcforcepost.SetPan(pan); mcforcepost.SetExpDate(expiry_date); mcforcepost.SetAuthCode(auth_code); mcforcepost.SetCryptType(crypt); mcforcepost.SetMerchantRefNo(merchant_ref_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mcforcepost); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Page 190 of 486 November 2018 7 Level 2/3 Transactions Sample MC Force Post Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.3.5 MC Purchase Correction The MC Purchase Correction (void) transaction is used to cancel a transaction that was performed in the current batch. No amount is required because a void is always for 100% of the original transaction. The only transaction that can be voided is completion. To send a void, the Order ID and Transaction Number from the MC Completion or MC Force Post are required. MC Purchase Correction transaction object definition McPurchaseCorrection mcpurchasecorrection = new McPurchaseCorrection(); HttpsPostRequest object for MC Purchase Correction transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mcpurchasecorrection); MC Purchase Correction transaction object values Table 1 MC Purchase Correction transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric mcpurchasecorrection .SetOrderId(order_id); Transaction number String 255-character alphanumeric mcpurchasecorrection .SetTxnNumber(txn_number); E-commerce indicator String 1-character alphanumeric mcpurchasecorrection .SetCryptType(crypt); November 2018 Page 191 of 486 Moneris Gateway API - Integration Guide Sample MC Purchase Correction namespace Moneris { using System; using System.Collections; using System.Text; public class TestMcPurchaseCorrection { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test20170112020548"; string txn_number="660117311792017012140548199-0_11"; string crypt="7"; McPurchaseCorrection mcpurchasecorrection = new McPurchaseCorrection(); mcpurchasecorrection.SetOrderId(order_id); mcpurchasecorrection.SetTxnNumber(txn_number); mcpurchasecorrection.SetCryptType(crypt); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mcpurchasecorrection); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Page 192 of 486 November 2018 7 Level 2/3 Transactions 7.3.6 MC Refund The MC Refund will credit a specified amount to the cardholder’s credit card. A refund can be sent up to the full value of the original capture. To send a refund you will require the Order ID and Transaction Number from the original MC Completion or MC Force Post. MC Refund transaction object definition McRefund mcRefund = new McRefund(); HttpsPostRequest object for MC Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mcRefund); MC Refund transaction object values Table 1 MC Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric mcRefund.SetOrderId(order_ id); Amount String 10-character decimal mcRefund.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number String 255-character alphanumeric mcRefund.SetTxnNumber(txn_ number); E-commerce indicator String 1-character alphanumeric mcRefund.SetCryptType(crypt); Merchant reference number String 19-character alphanumeric mcRefund.SetMerchantRefNo (merchant_ref_no); November 2018 Page 193 of 486 Moneris Gateway API - Integration Guide Sample MC Refund namespace Moneris { using System; using System.Collections; using System.Text; public class TestMcRefund { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test20170112020548"; string amount="5.00"; string txn_number="660117311792017012140548199-0_11"; string crypt="7"; string merchant_ref_no = "319038"; McRefund mcRefund = new McRefund(); mcRefund.SetOrderId(order_id); mcRefund.SetAmount(amount); mcRefund.SetTxnNumber(txn_number); mcRefund.SetCryptType(crypt); mcRefund.SetMerchantRefNo(merchant_ref_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mcRefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } Page 194 of 486 November 2018 7 Level 2/3 Transactions Sample MC Refund } } } 7.3.7 MC Independent Refund MC Independent Refund is used when the originating transaction was not performed through Moneris Gateway and does not require an existing order to be logged in the Moneris Gateway; however, the credit card number and the expiry date will need to be passed. The transaction format is almost identical to a purchase or a pre-authorization. NOTE: Independent refund transactions are not supported on all accounts. If you receive a transaction not allowed error when attempting an independent refund transaction, it may mean the feature is not supported on your account. To have Independent Refund transaction functionality temporarily enabled (or re-enabled), please contact the MonerisCustomer Service Centre at 1-866-319-7450. Once you have completed this transaction successfully, to submit the complete supplemental level 2/3 data, please proceed to MC Corpais. MC Independent Refund transaction object definition McIndependentRefund mcindrefund = new McIndependentRefund(); HttpsPostRequest object for MC Independent Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mcindrefund); November 2018 Page 195 of 486 Moneris Gateway API - Integration Guide MC Independent Refund transaction object values Table 1 MC Independent Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric mcindrefund.SetOrderId(order_ id); Amount String 10-character decimal mcindrefund.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 E-commerce indicator String 1-character alphanumeric mcindrefund.SetCryptType (crypt); Credit card number String 20-character numeric mcindrefund.SetPan(pan); Expiry date String 4-character numeric mcindrefund.SetExpdate (expiry_date); (YYMM format) Merchant reference number String 19-character alphanumeric mcindrefund.SetMerchantRefNo (merchant_ref_no); Table 2 MC Independent Refund transaction object optional values Value Customer ID Type String Limits 50-character alphanumeric Set Method mcindrefund.SetCustId(cust_ id); Sample MC Independent Refund namespace Moneris { using System; using System.Collections; using System.Text; public class TestMcIndependentRefund { public static void Main(string[] args) Page 196 of 486 November 2018 7 Level 2/3 Transactions Sample MC Independent Refund { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUST13343"; string amount = "5.00"; string pan = "5454545442424242"; string expiry_date = "1912"; //YYMM string crypt = "7"; string merchant_ref_no = "319038"; McIndependentRefund mcindrefund = new McIndependentRefund(); mcindrefund.SetOrderId(order_id); mcindrefund.SetCustId(cust_id); mcindrefund.SetAmount(amount); mcindrefund.SetPan(pan); mcindrefund.SetExpDate(expiry_date); mcindrefund.SetCryptType(crypt); mcindrefund.SetMerchantRefNo(merchant_ref_no); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mcindrefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } November 2018 Page 197 of 486 Moneris Gateway API - Integration Guide 7.3.8 MC Corpais - Corporate Card Common Data with Line Item Details This transaction example includes the following elements for Level 2 and 3 purchasing card corporate card data processing: l l Corporate Card Common Data (MC Corpac) l only 1 set of MC Corpac fields can be submitted l this data set includes data elements that apply to the overall order, e.g., the total overall taxes Line Item Details (MC Corpal) l 1-998 counts of MC Corpal line items can be submitted l This data set includes the details about each individual item or service purchased The MC Corpais request must be preceded by a financial transaction (MC Completion, MC Force Post, MC Refund, MC Independent Refund) and the Corporate Card flag must be set to “true” in the Preauthorization response. The MC Corpais request will need to contain the Order ID of the financial transaction as well as the Transaction Number. In addition, MC Corpais has a tax array object that can be sent via the Tax fields in MC Corpac and MC Corpal. For more about the tax array object, see 7.3.8.3 Tax Array Object - MC Corpais. For descriptions of the Level 2/3 fields, please see Definition of Request Fields for Level 2/3 - MasterCard (page 427). MC Corpais transaction object definition McCorpais mcCorpais = new McCorpais(); HttpsPostRequest object for MC Corpais transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mcCorpais); MC Corpais transaction object values Table 1 MC Corpais transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric mcCorpais.SetOrderId(order_ id); Transaction number String 255-character alphanumeric mcCorpais.SetTxnNumber(txn_ number); MCCorpac Object n/a mcCorpac.SetMcCorpac (mcCorpac); MC Corpal Object n/a mcCorpais.SetMcCorpal Page 198 of 486 November 2018 7 Level 2/3 Transactions Value Type Limits Set Method (mcCorpal); *Y = Required, N = Optional, C = Conditional 7.3.8.1 MC Corpac - Corporate Card Common Data Table 1 Corporate Card Common Data - Level 2 Request Fields - MCCorpac Req* Value Limits Set Method Description N AustinTetra Number 15-character alphanumeric mcCorpac .SetAustinTetraNumber (austin_tetra_number); The Austin-Tetra Number assigned to the card acceptor N NAICS Code 15-character alphanumeric mcCorpac.SetNaicsCode (naics_code); North American Industry Classification System (NAICS) code assigned to the card acceptor N Customer Code 25-character alphanumeric mcCorpac.SetCustomerCode1 (customer_code1_c); A control number, such as purchase order number, project number, department allocation number or name that the purchaser supplied the merchant Left-justified; may be spaces N Unique Invoice Number 17-character alphanumeric mcCorpac .SetUniqueInvoiceNumber (unique_invoice_number_c); Unique number associated with the individual transaction provided by the merchant N Commodity Code 15-character alphanumeric mcCorpac.SetCommodityCode (commodity_code); Code assigned by the merchant that best categorizes the item(s) being purchased N Order Date 6-character numeric mcCorpac.SetOrderDate (order_date_c); The date the item was ordered YYMMDD format November 2018 NOTE: If present, must con- Page 199 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description tain a valid date N Corporation VAT Number 20-character alphanumeric mcCorpac .SetCorporationVatNumber (corporation_vat_number_c); Contains a corporation’s value added tax (VAT) number N Customer VAT Number 20-character alphanumeric mcCorpac .SetCustomerVatNumber (customer_vat_number_c); Contains the VAT number for the customer / cardholder used to identify the customer when purchasing goods and services from the merchant N Freight Amount 12-character decimal mcCorpac.SetFreightAmount1 (freight_amount_c); The freight on the total purchase Must have 2 decimals Minimum = 0.00 Maximum = 999999.99 N Duty Amount 12-character decimal mcCorpac.SetDutyAmount1 (duty_amount_c); The duty on the total purchase Must have 2 decimals Minimum = 0.00 Maximum = 999999.99 N Destination State / Province Code 3-character alphanumeric mcCorpac .SetDestinationProvinceCode (destination_province_ code); State or Province of the country where the goods will be delivered Left justified with trailing spaces EXAMPLE: ONT = Ontario N Destination Country Code Page 200 of 486 3-character alphanumeric ISO 3166-1 mcCorpac .SetDestinationCountryCode (destination_country_code); The country code where goods will be delivered Left justified with trailing spaces November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method alpha-3 format Description ISO 3166-1 alpha-3 format EXAMPLE: CAN = Canada N Ship From Postal Code 10-character alphanumeric mcCorpac.SetShipFromPosCode (ship_from_pos_code); ANA NAN format N The postal code or zip code from which items were shipped Full alpha postal code Valid ANANAN format mcCorpac.SetShipToPosCode (ship_to_pos_code_c); Destination Postal Code 10-character alphanumeric The postal code or zip code where goods will be delivered N Authorized Contact Name 36-character alphanumeric mcCorpac .SetAuthorizedContactName (authorized_contact_name_ c); Name of an individual or company contacted for company authorized purchases N Authorized Contact Phone 17-character alphanumeric mcCorpac .SetAuthorizedContactPhone (authorized_contact_phone); Phone number of an individual or company contacted for company authorized purchases N Additional Card Acceptor Data 40-character alphanumeric mcCorpac .SetAdditionalCardAcceptorD ata(additional_card_ acceptor_data); Information pertaining to the card acceptor N Card Acceptor Type 8-character alphanumeric mcCorpac .SetCardAcceptorType(card_ acceptor_type); Various classifications of business ownership characteristics Full alpha postal code Valid ANANAN format if shipping to an address within Canada This field takes 8 characters. Each character represents a different component, as follows: November 2018 Page 201 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description 1st character represents ‘Business Type’ and contains a code to identify the specific classification or type of business: 1. Corporation 2. Not known 3. Individual/Sole Proprietorship 4. Partnership 5. Association/Estate/Trust 6. Tax Exempt Organizations (501C) 7. International Organization 8. Limited Liability Company (LLC) 9. Government Agency 2nd character represents 'Business Owner Type'. Contains a code to identify specific characteristics about the business owner. 1 - No application classification 2 - Female business owner 3 - Physically handicapped female business owner 4 - Physically handicapped male business owner 0 - Unknown 3rd character represents 'Business Certification Type'. Contains a code to identify specific characteristics about the busi- Page 202 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description ness certification type, such as small business, disadvantaged, or other certification type: 1 - Not certified 2 - Small Business Administration (SBA) certification small business 3 - SBA certification as small disadvantaged business 4 - Other government or agencyrecognized certification (such as Minority Supplier Development Council) 5 - Self-certified small business 6 - SBA certification as small and other government or agency-recognized certification 7 - SBA certification as small disadvantaged business and other government or agency-recognized certification 8 - Other government or agencyrecognized certification and self-certified small business A - SBA certification November 2018 Page 203 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description as 8(a) B - Self-certified small disadvantaged business (SDB) C - SBA certification as HUBZone 0 - Unknown 4th character represents 'Business Racial/Ethnic Type'. Contains a code identifying the racial or ethnic type of the majority owner of the business. 1 - African American 2 - Asian Pacific American 3 - Subcontinent Asian American 4 - Hispanic American 5 - Native American Indian 6 - Native Hawaiian 7 - Native Alaskan 8 - Caucasian 9 - Other 0 - Unknown 5th character represents 'Business Type Provided Code' Y - Business type is provided. N - Business type was not provided. R - Card acceptor refused to provide business type 6th character represents 'Business Owner Type Page 204 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description Provided Code' Y - Business owner type is provided. N - Business owner type was not provided. R - Card acceptor refused to provide business type 7th character represents 'Business Certification Type Provided Code' Y - Business certification type is provided. N - Business certification type was not provided. R - Card acceptor refused to provide business type 8th character represents 'Business Racial/Ethnic Type’ Y - Business racial/ethnic type is provided. N - Business racial/ethnic type was not provided. R - Card acceptor refused to provide business racial/ethnic type N Card Acceptor November 2018 20-character alpha- mcCorpac .SetCardAcceptorTaxTd(card_ US federal tax ID number or value-added tax (VAT) ID Page 205 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description Tax ID numeric acceptor_tax_id_c); N Card Acceptor Reference Number 25-character alphanumeric mcCorpac .SetCardAcceptorReferenceNu mber(card_acceptor_ reference_number); Code that facilitates card acceptor/corporation communication and record keeping N Card Acceptor VAT Number 20-character alphanumeric mcCorpac .SetCardAcceptorVatNumber (card_acceptor_vat_number_ c); Value added tax (VAT) number for the card acceptor location Tax Up to 6 arrays C Used to identify the card acceptor when collecting and reporting taxes mcCorpac.SetTax(tax_c); Can have up to 6 arrays containing different tax details NOTE: If you use this variable, you must fill in all the fields of tax array mentioned below. 7.3.8.2 MC Corpal - Line Item Details MC Corpal Object - Line Item Details mcCorpal.SetMcCorpal(customer_code1_l[0], line_item_date_l[0], ship_date_l[0], order_date1_l[0], medical_services_ship_to_health_industry_number_l[0], contract_number_l[0],medical_services_adjustment_l[0], medical_services_product_ number_qualifier_l[0], product_code1_l[0], item_description_l[0], item_quantity_l[0], unit_cost_l[0], item_unit_measure_l[0], ext_item_amount_l[0], discount_amount_l[0], commodity_code_l[0], type_of_supply_l[0], vat_ref_num_l[0], tax_l[0]); Table 1 Line Item Details - Level 3 Request Fields - MC Corpal Req* N Value Customer Code Page 206 of 486 Limits 25-character alphanumeric Variable customer_code1_l Description A control number, such as purchase order number, project number, department alloc- November 2018 7 Level 2/3 Transactions Req* Value Limits Variable Description ation number or name that the purchaser supplied the merchant N Line Item Date 6-character numeric line_item_date_l YYMMDD format The purchase date of the line item referenced in the associated Corporate Card Line Item Detail Fixed length 6 Numeric, in YYMMDD format N Ship Date 6-character numeric ship_date_l YYMMDD format The date the merchandise was shipped to the destination Fixed length 6 Numeric, in YYMMDD format N Order Date 6-character numeric order_date1_ll YYMMDD format The date the item was ordered Fixed length 6-character numeric, in YYMMDD format Y Product Code 12-character alphanumeric product_code1_ll Line item Product Code Contains the nonfuel related product code of the individual item purchased Y Item Description 35-character alphanumeric item_description_ll Line Item description Contains the November 2018 Page 207 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description description of the individual item purchased Y Item Quantity 12-character alphanumeric item_quantity_ll Quantity of line item Up to 5 decimal places supported Minimum amount is 0.0 and maximum is 9999999.99999 Y Unit Cost 12-character decimal unit_cost_ll Line item cost per unit. Must contain a minimum of 2 decimal places, up to 5 decimal places supported. Minimum amount is 0.00001 and maximum is 999999.99999 Y Item Unit Measure 12-character alphanumeric item_unit_measure_ ll The line item unit of measurement code ANSI X-12 EDI Allowable Units of Measure and Codes Y Extended Item Amount 9-character decimal ext_item_amount_ll Contains the individual item amount that is normally calculated as price multiplied by quantity Must contain 2 decimal places Minimum amount Page 208 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Variable Description is 0.00 and maximum is 999999.99 N Discount Amount 9-character decimal discount_amount_ll Contains the item discount amount Must contain 2 decimal places Minimum amount is 0.00 and maximum is 999999.99 N Commodity Code 15-character alphanumeric commodity_code_ll Code assigned to the merchant that best categorizes the item(s) being purchased C Tax Up to 6 arrays tax_l Can have up to 6 arrays containing different tax details –see Tax Array Request Fields table below for each field description NOTE: If you use this variable, you must fill in all the fields of tax array mentioned below. 7.3.8.3 Tax Array Object - MC Corpais The tax array object is used when you use the Tax field of both MC Corpac and MC Corpal. If you use the tax array object, all of the array fields must be sent. Setting the tax array differs slightly between the two objects. Setting tax array for MC Corpac string[] tax_amount_c = { "1.19", "1.29"}; string[] tax_rate_c = { "6.0", "7.0"}; string[] tax_type_c = { "GST", "PST"}; November 2018 Page 209 of 486 Moneris Gateway API - Integration Guide string[] tax_id_c = { "gst1298", "pst1298"}; string[] tax_included_in_sales_c = { "Y", "N"}; McTax tax_c = new McTax(); tax_c.SetTax(tax_amount_c[0], tax_rate_c[0], tax_type_c[0], tax_id_c[0], tax_ included_in_sales_c[0]); Setting tax array for MC Corpal //Tax Details for Items string[] tax_amount_l = {"0.52", "1.48"}; string[] tax_rate_l = {"13.0", "13.0"}; string[] tax_type_l = {"HST", "HST"}; string[] tax_id_l = {"hst1298", "hst1298"}; string[] tax_included_in_sales_l = {"Y", "Y"}; McTax[] tax_l = new McTax[2]; tax_l[1].SetTax(tax_amount_l[1], tax_rate_l[1], tax_type_l[1], tax_id_l[1], tax_included_in_sales_l[1]); Table 1 MC Corpais Tax Array Request Fields Req* Y Value Tax Amount Limits 12-character decimal Variable tax_amount_c/tax_ amount_l Description Contains detail tax amount for purchase of goods or services Must be 2 decimal places. Minimum amount is 0.00 and maximum is 999999.99 Y Tax Rate 5-character decimal tax_rate_c/tax_ rate_l Contains the detailed tax rate applied in relationship to a specific tax amount EXAMPLE: 5% GST should be ‘5.0’ or or 9.975% QST should be ‘9.975’ Page 210 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Variable Description May contain up to 3 decimals, minimum 0.001, maximum up to 9999.9 Y Tax Type 4-character alphanumeric tax_type_c/tax_ type_l Contains tax type, such as GST,QST,PST,HST Y Tax ID 20-character alphanumeric tax_id_c/tax_id_l Provides an identification number used by the card acceptor with the tax authority in relationship to a specific tax amount, such as GST/HST number Y Tax included in sales indicator 1-character alphanumeric tax_included_in_ sales_c/tax_ included_in_sales_l This is the indicator used to reflect additional tax capture and reporting Valid values are: Y = Tax included in total purchase amount N = Tax not included in total purchase amount 7.3.8.4 Sample Code for MC Corpais Sample MC Corpais - Corporate Card Common Data with Line Item Details namespace Moneris { using System; using System.Collections; using System.Text; public class TestMcCorpaisCommonLineItem { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; November 2018 Page 211 of 486 Moneris Gateway API - Integration Guide Sample MC Corpais - Corporate Card Common Data with Line Item Details string order_id="ord-200916-13:29:27"; string txn_number="66011731632016264132927986-0_11"; string customer_code1_c ="CustomerCode123"; string card_acceptor_tax_id_c ="UrTaxId";//Merchant tax id which is mandatory string corporation_vat_number_c ="cvn123"; string freight_amount_c ="1.23"; string duty_amount_c ="2.34"; string ship_to_pos_code_c ="M1R 1W5"; string order_date_c ="141211"; string customer_vat_number_c ="customervn231"; string unique_invoice_number_c ="uin567"; string authorized_contact_name_c ="John Walker"; //Tax Details string[] tax_amount_c = { "1.19", "1.29"}; string[] tax_rate_c = { "6.0", "7.0"}; string[] tax_type_c = { "GST", "PST"}; string[] tax_id_c = { "gst1298", "pst1298"}; string[] tax_included_in_sales_c = { "Y", "N"}; //Item Details string[] customer_code1_l = {"customer code", "customer code2"}; string[] line_item_date_l = {"150114", "150114"}; string[] ship_date_l = {"150120", "150122"}; string[] order_date1_l = {"150114", "150114"}; string[] medical_services_ship_to_health_industry_number_l = {null, null}; string[] contract_number_l = {null, null}; string[] medical_services_adjustment_l = {null, null}; string[] medical_services_product_number_qualifier_l = {null, null}; string[] product_code1_l = {"pc11", "pc12"}; string[] item_description_l = {"Good item", "Better item"}; string[] item_quantity_l = {"4", "5"}; string[] unit_cost_l ={"1.25", "10.00"}; string[] item_unit_measure_l = {"EA", "EA"}; string[] ext_item_amount_l ={"5.00", "50.00"}; string[] discount_amount_l ={"1.00", "50.00"}; string[] commodity_code_l ={"cCode11", "cCode12"}; string[] type_of_supply_l = {null, null}; string[] vat_ref_num_l = {null, null}; //Tax Details for Items string[] tax_amount_l = {"0.52", "1.48"}; string[] tax_rate_l = {"13.0", "13.0"}; string[] tax_type_l = {"HST", "HST"}; string[] tax_id_l = {"hst1298", "hst1298"}; string[] tax_included_in_sales_l = {"Y", "Y"}; //Create and set Tax for McCorpac McTax tax_c = new McTax(); tax_c.SetTax(tax_amount_c[0], tax_rate_c[0], tax_type_c[0], tax_id_c[0], tax_included_in_sales_c [0]); tax_c.SetTax(tax_amount_c[1], tax_rate_c[1], tax_type_c[1], tax_id_c[1], tax_included_in_sales_c [1]); //Create and set McCorpac for common data - only set values that you know McCorpac mcCorpac = new McCorpac(); mcCorpac.SetCustomerCode1(customer_code1_c); mcCorpac.SetCardAcceptorTaxTd(card_acceptor_tax_id_c); mcCorpac.SetCorporationVatNumber(corporation_vat_number_c); mcCorpac.SetFreightAmount1(freight_amount_c); mcCorpac.SetDutyAmount1(duty_amount_c); mcCorpac.SetShipToPosCode(ship_to_pos_code_c); mcCorpac.SetOrderDate(order_date_c); Page 212 of 486 November 2018 7 Level 2/3 Transactions Sample MC Corpais - Corporate Card Common Data with Line Item Details mcCorpac.SetCustomerVatNumber(customer_vat_number_c); mcCorpac.SetUniqueInvoiceNumber(unique_invoice_number_c); mcCorpac.SetAuthorizedContactName(authorized_contact_name_c); mcCorpac.SetTax(tax_c); //Create and set Tax for McCorpal McTax[] tax_l = new McTax[2]; tax_l[0] = new McTax(); tax_l[0].SetTax(tax_amount_l[0], tax_rate_l[0], tax_type_l[0], tax_id_l[0], tax_included_in_sales_ l[0]); tax_l[1] = new McTax(); tax_l[1].SetTax(tax_amount_l[1], tax_rate_l[1], tax_type_l[1], tax_id_l[1], tax_included_in_sales_ l[1]); //Create and set McCorpal for each item McCorpal mcCorpal = new McCorpal(); mcCorpal.SetMcCorpal(customer_code1_l[0], line_item_date_l[0], ship_date_l[0], order_date1_l[0], medical_services_ship_to_health_industry_number_l[0], contract_number_l[0], medical_services_adjustment_l[0], medical_services_product_number_qualifier_l[0], product_code1_l [0], item_description_l[0], item_quantity_l[0], unit_cost_l[0], item_unit_measure_l[0], ext_item_amount_l[0], discount_amount_l[0], commodity_ code_l[0], type_of_supply_l[0], vat_ref_num_l[0], tax_l[0]); mcCorpal.SetMcCorpal(customer_code1_l[1], line_item_date_l[1], ship_date_l[1], order_date1_l[1], medical_services_ship_to_health_industry_number_l[1], contract_number_l[1], medical_services_adjustment_l[1], medical_services_product_number_qualifier_l[1], product_code1_l [1], item_description_l[1], item_quantity_l[1], unit_cost_l[1], item_unit_measure_l[1], ext_item_amount_l[1], discount_amount_l[1], commodity_ code_l[1], type_of_supply_l[1], vat_ref_num_l[1], tax_l[1]); McCorpais mcCorpais = new McCorpais(); mcCorpais.SetOrderId(order_id); mcCorpais.SetTxnNumber(txn_number); mcCorpais.SetMcCorpac(mcCorpac); mcCorpais.SetMcCorpal(mcCorpal); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mcCorpais); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); November 2018 Page 213 of 486 Moneris Gateway API - Integration Guide Sample MC Corpais - Corporate Card Common Data with Line Item Details Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.4 Level 2/3 American Express Transactions l l l l l l l 7.4.1 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 Level 2/3 Transaction Types for Amex Level 2/3 Transaction Flow for Amex AX Completion AX Force Post AX Purchase Correction AX Refund AX Independent Refund 7.4.1 Level 2/3 Transaction Types for Amex This transaction set includes a suite of corporate card financial transactions as well as a transaction that allows for the passing of Level 2/3 data. Please ensure American Express Level 2/3 processing support is enabled on your merchant account. Batch Close, Open Totals and Pre-authorization are identical to the transactions outlined in the section Basic Transaction Set (page 12). l l When the Pre-authorization response contains CorporateCard equal to true then you can submit the AX transactions. If CorporateCard is false then the card does not support Level 2/3 data and non Level 2/3 transaction are to be used. If the card is not a corporate card, please refer to 2 Basic Transaction Set for the appropriate non-corporate card transactions. NOTE: This transaction set is intended for transactions where Corporate Card is true and Level 2/3 data will be submitted. If the credit card is found to be a corporate card but you do not wish to send any Level 2/3 data then you may submit AX transactions using the transaction set outlined in the section Basic Transaction Set (page 12). Page 214 of 486 November 2018 7 Level 2/3 Transactions Pre-authorization – (authorization) The preauth verifies and locks funds on the customer’s credit card. The funds are locked for a specified amount of time, based on the card issuer. To retrieve the funds from a pre-auth so that they may be settled in the merchant account a capture must be performed. CorporateCard will return as true if the card supports Level 2/3. AX Completion – (Capture/Pre-authorization Completion) Once a Pre-authorization is obtained the funds that are locked need to be retrieved from the customer’s credit card. The capture retrieves the locked funds and readies them for settlement in to the merchant account. Prior to performing an AXCompletion a Preauth must be performed. AX Force Post – (Force Capture/Pre-authorization Completion) This transaction is an alternative to AX Completion to obtain the funds locked on a Pre-authorization obtained from IVR or equivalent terminal. The capture retrieves the locked funds and readies them for settlement in to the merchant account. AX Purchase Correction – (Void, Correction) AX Completion and AX Force Post can be voided the same day* that they occur. A void must be for the full amount of the transaction and will remove any record of it from the cardholder statement. * An AX Purchase Correction can be performed against a transaction as long as the batch that contains the original transaction remains open. When using the automated closing feature, the batch close occurs daily between 10 – 11 pm EST. AX Refund – (Credit) An AX Refund can be performed against an AX Completion and AX Force Post to refund any part, or all of the transaction. AX Independent Refund – (Credit) An AX Independent Refund can be performed against a purchase or a capture to refund any part, or all of the transaction. Independent refund is used when the originating transaction was not performed through Moneris Gateway. Please note, the Independent Refund transaction may or may not be supported on your account. If you receive a transaction not allowed error when attempting an independent refund, it may mean the transaction is not supported on your account. If you wish to have the AX Independent Refund transaction type temporarily enabled (or re-enabled), please contact the Service Centre at 1-866-319-7450. November 2018 Page 215 of 486 Moneris Gateway API - Integration Guide 7.4.2 Level 2/3 Transaction Flow for Amex Page 216 of 486 November 2018 7 Level 2/3 Transactions 7.4.3 Level 2/3 Data Objects in Amex 7.4.3.1 About the Level 2/3 Data Objects for Amex 7.4.3.2 Defining the AxLevel23 Object l Table 1 Object l Table 2 Object l Table 3 Object l l 7.4.3.1 About the Level 2/3 Data Objects for Amex Many of the Level 2/3 transaction requests using American Express also include a mandatory data object called AxLevel23. AxLevel23 is also comprised of other objects, also described in this section. The Level 2/3 data objects within this section apply to all of the following transactions and are passed as part of the transaction request for: AX Completion AX Force Post AX Refund AX Independent Refund l l l l Things to Consider: l l Please ensure the addendum data below is complete and accurate. Please ensure the math on quantities calculations, amounts, discounts, taxes, etc. properly adds up to the overall transaction amount. Incorrect amounts will cause the transaction to be rejected. 7.4.3.2 Defining the AxLevel23 Object AxLevel23 object definition AxLevel23 level23 = new AxLevel23(); The AXLevel23 object itself has three objects, Table1, Table2 and Table3, all of which are mandatory. Table 1 AxLevel23 Object Req* Y Value Table1 Limits Object Set Method AxTable1 table1 = new AxTable1(); level23.SetTable1 November 2018 Description Refer below for further breakdown and definition of table1 Page 217 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Set Method Description (table1); Y Table2 AxTable2 table2 = new AxTable2(); Object level23.SetTable2 (table2); Y Table3 AxTable3 table3 = new AxTable3(); Object level23.SetTable3 (table3); Refer below for further breakdown and definition of table2 Refer below for further breakdown and definition of table3 *Y = Required, N = Optional, C = Conditional Table 1 Object Table 1 contains the addendum data heading information. Contains information such as identification elements that uniquely identify an invoice (transaction), the customer name and shipping address. Table 1 object definition AxTable1 table1 = new AxTable1(); Table 1 AxLevel23 object - Table 1 object fields Req* C Value Purchase Order Number Limits 22-character alphanumeric Set Method table1.SetBig04 (big04); Description The cardholder supplied Purchase Order Number, which is entered by the merchant at the point-ofsale This entry is used in the Statement/Reporting process and may include accounting information specific to the client NOTE: This element is mandatory, if the merchant’s customer provides a Purchase Order Number. Page 218 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description N Release Number 30-character alphanumeric table1.SetBig05 (big05); A number that identifies a release against a Purchase Order previously placed by the parties involved in the transaction N Invoice Number 8-character alphanumeric table1.SetBig10 (big10); Contains the Amex invoice/reference number N N1Loop Object table1.SetN1Loop (n1Loop) Refer below for further breakdown and definition of N1Loop object *Y = Required, N = Optional, C = Conditional Table 1 also has its own objects: l l N1Loop object AxRef object Table 1 - Setting the N1Loop Object The N1Loop data set contains the Requester names. It can also optionally contain the buying group, ship from, ship to and receiver details. A minimum of at least 1 n1Loop must be set. Up to 5 n1Loop can be set. N1Loop object definition n1Loop.SetN1Loop(n101, n102, n301, n401, n402, n403, axRef1); Table 1 AxLevel23 object - Table 1 object - N1Loop object fields Req* Y Value Entity Identifier Code Limits 2-character alphanumeric Variable or Set Method n101 Description Supported values: R6 - Requester (required) BG - Buying Group (optional) SF - Ship From (optional) ST - Ship To (optional) November 2018 Page 219 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable or Set Method Description 40 - Receiver (optional) Y Name 40-character alphanumeric n102 n101 code n102 meaning R6 Requester Name BG Buying Group Name SF Ship From Name ST Ship To Name 40 Receiver Name N Address 40-character alphanumeric n301 Address N City 30-character alphanumeric n401 City N State or Province 2-character alphanumeric n402 State or province N Postal Code 15-character alphanumeric n403 Postal Code N AxRef Object AxRef axRef1 = new AxRef(); Refer below for further breakdown and definition of AxRef object. This object contains the customer postal code (mandatory) and customer reference number (optional) A minimum of 1 axRef1 must be set; maximum of 2 axRef1’s may be set *Y = Required, N = Optional, C = Conditional Page 220 of 486 November 2018 7 Level 2/3 Transactions Table 1 - Setting the AxRef Object Setting AXRef object AxRef axRef1 = new AxRef(); string[] ref01 = {"4C", "CR"}; //Reference ID Qualifier string[] ref02 = {"M5T3A5", "16802309004"}; //Reference ID axRef1.SetRef(ref01[0], ref02[0]); axRef1.SetRef(ref01[1], ref02[1]); Table 1 AxLevel23 object - Table 1 object - AxRef object fields Req* Y Value Reference Identification Qualifier Limits 2-character alphanumeric Variable ref01 Description This element may contain the following qualifiers for the corresponding occurrences of the N1Loop: n101 value R6 ref01 denotation Supported values: 4C - Shipment Destination Code (mandatory) CR - Customer Reference Number (conditional) Y Reference Identification November 2018 15-character alphanumeric ref02 BG n/a SF n/a ST n/a 40 n/a This field must be populated for each ref01 provided Page 221 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description ref01 ref02 denotavalue tion 4C (n101 value = R6) This element must contain the Amex Ship-to Postal Code of the destination where the commodity was shipped. If the Ship-to Postal Code is unavailable, the postal code of the merchant location where the transaction took place may be substituted. CR (n101 value = R6): This element must contain the Amex Card member Reference Number (e.g., purchase order, cost center, project number, etc.) that corresponds to this transaction, if provided by the Cardholder. This information may be displayed in the statement/reporting process and may include client-specific accounting information. *Y = Required, N = Optional, C = Conditional Table 2 Object Table 2 includes the transaction’s addendum detail. It contains transaction data including reference codes, debit or credit and tax amounts, line item detail descriptions, shipping information and much more. All transaction data in an invoice relate to a single transaction and cardholder account number. Table 2 object definition AxTable2 table2 = new AxTable2(); Page 222 of 486 November 2018 7 Level 2/3 Transactions Table 1 AxLevel23 object - Table 2 object fields Req* N Value It1loop Limits Set Method table2.SetIt1Loop (it1Loop); Object Description Refer below for further breakdown and definition of object details. *Y = Required, N = Optional, C = Conditional Table 2 - Setting the AxIt1Loop Object The AxIt1Loop data defines the baseline item data for the invoice. This data is defined for each item/service purchased and included within this invoice. This data set contains basic transaction data, including quantity, unit of measure, unit price and goods/services reference information. l l A minimum of 1 it1Loop required A maximum of 999 it1Loop’s supported AxIt1Loop object definition AxIt1Loop it1Loop = new AxIt1Loop(); it1Loop.SetIt1Loop(it102[0], it103[0], it104[0], it105[0], it106s[0], txi[0], pam05[0], pid05[0]); it1Loop.SetIt1Loop(it102[1], it103[1], it104[1], it105[1], it106s[1], txi[1], pam05[1], pid05[1]); Table 1 AxLevel23 object - Table 2 object - AxIt1Loop object fields Req* Y Value Line Item Quantity Invoiced Limits 10-character decimal Variable it102 Description Quantity of line item Up to 2 decimal places supported Minimum amount is 0.0 and maximum is 9999999999 Y Unit or Basis for Measurement Code 2-character alphanumeric it103 The line item unit of measurement code Must contain a November 2018 Page 223 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description code that specifies the units in which the value is expressed or the manner in which a measurement is taken EXAMPLE: EA = each, E5=inches See ANSI X-12 EDI Allowable Units of Measure and Codes for the list of codes Y Unit Price 15-character decimal it104 Line item cost per unit Must contain 2 decimal places Minimum amount is 0.00 and maximum is 999999.99 N Basis or Unit Price Code 2-character alphanumeric it105 Code identifying the type of unit price for an item EXAMPLE: DR = dealer, AP = advise price See ASC X12 004010 Element 639 for list of codes N AxIt106s object it106s Refer below for further breakdown and definition of object details. N AxTxi object txi Refer below for further breakdown and definition of Page 224 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Variable Description object details A maximum of 12 AxTxi (tax information data sets) may be defined NOTE: that if line item level tax information is populated in AxTxi in Table2, then tax totals for the entire invoice (transaction) must be entered in Table3. Y Line Item Extended Amount 8-character decimal pam05 Contains the individual item amount that is normally calculated as price multiplied by quantity Must contain 2 decimal places Minimum amount is 0.00 and maximum is 99999.99 Y Line Item Description 80-character alphanumeric pid05 Line Item description Contains the description of the individual item purchased This field pertain to each line item in the transaction *Y = Required, N = Optional, C = Conditional November 2018 Page 225 of 486 Moneris Gateway API - Integration Guide Table 2 - Setting the AxIt106s Object AxIt106s[] it106s = {new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s()}; string[] it10618 = {"MG", "MG", "MG", "MG", "MG"}; //Product/Service ID qualifier string[] it10719 = {"DJFR4", "JFJ49", "FEF33", "FEE43", "DISCOUNT"}; //Product/Service ID (corresponds to it10618) Table 1 AxLevel23 object - Table 2 object - AxIt106s object fields Req* N Value Product/Service ID Qualifier Limits 2-character alphanumeric Set Method it106s [0].SetIt10618 (it10618[0]); it106s [1].SetIt10618 (it10618[1]); Description Supported values: MG - Manufacturer’s Part Number VC - Supplier Catalog Number SK - Supplier Stock Keeping Unit Number UP - Universal Product Code VP – Vendor Part Number PO – Purchase Order Number AN – Client Defined Asset Code N Product/Service ID it10618 VC it10719 size/type 20-character alphanumeric PO 22-character alphanumeric Other 30-character alphanumeric it106s [0].SetIt10719 (it10719[0]); it106s [1].SetIt10719 (it10719[1]); Product/Service ID corresponds to the preceding qualifier defined by it10618 The maximum length depends on the qualifier defined in it10618 *Y = Required, N = Optional, C = Conditional Table 2 - Setting the AxTxi Object Table 2 AxiTxi object definition //Create Table 2 with details string[] txi01_GST = {"GS", "GS", "GS", "GS", "GS"}; //Tax type code Page 226 of 486 November 2018 7 Level 2/3 Transactions string[] txi02_GST = {"0.70", "1.75", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_GST = {"5.0", "5.0", "5.0", "5.0","5.0"}; //Percent string[] txi06_GST = {"", "", "", "",""}; //Tax exempt code string[] txi01_PST = {"PG", "PG", "PG","PG","PG"}; //Tax type code string[] txi02_PST = {"0.80", "2.00", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_PST = {"7.0", "7.0", "7.0", "7.0","7.0"}; //Percent string[] txi06_PST = {"", "", "", "",""}; //Tax exempt code AxTxi[] txi = {new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi ()}; txi[0].SetTxi(txi01_GST[0], txi02_GST[0], txi03_GST[0], txi06_GST[0]); txi[0].SetTxi(txi01_PST[0], txi02_PST[0], txi03_PST[0], txi06_PST[0]); txi[1].SetTxi(txi01_GST[1], txi02_GST[1], txi03_GST[1], txi06_GST[1]); txi[1].SetTxi(txi01_PST[1], txi02_PST[1], txi03_PST[1], txi06_PST[1]); txi[2].SetTxi(txi01_GST[2], txi02_GST[2], txi03_GST[2], txi06_GST[2]); txi[2].SetTxi(txi01_PST[2], txi02_PST[2], txi03_PST[2], txi06_PST[2]); txi[3].SetTxi(txi01_GST[3], txi02_GST[3], txi03_GST[3], txi06_GST[3]); txi[3].SetTxi(txi01_PST[3], txi02_PST[3], txi03_PST[3], txi06_PST[3]); txi[4].SetTxi(txi01_GST[4], txi02_GST[4], txi03_GST[4], txi06_GST[4]); txi[4].SetTxi(txi01_PST[4], txi02_PST[4], txi03_PST[4], txi06_PST[4]); Table 1 AxLevel23 object - Table 2 object - AxiTxi object fields Req* C Value Tax Type code Limits txi01 Variable 2-character alphanumeric Description Tax type code applicable to Canada and US only For Canada, this field must contain a code that specifies the type of tax If txi01 is used, November 2018 Page 227 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description then txi02, txi03 or txi06 must be populated Valid codes include the following: CT – County/Tax (optional) CA – City Tax (optional) EV – Environmental Tax (optional) GS – Good and Services Tax (GST) (optional) LS – State and Local Sales Tax (optional) LT – Local Sales Tax (optional) PG – Provincial Sales Tax (PST) (optional) SP – State/Provincial Tax a.k.a. Quebec Sales Tax (QST) (optional) ST – State Sales Tax (optional) TX – All Taxes (required) VA – Value-Added Tax a.k.a. Canadian Harmonized Sales Tax (HST) (optional) C Monetary Amount txi02 6-character decimal This element may contain the monetary tax amount that corresponds to the Tax Type Code in txi01 NOTE: If txi02 is used in mandatory occur- Page 228 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Variable Description rence txi01=TX, txi02 must contain the total tax amount applicable to the entire invoice (transaction) If taxes are not applicable for the entire invoice (transaction), txi02 must be 0.00. The maximum value that can be entered in this field is “9999.99”, which is $9,999.99 (CAD) A debit is entered as: 9999.99 A credit is entered as: –9999.99 C Percent txi03 10-character decimal Contains the tax percentage (in decimal format) that corresponds to the tax type code defined in txi01 Up to 2 decimal places supported C Tax Exempt Code txi06 1-character alphanumeric This element may contain the Tax Exempt Code that identifies the exemption status from sales and tax that corresponds to the Tax Type Code in txi01 Supported values: 1 – Yes (Tax Exempt) 2 – No (Not Tax Exempt) November 2018 Page 229 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description 4 – Not Exempt/For Resale A – Labor Taxable, Material Exempt B – Material Taxable, Labor Exempt C – Not Taxable F – Exempt (Goods / Services Tax) G – Exempt (Provincial Sales Tax) L – Exempt Local Service R – Recurring Exempt U – Usage Exempt *Y = Required, N = Optional, C = Conditional Table 3 Object Table 3 includes the transaction addendum summary. It contains the total invoice (transaction) amount, sales tax, freight and/or handling charges and invoice summary information, including total line items, number of segments in the invoice, and the transaction set control number (a.k.a., batch number). Table 3 object definition AxTable3 table3 = new AxTable3(); Table 1 AxLevel23 object - Table 3 object fields Req* C Value AxTxi Limits Object Set Method table3.SetTxi (taxTbl3); Description Refer below for further breakdown and definition of object details. NOTE: if line item level tax information is populated in AxTxi in Table2, then tax totals for the entire invoice Page 230 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Set Method Description (transaction) must be entered in Table3. A maximum of 10 AxTxi’s may be set in Table3. *Y = Required, N = Optional, C = Conditional Table 3 - Setting the AxTxi Object The mandatory tax information data set must contain the total tax amount applicable to the entire invoice (transaction) which includes all line items identified in Table2. If taxes are not applicable for the entire invoice (transaction), then txi02 must be set to 0.00. Tax totals must be entered in this mandatory tax information segment in Table 3, even if line item detail level tax data is reported in Table 2. At least one occurrence of txi02, txi03 or txi06 is required. Table 3 AxiTxi object definition AxTxi taxTbl3 = new AxTxi(); taxTbl3.SetTxi("GS", "4.25","5.0",""); //sum of GST taxes taxTbl3.SetTxi("PG", "4.60","7.0",""); //sum of PST taxes taxTbl3.SetTxi("TX", "8.85","13.0",""); //sum of all taxes Table 1 AxLevel23 object - Table 3 object - AxiTxi object fields Req* C Value Tax Type code Limits txi01 Variable 2-character alphanumeric Description Tax type code applicable to Canada and US only For Canada, this field must contain a code that specifies the type of tax If txi01 is used, then txi02, txi03 or txi06 must be populated November 2018 Page 231 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description Valid codes include the following: CT – County/Tax (optional) CA – City Tax (optional) EV – Environmental Tax (optional) GS – Good and Services Tax (GST) (optional) LS – State and Local Sales Tax (optional) LT – Local Sales Tax (optional) PG – Provincial Sales Tax (PST) (optional) SP – State/Provincial Tax a.k.a. Quebec Sales Tax (QST) (optional) ST – State Sales Tax (optional) TX – All Taxes (required) VA – Value-Added Tax a.k.a. Canadian Harmonized Sales Tax (HST) (optional) C Monetary Amount txi02 6-character decimal This element may contain the monetary tax amount that corresponds to the Tax Type Code in txi01 NOTE: If txi02 is used in mandatory occurrence txi01=TX, txi02 must contain the total tax amount applicable to the entire invoice (transaction) Page 232 of 486 November 2018 7 Level 2/3 Transactions Req* Value Limits Variable Description If taxes are not applicable for the entire invoice (transaction), txi02 must be 0.00. The maximum value that can be entered in this field is “9999.99”, which is $9,999.99 (CAD) A debit is entered as: 9999.99 A credit is entered as: –9999.99 C Percent txi03 10-character decimal Contains the tax percentage (in decimal format) that corresponds to the tax type code defined in txi01 Up to 2 decimal places supported C Tax Exempt Code txi06 1-character alphanumeric This element may contain the Tax Exempt Code that identifies the exemption status from sales and tax that corresponds to the Tax Type Code in txi01 Supported values: 1 – Yes (Tax Exempt) 2 – No (Not Tax Exempt) 4 – Not Exempt/For Resale A – Labor Taxable, Material Exempt November 2018 Page 233 of 486 Moneris Gateway API - Integration Guide Req* Value Limits Variable Description B – Material Taxable, Labor Exempt C – Not Taxable F – Exempt (Goods / Services Tax) G – Exempt (Provincial Sales Tax) L – Exempt Local Service R – Recurring Exempt U – Usage Exempt *Y = Required, N = Optional, C = Conditional 7.4.4 AX Completion The AX Completion transaction is used to secure the funds locked by a pre-authorization transaction. When sending a capture request you will need two pieces of information from the original pre-authorization – the Order ID and the transaction number from the returned response. AX Completion transaction object definition AxCompletion axCompletion = new AxCompletion() HttpsPostRequest object for AX Completion HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(axCompletion); Page 234 of 486 November 2018 7 Level 2/3 Transactions AX Completion transaction object values Table 1 AX Completion transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric axCompletion.SetOrderId (order_id); Completion amount String 10-character decimal axCompletion.SetCompAmount (comp_amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number String 255-character alphanumeric axCompletion.SetTxnNumber (txn_number); E-commerce indicator String 1-character alphanumeric axCompletion.SetCryptType (crypt); Level 2/3 Data Object n/a axCompletion.SetAxLevel23 (level23); Sample AX Completion namespace Moneris { using System; using System.Collections; using System.Text; public class TestAxCompletion { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string string string string order_id="ord-210916-12:06:38"; comp_amount="62.37"; txn_number = "18924-0_11"; crypt="7"; //Create Table 1 with details string n101 = "R6"; //Entity ID Code November 2018 Page 235 of 486 Moneris Gateway API - Integration Guide Sample AX Completion string n102 = "Retailing Inc. International"; //Name string n301 = "919 Oriole Rd."; //Address Line 1 string n401 = "Toronto"; //City string n402 = "On"; //State or Province string n403 = "H1T6W3"; //Postal Code string[] ref01 = {"4C", "CR"}; //Reference ID Qualifier string[] ref02 = {"M5T3A5", "16802309004"}; //Reference ID string big04 = "PO7758545"; //Purchase Order Number string big05 = "RN0049858"; //Release Number string big10 = "INV99870E"; //Invoice Number AxRef axRef1 = new AxRef(); axRef1.SetRef(ref01[0], ref02[0]); axRef1.SetRef(ref01[1], ref02[1]); AxN1Loop n1Loop = new AxN1Loop(); n1Loop.SetN1Loop(n101, n102, n301, n401, n402, n403, axRef1); AxTable1 table1 = new AxTable1(); table1.SetBig04(big04); table1.SetBig05(big05); table1.SetBig10(big10); table1.SetN1Loop(n1Loop); //Create Table 2 //the sum of the string[] it102 = string[] it103 = string[] it104 = string[] it105 = with details extended amount field (pam05) must equal the level 1 amount field {"1", "1", "1", "1", "1"}; //Line item quantity invoiced {"EA", "EA", "EA", "EA", "EA"}; //Line item unit or basis of measurement code {"10.00", "25.00", "8.62", "10.00", "-10.00"}; //Line item unit price {"", "", "", "", ""}; //Line item basis of unit price code string[] it10618 = {"MG", "MG", "MG", "MG", "MG"}; //Product/Service ID qualifier string[] it10719 = {"DJFR4", "JFJ49", "FEF33", "FEE43", "DISCOUNT"}; //Product/Service ID (corresponds to it10618) string[] string[] string[] string[] txi01_GST txi02_GST txi03_GST txi06_GST = = = = {"GS", "GS", "GS", "GS", "GS"}; //Tax type code {"0.70", "1.75", "1.00", "0.80","0.00"}; //Monetary amount {"", "", "", "",""}; //Percent {"", "", "", "",""}; //Tax exempt code string[] txi01_PST = {"PG", "PG", "PG","PG","PG"}; //Tax type code string[] txi02_PST = {"0.80", "2.00", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_PST = {"", "", "", "",""}; //Percent string[] txi06_PST = {"", "", "", "",""}; //Tax exempt code string[] pam05 = {"11.50", "28.75", "10.62", "11.50", "-10.00"}; //Extended line-item amount string[] pid05 = {"Stapler", "Lamp", "Bottled Water", "Fountain Pen", "DISCOUNT"}; //Line item description AxIt106s[] it106s = {new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s ()}; it106s[0].SetIt10618(it10618[0]); it106s[0].SetIt10719(it10719[0]); it106s[1].SetIt10618(it10618[1]); it106s[1].SetIt10719(it10719[1]); it106s[2].SetIt10618(it10618[2]); it106s[2].SetIt10719(it10719[2]); it106s[3].SetIt10618(it10618[3]); it106s[3].SetIt10719(it10719[3]); Page 236 of 486 November 2018 7 Level 2/3 Transactions Sample AX Completion it106s[4].SetIt10618(it10618[4]); it106s[4].SetIt10719(it10719[4]); AxTxi[] txi = {new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi()}; txi[0].SetTxi(txi01_GST[0], txi02_GST[0], txi03_GST[0], txi06_GST[0]); txi[0].SetTxi(txi01_PST[0], txi02_PST[0], txi03_PST[0], txi06_PST[0]); txi[1].SetTxi(txi01_GST[1], txi02_GST[1], txi03_GST[1], txi06_GST[1]); txi[1].SetTxi(txi01_PST[1], txi02_PST[1], txi03_PST[1], txi06_PST[1]); txi[2].SetTxi(txi01_GST[2], txi02_GST[2], txi03_GST[2], txi06_GST[2]); txi[2].SetTxi(txi01_PST[2], txi02_PST[2], txi03_PST[2], txi06_PST[2]); txi[3].SetTxi(txi01_GST[3], txi02_GST[3], txi03_GST[3], txi06_GST[3]); txi[3].SetTxi(txi01_PST[3], txi02_PST[3], txi03_PST[3], txi06_PST[3]); txi[4].SetTxi(txi01_GST[4], txi02_GST[4], txi03_GST[4], txi06_GST[4]); txi[4].SetTxi(txi01_PST[4], txi02_PST[4], txi03_PST[4], txi06_PST[4]); AxIt1Loop it1Loop = new AxIt1Loop(); it1Loop.SetIt1Loop(it102[0], it103[0], it104[0], it105[0], it106s[0], txi[0], pam05[0], it1Loop.SetIt1Loop(it102[1], it103[1], it104[1], it105[1], it106s[1], txi[1], pam05[1], it1Loop.SetIt1Loop(it102[2], it103[2], it104[2], it105[2], it106s[2], txi[2], pam05[2], it1Loop.SetIt1Loop(it102[3], it103[3], it104[3], it105[3], it106s[3], txi[3], pam05[3], it1Loop.SetIt1Loop(it102[4], it103[4], it104[4], it105[4], it106s[4], txi[4], pam05[4], AxTable2 table2 = new AxTable2(); table2.SetIt1Loop(it1Loop); //Create Table 3 with details AxTxi taxTbl3 = new AxTxi(); taxTbl3.SetTxi("GS", "4.25","",""); //sum of GST taxes taxTbl3.SetTxi("PG", "4.60","",""); //sum of PST taxes taxTbl3.SetTxi("TX", "8.85","",""); //sum of all taxes AxTable3 table3 = new AxTable3(); table3.SetTxi(taxTbl3); pid05[0]); pid05[1]); pid05[2]); pid05[3]); pid05[4]); //Create and Set Level23 Object AxLevel23 level23 = new AxLevel23(); level23.SetTable1(table1); level23.SetTable2(table2); level23.SetTable3(table3); AxCompletion axCompletion = new AxCompletion(); axCompletion.SetOrderId(order_id); axCompletion.SetCompAmount(comp_amount); axCompletion.SetTxnNumber(txn_number); axCompletion.SetCryptType(crypt); axCompletion.SetAxLevel23(level23); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(axCompletion); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); November 2018 Page 237 of 486 Moneris Gateway API - Integration Guide Sample AX Completion Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.4.5 AX Force Post The AX Force Post transaction is used to secure the funds locked by a pre-authorization transaction performed over IVR or equivalent terminal. When sending an AX Force Post request, you will need the order ID, amount, credit card number, expiry date, authorization code and e-commerce indicator. AX Force Post transaction object definition AxForcePost axForcePost = new AxForcePost(); HttpsPostRequest object for AX Force Post transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(axForcePost); Page 238 of 486 November 2018 7 Level 2/3 Transactions AX Force Post transaction object values Table 1 AX Force Post transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric axForcePost.SetOrderId(order_ id); Amount String 10-character decimal axForcePost.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character alphanumeric axForcePost.SetPan(pan); Expiry date String 4-character alphanumeric axForcePost.SetExpdate (expiry_date); (YYMM format) Authorization code String 8-character alphanumeric axForcePost.SetAuthCode(auth_ code); E-commerce indicator String 1-character alphanumeric axForcePost.SetCryptType (crypt); Level 2/3 Data Object n/a axForcePost.SetAxLevel23 (level23); Table 2 AX Force Post transaction object optional values Value Customer ID Type String Limits 50-character alphanumeric Set Method axForcePost.SetCustId(cust_ id); Sample AX Force Post namespace Moneris November 2018 Page 239 of 486 Moneris Gateway API - Integration Guide Sample AX Force Post { using System; using System.Collections; using System.Text; public class TestAxForcePost { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string string string string string string string order_id="Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); cust_id="CUST13343"; amount="62.37"; pan="373269005095005"; expiry_date="2012"; //YYMM auth_code="123456"; crypt="7"; //Create Table 1 with details string n101 = "R6"; //Entity ID Code string n102 = "Retailing Inc. International"; //Name string n301 = "919 Oriole Rd."; //Address Line 1 string n401 = "Toronto"; //City string n402 = "On"; //State or Province string n403 = "H1T6W3"; //Postal Code string[] ref01 = {"4C", "CR"}; //Reference ID Qualifier string[] ref02 = {"M5T3A5", "16802309004"}; //Reference ID string big04 = "PO7758545"; //Purchase Order Number string big05 = "RN0049858"; //Release Number string big10 = "INV99870E"; //Invoice Number AxRef axRef1 = new AxRef(); axRef1.SetRef(ref01[0], ref02[0]); axRef1.SetRef(ref01[1], ref02[1]); AxN1Loop n1Loop = new AxN1Loop(); n1Loop.SetN1Loop(n101, n102, n301, n401, n402, n403, axRef1); AxTable1 table1 = new AxTable1(); table1.SetBig04(big04); table1.SetBig05(big05); table1.SetBig10(big10); table1.SetN1Loop(n1Loop); //Create Table 2 with details //the sum of the extended amount field (pam05) must equal the level 1 amount field string[] string[] string[] string[] it102 it103 it104 it105 = = = = {"1", "1", "1", "1", "1"}; //Line item quantity invoiced {"EA", "EA", "EA", "EA", "EA"}; //Line item unit or basis of measurement code {"10.00", "25.00", "8.62", "10.00", "-10.00"}; //Line item unit price {"", "", "", "", ""}; //Line item basis of unit price code string[] it10618 = {"MG", "MG", "MG", "MG", "MG"}; //Product/Service ID qualifier string[] it10719 = {"DJFR4", "JFJ49", "FEF33", "FEE43", "DISCOUNT"}; //Product/Service ID (corresponds to it10618) string[] txi01_GST = {"GS", "GS", "GS", "GS", "GS"}; //Tax type code string[] txi02_GST = {"0.70", "1.75", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_GST = {"", "", "", "",""}; //Percent Page 240 of 486 November 2018 7 Level 2/3 Transactions Sample AX Force Post string[] txi06_GST = {"", "", "", "",""}; //Tax exempt code string[] txi01_PST = {"PG", "PG", "PG","PG","PG"}; //Tax type code string[] txi02_PST = {"0.80", "2.00", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_PST = {"", "", "", "",""}; //Percent string[] txi06_PST = {"", "", "", "",""}; //Tax exempt code string[] pam05 = {"11.50", "28.75", "10.62", "11.50", "-10.00"}; //Extended line-item amount string[] pid05 = {"Stapler", "Lamp", "Bottled Water", "Fountain Pen", "DISCOUNT"}; //Line item description AxIt106s[] it106s = {new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s ()}; it106s[0].SetIt10618(it10618[0]); it106s[0].SetIt10719(it10719[0]); it106s[1].SetIt10618(it10618[1]); it106s[1].SetIt10719(it10719[1]); it106s[2].SetIt10618(it10618[2]); it106s[2].SetIt10719(it10719[2]); it106s[3].SetIt10618(it10618[3]); it106s[3].SetIt10719(it10719[3]); it106s[4].SetIt10618(it10618[4]); it106s[4].SetIt10719(it10719[4]); AxTxi[] txi = {new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi()}; txi[0].SetTxi(txi01_GST[0], txi02_GST[0], txi03_GST[0], txi06_GST[0]); txi[0].SetTxi(txi01_PST[0], txi02_PST[0], txi03_PST[0], txi06_PST[0]); txi[1].SetTxi(txi01_GST[1], txi02_GST[1], txi03_GST[1], txi06_GST[1]); txi[1].SetTxi(txi01_PST[1], txi02_PST[1], txi03_PST[1], txi06_PST[1]); txi[2].SetTxi(txi01_GST[2], txi02_GST[2], txi03_GST[2], txi06_GST[2]); txi[2].SetTxi(txi01_PST[2], txi02_PST[2], txi03_PST[2], txi06_PST[2]); txi[3].SetTxi(txi01_GST[3], txi02_GST[3], txi03_GST[3], txi06_GST[3]); txi[3].SetTxi(txi01_PST[3], txi02_PST[3], txi03_PST[3], txi06_PST[3]); txi[4].SetTxi(txi01_GST[4], txi02_GST[4], txi03_GST[4], txi06_GST[4]); txi[4].SetTxi(txi01_PST[4], txi02_PST[4], txi03_PST[4], txi06_PST[4]); AxIt1Loop it1Loop = new AxIt1Loop(); it1Loop.SetIt1Loop(it102[0], it103[0], it104[0], it105[0], it106s[0], txi[0], pam05[0], it1Loop.SetIt1Loop(it102[1], it103[1], it104[1], it105[1], it106s[1], txi[1], pam05[1], it1Loop.SetIt1Loop(it102[2], it103[2], it104[2], it105[2], it106s[2], txi[2], pam05[2], it1Loop.SetIt1Loop(it102[3], it103[3], it104[3], it105[3], it106s[3], txi[3], pam05[3], it1Loop.SetIt1Loop(it102[4], it103[4], it104[4], it105[4], it106s[4], txi[4], pam05[4], AxTable2 table2 = new AxTable2(); table2.SetIt1Loop(it1Loop); //Create Table 3 with details AxTxi taxTbl3 = new AxTxi(); taxTbl3.SetTxi("GS", "4.25","",""); //sum of GST taxes taxTbl3.SetTxi("PG", "4.60","",""); //sum of PST taxes taxTbl3.SetTxi("TX", "8.85","",""); //sum of all taxes AxTable3 table3 = new AxTable3(); table3.SetTxi(taxTbl3); pid05[0]); pid05[1]); pid05[2]); pid05[3]); pid05[4]); AxLevel23 level23 = new AxLevel23(); level23.SetTable1(table1); level23.SetTable2(table2); level23.SetTable3(table3); AxForcePost axForcePost = new AxForcePost(); axForcePost.SetOrderId(order_id); November 2018 Page 241 of 486 Moneris Gateway API - Integration Guide Sample AX Force Post axForcePost.SetCustId(cust_id); axForcePost.SetAmount(amount); axForcePost.SetPan(pan); axForcePost.SetExpDate(expiry_date); axForcePost.SetAuthCode(auth_code); axForcePost.SetCryptType(crypt); axForcePost.SetAxLevel23(level23); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(axForcePost); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.4.6 AX Purchase Correction The AX Purchase Correction (Void) transaction is used to cancel a transaction that was performed in the current batch. No amount is required because a void is always for 100% of the original transaction. The only transaction that can be voided using AX Purchase Correction is AX Completion and AX Force Post. To send an AX Purchase Correction the Order ID and transaction number from the AX Completion or AX Force Post are required. Page 242 of 486 November 2018 7 Level 2/3 Transactions AX Purchase Correction transaction object definition AxPurchaseCorrection axPurchaseCorrection = new AxPurchaseCorrection(); HttpsPostRequest object for AX Purchase Correction transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(axPurchaseCorrection); AX Purchase Correction transaction object values Table 1 AX Purchase Correction transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric axPurchaseCorrection .SetOrderId(order_id); Transaction number String 255-character alphanumeric axPurchaseCorrection .SetTxnNumber(txn_number); E-commerce indicator String 1-character alphanumeric axPurchaseCorrection .SetCryptType(crypt); AX Purchase Correction namespace Moneris { using System; using System.Collections; using System.Text; public class TestAxPurchaseCorrection { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string order_id="Test20170119104952"; string txn_number = "660117311852017019104953104-0_11"; string crypt="7"; AxPurchaseCorrection axPurchaseCorrection = new AxPurchaseCorrection(); axPurchaseCorrection.SetOrderId(order_id); axPurchaseCorrection.SetTxnNumber(txn_number); axPurchaseCorrection.SetCryptType(crypt); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(axPurchaseCorrection); November 2018 Page 243 of 486 Moneris Gateway API - Integration Guide AX Purchase Correction mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.4.7 AX Refund The AX Refund will credit a specified amount to the cardholder’s credit card. A refund can be sent up to the full value of the original AX Completion or AX Force Post. To send an AX Refund you will require the Order ID and transaction number from the original AX Completion or AX Force Post. AX Refund transaction object definition AxRefund axRefund = new AxRefund(); HttpsPostRequest object for AX Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(axRefund); Page 244 of 486 November 2018 7 Level 2/3 Transactions AX Refund transaction object values Table 1 AX Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric axRefund.SetOrderId(order_ id); Transaction number String 255-character alphanumeric axRefund.SetTxnNumber(txn_ number); Amount String 10-character decimal axRefund.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 E-commerce indicator String 1-character alphanumeric axRefund.SetCryptType(crypt); Level 2/3 Data Object n/a axRefund.SetAxLevel23 (level23); Sample AX Refund namespace Moneris { using System; using System.Collections; using System.Text; public class TestAxRefund { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string string string string order_id="ord-210916-12:06:38"; amount="62.37"; txn_number = "18924-4_11"; crypt="7"; //Create Table 1 with details string n101 = "R6"; //Entity ID Code November 2018 Page 245 of 486 Moneris Gateway API - Integration Guide Sample AX Refund string n102 = "Retailing Inc. International"; //Name string n301 = "919 Oriole Rd."; //Address Line 1 string n401 = "Toronto"; //City string n402 = "On"; //State or Province string n403 = "H1T6W3"; //Postal Code string[] ref01 = {"4C", "CR"}; //Reference ID Qualifier string[] ref02 = {"M5T3A5", "16802309004"}; //Reference ID string big04 = "PO7758545"; //Purchase Order Number string big05 = "RN0049858"; //Release Number string big10 = "INV99870E"; //Invoice Number AxRef axRef1 = new AxRef(); axRef1.SetRef(ref01[0], ref02[0]); axRef1.SetRef(ref01[1], ref02[1]); AxN1Loop n1Loop = new AxN1Loop(); n1Loop.SetN1Loop(n101, n102, n301, n401, n402, n403, axRef1); AxTable1 table1 = new AxTable1(); table1.SetBig04(big04); table1.SetBig05(big05); table1.SetBig10(big10); table1.SetN1Loop(n1Loop); //Create Table 2 //the sum of the string[] it102 = string[] it103 = string[] it104 = string[] it105 = with details extended amount field (pam05) must equal the level 1 amount field {"1", "1", "1", "1", "1"}; //Line item quantity invoiced {"EA", "EA", "EA", "EA", "EA"}; //Line item unit or basis of measurement code {"10.00", "25.00", "8.62", "10.00", "-10.00"}; //Line item unit price {"", "", "", "", ""}; //Line item basis of unit price code string[] it10618 = {"MG", "MG", "MG", "MG", "MG"}; //Product/Service ID qualifier string[] it10719 = {"DJFR4", "JFJ49", "FEF33", "FEE43", "DISCOUNT"}; //Product/Service ID (corresponds to it10618) string[] string[] string[] string[] txi01_GST txi02_GST txi03_GST txi06_GST = = = = {"GS", "GS", "GS", "GS", "GS"}; //Tax type code {"0.70", "1.75", "1.00", "0.80","0.00"}; //Monetary amount {"", "", "", "",""}; //Percent {"", "", "", "",""}; //Tax exempt code string[] txi01_PST = {"PG", "PG", "PG","PG","PG"}; //Tax type code string[] txi02_PST = {"0.80", "2.00", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_PST = {"", "", "", "",""}; //Percent string[] txi06_PST = {"", "", "", "",""}; //Tax exempt code string[] pam05 = {"11.50", "28.75", "10.62", "11.50", "-10.00"}; //Extended line-item amount string[] pid05 = {"Stapler", "Lamp", "Bottled Water", "Fountain Pen", "DISCOUNT"}; //Line item description AxIt106s[] it106s = {new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s ()}; it106s[0].SetIt10618(it10618[0]); it106s[0].SetIt10719(it10719[0]); it106s[1].SetIt10618(it10618[1]); it106s[1].SetIt10719(it10719[1]); it106s[2].SetIt10618(it10618[2]); it106s[2].SetIt10719(it10719[2]); it106s[3].SetIt10618(it10618[3]); it106s[3].SetIt10719(it10719[3]); Page 246 of 486 November 2018 7 Level 2/3 Transactions Sample AX Refund it106s[4].SetIt10618(it10618[4]); it106s[4].SetIt10719(it10719[4]); AxTxi[] txi = {new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi()}; txi[0].SetTxi(txi01_GST[0], txi02_GST[0], txi03_GST[0], txi06_GST[0]); txi[0].SetTxi(txi01_PST[0], txi02_PST[0], txi03_PST[0], txi06_PST[0]); txi[1].SetTxi(txi01_GST[1], txi02_GST[1], txi03_GST[1], txi06_GST[1]); txi[1].SetTxi(txi01_PST[1], txi02_PST[1], txi03_PST[1], txi06_PST[1]); txi[2].SetTxi(txi01_GST[2], txi02_GST[2], txi03_GST[2], txi06_GST[2]); txi[2].SetTxi(txi01_PST[2], txi02_PST[2], txi03_PST[2], txi06_PST[2]); txi[3].SetTxi(txi01_GST[3], txi02_GST[3], txi03_GST[3], txi06_GST[3]); txi[3].SetTxi(txi01_PST[3], txi02_PST[3], txi03_PST[3], txi06_PST[3]); txi[4].SetTxi(txi01_GST[4], txi02_GST[4], txi03_GST[4], txi06_GST[4]); txi[4].SetTxi(txi01_PST[4], txi02_PST[4], txi03_PST[4], txi06_PST[4]); AxIt1Loop it1Loop = new AxIt1Loop(); it1Loop.SetIt1Loop(it102[0], it103[0], it104[0], it105[0], it106s[0], txi[0], pam05[0], it1Loop.SetIt1Loop(it102[1], it103[1], it104[1], it105[1], it106s[1], txi[1], pam05[1], it1Loop.SetIt1Loop(it102[2], it103[2], it104[2], it105[2], it106s[2], txi[2], pam05[2], it1Loop.SetIt1Loop(it102[3], it103[3], it104[3], it105[3], it106s[3], txi[3], pam05[3], it1Loop.SetIt1Loop(it102[4], it103[4], it104[4], it105[4], it106s[4], txi[4], pam05[4], AxTable2 table2 = new AxTable2(); table2.SetIt1Loop(it1Loop); //Create Table 3 with details AxTxi taxTbl3 = new AxTxi(); taxTbl3.SetTxi("GS", "4.25","",""); //sum of GST taxes taxTbl3.SetTxi("PG", "4.60","",""); //sum of PST taxes taxTbl3.SetTxi("TX", "8.85","",""); //sum of all taxes AxTable3 table3 = new AxTable3(); table3.SetTxi(taxTbl3); pid05[0]); pid05[1]); pid05[2]); pid05[3]); pid05[4]); //Create and Set Level23 Object AxLevel23 level23 = new AxLevel23(); level23.SetTable1(table1); level23.SetTable2(table2); level23.SetTable3(table3); AxRefund axRefund = new AxRefund(); axRefund.SetOrderId(order_id); axRefund.SetAmount(amount); axRefund.SetTxnNumber(txn_number); axRefund.SetCryptType(crypt); axRefund.SetAxLevel23(level23); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(axRefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); November 2018 Page 247 of 486 Moneris Gateway API - Integration Guide Sample AX Refund Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 7.4.8 AX Independent Refund The AX Independent Refund will credit a specified amount to the cardholder’s credit card. The independent refund does not require an existing order to be logged in the Moneris Gateway; however, the credit card number and expiry date will need to be passed. AX Independent Refund transaction object definition AxIndependentRefund axIndependentRefund = new AxIndependentRefund(); HttpsPostRequest object for AX Independent Refund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(axIndependentRefund); Page 248 of 486 November 2018 7 Level 2/3 Transactions AX Independent Refund transaction object values Table 1 AX Independent Refund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric axIndependentRefund .SetOrderId(order_id); Amount String 10-character decimal axIndependentRefund.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character alphanumeric axIndependentRefund.SetPan (pan); Expiry date String 4-character alphanumeric axIndependentRefund .SetExpdate(expiry_date); (YYMM format) E-commerce indicator String 1-character alphanumeric axIndependentRefund .SetCryptType(crypt); Table 2 AX Independent Refund transaction object optional values Value Customer ID Type String Limits 50-character alphanumeric Set Method axIndependentRefund.SetCustId (cust_id); Sample AX Independent Refund namespace Moneris { using System; using System.Collections; using System.Text; public class TestAxIndependentRefund { public static void Main(string[] args) { November 2018 Page 249 of 486 Moneris Gateway API - Integration Guide Sample AX Independent Refund string store_id = "moneris"; string api_token = "hurgle"; string processing_country_code = "CA"; bool status_check = false; string string string string string string order_id="Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); cust_id="CUST13343"; amount="62.37"; pan="373269005095005"; expiry_date="2012"; //YYMM crypt="7"; //Create Table 1 with details string n101 = "R6"; //Entity ID Code string n102 = "Retailing Inc. International"; //Name string n301 = "919 Oriole Rd."; //Address Line 1 string n401 = "Toronto"; //City string n402 = "On"; //State or Province string n403 = "H1T6W3"; //Postal Code string[] ref01 = {"4C", "CR"}; //Reference ID Qualifier string[] ref02 = {"M5T3A5", "16802309004"}; //Reference ID string big04 = "PO7758545"; //Purchase Order Number string big05 = "RN0049858"; //Release Number string big10 = "INV99870E"; //Invoice Number AxRef axRef1 = new AxRef(); axRef1.SetRef(ref01[0], ref02[0]); axRef1.SetRef(ref01[1], ref02[1]); AxN1Loop n1Loop = new AxN1Loop(); n1Loop.SetN1Loop(n101, n102, n301, n401, n402, n403, axRef1); AxTable1 table1 = new AxTable1(); table1.SetBig04(big04); table1.SetBig05(big05); table1.SetBig10(big10); table1.SetN1Loop(n1Loop); //Create Table 2 //the sum of the string[] it102 = string[] it103 = string[] it104 = string[] it105 = with details extended amount field (pam05) must equal the level 1 amount field {"1", "1", "1", "1", "1"}; //Line item quantity invoiced {"EA", "EA", "EA", "EA", "EA"}; //Line item unit or basis of measurement code {"10.00", "25.00", "8.62", "10.00", "-10.00"}; //Line item unit price {"", "", "", "", ""}; //Line item basis of unit price code string[] it10618 = {"MG", "MG", "MG", "MG", "MG"}; //Product/Service ID qualifier string[] it10719 = {"DJFR4", "JFJ49", "FEF33", "FEE43", "DISCOUNT"}; //Product/Service ID (corresponds to it10618) string[] string[] string[] string[] txi01_GST txi02_GST txi03_GST txi06_GST = = = = {"GS", "GS", "GS", "GS", "GS"}; //Tax type code {"0.70", "1.75", "1.00", "0.80","0.00"}; //Monetary amount {"", "", "", "",""}; //Percent {"", "", "", "",""}; //Tax exempt code string[] txi01_PST = {"PG", "PG", "PG","PG","PG"}; //Tax type code string[] txi02_PST = {"0.80", "2.00", "1.00", "0.80","0.00"}; //Monetary amount string[] txi03_PST = {"", "", "", "",""}; //Percent string[] txi06_PST = {"", "", "", "",""}; //Tax exempt code string[] pam05 = {"11.50", "28.75", "10.62", "11.50", "-10.00"}; //Extended line-item amount string[] pid05 = {"Stapler", "Lamp", "Bottled Water", "Fountain Pen", "DISCOUNT"}; //Line item description AxIt106s[] it106s = {new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s(), new AxIt106s Page 250 of 486 November 2018 7 Level 2/3 Transactions Sample AX Independent Refund ()}; it106s[0].SetIt10618(it10618[0]); it106s[0].SetIt10719(it10719[0]); it106s[1].SetIt10618(it10618[1]); it106s[1].SetIt10719(it10719[1]); it106s[2].SetIt10618(it10618[2]); it106s[2].SetIt10719(it10719[2]); it106s[3].SetIt10618(it10618[3]); it106s[3].SetIt10719(it10719[3]); it106s[4].SetIt10618(it10618[4]); it106s[4].SetIt10719(it10719[4]); AxTxi[] txi = {new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi(), new AxTxi()}; txi[0].SetTxi(txi01_GST[0], txi02_GST[0], txi03_GST[0], txi06_GST[0]); txi[0].SetTxi(txi01_PST[0], txi02_PST[0], txi03_PST[0], txi06_PST[0]); txi[1].SetTxi(txi01_GST[1], txi02_GST[1], txi03_GST[1], txi06_GST[1]); txi[1].SetTxi(txi01_PST[1], txi02_PST[1], txi03_PST[1], txi06_PST[1]); txi[2].SetTxi(txi01_GST[2], txi02_GST[2], txi03_GST[2], txi06_GST[2]); txi[2].SetTxi(txi01_PST[2], txi02_PST[2], txi03_PST[2], txi06_PST[2]); txi[3].SetTxi(txi01_GST[3], txi02_GST[3], txi03_GST[3], txi06_GST[3]); txi[3].SetTxi(txi01_PST[3], txi02_PST[3], txi03_PST[3], txi06_PST[3]); txi[4].SetTxi(txi01_GST[4], txi02_GST[4], txi03_GST[4], txi06_GST[4]); txi[4].SetTxi(txi01_PST[4], txi02_PST[4], txi03_PST[4], txi06_PST[4]); AxIt1Loop it1Loop = new AxIt1Loop(); it1Loop.SetIt1Loop(it102[0], it103[0], it104[0], it105[0], it106s[0], txi[0], pam05[0], it1Loop.SetIt1Loop(it102[1], it103[1], it104[1], it105[1], it106s[1], txi[1], pam05[1], it1Loop.SetIt1Loop(it102[2], it103[2], it104[2], it105[2], it106s[2], txi[2], pam05[2], it1Loop.SetIt1Loop(it102[3], it103[3], it104[3], it105[3], it106s[3], txi[3], pam05[3], it1Loop.SetIt1Loop(it102[4], it103[4], it104[4], it105[4], it106s[4], txi[4], pam05[4], AxTable2 table2 = new AxTable2(); table2.SetIt1Loop(it1Loop); //Create Table 3 with details AxTxi taxTbl3 = new AxTxi(); taxTbl3.SetTxi("GS", "4.25","",""); //sum of GST taxes taxTbl3.SetTxi("PG", "4.60","",""); //sum of PST taxes taxTbl3.SetTxi("TX", "8.85","",""); //sum of all taxes AxTable3 table3 = new AxTable3(); table3.SetTxi(taxTbl3); pid05[0]); pid05[1]); pid05[2]); pid05[3]); pid05[4]); //Create and Set Level23 Object AxLevel23 level23 = new AxLevel23(); level23.SetTable1(table1); level23.SetTable2(table2); level23.SetTable3(table3); AxIndependentRefund axIndependentRefund = new AxIndependentRefund(); axIndependentRefund.SetOrderId(order_id); axIndependentRefund.SetCustId(cust_id); axIndependentRefund.SetAmount(amount); axIndependentRefund.SetPan(pan); axIndependentRefund.SetExpDate(expiry_date); axIndependentRefund.SetCryptType(crypt); axIndependentRefund.SetAxLevel23(level23); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions November 2018 Page 251 of 486 Moneris Gateway API - Integration Guide Sample AX Independent Refund mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(axIndependentRefund); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Page 252 of 486 November 2018 8 MPI l l l l l l 8.1 8.2 8.3 8.4 8.5 8.6 About MPI Transactions 3-D Secure Implementations (VbV, MCSC, SafeKey) Activating VbV and MCSC Activating Amex SafeKey Transaction Flow for MPI MPI Transactions 8.1 About MPI Transactions The Moneris Gateway can enable transactions using the 3-D Secure protocol via Merchant Plug-In (MPI) and Access Control Server (ACS) . Moneris Gateway supports the following 3-D Secure implementations: l l l Verified by Visa (VbV) Mastercard Secure Code (MCSC) American Express SafeKey (applies to Canadian integrations only) 8.2 3-D Secure Implementations (VbV, MCSC, SafeKey) Verified by Visa (VbV), MasterCard Secure Code (MCSC) and American Express SafeKey are programs based on the 3-D Secure Protocol to improve the security of online transactions. These programs involve authentication of the cardholder during an online e-commerce transaction. Authentication is based on the issuer’s selected method of authentication. The following are examples of authentication methods: l l l Risk-based authentication Dynamic passwords Static passwords. Some benefits of these programs are reduced risk of fraudulent transactions and protection against chargebacks for certain fraudulent transactions. Additional eFraud features To further decrease fraudulent activity, Moneris also recommends implementing the following features: l l AVS: Address Verification Service (page 291) CVD: Card Validation Digits (). November 2018 Page 253 of 486 Moneris Gateway API - Integration Guide 8.3 Activating VbV and MCSC To integrate Verified by Visa and/or MasterCard Secure Code transaction functionality in your system, call Moneris Sales Support to have Moneris enroll you in the program(s) and enable the functionality on your account. 8.4 Activating Amex SafeKey To Activate Amex SafeKey transaction functionality with your system via the Moneris Gateway API: 1. Enroll in the SafeKey program with American Express at: https://network.americanexpress.com/ca/en/safekey/index.aspx 2. Call your Moneris sales centre at 1-855-465-4980 to get Amex SafeKey functionality enabled on your account. 8.5 Transaction Flow for MPI Figure 3: Transaction flow diagram 1. Cardholder enters the credit card number and submits the transaction information to the merchant. 2. Upon receiving the transaction request, the merchant calls the MonerisMPI API and passes a TXN type request. For sample code please refer to MpiTxn Request Transaction (page 258). 3. The Moneris MPI receives the request, authenticates the merchant and sends the transaction information to Visa, MasterCard or American Express. 4. Visa/MasterCard/Amex verifies that the card is enrolled and returns the issuer URL. 5. Moneris MPI receives the response from Visa, MasterCard or Amex and forwards the information to the merchant. 6. The MonerisMPI API installed at the merchant receives the response from the Moneris MPI. If the response is "Y" for enrolled, the merchant makes a call to the API, which opens a popup/inline window in the cardholder browser. If the response is “N” for not enrolled, a transaction could be sent to the processor identifying it as VBV/MCSC/SafeKey attempted with an ECI value of 6. Page 254 of 486 November 2018 8 MPI 7. 8. 9. 10. 11. 12. If the response is “U” for unable to authenticate or the response times out, the transaction can be sent to the processor with an ECI value of 7. The merchant can then choose to continue with the transaction and be liable for a chargeback, or the merchant can choose to end the transaction. The cardholder browser uses the URL that was returned from Visa/MasterCard/Amex via the merchant to communicate directly to the bank. The contents of the popup are loaded and the cardholder enters the PIN. The information is submitted to the bank and authenticated. A response is then returned to the client browser. The client browser receives the response from the bank, and forwards it to the merchant. The merchant receives the response information from the cardholder browser, and passes an ACS request type to the Moneris MPI API. Moneris MPI receives the ACS request and authenticates the information. The Moneris MPI then provides a CAVV value (getCavv()) and a crypt type (getMpiEciO) to the merchant. If the getSuccess() of the response is “true”, the merchant may proceed with the cavv purchase or cavv preauth. If the getSuccess() of the response is “false” and the getMessage() is “N”, the transaction must be cancelled because the cardholder failed to authenticate. If the getSuccess() of the response is “false” and the getMessage is “U”, the transaction can be processed as a normal purchase or PreAuth; however in this case the merchant assumes liability of a chargeback. If the response times out, the transaction can be processed as a normal purchase or PreAuth; however in this case the merchant assumes liability of a chargeback. The merchant retrieves the CAVV value, and formats a cavv purchase or a cavv preauth request using the method that is normally used. As part of this transaction method, the merchant must pass the CAVV value and the crypt type. 8.6 MPI Transactions Any of the transaction objects that are defined in this section can be passed to the HttpsPostRequest connection object defined in Section 17.5 (page 391)here. TXN Sends the initial transaction data to the Moneris MPI to verify whether the card is enrolled. The browser returns a PARes as well as a success field. ACS Passes the PARes (received in the response to the TXN transaction) to the Moneris MPI API. Cavv Purchase After receiving confirmation from the ACS transaction, this verifies funds on the customer’s card, removes the funds and prepares them for deposit into the merchant’s account. Cavv Pre-Authorization After receiving confirmation from the ACS transaction, this verifies and locks funds on the customer’s credit card. The funds are locked for a specified amount of time based on the card issuer. November 2018 Page 255 of 486 Moneris Gateway API - Integration Guide To retrieve the funds that have been locked by a Pre-Authorization transaction so that they may be settled in the merchant’s account, a basic Completion transaction (page 25) must be performed. A PreAuthorization transaction may only be "completed" once. NOTE: Cavv Purchase and Cavv Pre-Authorization transactions are also used to process Apple Pay and Android Pay transactions. For further details on how to process these wallet transactions, please refer to 10 Apple Pay In-App and on the Web Integration. 8.6.1 VbV, MCSC and SafeKey Responses For each transaction, a crypt type is sent to identify whether it is a VbV-, MCSC- or SafeKey-authenticated transaction. Below are the tables defining the possible crypt types as well as the possible VARes and PARes responses. Table 71: Crypt type definitions Crypt type 5 Visa definition l l 6 l l 7 l l l Fully authenticated There is a liability shift, and the merchant is protected from chargebacks VbV has been attempted There is a liability shift, and the merchant is protected from certain chargebacks on fraudulent transactions Non-VbV transaction No liability shift Merchant is not protected from chargebacks Page 256 of 486 MasterCard definition l l l l l l l Fully authenticated There is a liability shift, and the merchant is protected from chargebacks. MCSC has been attempted There is a liability shift, and the merchant is protected from certain chargebacks on fraudulent transactions Non-MCSC transaction No liability shift Merchant is not protected from chargebacks American Express Definition l l l l l l l Fully authenticated There is a liability shift, and the merchant is protected from chargebacks. SafeKey has been attempted There is a liability shift, and the merchant is protected from certain chargebacks on fraudulent transactions Non-SafeKey transaction No liability shift Merchant is not protected from chargebacks November 2018 8 MPI Table 72: VERes response definitions VERes Response Response Definition N The card/issuer is not enrolled. Sent as a normal Purchase/PreAuth transaction with a crypt type of 6. U The card type is not participating in VbV/MCSC/SafeKey. It could be corporate card or another card plan that Visa/MasterCard/Amex excludes. Proceed with a regular transaction with a crypt type of 7 or cancel the transaction. Y The card is enrolled. Proceed to create the VbV/MCSC/SafeKey inline window for cardholder authentication. Proceed to PARes for crypt type. Table 73: PARes response definitions PARes response Response definition A Attempted to verify PIN, and will receive a CAVV. Send as a cavv_purchase/cavv_preAuth, which returns a crypt type of 6. Y Fully authenticated, and will receive a CAVV. Send as a cavv_purchase/cavv_preAuth which will return a crypt type of 5. N Failed to authenticate. No CAVV is returned. Cancel transaction. Merchant may proceed with a crypt type of 7 although this is strongly discouraged. Table 74: 3-D Secure/CAVV transaction handling Step 1: VERes Step 2: PARes Cardholder/issuer enrolled? VbV/MCSC InLine window response Step 3: Transaction Are you protected? Y Y Send a CAVV transaction Y N Cancel transaction. Authentication failed or high-risk transaction. Y A Send a CAVV transaction U n/a Send a regular transaction with a crypt type of 7 N n/a Send a regular transaction with a crypt type of 6 November 2018 Page 257 of 486 Moneris Gateway API - Integration Guide 8.6.2 MpiTxn Request Transaction MpiTxn transaction object definition MpiTxn mpiTxn = new MpiTxn(); HttpsPostRequest object for MpiTxn transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(mpiTxn); MpiTxn transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 75: MpiTxn transaction object mandatory values Value Type Limits Set method XID String 20-character alphanumeric mpiTxn.SetXid(xid); Credit card number String 20-character numeric mpiTxn.SetPan(pan); Expiry date String 4-character alphanumeric mpiTxn.SetExpdate(expiry_ date); (YYMM format) Amount String 10-character decimal mpiTxn.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 MD String 1024-character alphanumeric mpiTxn.SetMD(MD); Merchant URL String N/A mpiTxn.SetMerchantUrl (merchantUrl); Accept String N/A mpiTxn.SetAccept(accept); User Agent String N/A mpiTxn.SetUserAgent (userAgent); Page 258 of 486 November 2018 8 MPI Sample MpiTxn Request namespace Moneris { using System; using System.Text; public class TestCanadaMpiTxn { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string amount = "1.00"; Random r = new Random(); StringBuilder sb = new StringBuilder(); for(int i=0; i< 20; i++) { sb.Append(r.Next(0,9)); } string xid = sb.ToString(); //string MD = xid + "mycardinfo" + amount; string MD = "xid=99999999999999992464&pan=4242424242424242&expiry=1511&amount=1.00"; string merchantUrl = "https://YOUR_MPI_RESPONSE_URL"; string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; string userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"; string processing_country_code = "CA"; string pan = "4242424242424242"; string expdate = "1511"; bool status_check = false; MpiTxn mpiTxn = new MpiTxn(); mpiTxn.SetXid(xid); mpiTxn.SetPan(pan); mpiTxn.SetExpDate(expdate); mpiTxn.SetAmount(amount); mpiTxn.SetMD(MD); mpiTxn.SetMerchantUrl(merchantUrl); mpiTxn.SetAccept(accept); mpiTxn.SetUserAgent(userAgent); //************************OPTIONAL VARIABLES*************************** HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(mpiTxn); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); /********************** REQUEST ************************/ try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("MpiMessage = " + receipt.GetMpiMessage()); Console.WriteLine("MpiSuccess = " + receipt.GetMpiSuccess()); if (receipt.GetMpiSuccess() == "true") { Console.WriteLine(receipt.GetInLineForm()); } Console.ReadLine(); } catch (Exception e) November 2018 Page 259 of 486 Moneris Gateway API - Integration Guide Sample MpiTxn Request { Console.WriteLine(e); } } } // end TestResMpiTxn } 8.6.2.1 TXN Response and Creating the Popup The TXN request returns a response with one of several possible values. The get Message method of the response object returns “Y”, “U”, or “N”. N Purchase or Pre-Authorization can be sent as a crypt type of 6 (attempted authentication). Y A call to the API to create the VBV form is made. U (Returned for non-participating cards such as corporate cards) Merchant can send the transaction with crypt_type 7. However, the merchant is liable for chargebacks. 8.6.3 Vault MPI Transaction – ResMpiTxn Vault MPI Transaction transaction object definition ResMpiTxn resMpiTxn = new ResMpiTxn(); HttpsPostRequest object for Vault MPI Transaction transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(resMpiTxn); Vault MPI Transaction transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 76: Vault MPI Transaction transaction object mandatory values Value Type Limits Set method Data key String 25-character alphanumeric resMpiTxn.SetData(data_key); XID String 20-character alphanumeric resMpiTxn.SetXid(xid); Amount String 10-character decimal resMpiTxn.SetAmount(amount); Page 260 of 486 November 2018 8 MPI Table 76: Vault MPI Transaction transaction object mandatory values (continued) Value Type Limits Set method Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 MD String 1024-character alphanumeric resMpiTxn.SetMD(MD); Merchant URL String n/a resMpiTxn.SetMerchantUrl (merchantUrl); Accept String n/a resMpiTxn.SetAccept(accept); User Agent String n/a resMpiTxn.SetUserAgent (userAgent); Expiry date String 4-character alphanumeric resMpiTxn.SetExpdate(expiry_ date); (YYMM format) Sample Vault MPI Transaction namespace Moneris { using System; using System.Text; using System.Collections; public class TestCanadaResMpiTxn { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string data_key = "SzSrdoy0bt8UFXOtgS88wFAy7"; string amount = "1.00"; Random r = new Random(); StringBuilder sb = new StringBuilder(); for(int i=0; i< 20; i++) { sb.Append(r.Next(0,9)); } string xid = sb.ToString(); November 2018 Page 261 of 486 Moneris Gateway API - Integration Guide Sample Vault MPI Transaction string MD = xid + "mycardinfo" + amount; string merchantUrl = "www.mystoreurl.com"; string accept = "true"; string userAgent = "Mozilla"; string processing_country_code = "CA"; bool status_check = false; ResMpiTxn resMpiTxn = new ResMpiTxn(); resMpiTxn.SetData(data_key); resMpiTxn.SetXid(xid); resMpiTxn.SetAmount(amount); resMpiTxn.SetMD(MD); resMpiTxn.SetMerchantUrl(merchantUrl); resMpiTxn.SetAccept(accept); resMpiTxn.SetUserAgent(userAgent); //************************OPTIONAL VARIABLES*************************** HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(resMpiTxn); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); /********************** REQUEST ************************/ try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("MpiMessage = " + receipt.GetMpiMessage()); Console.WriteLine("MpiSuccess = " + receipt.GetMpiSuccess()); if (receipt.GetMpiSuccess() == "true") { Console.WriteLine(receipt.GetInLineForm()); } Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } // end TestResMpiTxn } Vault response fields For a list and explanation of (Receipt object) response fields that are available after sending this Vault transaction, see Definitions of Response Fields (page 447). 8.6.4 MPI ACS Request Transaction MPI ACS Request transaction object definition MpiAcs mpiAcs = new MpiAcs(); HttpsPostRequest object for MPI ACS Request transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); Page 262 of 486 November 2018 8 MPI mpgReq.SetTransaction(mpiAcs); MPI ACS Request transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 77: MPI ACS Request transaction object mandatory values Value Type Limits XID String 20-character alphanumeric Amount String 10-character decimal Set method NOTE: Is the concatenated 20-character prefix that forms part of the variable MD mpiAcs.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 MD String 1024-character alphanumeric mpiAcs.SetMD(MD); PARes String n/a mpiAcs.SetPaRes(PaRes); Sample MPI ACS Request namespace Moneris { using System; public class TestCanadaMpiAcs { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string amount = "1.00"; string xid = "12345678910111214005"; string MD = xid + "mycardinfo" + amount; string PaRes = "PaRes String"; string processing_country_code = "CA"; bool status_check = false; MpiAcs resMpiAcs = new MpiAcs(); resMpiAcs.SetPaRes(PaRes); resMpiAcs.SetMD(MD); //************************OPTIONAL VARIABLES*************************** HttpsPostRequest mpgReq = new HttpsPostRequest(); November 2018 Page 263 of 486 Moneris Gateway API - Integration Guide Sample MPI ACS Request mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(resMpiAcs); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); /********************** REQUEST ************************/ try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("MpiMessage = " + receipt.GetMpiMessage()); Console.WriteLine("MpiSuccess = " + receipt.GetMpiSuccess()); if (receipt.GetMpiSuccess() == "true") { Console.WriteLine("Cavv = " + receipt.GetMpiCavv()); Console.WriteLine("Crypt Type = " + receipt.GetMpiEci()); } else { Console.WriteLine("Message = " + receipt.GetMessage()); } } catch (Exception e) { Console.WriteLine(e); } } } } 8.6.4.1 ACS Response and Forming a Transaction The ACS response contains the CAVV value and the e-commerce indicator. These values are to be passed to the transaction engine using the Cavv Purchase or Cavv Pre-Authorization request. Please see the documentation provided by your payment solution. Outlined below is how to send a transaction to Moneris Gateway. if ( mpiRes.getSuccess().equals("true") ) { //Send transaction to host using CAVV purchase or CAVV preauth, refer to sample //code for Moneris Gateway. Call mpiRes.getCavv() to obtain the CAVV value. //If you are using preauth/capture model, be sure to call getMessage() so the //value can be stored and used in the capture transaction after on to protect //your chargeback liability. (e.g. getMPIMessage()= A = crypt type of 6 for //follow on transaction and getMPIMessage() = Y = crypt type of 5 for follow on //transaction. } else { if (mpiRes.getMessage().equals(“N”)) { //Do not send transaction as the cardholder failed authentication. } else { //Optional to send transaction using the mpg API. In this case merchant //assumes liability. } Page 264 of 486 November 2018 8 MPI } 8.6.5 Purchase with 3-D Secure – cavvPurchase The Purchase with 3-D Secure transaction follows a 3-D Secure MPI authentication. After receiving confirmation from the MPI ACS transaction, this Purchase verifies funds on the customer’s card, removes the funds and prepares them for deposit into the merchant’s account. To perform the 3-D Secure authentication, the Moneris MPI or any 3rd party MPI may be used. This transaction can also be used to process an Apple Pay transaction. This transaction is applicable only if choosing to integrate directly to Apple Wallet (if not using the Moneris Apple Pay SDK). Please refer to 10 Apple Pay In-App and on the Web Integration for more details on your integration options. Refer to Apple's developer portal for details on integrating directly to the wallet to retrieve the payload data. Purchase with 3-D Secure transaction object definition CavvPurchase cavvPurchase = new CavvPurchase(); HttpsPostRequest object for Purchase with 3-D Secure transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(cavvPurchase); Cavv Purchase transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 78: Purchase with 3-D Secure transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric cavvPurchase.SetOrderId (order_id); Amount String 10-character decimal cavvPurchase.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number November 2018 String 20-character alphanumeric cavvPurchase.SetPan(pan); Page 265 of 486 Moneris Gateway API - Integration Guide Table 78: Purchase with 3-D Secure transaction object mandatory values Value Expiry date Type String Limits 4-character alphanumeric Set method cavvPurchase.SetExpdate (expiry_date); (YYMM format) CAVV String 50-character alphanumeric cavvPurchase.SetCavv(cavv); String 1-character alphanumeric cavvPurchase.SetCryptType (crypt); NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, CAVV field contains the decrypted cryptogram. For more, see Appendix A Definitions of Request Fields. E-commerce indicator NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, the E-commerce indicator is a mandatory field containing the value received from the decrypted payload or a default value of 5. If you get a 2-character value (e.g.,. 05 or 07) from the payload, remove the initial 0 and just send us the 2nd character. For more, see Appendix A Definitions of Request Fields. Page 266 of 486 November 2018 8 MPI Table 1 INTERAC® e-Commerce Fields – Required for Apple Pay and Google Pay Only Variable and Field Name Network Type Limits Set Method String alphabetical cavvPurchase.setNetwork (network); String 3-character alphanumeric cavvPurchase.setDataType (data_type); NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Data Type NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Table 2 Purchase with 3-D Secure transaction object optional values Value Type Limits Set Method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric cavvPurchase.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric cavvPurchase .SetDynamicDescriptor (dynamic_descriptor); Card Match ID String 50-character alphanumeric cavvPurchase.SetCmId (transaction_id); Object N/A cavvPurchase.SetCustInfo (customer); NOTE: Applies to Offlinx™ only; must be unique value for each transaction Customer information November 2018 Page 267 of 486 Moneris Gateway API - Integration Guide Value Type Limits Set Method AVS Object N/A cavvPurchase.SetAvsInfo (avsCheck); CVD Object N/A cavvPurchase.SetCvdInfo (cvdCheck); Convenience fee Object N/A cavvPurchase.SetConvFeeInfo (convFeeInfo); NOTE: Not applicable when processing Apple Pay transactions. Page 268 of 486 November 2018 8 MPI Value Recurring billing Type Limits Set Method Object N/A cavvPurchase.SetRecur (recurring_cycle); String 3-character alphanumeric cavvPurchase .SetWalletIndicator(wallet_ indicator); Object N/A cof.SetCofInfo(cof); recur NOTE: For sample code for a Purchase with 3D Secure including the Recurring Billing Info Object, see 8.6.5.1 Purchase with 3-D Secure and Recurring Billing . Wallet indicator NOTE: For Cavv Purchase and Cavv PreAuthorization, wallet indicator applies to Apple Pay or Android Pay only. For more, see Appendix A Definitions of Request Fields Credential on File Info cof NOTE: This is a nested object within the transaction, and required when storing or using the customer's stored credentials. The Credential on File Info object has its own request variables, listed in blue in the table below, "Credential on File Object Request Variables". November 2018 Page 269 of 486 Moneris Gateway API - Integration Guide Credential on File Transaction Object Request Fields Value Issuer ID Type String NOTE: This variable is required for all merchant-intiated transactions following the first one; upon sending the first transaction, the Issuer ID value is received in the transaction response and then used in subsequent transaction requests. Payment Indicator Limits 15-character alphanumeric variable length String 1-character alphabetic Set Method cof.SetIssuerId("VALUE_FOR_ ISSUER_ID"); NOTE: For a list and explanation of the possible values to send for this variable, see Definitions of Request Fields – Credential on File cof.SetPaymentIndicator ("PAYMENT_INDICATOR_VALUE"); NOTE: For a list and explanation of the possible values to send for this variable, see Definitions of Request Fields – Credential on File Payment Information String 1-character numeric cof.SetPaymentInformation ("PAYMENT_INFO_VALUE"); NOTE: For a list and explanation of the possible values to send for this variable, see Definitions of Request Fields – Credential on File Recurring Billing Info Object Request Fields Variable and Field Name Type and Limits Description Number of Recurs String num_recurs numeric, 1-99 Period String period numeric, 1-999 Number of recur units that must pass between recurring billings Start Date String Date of the first future recurring Page 270 of 486 The number of times that the transaction must recur November 2018 8 MPI Variable and Field Name start_date Type and Limits YYYY/MM/DD Description billing transaction This value must be a date in the future If an additional charge is to be made immediately, the value of Start Now must be set to true Start Now String start_now true/false If a single charge is to be made against the card immediately, set this value to true; the amount to be billed immediately may differ from the amount billed on a regular basis thereafter If the billing is to start in the future, set this value to false When set to false, use Card Verification prior to sending the Purchase with Recur and Credential on File objects Recurring Amount String recur_amount 10-character decimal Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point Amount of the recurring transaction This is the amount that will be billed on the Start Date and then billed repeatedly based on the interval defined by Period and Recur Unit EXAMPLE: 1234567.89 Recur Unit String recur_unit day, week, month or eom Unit to be used as a basis for the interval Works in conjunction with Period to define the billing frequency Possible values are: day week month November 2018 Page 271 of 486 Moneris Gateway API - Integration Guide Variable and Field Name Type and Limits Description eom (end of month) Sample Purchase with 3-D Secure - cavvPurchase namespace Moneris { using System; using System.Collections; public class TestCanadaCavvPurchase { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUS887H67"; string amount = "10.42"; string pan = "4242424242424242"; string expdate = "1901"; //YYMM string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA="; string dynamic_descriptor = "123456"; string wallet_indicator = "APP"; string processing_country_code = "CA"; string crypt_type = "5"; bool status_check = false; CofInfo cof = new CofInfo(); cof.SetPaymentIndicator("U"); cof.SetPaymentInformation("2"); cof.SetIssuerId("168451306048014"); CavvPurchase cavvPurchase = new CavvPurchase(); cavvPurchase.SetOrderId(order_id); cavvPurchase.SetCustId(cust_id); cavvPurchase.SetAmount(amount); cavvPurchase.SetPan(pan); cavvPurchase.SetExpDate(expdate); cavvPurchase.SetCavv(cavv); cavvPurchase.SetCryptType(crypt_type); //Mandatory for AMEX cards only cavvPurchase.SetDynamicDescriptor(dynamic_descriptor); //cavvPurchase.SetNetwork("Interac"); //set only for Interac e-commerce //cavvPurchase.SetDataType("3DSecure"); //set only for Interac e-commerce //cavvPurchase.SetWalletIndicator(wallet_indicator); //set only wallet transactions e.g. APPLE PAY //cavvPurchase.SetCmId("8nAK8712sGaAkls56"); //set only for usage with Offlinx - Unique max 50 alphanumeric characters transaction id generated by merchant cavvPurchase.SetCofInfo(cof); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(cavvPurchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Page 272 of 486 November 2018 8 MPI Sample Purchase with 3-D Secure - cavvPurchase Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.WriteLine("IssuerId = " + receipt.GetIssuerId()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 8.6.5.1 Purchase with 3-D Secure and Recurring Billing The example below illustrates the Purchase with 3-D Secure when also sending the Recurring Billing Info object in the transaction. Purchase with 3-D Secure and Recurring Billing namespace Moneris { using System; using System.Collections; public class TestCanadaCavvPurchase { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUS887H67"; string amount = "10.42"; string pan = "4242424242424242"; string expdate = "1901"; //YYMM string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA="; string dynamic_descriptor = "123456"; string wallet_indicator = "APP"; string processing_country_code = "CA"; string crypt_type = "5"; bool status_check = false; /************************* Recur Variables **********************************/ string recur_unit = "month"; //eom = end of month November 2018 Page 273 of 486 Moneris Gateway API - Integration Guide Purchase with 3-D Secure and Recurring Billing string start_now = "true"; string start_date = "2018/02/25"; string num_recurs = "12"; string period = "1"; string recur_amount = "30.00"; /************************* Recur Object Option1 ******************************/ Recur recurring_cycle = new Recur(recur_unit, start_now, start_date, num_recurs, period, recur_amount); /************************* Recur Object Option2 ******************************/ Hashtable recur_hash = new Hashtable(); recur_hash.Add("recur_unit", recur_unit); recur_hash.Add("start_now", start_now); recur_hash.Add("start_date", start_date); recur_hash.Add("num_recurs", num_recurs); recur_hash.Add("period", period); recur_hash.Add("recur_amount", recur_amount); Recur recurring_cycle2 = new Recur(recur_hash); CofInfo cof = new CofInfo(); cof.SetPaymentIndicator("R"); cof.SetPaymentInformation("2"); cof.SetIssuerId("168451306048014"); CavvPurchase cavvPurchase = new CavvPurchase(); cavvPurchase.SetOrderId(order_id); cavvPurchase.SetCustId(cust_id); cavvPurchase.SetAmount(amount); cavvPurchase.SetPan(pan); cavvPurchase.SetExpDate(expdate); cavvPurchase.SetCavv(cavv); cavvPurchase.SetCryptType(crypt_type); //Mandatory for AMEX cards only cavvPurchase.SetDynamicDescriptor(dynamic_descriptor); //cavvPurchase.SetNetwork("Interac"); //set only for Interac e-commerce //cavvPurchase.SetDataType("3DSecure"); //set only for Interac e-commerce //cavvPurchase.SetWalletIndicator(wallet_indicator); //set only wallet transactions e.g. APPLE PAY cavvPurchase.SetRecur(recurring_cycle); cavvPurchase.SetCofInfo(cof); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(cavvPurchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Page 274 of 486 November 2018 8 MPI Purchase with 3-D Secure and Recurring Billing Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.WriteLine("IssuerId = " + receipt.GetIssuerId()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 8.6.6 Pre-Authorization with 3-D Secure – cavvPreauth The Pre-Authorization with 3-D Secure transaction follows a 3-D Secure MPI authentication. After receiving confirmation from the MPI ACS transaction, this Pre-Authorization verifies funds on the customer’s card, removes the funds and prepares them for deposit into the merchant’s account. To perform the 3-D Secure authentication, the Moneris MPI or any 3rd party MPI may be used. This transaction can also be used to process an Apple Pay transaction. This transaction is applicable only if choosing to integrate directly to Apple Wallet (if not using the Moneris Apple Pay SDK). Please refer to 10 Apple Pay In-App and on the Web Integration for more details on your integration options. Refer to Apple's developer portal for details on integrating directly to the wallet to retrieve the payload data. Pre-Authorization with 3-D Secure transaction object definition CavvPreAuth cavvPreauth = new CavvPreAuth(); HttpsPostRequest object for Pre-Authorization with 3-D Secure transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(cavvPreauth); Pre-Authorization with 3-D Secure transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields November 2018 Page 275 of 486 Moneris Gateway API - Integration Guide Table 79: Pre-Authorization with 3-D Secure object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric cavvPreauth.SetOrderId(order_ id); Amount String 10-character decimal cavvPreauth.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number Page 276 of 486 String 20-character numeric cavvPreauth.SetPan(pan); November 2018 8 MPI Value Type Limits Set method Cardholder Authentication Verification Value (CAVV) String 50-character alphanumeric cavvPreauth.SetCavv(cavv); Expiry date String 4-character numeric cavvPreauth.SetExpdate (expiry_date); E-commerce indicator String 1-character alphanumeric cavvPreauth.SetCryptType (crypt); NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, CAVV field contains the decrypted cryptogram. For more, see Appendix A Definitions of Request Fields. NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, the E-commerce indicator is a mandatory field containing the value received from the decrypted payload or a default value of 5. If you get a 2-character value (e.g.,. 05 or 07) from the payload, remove the initial 0 and just send us the 2nd character. For more, see Appendix A Definitions of Request Fields. November 2018 Page 277 of 486 Moneris Gateway API - Integration Guide Table 1 INTERAC® e-Commerce Fields – Required for Apple Pay and Google Pay Only Variable and Field Name Network Type Limits Set Method String alphabetical cavvPurchase.setNetwork (network); String 3-character alphanumeric cavvPurchase.setDataType (data_type); NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Data Type NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Table 2 Pre-Authorization with 3-D Secure object optional values Value Type Limits Set method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric cavvPreauth.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric cavvPreauth .SetDynamicDescriptor (dynamic_descriptor); Card Match ID String 50-character alphanumeric cavvPreauth.SetCmId (transaction_id); Object N/A cavvPreauth.SetAvsInfo NOTE: Applies to Offlinx™ only; must be unique value for each transaction AVS Page 278 of 486 November 2018 8 MPI Value Type Limits Set method (avsCheck); CVD Object N/A cavvPreauth.SetCvdInfo (cvdCheck); Wallet indicator String 3-character alphanumeric cavvPreauth .SetWalletIndicator(wallet_ indicator); Object N/A cof.SetCofInfo(cof); NOTE: For Cavv Purchase and Cavv PreAuthorization, wallet indicator applies to Apple Pay or Android Pay only. For more, see Appendix A Definitions of Request Fields Credential on File Info cof NOTE: This is a nested object within the transaction, and required when storing or using the customer's stored credentials. The Credential on File Info object has its own request variables, listed in blue in the table below, "Credential on File Object Request Variables". November 2018 Page 279 of 486 Moneris Gateway API - Integration Guide Credential on File Transaction Object Request Fields Value Issuer ID Type String NOTE: This variable is required for all merchant-intiated transactions following the first one; upon sending the first transaction, the Issuer ID value is received in the transaction response and then used in subsequent transaction requests. Payment Indicator Limits 15-character alphanumeric variable length String 1-character alphabetic Set Method cof.SetIssuerId("VALUE_FOR_ ISSUER_ID"); NOTE: For a list and explanation of the possible values to send for this variable, see Definitions of Request Fields – Credential on File cof.SetPaymentIndicator ("PAYMENT_INDICATOR_VALUE"); NOTE: For a list and explanation of the possible values to send for this variable, see Definitions of Request Fields – Credential on File Payment Information String 1-character numeric cof.SetPaymentInformation ("PAYMENT_INFO_VALUE"); NOTE: For a list and explanation of the possible values to send for this variable, see Definitions of Request Fields – Credential on File Sample Pre-Authorization with 3-D Secure – cavvPreauth namespace Moneris { using System; using System.Collections; public class TestCanadaCavvPreauth { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUS887H67"; string amount = "10.42"; string pan = "4242424242424242"; string expdate = "1911"; //YYMM format Page 280 of 486 November 2018 8 MPI Sample Pre-Authorization with 3-D Secure – cavvPreauth string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA="; string dynamic_descriptor = "123456"; string wallet_indicator = "APP"; string processing_country_code = "CA"; string crypt_type = "5"; bool status_check = false; CofInfo cof = new CofInfo(); cof.SetPaymentIndicator("U"); cof.SetPaymentInformation("2"); cof.SetIssuerId("168451306048014"); CavvPreAuth cavvPreauth = new CavvPreAuth(); cavvPreauth.SetOrderId(order_id); cavvPreauth.SetCustId(cust_id); cavvPreauth.SetAmount(amount); cavvPreauth.SetPan(pan); cavvPreauth.SetExpDate(expdate); cavvPreauth.SetCavv(cavv); cavvPreauth.SetCryptType(crypt_type); //Mandatory for AMEX cards only cavvPreauth.SetDynamicDescriptor(dynamic_descriptor); //cavvPreauth.SetWalletIndicator(wallet_indicator); //set only wallet transactions e.g. APPLE PAY //cavvPreauth.SetCmId("8nAK8712sGaAkls56"); //set only for usage with Offlinx - Unique max 50 alphanumeric characters transaction id generated by merchant cavvPreauth.SetCofInfo(cof); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(cavvPreauth); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.WriteLine("IssuerId = " + receipt.GetIssuerId()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } November 2018 Page 281 of 486 Moneris Gateway API - Integration Guide Sample Pre-Authorization with 3-D Secure – cavvPreauth } } } 8.6.7 Cavv Result Codes for Verified by Visa Table 80: CAVV result codes for VbV Code 0 Message Significance CAVV authentication results invalid For this transaction, you may not receive protection from chargebacks as a result of using VbV because the CAVV was considered invalid at the time the financial transaction was processed. Check that you are following the VbV process correctly and passing the correct data in our transactions. 1 CAVV failed validation; authentication Provided that you have implemented the VbV process correctly, the liability for this transaction should remain with the Issuer for chargeback reason codes covered by Verified by Visa. 2 CAVV passed validation; authentication The CAVV was confirmed as part of the financial transaction. This transaction is a fully authenticated VbV transaction (ECI 5) 3 CAVV passed validation; attempt The CAVV was confirmed as part of the financial transaction. This transaction is an attempted VbV transaction (ECI 6) 4 CAVV failed validation; attempt Provided that you have implemented the VbV process correctly the liability for this transaction should remain with the Issuer for chargeback reason codes covered by Verified by Visa. 7 CAVV failed validation; attempt (US issued cards only) Please check that you are following the VbV process correctly and passing the correct data in your transactions. Provided that you have implemented the VbV process correctly the liability for this transaction should be the same as an attempted transaction (ECI 6) Page 282 of 486 November 2018 8 MPI Table 80: CAVV result codes for VbV (continued) Code Message Significance 8 CAVV passed validation; attempt (US issued cards only The CAVV was confirmed as part of the financial transaction. This transaction is an attempted VbV transaction (ECI 6) 9 CAVV failed validation; attempt (US issued cards only) Please check that you are following the VbV process correctly and passing the correct data in our transactions. Provided that you have implemented the VbV process correctly the liability for this transaction should be the same as an attempted transaction (ECI 6) A CAVV passed validation; attempt (US issued cards only) The CAVV was confirmed as part of the financial transaction. This transaction is an attempted VbV transaction (ECI 6) B CAVV passed validation; information only, no liability shift The CAVV was confirmed as part of the financial transaction. However, this transaction does not qualify for the liability shift. Treat this transaction the same as an ECI 7. 8.6.8 Vault Cavv Purchase Vault Cavv Purchase transaction object definition ResCavvPurchaseCC resCavvPurchaseCC = new ResCavvPurchaseCC(); HttpsPostRequest object for Vault Cavv Purchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(resCavvPurchaseCC); November 2018 Page 283 of 486 Moneris Gateway API - Integration Guide Vault Cavv Purchase transaction details Table 81: Vault Cavv Purchase transaction object mandatory values Value Type Limits Set method Data Key String 25-character alphanumeric resCavvPurchaseCC.SetData (data_key); Order ID String 50-character alphanumeric resCavvPurchaseCC.SetOrderId (order_id); Amount String 10-character decimal resCavvPurchaseCC.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Cardholder Authentication Verification Value (CAVV) String 50-character alphanumeric resCavvPurchaseCC.SetCavv (cavv); E-commerce indicator String 1-character alphanumeric resCavvPurchaseCC .SetCryptType(crypt); Table 82: Vault Cavv Purchase transaction object optional values Value Type Limits Set method Customer ID String 50-character alphanumeric resCavvPurchaseCC.SetCustId (cust_id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Expiry date String 4-character alphanumeric resCavvPurchaseCC.SetExpdate (expiry_date); (YYMM format) Page 284 of 486 November 2018 8 MPI Sample Vault Cavv Purchase namespace Moneris { using System; using System.Text; using System.Collections; public class TestCanadaResCavvPreauthCC { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string data_key = "4INQR1A8ocxD0oafSz50LADXy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "1.00"; string cust_id = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be used string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA"; string expdate = "1911"; string processing_country_code = "CA"; bool status_check = false; ResCavvPreauthCC resCavvPreauthCC = new ResCavvPreauthCC(); resCavvPreauthCC.SetOrderId(order_id); resCavvPreauthCC.SetDataKey(data_key); resCavvPreauthCC.SetCustId(cust_id); resCavvPreauthCC.SetAmount(amount); resCavvPreauthCC.SetCavv(cavv); //resCavvPreauthCC.SetExpDate(expdate); //mandatory for temp token only HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(resCavvPreauthCC); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("DataKey = " + receipt.GetDataKey()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("ResSuccess = " + receipt.GetResSuccess()); Console.WriteLine("PaymentType = " + receipt.GetPaymentType()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); //ResolveData Console.WriteLine("Cust ID = " + receipt.GetResDataCustId()); Console.WriteLine("Phone = " + receipt.GetResDataPhone()); Console.WriteLine("Email = " + receipt.GetResDataEmail()); November 2018 Page 285 of 486 Moneris Gateway API - Integration Guide Sample Vault Cavv Purchase Console.WriteLine("Note = " + receipt.GetResDataNote()); Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan()); Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate()); Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType()); Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber()); Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName()); Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 8.6.9 Vault Cavv Pre-Authorization Vault Cavv Pre-Authorization transaction object definition ResCavvPreauthCC resCavvPreauthCC = new ResCavvPreauthCC(); HttpsPostRequest object for Vault Cavv Pre-Authorization HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(resCavvPreauthCC); Vault Cavv Pre-Authorization transaction details Table 83: Vault Cavv Pre-Authorization object mandatory values Value Type Limits Set method Data Key String 25-character alphanumeric resCavvPreauthCC.SetData (data_key); Order ID String 50-character alphanumeric resCavvPreauthCC.SetOrderId (order_id); Amount String 10-character decimal resCavvPreauthCC.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Page 286 of 486 November 2018 8 MPI Table 83: Vault Cavv Pre-Authorization object mandatory values Value Type Limits Set method CAVV String 50-character alphanumeric resCavvPreauthCC.SetCavv (cavv); E-commerce indicator String 1-character alphanumeric resCavvPreauthCC.SetCryptType (crypt); Table 84: Vault Cavv Pre-Authorization object optional values Value Customer ID Type String Limits 50-character alphanumeric Set method resCavvPreauthCC.SetCustId (cust_id); Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Expiry date String 4-character numeric resCavvPreauthCC.SetExpdate (expiry_date); Sample Vault Cavv Pre-Authorization namespace Moneris { using System; using System.Text; using System.Collections; public class TestCanadaResCavvPreauthCC { public static void Main(string[] args) { string store_id = "store1"; string api_token = "yesguy"; string data_key = "4INQR1A8ocxD0oafSz50LADXy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "1.00"; string cust_id = "customer1"; //if sent will be submitted, otherwise cust_id from profile will be used string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA"; string expdate = "1911"; string processing_country_code = "CA"; bool status_check = false; ResCavvPreauthCC resCavvPreauthCC = new ResCavvPreauthCC(); resCavvPreauthCC.SetOrderId(order_id); resCavvPreauthCC.SetDataKey(data_key); resCavvPreauthCC.SetCustId(cust_id); resCavvPreauthCC.SetAmount(amount); resCavvPreauthCC.SetCavv(cavv); //resCavvPreauthCC.SetExpDate(expdate); //mandatory for temp token only November 2018 Page 287 of 486 Moneris Gateway API - Integration Guide Sample Vault Cavv Pre-Authorization HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(resCavvPreauthCC); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("DataKey = " + receipt.GetDataKey()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("ResSuccess = " + receipt.GetResSuccess()); Console.WriteLine("PaymentType = " + receipt.GetPaymentType()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); //ResolveData Console.WriteLine("Cust ID = " + receipt.GetResDataCustId()); Console.WriteLine("Phone = " + receipt.GetResDataPhone()); Console.WriteLine("Email = " + receipt.GetResDataEmail()); Console.WriteLine("Note = " + receipt.GetResDataNote()); Console.WriteLine("Masked Pan = " + receipt.GetResDataMaskedPan()); Console.WriteLine("Exp Date = " + receipt.GetResDataExpdate()); Console.WriteLine("Crypt Type = " + receipt.GetResDataCryptType()); Console.WriteLine("Avs Street Number = " + receipt.GetResDataAvsStreetNumber()); Console.WriteLine("Avs Street Name = " + receipt.GetResDataAvsStreetName()); Console.WriteLine("Avs Zipcode = " + receipt.GetResDataAvsZipcode()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Page 288 of 486 November 2018 9 e-Fraud Tools l l l 9.1 Address Verification Service 9.2 Card Validation Digits (CVD) 9.3 Transaction Risk Management Tool November 2018 Page 289 of 486 9.1 Address Verification Service l l l l 9.1.1 9.1.2 9.1.3 9.1.4 About Address Verification Service (AVS) AVS Info Object AVS Response Codes AVS Sample Code 9.1.1 About Address Verification Service (AVS) Address Verification Service (AVS) is an optional fraud-prevention tool offered by issuing banks whereby a cardholder's address is submitted as part of the transaction authorization. The AVS address is then compared to the address kept on file at the issuing bank. AVS checks whether the street number, street name and zip/postal code match. The issuing bank returns an AVS result code indicating whether the data was matched successfully. Regardless of the AVS result code returned, the credit card is authorized by the issuing bank. The response that is received from AVS verification is intended to provide added security and fraud prevention, but the response itself does not affect the completion of a transaction. Upon receiving a response, the choice to proceed with a transaction is left entirely to the merchant. The responses is not a strict guideline of whether a transaction will be approved or declined. The following transactions support AVS: l l l l l Purchase (Basic and Mag Swipe) Pre-Authorization (Basic) Re-Authorization (Basic) ResAddCC (Vault) ResUpdateCC (Vault) Things to Consider: l l l AVS is supported by Visa, MasterCard, American Express, Discover and JCB. When testing AVS, you must only use the Visa test card numbers 4242424242424242 or 4005554444444403, and the amounts described in the Simulator eFraud Response Codes document available at the Moneris developer portal (https://developer.moneris.com). Store ID “store5” is set up to support AVS testing. 9.1.2 AVS Info Object AVSInfo object definition AvsInfo avsCheck = new AvsInfo(); November 2018 Page 291 of 486 Moneris Gateway API - Integration Guide Transaction object set method .setAvsInfo(avsCheck); Table 1 AVS Info Object – Required Fields Variable and Field Name AVS street number Type and Limits String Set Method Description avsCheck.SetAvsStreetNumber ("212"); Cardholder street number avsCheck.SetAvsStreetName ("Payton Street"); Cardholder street name avsCheck.SetAvsZipCode ("M1M1M1"); Cardholder zip/postal code 19-character alphanumeric NOTE: this character limit is a combined total allowed for AVS street number and AVS street name AVS street name String 19-character alphanumeric NOTE: this character limit is the combined total allowed for AVS street number and AVS street name AVS zip/postal code String 9-character alphanumeric 9.1.3 AVS Response Codes Below is a full list of possible AVS response codes. These can be returned when you call the receipt.GetAvsResultCode() method . Page 292 of 486 November 2018 Table 85: AVS result codes Value Visa MasterCard/Discover A Street address matches, zip/postal code does not. Acquirer rights not implied. B Street address matches. Zip/Postal code not N/A verified due to incompatible formats. (Acquirer sent both street address and zip/postal code.) N/A C Street address not verified due to incompatible formats. (Acquirer sent both street address and zip/postal code.) N/A N/A D Street address and zip/postal code match. N/A Customer name incorrect, zip/postal code matches E N/A N/A Customer name incorrect, billing address and zip/postal code match F (Applies to UK only) Street address and zip/- N/A postal code match. Customer name incorrect, billing address matches. G Address information not verified for international transaction. Any of the following may be true: N/A N/A l l l Address matches, zip/postal code does not. Amex/JCB Billing address matches, zip/postal code does not. Issuer is not an AVS participant. AVS data was present in the request, but issuer did not return an AVS result. Visa performs AVS on behalf of the issuer and there was no address record on file for this account. I Address information not verified. N/A N/A K N/A N/A Customer name matches. L N/A N/A Customer name and postal code match. N/A N/A Customer name and zip/postal code match. November 2018 Page 293 of 486 Moneris Gateway API - Integration Guide Table 85: AVS result codes (continued) Value Visa MasterCard/Discover Amex/JCB M Street address and zip/postal code match. N/A Customer name, billing address, and zip/postal code match. N No match. Neither address nor postal code matches. Billing address and postal code do not match. Also used when acquirer requests AVS but sends no AVS data. O N/A N/A Customer name and billing address match P Postal code matches. Acquirer sent both postal code and street address, but street address not verified due to incompatible formats. N/A N/A R Retry: System unavailable or timed out. Issuer ordinarily performs AVS, but was unavailable. Retry. System unable to Retry. System unavailprocess. able. The code R is used by Visa when issuers are unavailable. Issuers should refrain from using this code. S N/A AVS currently not supported. AVS currently not supported. T N/A Nine-digit zip/postal code matches, address does not match. N/A U Address not verified for domestic transaction. One of the following is true: No data from Issuer/Authorization system. Information is unavailable. l l l Issuer is not an AVS participant AVS data was present in the request, but issuer did not return an AVS result Visa performs AVS on behalf of the issuer and there was no address record on file for this account. Page 294 of 486 November 2018 Table 85: AVS result codes (continued) Value Visa MasterCard/Discover Amex/JCB W Not applicable. If present, replaced with ‘Z’ by Visa. Available for U.S. issuers only. For US Addresses, nine- Customer name, billing digit zip/postal code address, and zip/postal matches, address does code are all correct. not. For addresses outside the US, zip/postal code matches, address does not. X N/A For US addresses, nine- N/A digit zip/postal code and address match. For addresses outside the US,zip/postal code and address match. Y Street address and zip/postal code match. For US addresses, fivedigit zip/postal code and address match. Z Zip/postal code matches, but street address For U.S. addresses, five- Postal code matches, either does not match or street address was digit zip code matches, billing address does not not included in request. address does not match. match. Billing address and zip/postal code match. 9.1.4 AVS Sample Code This is a sample of Java code illustrating how AVS is implemented with a Purchase transaction. Purchase object information that is not relevant to AVS has been removed. For more about Purchase transactions, see 2.2 Purchase. Sample Purchase with AVS information AvsInfo avsCheck = new AvsInfo(); avsCheck.SetAvsStreetNumber("212"); avsCheck.SetAvsStreetName("Payton Street"); avsCheck.SetAvsZipCode("M1M1M1"); avsCheck.SetAvsEmail("test@host.com"); avsCheck.SetAvsHostname("hostname"); avsCheck.SetAvsBrowser("Mozilla"); avsCheck.SetAvsShiptoCountry("CAN"); avsCheck.SetAvsShipMethod("G"); avsCheck.SetAvsMerchProdSku("123456"); avsCheck.SetAvsCustIp("192.168.0.1"); avsCheck.SetAvsCustPhone("5556667777"); Purchase purchase = new Purchase(); purchase.SetAvsInfo(avsCheck); November 2018 Page 295 of 486 9.2 Card Validation Digits (CVD) l l l l 9.2.1 9.2.3 9.2.4 9.2.5 About Card Validation Digits (CVD) CVD Info Object CVD Result Codes Sample Purchase with CVD Info Object 9.2.1 About Card Validation Digits (CVD) The Card Validation Digits (CVD) value is an additional number printed on credit cards that is used as an additional check when verifying cardholder credentials during a transaction. The response that is received from CVD verification is intended to provide added security and fraud prevention, but the response itself does not affect the completion of a transaction. Upon receiving a response, the choice whether to proceed with a transaction is left entirely to the merchant. The responses is not a strict guideline of which transaction will approve or decline. The following transactions support CVD: l l l Purchase (Basic, Vault and Mag Swipe) Pre-Authorization (Basic and Vault) Re-Authorization Things to Consider: l l l l CVD is only supported by Visa, MasterCard, American Express, Discover, JCB and UnionPay. For UnionPay cards, the CVD response will not be returned; the issuer will approve or decline based on the CVD result. When testing CVD, you must only use the Visa test card numbers 4242424242424242 or 4005554444444403, and the amounts described in the Simulator eFraud Response Codes document available at the Moneris developer portal (https://developer.moneris.com). Test store_id “store5” is set up to support CVD testing. 9.2.2 Transactions Where CVD Is Required The Card Validation Digits (CVD) object is required in transaction requests in the following scenarios: l l Initial transactions when storing cardholder credentials in Credential on File scenarios; subsequent follow-on transactions do not use CVD Any Purchase, Pre-Authorization or Card Verification where you are not storing cardholder credentials November 2018 Page 296 of 486 Moneris Gateway API - Integration Guide 9.2.3 CVD Info Object NOTE: The CVD value must only be passed to the Moneris Gateway. Under no circumstances may it be stored for subsequent uses or displayed as part of the receipt information. CvdInfo object definition CvdInfo cvdCheck = new CvdInfo(); Transaction object set method transaction.setCvdInfo(cvdCheck); Table 1 CVD Info Object – Required Fields Variable and Field Name CVD indicator Type and Limits String Set Method cvdCheck.SetCvdIndicator ("1"); 1-character numeric Description Indicates presence of CVD Possible values: 0: CVD value is deliberately bypassed or is not provided by the merchant. 1: CVD value is present. 2: CVD value is on the card, but is illegible. 9: Cardholder states that the card has no CVD imprint. CVD value String 4-character numeric Page 297 of 486 cvdCheck.SetCvdValue ("099"); CVD value located on credit card NOTE: The CVD value must only be passed to the Moneris Gateway. Under no circumstances may it be stored for subsequent uses or displayed as part of November 2018 Variable and Field Name Type and Limits Set Method Description the receipt information. 9.2.4 CVD Result Codes Value Definition M Match N No match P Not processed S CVD should be on the card, but Merchant has indicated that CVD is not present U Issuer is not a CVD participant Y Match for Amex/JCB only D Invalid security code for Amex or JCB only Other Invalid response code 9.2.5 Sample Purchase with CVD Info Object This is a sample of Java code illustrating how CVD is implemented with a Purchase transaction. Purchase object information that is not relevant to CVD has been removed. Sample Purchase with CVD Information CvdInfo cvdCheck = new CvdInfo(); cvdCheck.setCvdIndicator("1"); cvdCheck.setCvdValue("099"); Purchase purchase = new Purchase(); purchase.setCvdInfo(cvdCheck); November 2018 Page 298 of 486 9.3 Transaction Risk Management Tool l l l l l l 9.3.1 9.3.2 9.3.3 9.3.4 9.3.6 9.3.6 About the Transaction Risk Management Tool Introduction to Queries Session Query Attribute Query Inserting the Profiling Tags Into Your Website Inserting the Profiling Tags Into Your Website The Transaction Risk Management Tool (TRMT) is available to Canadian integrations only. 9.3.1 About the Transaction Risk Management Tool The Transaction Risk Management Tool provides additional information to assist in identifying fraudulent transactions. To maximize the benefits from the Transaction Risk Management Tool, it is highly recommended that you: l l Carefully consider the business logic and processes that you need to implement surrounding the handling of response information the Transaction Risk Management Tool provides. Implement the other fraud tools available through Moneris Gateway (such as AVS, CVD, Verified by Visa, MasterCard SecureCode and American Express SafeKey). 9.3.2 Introduction to Queries There are two types of transactions associated with the Transaction Risk Management Tool (TRMT): l l Session Query (page 300) Attribute Query (page 307) The Session Query and Attribute Query are used at the time of the transaction to obtain the risk assessment. Moneris recommends that you use the Session Query as much as possible for obtaining your risk assessment because it uses the device fingerprint as well as other transaction information when providing the risk scores. To use the Session Query, you must implement two components: l l Tags on your website to collect the device fingerprinting information Session Query transaction. If you are not able to collect the necessary information for the Session Query (such as the device fingerprint), then use the Attribute Query. November 2018 Canada Only Page 299 of 486 Moneris Gateway API - Integration Guide 9.3.3 Session Query Once a device profiling session has been initiated upon a client device, the Session Query API is used at the time of the transaction or even to obtain a device identifier or ‘fingerprint’, attribute list and risk assessment for the client device. Session Query transaction object definition SessionQuery sq = new SessionQuery(); HttpsPostRequest object for Session Query transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(sq); Session Query transaction values Table 86: Session Query transaction object mandatory values Type Limits Set method Value Description Session ID sq.SetSessionId(session_id); String 9-character decimal Permitted characters: [a-z], [A-Z], 0-9, _, - Web server session identifier generated when device profiling was initiated. Service type sq.SetServiceType(service_type); String 9-character decimal Which output fields are returned. session -- returns IP and device related attributes. Event type sq.SetEventType(service_type); String payment Defines the type of transaction or event for reporting purposes. payment - Purchasing of goods/services. Credit card String 20-character numeric number (PAN) No spaces or dashes sq.SetPan(pan); Most credit card numbers today are 16 digits, but some 13-digit numbers are still accepted by some issuers. This field has been intentionally expanded to 20 digits in consideration for future expansion and potential support of private label card ranges. Page 300 of 486 Canada Only November 2018 Table 86: Session Query transaction object mandatory values (continued) Type Limits Set method Value Description sq.SetAccountAddressStreet1 Account String 32-character alphanumeric ("3300 Bloor St W"); address street 1 First portion of the street address component of the billing address. sq.SetAccountAddressStreet2("4th Account String 32-character alphanumeric Flr West Tower"); Address street 2 Second portion of the street address component of the billing address. Account address city String 50-character alphanumeric sq.SetAccountAddressCity ("Toronto"); The city component of the billing address. sq.SetAccountAddressState Account String 64-character alphanumeric ("Ontario"); address state/province The state/province component of the billing address. sq.SetAccountAddressCountry Account String 2-character alphanumeric ("CA"); address country ISO2 country code of the billing addresses. Account address ZIP/postal code String 8-character alphanumeric sq.SetAccountAddressZip ("M8X2X2"); ZIP/postal code of the billing address. sq.SetAccountAddressStreet1 Shipping String 32-character alphanumeric ("3300 Bloor St W"); address street 1 First portion of the street address component of the shipping address. sq.SetAccountAddressStreet2("4th Shipping String 32-character alphanumeric Flr West Tower"); address street 2 Second portion of the street address component of the shipping address. Shipping address city String 50-character alphanumeric sq.SetAccountAddressCity ("Toronto"); City component of the shipping address. sq.SetAccountAddressState Shipping String 64-character alphanumeric ("Ontario"); address state/province The state/province component of the shipping address. November 2018 Canada Only Page 301 of 486 Moneris Gateway API - Integration Guide Table 86: Session Query transaction object mandatory values (continued) Type Limits Set method Value Description sq.SetAccountAddressCountry Shipping String 2-character alphanumeric ("CA"); address country ISO2 country code of the account address country. Shipping address ZIP sq.SetAccountAddressZip ("M8X2X2"); String 8-character alphanumeric The ZIP/postal code component of the shipping address. sq.SetLocalAttrib1("a"); Local attribute String 255-character alphanumeric 1-5 These five attributes can be used to pass custom attribute data. These are used if you wish to correlate some data with the returned device information. Transaction amount sq.SetTransactionAmount("1.00"); String 255-character alphanumeric Must contain 2 decimal places The numeric currency amount. Transaction currency sq.SetTransactionCurrency ("840"); String 10-character numeric The currency type that the transaction was denominated in. If TransactionAmount is passed, the TransactionCurrency is required. Values to be used are: l l CAD – 124 USD – 840 Table 87: Session Query transaction object optional values Type Limits Set method Value Description Account login String 255-character alphanumeric sq.SetAccountLogin("13195417-8CA0-46cd-960D14C158E4DBB2"); The Account Login name. Password hash String 40-character alphanumeric sq.SetPasswordHash ("489c830f10f7c601d30599a0deaf66e64d2aa50a"); The input must be a SHA-2 hash of the password in hexadecimal format. Used to check if it is on a watch list. Page 302 of 486 Canada Only November 2018 Table 87: Session Query transaction object optional values (continued) Type Limits Set method Value Description Account num- String 255-character alphanumeric ber sq.SetAccountNumber("3E17A905-AC8A-4c8d-A4173DADA2A55220"); The account number for the account. Account name String 255-character alphanumeric sq.SetAccountName("4590FCC0-DF4A-44d9-A57BAF9DE98B84DD"); Account name (or concatenation of first and last name of account holder). Account email String 100-character alphanumeric sq.SetAccountEmail("3CAE72EF-6B69-4a25-93FE2674735E78E8@test.threatmetrix.com"); The email address entered into the form for this contact. Used to check if this is a high risk account email id. Account telephone String 32-character alphanumeric Contact telephone number including country and city codes. All whitespace is removed. Must be in format: 0..9,,(,),[,] braces must be matched. Address street String 32-character 1 alphanumeric The first portion of the street address component of the account address. Address street String 32-character 2 alphanumeric The second portion of the street address component of the account address. Address city String 50-character alphanumeric The city component of the account address. Address state/- String 64-character province alphanumeric The state/province component of the account address Address coun- String 2-character try alphanumeric The 2 character ISO2 country code of the account address country November 2018 Canada Only Page 303 of 486 Moneris Gateway API - Integration Guide Table 87: Session Query transaction object optional values (continued) Type Limits Set method Value Description Address ZIP String 8-character alphanumeric The ZIP/postal code of the account address. Ship Address Street 1 String 32-character alphanumeric The first portion of the street address component of the shipping address Ship Address Street 2 String 32-character alphanumeric The second portion of the street address component of the shipping address Ship Address City String 50-character alphanumeric The city component of the shipping address Ship Address String 64-character State/Province alphanumeric The state/province component of the shipping address Ship Address Country String 2-character alphanumeric The 2 character ISO2 country code of the shipping address country Ship Address ZIP String 8-character alphanumeric The ZIP/postal code of the shipping address CC Number Hash String 255-character alphanumeric This is a SHA-2 hash (in hexadecimal format) of the credit card number. Custom Attrib- String 255-character ute 1-8 alphanumeric These 8 attributes can be used to pass custom attribute data which can be used within the rules. Page 304 of 486 Canada Only November 2018 Sample Session Query - CA namespace Moneris { using System; using System.Collections; public class TestCanadaRiskCheckSession { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string session_id = "abc123"; string service_type = "session"; //string event_type = "LOGIN"; string processing_country_code = "CA"; bool status_check = false; SessionQuery sq = new SessionQuery(); sq.SetOrderId(order_id); sq.SetSessionId(session_id); sq.SetServiceType(service_type); sq.SetEventType(service_type); //sq.SetPolicy(""); //sq.SetDeviceId("4EC40DE5-0770-4fa0-BE53-981C067C598D"); sq.SetAccountLogin("13195417-8CA0-46cd-960D-14C158E4DBB2"); sq.SetPasswordHash("489c830f10f7c601d30599a0deaf66e64d2aa50a"); sq.SetAccountNumber("3E17A905-AC8A-4c8d-A417-3DADA2A55220"); sq.SetAccountName("4590FCC0-DF4A-44d9-A57B-AF9DE98B84DD"); sq.SetAccountEmail("3CAE72EF-6B69-4a25-93FE-2674735E78E8@test.threatmetrix.com"); //sq.SetAccountTelephone("5556667777"); sq.SetPan("4242424242424242"); //sq.SetAccountAddressStreet1("3300 Bloor St W"); //sq.SetAccountAddressStreet2("4th Flr West Tower"); //sq.SetAccountAddressCity("Toronto"); //sq.SetAccountAddressState("Ontario"); //sq.SetAccountAddressCountry("CA"); //sq.SetAccountAddressZip("M8X2X2"); //sq.SetShippingAddressStreet1("3300 Bloor St W"); //sq.SetShippingAddressStreet2("4th Flr West Tower"); //sq.SetShippingAddressCity("Toronto"); //sq.SetShippingAddressState("Ontario"); //sq.SetShippingAddressCountry("CA"); //sq.SetShippingAddressZip("M8X2X2"); //sq.SetLocalAttrib1("a"); //sq.SetLocalAttrib2("b"); //sq.SetLocalAttrib3("c"); //sq.SetLocalAttrib4("d"); //sq.SetLocalAttrib5("e"); //sq.SetTransactionAmount("1.00"); //sq.SetTransactionCurrency("840"); //set SessionAccountInfo sq.SetTransactionCurrency("CAN"); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(sq); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); November 2018 Canada Only Page 305 of 486 Moneris Gateway API - Integration Guide Sample Session Query - CA try { Hashtable results = new Hashtable(); string[] rules; Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); // results = receipt.GetResult(); //Iterate through the response // IDictionaryEnumerator r = results.GetEnumerator(); // while (r.MoveNext()) // { // Console.WriteLine(r.Key.ToString() + " = " + r.Value.ToString()); // } //Iterate through the rules that were fired rules = receipt.GetRules(); for (int i = 0; i < rules.Length; i++) { Console.WriteLine("RuleName = " + rules[i]); Console.WriteLine("RuleCode = " + receipt.GetRuleCode(rules[i])); Console.WriteLine("RuleMessageEn = " + receipt.GetRuleMessageEn(rules[i])); Console.WriteLine("RuleMessageFr = " + receipt.GetRuleMessageFr(rules[i])); } Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } // end TestRiskCheckSession } 9.3.3.1 Session Query Transaction Flow Figure 4: Session Query transaction flow 1. Cardholder logs onto the merchant website. 2. When the page has loaded in the cardholder's browser, special tags within the site allow information from the device to be gathered and sent to ThreatMetrix as the device fingerprint. The HTML tags should be placed where the cardholder is resident on the page for a couple of seconds to get the broadest data possible. 3. Customer submits a transaction. Page 306 of 486 Canada Only November 2018 4. Merchant’s web application makes a Session Query transaction to the Moneris Gateway using the same session id that was included in the device fingerprint. This call must be made within 30 minutes of profiling (2). 5. Moneris Gateway submits the Session Query data to ThreatMetrix. 6. ThreatMetrix uses the Session Query data and the device fingerprint information to assess the transaction against the rules. A score is generated based on the rules. 7. The merchant uses the returned device information in its risk analysis to make a business decision. The merchant may wish to continue or cancel with the cardholder’s payment transaction. 9.3.4 Attribute Query The Attribute Query is used to obtain a risk assessment of transaction-related identifiers such as the email address and the card number. Unlike the Session Query, the Attribute Query does not require the device fingerprinting information to be provided. AttributeQuery transaction object definition AttributeQuery aq = new AttributeQuery(); HttpsPostRequest object for AttributeQuery transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); Attribute Query transaction values Table 88: Attribute Query transaction object mandatory values Type Limits Set method Value Description Service type aq.SetServiceType(service_type); String N/A Which output fields are returned. session -- returns IP and device related attributes. Device ID String 36-character alphanumeric aq.SetDeviceId(""); Unique device identifier generated by a previous call to the ThreatMetrix sessionquery API. Credit card number String 20-character numeric aq.SetPan(pan); No spaces or dashes Most credit card numbers today are 16 digits, but some 13-digit numbers are still accepted by some issuers. This field has been intentionally expanded to 20 digits in consideration for future expansion and potential support of private label card ranges. November 2018 Canada Only Page 307 of 486 Moneris Gateway API - Integration Guide Table 88: Attribute Query transaction object mandatory values (continued) Type Limits Set method Value Description IP address String 64-character alphanumeric aq.SetIPAddress("192.168.0.1"); True IP address. Results will be returned as true_ip_geo, true_ip_score and so on. IP forwarded String 64-character alphanumeric aq.SetIPForwarded ("192.168.1.0"); The IP address of the proxy. If the IPAddress is supplied, results will be returned as proxy_ip_geo and proxy_ip_score. If the IP Address is not supplied, this IP address will be treated as the true IP address and results will be returned as true_ip_geo, true_ip_score and so on aq.SetAccountAddressStreet1 Account String 32-character alphanumeric ("3300 Bloor St W"); address street 1 First portion of the street address component of the billing address. aq.SetAccountAddressStreet2("4th Account String 32-character alphanumeric Flr West Tower"); Address Street 2 Second portion of the street address component of the billing address. Account address city String 50-character alphanumeric aq.SetAccountAddressCity ("Toronto"); The city component of the billing address. aq.SetAccountAddressState Account String 64-character alphanumeric ("Ontario"); address state/province The state component of the billing address. aq.SetAccountAddressCountry Account String 2-character alphanumeric ("CA"); address country ISO2 country code of the billing addresses. Account address zip/postal code String 8-character alphanumeric aq.SetAccountAddressZip ("M8X2X2"); Zip/postal code of the billing address. Shipping String 32-character alphanumeric address street 1 Account address country aq.SetShippingAddressStreet1 ("3300 Bloor St W"); aq.SetShippingAddressStreet2 Shipping String 32-character alphanumeric ("4th Flr West Tower"); Address Street 2 Second portion of the street address component of the shipping address. Page 308 of 486 Canada Only November 2018 Table 88: Attribute Query transaction object mandatory values (continued) Type Limits Set method Value Description Shipping Address City String 50-character alphanumeric aq.setShippingAddressCity ("Toronto"); City component of the shipping address. aq.setShippingAddressState Shipping String 64-character alphanumeric ("Ontario"); Address State/Province State/Province component of the shipping address. aq.setShippingAddressCountry Shipping String 2-character alphanumeric ("CA"); Address Country ISO2 country code of the account address country. Shipping Address zip/postal code String 8-character alphanumeric The zip/postal code component of the shipping address. Sample Attribute Query namespace Moneris { using System; using System.Collections; public class TestRiskCheckAttribute { public static void Main(string[] args) { string store_id = "moneris"; string api_token = "hurgle"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string service_type = "session"; string processing_country_code = "CA"; bool status_check = false; AttributeQuery aq = new AttributeQuery(); aq.SetOrderId(order_id); aq.SetServiceType(service_type); aq.setDeviceId(""); aq.setAccountLogin("13195417-8CA0-46cd-960D-14C158E4DBB2"); aq.setPasswordHash("489c830f10f7c601d30599a0deaf66e64d2aa50a"); aq.setAccountNumber("3E17A905-AC8A-4c8d-A417-3DADA2A55220"); aq.setAccountName("4590FCC0-DF4A-44d9-A57B-AF9DE98B84DD"); aq.setAccountEmail("3CAE72EF-6B69-4a25-93FE-2674735E78E8@test.threatmetrix.com"); //aq.setCCNumberHash("4242424242424242"); //aq.setIPAddress("192.168.0.1"); //aq.setIPForwarded("192.168.1.0"); aq.setAccountAddressStreet1("3300 Bloor St W"); aq.setAccountAddressStreet2("4th Flr West Tower"); aq.setAccountAddressCity("Toronto"); aq.setAccountAddressState("Ontario"); aq.setAccountAddressCountry("CA"); aq.setAccountAddressZip("M8X2X2"); November 2018 Canada Only Page 309 of 486 Moneris Gateway API - Integration Guide Sample Attribute Query aq.setShippingAddressStreet1("3300 Bloor St W"); aq.setShippingAddressStreet2("4th Flr West Tower"); aq.setShippingAddressCity("Toronto"); aq.setShippingAddressState("Ontario"); aq.setShippingAddressCountry("CA"); aq.setShippingAddressZip("M8X2X2"); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(aq); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Hashtable results = new Hashtable(); string[] rules; Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); results = receipt.GetResult(); //Iterate through the response IDictionaryEnumerator response = results.GetEnumerator(); while (response.MoveNext()) { Console.WriteLine(response.Key.ToString() + " = " + response.Value.ToString()); } //Iterate through the rules that were fired rules = receipt.GetRules(); for (int i = 0; i < rules.Length; i++) { Console.WriteLine("RuleName = " + rules[i]); Console.WriteLine("RuleCode = " + receipt.GetRuleCode(rules[i])); Console.WriteLine("RuleMessageEn = " + receipt.GetRuleMessageEn(rules[i])); Console.WriteLine("RuleMessageFr = " + receipt.GetRuleMessageFr(rules[i])); } Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } // end TestRiskCheckAttribute } Page 310 of 486 Canada Only November 2018 9.3.4.1 Attribute Query Transaction Flow Figure 5: Attribute query transaction flow 1. Cardholder logs onto merchant website and submits a transaction. 2. The merchant’s web application makes an Attribute Query transaction that includes the session ID to the Moneris Gateway. 3. Moneris Gateway submits Attribute Query data to ThreatMetrix. 4. ThreatMetrix uses the Attribute Query data to assess the transaction against the rules. A score is generated based on the rules. 5. The merchant uses the returned device information in its risk analysis to make a business decision. The merchant may wish to continue or cancel with the cardholder's payment transaction. 9.3.5 Handling Response Information When reviewing the response information and determining how to handle the transaction, it is recommended that you (either manually or through automated logic on your site) use the following pieces of information: l l l l Risk score Rules triggered (such as Rule Codes, Rule Names, Rule Messages) Results obtained from Verified by Visa, MasterCard Secure Code, AVS, CVD and the financial transaction authorization Response codes for the Transaction Risk Management Transaction that are included by automated processes. November 2018 Canada Only Page 311 of 486 Moneris Gateway API - Integration Guide 9.3.5.1 TRMT Response Fields Table 89: Receipt object response values for TRMT Type Limits Get method Value Definition Response Code String receipt.GetResponseCode(); 3-character alphanumeric 001 – Success 981 – Data error 982 – Duplicate Order ID 983 – Invalid Transaction 984 – Previously asserted 985 – Invalid activity description 986- Invalid impact description 987 – Invalid Confidence description 988 - Cannot find Previous Message String N/A receipt.GetMessage(); Response message Event type String N/A Type of transaction or event returned in the response. Org ID String N/A ThreatMetrix-defined unique transaction identifier Policy String N/A Policy used for the Session Query will be returned with the return request. If the Policy was not included, then the Policy name default is returned. Policy score String N/A The sum of all the risks weights from triggered rules within the selected policy in the range [-100…100] Request dur- String N/A ation Length of time it takes for the transaction to be processed. Page 312 of 486 Canada Only November 2018 Table 89: Receipt object response values for TRMT (continued) Type Limits Get method Value Definition Request ID String N/A Unique number and will always be returned with the return request. Request res- String N/A ult See 9.3.5.1 (page 312). Review status String Risk rating String N/A The transaction status based on the assessments and risk scores. N/A The rating based on the assessments and risk scores. Service type String N/A The service type will be returned in the attribute query response. Session ID String N/A Temporary identifier unique to the visitor will be returned in the return request. Summary risk score String Transaction ID String Unknown session String N/A Based on all of the returned values in the range [-100 … 100] N/A This is the transaction identifier and will always be returned in the response when supplied as input. N/A If present, the value is "yes". It indicates the session ID that was passed was not found. Table 90: Response code descriptions Value November 2018 Definition 001 Success 981 Data error 982 Duplicate order ID 983 Invalid transaction 984 Previously asserted 985 Invalid activity description Canada Only Page 313 of 486 Moneris Gateway API - Integration Guide Value Definition 986 Invalid impact description 987 Invalid confidence description 988 Cannot find previous Table 91: Request result values and descriptions Value Definition fail_duplicate_entities_of_same_type More than one entity of the same was specified, e.g. password_hash was specified twice. fail_incomplete ThreatMetrix was unable to process the request due to incomplete or incorrect input data fail_invalid_account_number The format of the supplied account number was invalid fail_invalid_characters Invalid characters submitted fail_invalid_charset The value of character set was invalid fail_invalid_currency_code The format of the currency_code was invalid fail_invalid_currency_format The format of the currency_format was invalid fail_invalid_telephone_number Format of the supplied telephone number was invalid fail_access ThreatMetrix was unable to process the request because of API verification failing fail_internal_error ThreatMetrix encountered an error while processing the request fail_invalid_device_id Format of the supplied device_id was invalid fail_invalid_email_address Format of the supplied email address was invalid fail_invalid_fuzzy_device_id The format of fuzzy_device_id was invalid fail_invalid_ip_address_parameter Format of a supplied ip_address parameter was invalid fail_invalid_parameter The format of the parameter was invalid, or the Page 314 of 486 Canada Only November 2018 Value Definition value is out of boundary fail_invalid_sha_hash The format of a parameter specified as a sha hash was invalid, sha hash included sha1/2/3 hash fail_invalid_submitter_id The format of the submitter id was invalid or the value is out of boundary fail_no_policy_configured No policy was configured against the org_id fail_not_enough_params Not enough device attributes were collected during profiling to perform a fingerprint match fail_parameter_overlength The value of the parameter was overlength fail_temporarily_unavailable Request failed because the service is temporarily unavailable fail_too_many_instances_of_same_parameter Multiple values for some parameters which only allow one instance fail_verification API query limit reached success ThreatMetrix was able to process the request successfully 9.3.5.2 Understanding the Risk Score For each Session Query or Attribute Query, a score with a value between -100 and +100 is returned based on the rules that were triggered for the transaction. Table 92 defines the risk scores ranges. Table 92: Session Query and Attribute Query risk score definitions Risk score Visa definition -100 to -1 A lower score indicates a higher probability that the transaction is fraudulent. 0 Neutral transaction 1 to 100 A higher score indicates a lower probability that the transaction is fraudulent. Note: All e-commerce transactions have some level of risk associated with them. Therefore, it is rare to see risk score in the high positive values. November 2018 Canada Only Page 315 of 486 Moneris Gateway API - Integration Guide When evaluating the risk of a transaction, the risk score gives an initial indicator of the potential risk that the transaction is fraudulent. Because some of the rules that are evaluated on each transaction may not be relevant to your business scenario, review the rules that were triggered for the transaction before determining how to handle the transaction. 9.3.5.3 Understanding the Rule Codes, Rule Names and Rule Messages The rule codes, rule names and rule messages provide details about what rules were triggered during the assessment of the information provided in the Session or Attribute Query. Each rule code has a rule name and rule message. The rule name and rule message are typically similar. Table 93 provides additional information on each rule. When evaluating the risk of a transaction, it is recommended that you review the rules that were triggered for the transaction and assess the relevance to your business. (That is, how does it relate to the typical buying habits of your customer base?) If you are automating some or all of the decision-making processes related to handling the responses, you may want to use the rule codes. If you are documenting manual processes, you may want to refer to the more user-friendly rule name or rule message. Table 93: Rule names, numbers and messages Rule name Rule number Rule message Rule explanation White lists DeviceWhitelisted WL001 Device White Listed Device is on the white list. This indicates that the device has been flagged as always "ok". Note: This rule is currently not in use. IPWhitelisted WL002 IP White Listed IP address is on the white list. This indicates the device has been flagged as always "ok". Note: This rule is currently not in use. EmailWhitelisted WL003 Email White Listed Email address is on the white list. This indicates that the device has been flagged as always "ok". Note: This rule is currently not in use. Event velocity 2DevicePayment EV003 2 Device Payment Velocity Multiple payments were detected from this device in the past 24 hours. Page 316 of 486 Canada Only November 2018 Table 93: Rule names, numbers and messages (continued) Rule name 2IPPaymentVelocity Rule number Rule message Rule explanation EV006 2 IP Payment Velocity Multiple payments were detected from this IP within the past 24 hours. 2ProxyPaymentVelocity EV008 2 Proxy Payment Velocity The device has used 3 or more different proxies during a 24 hour period. This could be a risk or it could be someone using a legitimate corporate proxy. Email 3EmailPerDeviceDay EM001 3 Emails for the Device ID in 1 Day This device has presented 3 different email IDs within the past 24 hours. 3EmailPerDeviceWeek EM002 3 emails for the Device ID in 1 week This device has presented 3 different email IDs within the past week. 3DevciePerEmailDay EM003 3 Device Ids for email address in 1 day This email has been presented from three different devices in the past 24 hours. 3DevciePerEmailWeek EM004 3 Device Ids for email address in 1 week This email has been presented from three different devices in the past week. EmailDistanceTravelled EM005 Email Distance Travelled This email address has been associated with different physical locations in a short period of time. 3EmailPerSmartIDHour EM006 3 Emails for SmartID in 1 Hour The SmartID for this device has been associated with 3 different email addresses in 1 hour. GlobalEMailOverOneMonth EM007 Global Email over 1 month The e-mail address involved in the transaction over 30 days ago. This generally indicates that the transaction is less risky. Note: This rule is set so that it does not impact the policy score or risk rating. ComputerGeneratedEmailAddress November 2018 EM008 Canada Only Computer Generated Email Address Page 317 of 486 Moneris Gateway API - Integration Guide Table 93: Rule names, numbers and messages (continued) Rule name Rule number Rule message Rule explanation This transaction used a computer-generated email address. Account Number 3AccountNumberPerDeviceDay AN001 3 Account Numbers for device in 1 day This device has presented 3 different user accounts within the past 24 hours. 3AccountNumberPerDeviceWeek AN002 3 Account Numbers for device in 1 week This device has presented 3 different user accounts within the past week. 3DevciePerAccountNumberDay AN003 3 Device IDs for account number in 1 day This user account been used from three different devices in the past 24 hours. 3DevciePerAccountNumberWeek AN004 3 Device IDs for account number in 1 week This card number has been used from three different devices in the past week. AccountNumberDistanceTravelled AN005 Account Number distance travelled This card number has been used from a number of physically different locations in a short period of time. Credit card/payments 3CreditCardPerDeviceDay CP001 3 credit cards for device in 1 day This device has used three credit cards within 24 hours. 3CreditCardPerDeviceWeek CP002 3 credit cards for device in 1 week This device has used three credit cards within 1 week. 3DevicePerCreditCardDay CP003 3 device ids for credit card in 1 day This credit card has been used on three different devices in 24 hours. 3DevciePerCreditCardWeek CP004 3 device ids for credit card in 1 week This credit card has been used on three different devices in 1 week. Page 318 of 486 Canada Only November 2018 Table 93: Rule names, numbers and messages (continued) Rule name CredtCardDistanceTravelled Rule number Rule message Rule explanation CP005 Credit Card has travelled The credit card has been used at a number of physically different locations in a short period of time. CreditCardShipAddressGeoMismatch CP006 Credit Card and Ship Address do not match The credit card was issued in a region different from the Ship To Address information provided. CreditCardBillAddressGeoMismatch CP007 Credit Card and Billing Address do not match The credit card was issued in a region different from the Billing Address information provided. CreditCardDeviceGeoMismatch CP008 Credit Card and device location do not match The device is located in a region different from where the card was issued. CreditCardBINShipAddressGeoMismatch CP009 Credit Card issuing location and Shipping address do not match The credit card was issued in a region different from the Ship To Address information provided. CreditCardBINBillAddressGeoMismatch CP010 Credit Card issuing location and Billing address do not match The credit card was issued in a region different from the Billing Address information provided. CreditCardBINDeviceGeoMismatch CP011 Credit Card issuing location and location of the device do not match The device is located in a region different from where the card was issued. TransactionValueDay CP012 Daily Transaction Value Threshold The transaction value exceeds the daily threshold. TransactionValueWeek CP013 Weekly Transaction Value Threshold The transaction value exceeds the weekly threshold. Proxy rules 3ProxyPerDeviceDay PX001 3 Proxy Ips in 1 day This device has used three different proxy servers in the past 24 hours. November 2018 Canada Only Page 319 of 486 Moneris Gateway API - Integration Guide Table 93: Rule names, numbers and messages (continued) Rule name AnonymousProxy Rule number Rule message Rule explanation PX002 Anonymous Proxy IP This device is using an anonymous proxy UnusualProxyAttributes PX003 Unusual Proxy Attributes This transaction is coming from a source with unusual proxy attributes. AnonymousProxy PX004 Anonymous Proxy This device is connecting through an anonymous proxy connection. HiddenProxy PX005 Hidden Proxy This device is connecting via a hidden proxy server. OpenProxy PX006 Open Proxy This transaction is coming from a source that is using an open proxy. TransparentProxy PX007 Transparent Proxy This transaction is coming from a source that is using a transparent proxy. DeviceProxyGeoMismatch PX008 Proxy and True GEO Match This device is connecting through a proxy server that didn’t match the devices geo-location. ProxyTrueISPMismatch PX009 Proxy and True ISP Match This device is connecting through a proxy server that doesn’t match the true IP address of the device. ProxyTrueOrganizationMismatch PX010 Proxy and True Org Match The Proxy information and True ISP information for this source do not match. DeviceProxyRegionMismatch PX011 Proxy and True Region Match The proxy and device region location information do not match. ProxyNegativeReputation PX012 Proxy IP Flagged Risky in Reputation Network This device is connecting from a proxy server with a known negative reputation. Page 320 of 486 Canada Only November 2018 Table 93: Rule names, numbers and messages (continued) Rule name SatelliteProxyISP Rule number Rule message Rule explanation PX013 Satellite Proxy This transaction is coming from a source that is using a satellite proxy. GEO DeviceCountriesNotAllowed GE001 True GEO in Countries Not Allowed blacklist This device is connecting from a high-risk geographic location. DeviceCountriesNotAllowed GE002 True GEO in Countries Not Allowed (negative whitelist) The device is from a region that is not on the whitelist of regions that are accepted. DeviceProxyGeoMismatch GE003 True GEO different from Proxy GEO The true geographical location of this device is different from the proxy geographical location. DeviceAccountGeoMismatch GE004 Account Address different from True GEO This device has presented an account billing address that doesn't match the devices geolocation. DeviceShipGeoMismatch GE005 Device and Ship Geo mismatch The location of the device and the shipping address do not match. DeviceShipGeoMismatch GE006 Device and Ship Geo mismatch The location of the device and the shipping address do not match. Device SatelliteISP DV001 Satellite ISP This transaction is from a source that is using a satellite ISP. MidsessionChange DV002 Session Changed Mid-session This device changed session details and identifiers in the middle of a session. November 2018 Canada Only Page 321 of 486 Moneris Gateway API - Integration Guide Table 93: Rule names, numbers and messages (continued) Rule name LanguageMismatch Rule number Rule message Rule explanation DV003 Language Mismatch The language of the user does not match the primary language spoken in the location where the True IP is registered. NoDeviceID DV004 No Device ID No device ID was available for this transaction. Dial-upConnection DV005 Dial-up connection This device uses a less identifiable dial-up connection. DeviceNegativeReputation DV006 Device Blacklisted in Reputational Network This device has a known negative reputation as reported to the fraud network. DeviceGlobalBlacklist DV007 Device on the Global Black List This device has been flagged on the global blacklist of known problem devices. DeviceCompromisedDay DV008 Device compromised in last day This device has been reported as compromised in the last 24 hours. DeviceCompromisedHour DV009 Device compromised in last hour This device has been reported as compromised in the last hour. FlashImagesCookiesDisabled DV010 Flash Images Cookies Disabled Key browser functions/identifiers have been disabled on this device. FlashCookiesDisabled DV011 Flash Cookies Disabled Key browser functions/identifiers have been disabled on this device. FlashDisabled DV012 Flash Disabled Key browser functions/identifiers have been disabled on this device. ImagesDisabled DV013 Images Disabled Key browser functions/identifiers have been disabled on this device. Page 322 of 486 Canada Only November 2018 Table 93: Rule names, numbers and messages (continued) Rule number Rule name Rule message Rule explanation CookiesDisabled DV014 Cookies Disabled Key browser functions/identifiers have been disabled on this device. DeviceDistanceTravelled DV015 Device Distance Travelled The device has been used from multiple physical locations in a short period of time. PossibleCookieWiping DV016 Cookie Wiping This device appears to be deleting cookies after each session. PossibleCookieCopying DV017 Possible Cookie Copying This device appears to be copying cookies. PossibleVPNConnection DV018 Possibly using a VPN Connection This device may be using a VPN connection 9.3.5.4 Examples of Risk Response Session Query Sample Risk Response - Session Query 001 Success abc123 yes payment session -25 riskcheck42 11kue096 91C1879B-33D4-4D72-8FCB-B60A172B3CAC medium success -25 default review ComputerGeneratedEMail UN001 November 2018 Canada Only Page 323 of 486 Moneris Gateway API - Integration Guide Sample Risk Response - Session Query Unknown Rule Regle Inconnus NoDeviceID DV004 No Device ID null Attribute Query Sample Risk Response - Attribute Query 11kue096 443D7FB5-CC5C-4917-A57E-27EAC824069C session medium -25 success default -25 riskcheck19 review ComputerGeneratedEMail UN001 Unknown Rule Regle Inconnus NoDeviceID DV004 No Device ID null 9.3.6 Inserting the Profiling Tags Into Your Website Place the profiling tags on an HTML page served by your web application such that ThreatMetrix can collect device information from the customer’s web browser. The tags must be placed on a page that a visitor would display in a browser window for 3-5 seconds (such as a page that requires a user to input Page 324 of 486 Canada Only November 2018 data). After the device is profiled, a Session Query may be used to obtain the detail device information for risk assessment before submitting a financial payment transaction. There are two profiling tags that require two variables. Those tags are org_id and session_id. session_id must match the session ID value that is to be passed in the Session Query transaction. The valid org_id values are: 11kue096 QA testing environment. lbhqgx47 Production environment. Below is an HTML sample of the profiling tags. NOTE: Your site must replace in the sample code with a unique alphanumeric value each time you fingerprint a new customer.

November 2018 Canada Only Page 325 of 486 9.4 Encorporating All Available Fraud Tools l l l 9.4.1 Implementation Options for TRMT 9.4.2 Implementation Checklist 9.4.3 Making a Decision To minimize fraudulent activity in online transactions, Moneris recommends that you implement all of the fraud tools available through the Moneris Gateway. These are explained below: Address Verification Service (AVS) Verifies the cardholder's billing address information. Verified by Visa, MasterCard Secure Code and Amex SafeKey (VbV/MCSC/SafeKey) Authenticates the cardholder at the time of an online transaction. Card Validation Digit (CVD) Validates that cardholder is in possession of a genuine credit card during the transaction. Note that all responses that are returned from these verification methods are intended to provide added security and fraud prevention. The response itself does not affect the completion of a transaction. Upon receiving a response, the choice to proceed with a transaction is left entirely to the merchant. 9.4.1 Implementation Options for TRMT Option A Process a Transaction Risk Management Tool query and obtain the response. You can then decide whether to continue with the transaction, abort the transaction, or use additional efraud features. If you want to use additional efraud features, perform one or both of the following to help make your decision about whether to continue with the transaction or abort it: l l Process a VbV/MCSC/SafeKey transaction and obtain the response. The merchant then makes the decision whether to continue with the transaction or to abort it. Process a financial transaction including AVS/CVD details and obtain the response. The merchant then makes a decision whether to continue with the transaction or to abort it. Option B 1. 2. 3. 4. Process a Transaction Risk Management Tool query and obtain the response. Process a VbV/MCSC/SafeKey transaction and obtain the response. Process a financial transaction including AVS/CVD details and obtain the response. Merchant then makes a one-time decision based on the responses received from the eFraud tools. 9.4.2 Implementation Checklist The following checklists provide high-level tasks that are required as part of your implementation of the Transaction Risk Management Tool. Because each organization has certain project requirements for implementing system and process changes, this list is only a guideline, and does not cover all aspects of your project. November 2018 Page 326 of 486 Moneris Gateway API - Integration Guide Download and review all of the applicable APIs and Integration Guides Please review the sections outlined within this document that refers to the following feature Table 94: API documentation Document/API Use the document if you are…. Transaction Risk Management Tool Integration Guide (Section #) Implementing or updating your integration for the Transaction Risk Management Tool Moneris MPI – Verified by Visa/MasterCard SecureCode/American Express SafeKey – Java API Integration Guide Implementing or updating Verified by Visa, MasterCard SecureCode or American Express SafeKey Basic transaction with VS and CVD (Section#) Implementing or updating transaction processing, AVS or CVD Design your transaction flow and business processes When designing your transaction flow, think about which scenarios you would like to have automated, and which scenarios you would like to have handled manually by your employees. The “Understand Transaction Risk Management Transaction Flow” and Handling Response Information (page 311) sections can help you work through the design of your transaction and process flows. Things to consider when designing your process flows: l l l Processes for notifying people within your organization when there is scheduled maintenance for Moneris Gateway. Handling refunds, canceled orders and so on. Communicating with customers when you will not be shipping the goods because of suspected fraud, back-ordered goods and so on. Complete your development and testing l The Moneris Gateway API - Integration Guide provides the technical details required for the development and testing. Ensure that you follow the testing instructions and data provided. If you are an integrator l l l Ensure that your solution meets the requirements for PCI-DSS/PA-DSS as applicable. Send an email to eproducts@moneris.com with the subject line “Certification Request”. Develop material to set up your customers as quickly as possible with your solution and a Moneris account. Include information such as: l Steps they must take to enter their store ID or API token information into your solution. Page 327 of 486 November 2018 l Any optional services that you support via Moneris Gateway (such as TRMT, AVS, CVD, VBV/MCSC/SafeKey and so on) so that customers can request these features. 9.4.3 Making a Decision Depending on your business policies and processes, the information obtained from the fraud tools (such as AVS, CVD, VbV/MCSC/SafeKey and TRMT) can help you make an informed decision about whether to accept a transaction or deny it because it is potentially fraudulent. If you do not want to continue with a likely fraudulent transaction, you must inform the customer that you are not proceeding with their transaction. If you are attempting to do further authentication by using the available fraud tools, but you have received an approval response instead, cancel the financial transaction by doing one of the following: l l If the original transaction is a Purchase, use a Purchase Correction or Refund transaction. You will need the original order ID and transaction number. If the original transaction is a Pre-Authorization, use a Completion transaction for $0.00. November 2018 Page 328 of 486 10 Apple Pay In-App and on the Web Integration l l l l l 10.1 About Apple Pay In-App and on the Web Integration10.1 About Apple Pay In-App and on the Web Integration 10.2 About API Integration of Apple Pay 10.3 Apple Pay In-App Process Flows10.3 Apple Pay In-App Process Flows 10.4 Cavv Purchase – Apple Pay 10.4 Cavv Purchase – Apple Pay 10.5 Cavv Pre-Authorization – Apple Pay 10.1 About Apple Pay In-App and on the Web Integration The Moneris Gateway enables merchants to process in-app or on the web payment methods in mobile applications and the Safari web browser on Apple devices via Apple Pay. Moneris Solutions offers two processing and integration methods for Apple Pay. Merchants can choose to use one of two methods: l l Software Development Kit (SDK), or API While both methods provide the same basic payment features, there are differences in their implementations. This guide only deals with the API method; for detailed information about the SDK method of integration, see the Moneris Developer Portal at https://developer.moneris.com. 10.2 About API Integration of Apple Pay An API integration works to provide a communication link between the merchants’ server and Moneris’ server. APIs are required to complete any transaction, and therefore the APIs for Apple Pay are also included within an SDK integration. If the merchant chooses to use only an API integration, the merchant must decrypt payload information themselves before sending the decrypted information to the Moneris Gateway to be processed. Because this process is complicated, Apple recommend only businesses with expertise and a previously integrated payment processing system use APIs instead of SDKs. 10.2.1 Transaction Types That Use Apple Pay In the Moneris Gateway API, there are two transaction types that allow you to process decrypted transaction payload information with Apple Pay: l l 10.4 Cavv Purchase – Apple Pay 10.4 Cavv Purchase – Apple Pay 10.5 Cavv Pre-Authorization – Apple Pay November 2018 Page 329 of 486 Moneris Gateway API - Integration Guide NOTE: INTERAC® e-Commerce functionality is currently available using the Cavv Purchase transaction type only. Once you have processed the initial transaction using Cavv Purchase or Cavv Pre-Authorization, if required you can then process any of the following transactions: l l l Refund (page 35) Pre-Authorization Completion (page 25) Purchase Correction (page 33) 10.3 Apple Pay In-App Process Flows For both API and SDK methods of mobile in-app integration, the merchant’s iOS app uses Apple’s PassKit Framework to request and receive encrypted payment details from Apple. When payment details are returned in their encrypted form, they can be decrypted and processed by the Moneris Gateway in one of two ways: SDK or API. Steps in the Apple Pay In-App and on the Web payment process API 1. Merchant’s mobile application or web page requests and receives the encrypted payload. 2. Encrypted payload is sent to the merchant’s server, where it is decrypted. Page 330 of 486 November 2018 10 Apple Pay In-App and on the Web Integration 3. Moneris Gateway receives the decrypted payload from the merchant’s server, and processes the Cavv Purchase – Apple Pay (page 331)Cavv Purchase – Apple Pay (page 331) or Cavv Pre-Authorization – Apple Pay (page 336)Cavv Pre-Authorization – Apple Pay (page 336) transaction. a. Please ensure the wallet indicator is properly populated with the correct value (APP for Apple Pay In-App or APW for Apple Pay on the Web). SDK 1. Merchant's mobile application or web page requests and receives the encrypted payload. 2. Encrypted payload is sent from the merchant’s server to the Moneris Gateway, and the payload is decrypted and processed. This guide only deals with the API method; for detailed information about the SDK method of integration, see the Moneris Developer Portal at https://developer.moneris.com. 10.4 Cavv Purchase – Apple Pay The Cavv Purchase for Apple Pay transaction follows a 3-D Secure model but it does not require an MPI. Once the Apple Pay payload has been decrypted, this Purchase verifies funds on the customer’s card, removes the funds and prepares them for deposit into the merchant’s account. For Apple Pay processing, this transaction is only applicable if choosing to integrate directly to the Apple Wallet (if not using the Moneris Apple Pay SDK). Please refer to 10 Apple Pay In-App and on the Web Integration for more details on your integration options. Refer to Apple's Developer Portal for details on integrating directly to Apple Wallet to retrieve the payload data. CavvPurchase transaction object definition CavvPurchase cavvPurchase = new CavvPurchase(); HttpsPostRequest object for Cavv Purchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(cavvPurchase); Cavv Purchase transaction values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields November 2018 Page 331 of 486 Moneris Gateway API - Integration Guide Table 95: Cavv Purchase transaction object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric cavvPurchase.SetOrderId (order_id); Amount String 10-character decimal cavvPurchase.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number Page 332 of 486 String 20-character alphanumeric cavvPurchase.SetPan(pan); November 2018 10 Apple Pay In-App and on the Web Integration Table 95: Cavv Purchase transaction object mandatory values Value Expiry date Type String Limits 4-character alphanumeric Set method cavvPurchase.SetExpdate (expiry_date); YYMM format CAVV String 100-character alphanumeric cavvPurchase.SetCavv(cavv); String 1-character alphanumeric cavvPurchase.SetCryptType (crypt); NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, CAVV field contains the decrypted cryptogram. For more, see Appendix A Definitions of Request Fields. E-commerce indicator NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, the E-commerce indicator is a mandatory field containing the value received from the decrypted payload or a default value of 5. If you get a 2-character value (e.g.,. 05 or 07) from the payload, remove the initial 0 and just send us the 2nd character. For more, see Appendix A Definitions of Request Fields. November 2018 Page 333 of 486 Moneris Gateway API - Integration Guide Table 1 CavvPurchase transaction object optional values Value Type Limits Set Method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric cavvPurchase.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric cavvPurchase .SetDynamicDescriptor (dynamic_descriptor); Card Match ID String 50-character alphanumeric cavvPurchase.SetCmId (transaction_id); Customer information Object N/A cavvPurchase.SetCustInfo (customer); Network String alphabetical cavvPurchase.setNetwork (network); String 3-character alphanumeric cavvPurchase.setDataType (data_type); NOTE: Applies to Offlinx™ only; must be unique value for each transaction NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Data Type NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Page 334 of 486 November 2018 10 Apple Pay In-App and on the Web Integration Sample Cavv Purchase for Apple Pay namespace Moneris { using System; using System.Collections; public class TestCanadaCavvPurchase { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUS887H67"; string amount = "10.42"; string pan = "4242424242424242"; string expdate = "1901"; //YYMM string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA="; string dynamic_descriptor = "123456"; string wallet_indicator = "APP"; string processing_country_code = "CA"; string crypt_type = "5"; bool status_check = false; CofInfo cof = new CofInfo(); cof.SetPaymentIndicator("U"); cof.SetPaymentInformation("2"); cof.SetIssuerId("168451306048014"); CavvPurchase cavvPurchase = new CavvPurchase(); cavvPurchase.SetOrderId(order_id); cavvPurchase.SetCustId(cust_id); cavvPurchase.SetAmount(amount); cavvPurchase.SetPan(pan); cavvPurchase.SetExpDate(expdate); cavvPurchase.SetCavv(cavv); cavvPurchase.SetCryptType(crypt_type); //Mandatory for AMEX cards only cavvPurchase.SetDynamicDescriptor(dynamic_descriptor); //cavvPurchase.SetNetwork("Interac"); //set only for Interac e-commerce //cavvPurchase.SetDataType("3DSecure"); //set only for Interac e-commerce //cavvPurchase.SetWalletIndicator(wallet_indicator); //set only wallet transactions e.g. APPLE PAY //cavvPurchase.SetCmId("8nAK8712sGaAkls56"); //set only for usage with Offlinx - Unique max 50 alphanumeric characters transaction id generated by merchant cavvPurchase.SetCofInfo(cof); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(cavvPurchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); November 2018 Page 335 of 486 Moneris Gateway API - Integration Guide Sample Cavv Purchase for Apple Pay Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.WriteLine("IssuerId = " + receipt.GetIssuerId()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 10.5 Cavv Pre-Authorization – Apple Pay The Cavv Pre-Authorization for Apple Pay transaction follows a 3-D Secure model but it does not require an MPI. Once the Apple Pay payload has been decrypted, this Pre-Authorization verifies funds on the customer’s card, and holds the funds. To prepare the funds for deposit into the merchant’s account please process a Pre-Authorization Completion transaction. For Apple Pay processing, this transaction is only applicable if choosing to integrate directly to the Apple Wallet (if not using the Moneris Apple Pay SDK). Please refer to 10 Apple Pay In-App and on the Web Integration for more details on your integration options. Refer to Apple's Developer Portal for details on integrating directly to Apple Wallet to retrieve the payload data. NOTE: INTERAC® e-Commerce functionality is currently available using the Cavv Purchase transaction type only. Cavv Pre-Authorization transaction object definition CavvPreAuth cavvPreauth = new CavvPreAuth(); HttpsPostRequest object for Cavv Pre-Authorization transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(cavvPreauth); Page 336 of 486 November 2018 10 Apple Pay In-App and on the Web Integration Cavv Pre-Authorization transaction values Table 96: Cavv Pre-Authorization object mandatory values Value Type Limits Set method Order ID String 50-character alphanumeric cavvPreauth.SetOrderId(order_ id); Amount String 10-character decimal cavvPreauth.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number November 2018 String 20-character numeric cavvPreauth.SetPan(pan); Page 337 of 486 Moneris Gateway API - Integration Guide Value Type Limits Set method Cardholder Authentication Verification Value (CAVV) String 50-character alphanumeric cavvPreauth.SetCavv(cavv); Expiry date String 4-character numeric cavvPreauth.SetExpdate (expiry_date); E-commerce indicator String 1-character alphanumeric cavvPreauth.SetCryptType (crypt); NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, CAVV field contains the decrypted cryptogram. For more, see Appendix A Definitions of Request Fields. NOTE: For Apple Pay Cavv Purchase and Cavv Pre-Authorization transactions, the E-commerce indicator is a mandatory field containing the value received from the decrypted payload or a default value of 5. If you get a 2-character value (e.g.,. 05 or 07) from the payload, remove the initial 0 and just send us the 2nd character. For more, see Appendix A Definitions of Request Fields. Table 1 Cavv Pre-Authorization object optional values Value Type Limits Set method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric cavvPreauth.SetCustId(cust_ id); Dynamic descriptor String 20-character alpha- cavvPreauth Page 338 of 486 November 2018 10 Apple Pay In-App and on the Web Integration Value Card Match ID Type Limits Set method numeric .SetDynamicDescriptor (dynamic_descriptor); String 50-character alphanumeric cavvPreauth.SetCmId (transaction_id); String alphabetical cavvPurchase.setNetwork (network); String 3-character alphanumeric cavvPurchase.setDataType (data_type); NOTE: Applies to Offlinx™ only; must be unique value for each transaction Network NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Data Type NOTE: This request variable is mandatory for INTERAC® e-Commerce transactions conducted via Apple Pay, and is not for use with credit card transactions. Sample Cavv Pre-Authorization for Apple Pay namespace Moneris { using System; using System.Collections; public class TestCanadaCavvPreauth { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "CUS887H67"; string amount = "10.42"; string pan = "4242424242424242"; November 2018 Page 339 of 486 Moneris Gateway API - Integration Guide Sample Cavv Pre-Authorization for Apple Pay string expdate = "1911"; //YYMM format string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA="; string dynamic_descriptor = "123456"; string wallet_indicator = "APP"; string processing_country_code = "CA"; string crypt_type = "5"; bool status_check = false; CofInfo cof = new CofInfo(); cof.SetPaymentIndicator("U"); cof.SetPaymentInformation("2"); cof.SetIssuerId("168451306048014"); CavvPreAuth cavvPreauth = new CavvPreAuth(); cavvPreauth.SetOrderId(order_id); cavvPreauth.SetCustId(cust_id); cavvPreauth.SetAmount(amount); cavvPreauth.SetPan(pan); cavvPreauth.SetExpDate(expdate); cavvPreauth.SetCavv(cavv); cavvPreauth.SetCryptType(crypt_type); //Mandatory for AMEX cards only cavvPreauth.SetDynamicDescriptor(dynamic_descriptor); //cavvPreauth.SetWalletIndicator(wallet_indicator); //set only wallet transactions e.g. APPLE PAY //cavvPreauth.SetCmId("8nAK8712sGaAkls56"); //set only for usage with Offlinx - Unique max 50 alphanumeric characters transaction id generated by merchant cavvPreauth.SetCofInfo(cof); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(cavvPreauth); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.WriteLine("IssuerId = " + receipt.GetIssuerId()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); Page 340 of 486 November 2018 10 Apple Pay In-App and on the Web Integration Sample Cavv Pre-Authorization for Apple Pay } } } } November 2018 Page 341 of 486 Moneris Gateway API - Integration Guide 11 Offlinx™ l l What Is a Pixel Tag? Offlinx™ and API Transactions 11.1 What Is a Pixel Tag? A pixel tag is a piece of code that goes on a web page and requests an image file (a tiny transparent image or pixel) when loaded, which, while not visible to the user, allows Offlinx™ to gather relevant information about the user. The data collected by our pixel tag is: l l l Anonymous (not personally identifiable) and compliant with privacy standards Secure — utilizes SSL communication to transmit the data securely Not shared with anyone 11.2 Offlinx™ and API Transactions The Offlinx™ Card Match pixel tag feature can be implemented via the Unified API with the Card Match ID variable, which corresponds to the Transaction ID in Offlinx™. The Card Match ID must be a unique value for each transaction. For more information about the Offlinx™ solution, consult the Offlinx™ Pixel Tag Setup Guide available from your account/service manager. API transactions where this applies: l l l l l l Purchase Pre-Authorization Purchase with 3-D Secure – cavvPurchase Pre-Authorization with 3-D Secure – cavvPreauth Cavv Purchase – Apple Pay Cavv Pre-Authorization – Apple Pay Page 342 of 486 November 2018 12 Convenience Fee l l l l 12.1 12.2 12.3 12.4 About Convenience Fee Purchase with Convenience Fee Convenience Fee Purchase w/ Customer Information Convenience Fee Purchase with VbV, MCSC and Amex SafeKey 12.1 About Convenience Fee The Convenience Fee program was designed to allow merchants to offer the convenience of an alternative payment channel to the cardholder at a charge. This applies only when providing a true "convenience" in the form of an alternative payment channel outside the merchant's customary face-to-face payment channels. The convenience fee will be a separate charge on top of what the consumer is paying for the goods and/or services they were given, and this charge will appear as a separate line item on the consumer’s statement. NOTE: The Convenience Fee program is only offered to certain supported Merchant Category Codes (MCCs). Please speak to your account manager for further details. 12.2 Purchase with Convenience Fee NOTE: Convenience Fee Purchase with Customer Information is also supported. Convenience Fee Purchase transaction object definition Purchase purchase = new Purchase(); HttpsPostRequest object for Convenience Fee Purchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(purchase); Convenience Fee Purchase transaction object values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields November 2018 Page 343 of 486 Moneris Gateway API - Integration Guide Table 1 Convenience Fee Purchase transaction object mandatory values Value Type Limits Set Method Convenience Fee Object n/a purchase.SetConvFeeInfo (convFeeInfo); Order ID String 50-character alphanumeric purchase.SetOrderId(order_ id); Amount String 10-character decimal purchase.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character numeric purchase.SetPan(pan); Expiry date String 4-character numeric YYMM format purchase.SetExpdate(expiry_ date); E-commerce indicator String 1-character alphanumeric purchase.SetCryptType(crypt); Convenience fee amount String 9-character decimal .SetConvFeeInfo(convfee_ amount); Table 2 Convenience Fee Purchase transaction object optional values Value Type Limits Set Method Customer ID String 50-character alphanumeric purchase.SetCustId(cust_id); Dynamic descriptor String 20-character alphanumeric purchase.SetDynamicDescriptor (dynamic_descriptor); AVS information Object purchase.SetAvsInfo (avsCheck); CVD information Object purchase.SetCvdInfo (cvdCheck); Page 344 of 486 November 2018 12 Convenience Fee Sample Purchase with Convenience Fee namespace Moneris { using System; public class TestCanadaConvFeePurchase { public static void Main(string[] args) { string store_id = "monca00392"; string api_token = "qYdISUhHiOdfTr1CLNpN"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "5.00"; string pan = "4242424242424242"; string expdate = "1602"; //YYMM format string crypt = "7"; string convenience_fee = "1.00"; string processing_country_code = "CA"; bool status_check = false; ConvFeeInfo convFeeInfo = new ConvFeeInfo(); convFeeInfo.SetConvenienceFee(convenience_fee); Purchase purchase = new Purchase(); purchase.SetOrderId(order_id); purchase.SetAmount(amount); purchase.SetPan(pan); purchase.SetExpDate(expdate); purchase.SetCryptType(crypt); purchase.SetConvFeeInfo(convFeeInfo); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(purchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CfSuccess = " + receipt.GetCfSuccess()); Console.WriteLine("CfStatus = " + receipt.GetCfStatus()); Console.WriteLine("FeeAmount = " + receipt.GetFeeAmount()); Console.WriteLine("FeeRate = " + receipt.GetFeeRate()); Console.WriteLine("FeeType = " + receipt.GetFeeType()); //Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); November 2018 Page 345 of 486 Moneris Gateway API - Integration Guide Sample Purchase with Convenience Fee //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 12.3 Convenience Fee Purchase w/ Customer Information Convenience Fee Purchase with Customer information transaction object definition Purchase purchase = new Purchase(); HttpsPostRequest object for Convenience Fee Purchase with Customer Info transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(purchase); Convenience Fee Purchase with Customer information transaction object values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields Table 1 Convenience Fee Purchase w/ Customer Info transaction object mandatory values Value Type Limits Set Method Convenience Fee Object n/a purchase.SetConvFeeInfo (convFeeInfo); Order ID String 50-character alphanumeric purchase.SetOrderId(order_ id); Amount String 10-character decimal purchase.SetAmount(amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number Page 346 of 486 String 20-character numeric purchase.SetPan(pan); November 2018 12 Convenience Fee Table 1 Convenience Fee Purchase w/ Customer Info transaction object mandatory values (continued) Value Type Limits Set Method Expiry date String 4-character numeric YYMM format purchase.SetExpdate(expiry_ date); E-commerce indicator String 1-character alphanumeric purchase.SetCryptType(crypt); Convenience fee amount String 9-character decimal purchase.SetConvFeeInfo (convfee_amount); Table 2 Convenience Fee Purchase w/ Customer Info transaction object optional values Value Type Limits Set Method Customer ID String 50-character alphanumeric purchase.SetCustId(cust_id); Dynamic descriptor String 20-character alphanumeric purchase.SetDynamicDescriptor (dynamic_descriptor); Customer information Object n/a purchase.SetCustInfo (customer); AVS information Object n/a purchase.SetAvsInfo (avsCheck); CVD information Object n/a purchase.SetCvdInfo (cvdCheck); Sample Convenience Fee Purchase with Customer Information namespace Moneris { using System; public class TestCanadaConvFeePurchaseCustInfo { public static void Main(string[] args) { string store_id = "monca00392"; string api_token = "qYdISUhHiOdfTr1CLNpN"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "5.00"; string pan = "4005554444444403"; string expdate = "1602"; //YYMM format November 2018 Page 347 of 486 Moneris Gateway API - Integration Guide Sample Convenience Fee Purchase with Customer Information string crypt = "7"; string cust_id = "my customer id"; string convenience_fee = "1.00"; string processing_country_code = "CA"; bool status_check = false; ConvFeeInfo convFeeInfo = new ConvFeeInfo(); convFeeInfo.SetConvenienceFee(convenience_fee); Purchase purchase = new Purchase(); purchase.SetOrderId(order_id); purchase.SetCustId(cust_id); purchase.SetAmount(amount); purchase.SetPan(pan); purchase.SetExpDate(expdate); purchase.SetCryptType(crypt); purchase.SetConvFeeInfo(convFeeInfo); /********************* Billing/Shipping Variables ****************************/ string first_name = "Bob"; string last_name = "Smith"; string company_name = "ProLine Inc."; string address = "623 Bears Ave"; string city = "Chicago"; string province = "Illinois"; string postal_code = "M1M2M1"; string country = "Canada"; string phone = "777-999-7777"; string fax = "777-999-7778"; string tax1 = "10.00"; string tax2 = "5.78"; string tax3 = "4.56"; string shipping_cost = "10.00"; /********************* Order Line Item Variables *****************************/ string[] item_description = new string[] { "Chicago Bears Helmet", "Soldier Field Poster" }; string[] item_quantity = new string[] { "1", "1" }; string[] item_product_code = new string[] { "CB3450", "SF998S" }; string[] item_extended_amount = new string[] { "150.00", "19.79" }; /********************** Customer Information Object **************************/ CustInfo customer = new CustInfo(); /********************** Set Customer Billing Information **********************/ customer.SetBilling(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); /******************** Set Customer Shipping Information ***********************/ customer.SetShipping(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); /***************************** Order Line Items ******************************/ customer.SetItem(item_description[0], item_quantity[0], item_product_code[0], item_extended_amount[0]); customer.SetItem(item_description[1], item_quantity[1], item_product_code[1], item_extended_amount[1]); purchase.SetCustInfo(customer); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(purchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); Page 348 of 486 November 2018 12 Convenience Fee Sample Convenience Fee Purchase with Customer Information try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("CfSuccess = " + receipt.GetCfSuccess()); Console.WriteLine("CfStatus = " + receipt.GetCfStatus()); Console.WriteLine("FeeAmount = " + receipt.GetFeeAmount()); Console.WriteLine("FeeRate = " + receipt.GetFeeRate()); Console.WriteLine("FeeType = " + receipt.GetFeeType()); //Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 12.4 Convenience Fee Purchase with VbV, MCSC and Amex SafeKey Convenience Fee Purchase with VbV/MCSC/SafeKey transaction object definition CavvPurchase cavvPurchase = new CavvPurchase(); HttpsPostRequest object for Convenience Fee Purchase w/ VbV/MCSC/SafeKey transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(cavvPurchase); Convenience Fee Purchase with VbV/MCSC/SafeKey transaction object values For a full description of mandatory and optional values, see Appendix A Definitions of Request Fields November 2018 Page 349 of 486 Moneris Gateway API - Integration Guide Table 1 Convenience Fee Purchase with VbV, MCSC, SafeKey - Required Fields Value Type Limits Set Method Convenience Fee Object N/A cavvPurchase.SetConvFeeInfo (convFeeInfo); Order ID String 50-character alphanumeric cavvPurchase.SetOrderId (order_id); Amount String 10-character decimal cavvPurchase.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Credit card number String 20-character numeric cavvPurchase.SetPan(pan); Expiry date String 4-character numeric YYMM format cavvPurchase.SetExpdate (expiry_date); E-Commerce indicator String 1-character alphanumeric cavvPurchase.SetCryptType (crypt); Cardholder Authentication Verification Value (CAVV) String 50-character alphanumeric cavvPurchase.SetCavv(cavv); Convenience fee amount String 9-character decimal .SetConvFeeInfo(convfee_ amount); Table 2 Convenience Fee Purchase with VbV, MCSC, SafeKey - Optional Values Value Type Limits Set Method Status Check Boolean true/false mpgReq.SetStatusCheck(status_ check); Customer ID String 50-character alphanumeric cavvPurchase.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric cavvPurchase .SetDynamicDescriptor (dynamic_descriptor); Page 350 of 486 November 2018 12 Convenience Fee Value Type Limits Set Method E-commerce indicator String 1-character numeric cavvPurchase.SetCryptType (crypt); Customer Information Object N/A cavvPurchase.SetCustInfo (customer); AVS Information Object N/A cavvPurchase.SetAvsInfo (avsCheck); CVD Information Object N/A cavvPurchase.SetCvdInfo (cvdCheck); Sample Purchase with VbV/MCSC/SafeKey namespace Moneris { using System; using System.Collections; public class TestCanadaConvFeeCavvPurchase { public static void Main(string[] args) { string store_id = "monca00392"; string api_token = "qYdISUhHiOdfTr1CLNpN"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string cust_id = "B_Urlac_54"; string amount = "10.42"; string pan = "4005554444444403"; string expdate = "1901"; //YYMM format string cavv = "AAABBJg0VhI0VniQEjRWAAAAAAA"; string crypt_type = "5"; string convenience_fee = "1.00"; string dynamic_descriptor = "my descriptor"; string processing_country_code = "CA"; bool status_check = false; AvsInfo avsCheck = new AvsInfo(); avsCheck.SetAvsStreetNumber("212"); avsCheck.SetAvsStreetName("Payton Street"); avsCheck.SetAvsZipCode("M1M1M1"); CvdInfo cvdCheck = new CvdInfo(); cvdCheck.SetCvdIndicator("1"); cvdCheck.SetCvdValue("099"); ConvFeeInfo convFeeInfo = new ConvFeeInfo(); convFeeInfo.SetConvenienceFee(convenience_fee); CavvPurchase cavvPurchase = new CavvPurchase(); cavvPurchase.SetOrderId(order_id); cavvPurchase.SetCustId(cust_id); cavvPurchase.SetAmount(amount); cavvPurchase.SetPan(pan); cavvPurchase.SetExpDate(expdate); cavvPurchase.SetCavv(cavv); cavvPurchase.SetCryptType(crypt_type); //Mandatory for AMEX cards only November 2018 Page 351 of 486 Moneris Gateway API - Integration Guide Sample Purchase with VbV/MCSC/SafeKey cavvPurchase.SetDynamicDescriptor(dynamic_descriptor); cavvPurchase.SetAvsInfo(avsCheck); cavvPurchase.SetCvdInfo(cvdCheck); cavvPurchase.SetConvFeeInfo(convFeeInfo); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(cavvPurchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("Avs Response = " + receipt.GetAvsResultCode()); Console.WriteLine("Cvd Response = " + receipt.GetCvdResultCode()); //Console.WriteLine("CardLevelResult = " + receipt.GetCardLevelResult()); Console.WriteLine("CavvResultCode = " + receipt.GetCavvResultCode()); Console.WriteLine("CfSuccess = " + receipt.GetCfSuccess()); Console.WriteLine("CfStatus = " + receipt.GetCfStatus()); Console.WriteLine("FeeAmount = " + receipt.GetFeeAmount()); Console.WriteLine("FeeRate = " + receipt.GetFeeRate()); Console.WriteLine("FeeType = " + receipt.GetFeeType()); //Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); //Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Page 352 of 486 November 2018 13 Recurring Billing l l l l l 1 About Recurring Billing 13.2 Purchase with Recurring Billing 13.3 Recurring Billing Update 1 Recurring Billing Response Fields and Codes 13.5 Credential on File and Recurring Billing 13.1 About Recurring Billing Recurring Billing allows you to set up payments whereby Moneris automatically processes the transactions and bills customers on your behalf based on the billing cycle information you provide. Recurring Billing series are created by sending the Recurring Billing object in these transactions: l l l Purchase Purchase with Vault Purchase with 3-D Secure (cavvPurchase) You can modify a Recurring Billing series after it has been created by sending the Recurring Billing Update administrative transaction. NOTE: Alternatively, if you prefer to manage recurring series on your own merchant system, you can send the periodic payments as basic Purchase transactions with the e-commerce indicator (crypt_type) value = 2 and with the Credential on File info object included. 13.2 Purchase with Recurring Billing Recurring Billing Info Object Definition Recur recurring_cycle = new Recur(recur_unit, start_now, start_date, num_ recurs, period, recur_amount); Transaction object set method .SetRecur(recurring_cycle); Recurring Billing Info Object Request Fields Variable and Field Name Type and Limits Number of Recurs String num_recurs numeric, 1-99 Period String November 2018 Description The number of times that the transaction must recur Number of recur units that Page 353 of 486 Moneris Gateway API - Integration Guide Variable and Field Name Type and Limits Description period numeric, 1-999 must pass between recurring billings Start Date String start_date YYYY/MM/DD Date of the first future recurring billing transaction This value must be a date in the future If an additional charge is to be made immediately, the value of Start Now must be set to true Start Now String start_now true/false If a single charge is to be made against the card immediately, set this value to true; the amount to be billed immediately may differ from the amount billed on a regular basis thereafter If the billing is to start in the future, set this value to false When set to false, use Card Verification prior to sending the Purchase with Recur and Credential on File objects Recurring Amount String recur_amount 10-character decimal Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point Amount of the recurring transaction This is the amount that will be billed on the Start Date and then billed repeatedly based on the interval defined by Period and Recur Unit EXAMPLE: 1234567.89 Recur Unit String recur_unit day, week, month or eom Unit to be used as a basis for the interval Works in conjunction with Period to define the billing frequency Possible values are: Page 354 of 486 November 2018 13 Recurring Billing Variable and Field Name Type and Limits Description day week month eom (end of month) Sample Purchase with Recurring Billing namespace Moneris { using System; using System.Collections; public class TestCanadaPurchaseRecur { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "10.00"; string pan = "4242424242424242"; string expiry_date = "1901"; //YYMM format string crypt = "7"; /************************* Recur Variables **********************************/ string recur_unit = "month"; //eom = end of month string start_now = "true"; string start_date = "2016/07/28"; string num_recurs = "12"; string period = "1"; string recur_amount = "30.00"; string processing_country_code = "CA"; bool status_check = false; /************************* Recur Object Option1 ******************************/ Recur recurring_cycle = new Recur(recur_unit, start_now, start_date, num_recurs, period, recur_amount); /************************* Recur Object Option2 ******************************/ Hashtable recur_hash = new Hashtable(); recur_hash.Add("recur_unit", recur_unit); recur_hash.Add("start_now", start_now); recur_hash.Add("start_date", start_date); recur_hash.Add("num_recurs", num_recurs); recur_hash.Add("period", period); recur_hash.Add("recur_amount", recur_amount); Recur recurring_cycle2 = new Recur(recur_hash); /************************ Transactional Object *******************************/ Purchase purchase = new Purchase(order_id, amount, pan, expiry_date, crypt); /******************************* Set Recur ***********************************/ purchase.SetRecur(recurring_cycle); CofInfo cof = new CofInfo(); cof.SetPaymentIndicator("R"); cof.SetPaymentInformation("2"); cof.SetIssuerId("168451306048014"); purchase.SetCofInfo(cof); /**************************** Https Post Request ***************************/ HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); November 2018 Page 355 of 486 Moneris Gateway API - Integration Guide Sample Purchase with Recurring Billing mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(purchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); /******************************* Receipt ***********************************/ try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("Recur Success = " + receipt.GetRecurSuccess()); Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit()); Console.WriteLine("IssuerId = " + receipt.GetIssuerId()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 13.3 Recurring Billing Update After you have set up a Recurring Billing transaction series, you can change some of the details of the series as long as it has not yet completed the preset recurring duration (i.e., it hasn’t terminated yet). Before sending a Recurring Billing Update transaction that updates the credit card number, you must send a Card Verification request. This requirement does not apply if you are only updating the schedule or amount. Things to Consider: l When completing the update recurring billing portion please keep in mind that the recur bill dates cannot be changed to have an end date greater than 10 years from Page 356 of 486 November 2018 13 Recurring Billing today and cannot be changed to have an end date end today or earlier. Recurring Billing Update transaction object definition RecurUpdate recurUpdate = new RecurUpdate(); HttpsPostRequest object for Recurring Billing Update transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(recurUpdate); Recurring Billing Update transaction values Table 1 Recurring Billing Update – Basic Required Fields Variable and Field Name Type and Limits Set Method recurUpdate.setCustId(cust_ id); Order ID String order_id 50-character alphanumeric Table 2 Recurring Billing Update – Basic Optional Fields Variable and Field Name Type and Limits Set Method recurUpdate.setCustId(cust_ id); Customer ID String cust_id 50-character alphanumeric Credit card number String pan 20-character alphanumeric Expiry date String expiry_date YYMM recurUpdate.SetPan(pan); recurUpdate.setExpdate (expiry_date); Table 3 Recurring Billing Update – Recurring Billing Required Fields Variable and Field Name Recurring November 2018 Type and Limits String Set Method recurUpdate.SetRecurAmount (recur_amount); Description Changes the amount that is Page 357 of 486 Moneris Gateway API - Integration Guide Variable and Field Name amount recur_ amount Type and Limits Set Method Description billed recurrently 10-character decimal; Up to 7 digits (dollars) + decimal point + 2 digits (cents) after the decimal point The change takes effect on the next charge EXAMPLE: 1234567.89 Add number of recurs String recurUpdate.SetAddNumRecurs (add_num); numeric, 1-999 add_num Adds to the given number of recurring transactions to the current (remaining) number This can be used if a customer decides to extend a membership or subscription Cannot be used to decrease the current number of recurring transactions; use Change number of recurs instead Change number of recurs String recurUpdate.SetTotalNumRecurs (total_num); Replaces the current (remaining) number of recurring transactions recurUpdate.SetHold(hold); Temporarily pauses recurring billing numeric, 1-999 total_num Hold recurring billing hold Page 358 of 486 String true/false While a transaction is on hold, it is not billed for the recurring amount; however, the number of remaining recurs continues to be decremented dur- November 2018 13 Recurring Billing Variable and Field Name Type and Limits Set Method Description ing that time Terminate recurring transaction recurUpdate.SetTerminate (terminate); String Terminates recurring billing true/false NOTE: After it has been terminated, a recurring transaction cannot be reactivated; a new purchase transaction with recurring billing must be submitted. terminate Sample Recurring Billing Update namespace Moneris { using System; public class TestCanadaRecurUpdate { public static void Main(string[] args) { string store_id = "store5"; string api_token = "yesguy"; string order_id = "Test20150625013553"; string cust_id = "antonio"; string recur_amount = "1.50"; string pan = "4242424242424242"; string expiry_date = "1901"; //string add_num = ""; //string total_num = ""; //string hold = ""; //string terminate = ""; string processing_country_code = "CA"; bool status_check = false; CofInfo cof = new CofInfo(); cof.SetIssuerId("139X3130ASCXAS9"); RecurUpdate recurUpdate = new RecurUpdate(); recurUpdate.SetOrderId(order_id); recurUpdate.SetCustId(cust_id); recurUpdate.SetRecurAmount(recur_amount); recurUpdate.SetPan(pan); recurUpdate.SetExpDate(expiry_date); //recurUpdate.SetAddNumRecurs(add_num); //recurUpdate.SetTotalNumRecurs(total_num); //recurUpdate.SetHold(hold); November 2018 Page 359 of 486 Moneris Gateway API - Integration Guide Sample Recurring Billing Update //recurUpdate.SetTerminate(terminate); recurUpdate.SetCofInfo(cof); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(recurUpdate); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("RecurUpdateSuccess = " + receipt.GetRecurUpdateSuccess()); Console.WriteLine("NextRecurDate = " + receipt.GetNextRecurDate()); Console.WriteLine("RecurEndDate = " + receipt.GetRecurEndDate()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 13.4 Recurring Billing Response Fields and Codes Table 97 outlines the response fields that are part of recurring billing. Some are available when you set up recurring billing (such as with a Purchase transaction), and some are available when you update an existing transaction with the Recurring Billing transaction. Receipt object definition Receipt receipt = mpgReq.GetReceipt(); Table 97: Recurring Billing response fields Value Type Limits Get method Description Transaction object with Recurring Billing response fields Response code Page 360 of 486 String 3-character numeric receipt.GetResponseCode(); See Table 98: for a description of possible response codes. November 2018 13 Recurring Billing Table 97: Recurring Billing response fields Value Type Limits Get method Description Recur success receipt.GetRecurSuccess(); String TBD Indicates whether the transaction successfully registered Recur update object response fields Recur update success String true/false Next recur date String yyyy-mm-dd format Recur end date String yyyy-mm-dd format receipt.GetRecurUpdateSuccess(); Indicates whether the transaction successfully updated. receipt.GetNextRecurDate(); Indicates when the transaction will be billed again. receipt.GetRecurEndDate(); Indicates when the Recurring Billing Transaction will end. The Recur Update response is a 3-digit numeric value. The following is a list of all possible responses after a Recur Update transaction has been sent. Table 98: Recur update response codes Request Value Definition 001 Recurring transaction successfully updated (optional: terminated) 983 Cannot find the previous transaction 984 Data error: (optional: field name) 985 Invalid number of recurs 986 Incomplete: timed out null Error: Malformed XML 13.5 Credential on File and Recurring Billing NOTE: The value of the payment indicator field must be R when sending Recurring Billing transactions. For Recurring Billing transactions which are set to start immediately: November 2018 Page 361 of 486 Moneris Gateway API - Integration Guide 1. Send a Purchase transaction request with both the Recurring Billing and Credential on File info objects For Recurring Billing transactions which are set to start on a future date: 1. Send Card Verification transaction request including the Credential on File info object to get the Issuer ID 2. Send Purchase transaction request with the Recur and Credential on File info objects included For updating a Recurring Billing series where you are updating the card number (does not apply if you are only modifying the schedule or amount in a recurring series): 1. Send Card Verification request including the Credential on File info object to get the Issuer ID 2. Send a Recurring Billing Update transaction For more information about the Recurring Billing object, see Definition of Request Fields – Recurring. Page 362 of 486 November 2018 14 Customer Information l l 14.1 Using the Customer Information Object 14.2 Customer Information Sample Code An optional add-on to a number of transactions the Customer Information object. The Customer Information object offers a number of fields to be submitted as part of the financial transaction, and stored by Moneris. These details may be viewed in the future in the Merchant Resource Center. The following transactions support the Customer Information object : l l l Purchase (Basic, Interac Debit and Vault) Pre-Authorization (Basic and Vault) Re-Authorization (Basic) The Customer Information object holds three types of information: l l l Miscellaneous customer information properties Billing/Shipping information Item information Things to Consider: l l l l If you send characters that are not included in the allowed list, these extra transaction details may not be stored. All fields are alphanumeric and allow the following characters: a-z A-Z 0-9 _ - : . @ $ = / All French accents should be encoded as HTML entities, such as é. The data sent in Billing and Shipping Address fields will not be used for any address verification. 14.1 Using the Customer Information Object l l l 14.1.1 CustInfo Object – Miscellaneous Properties 14.1.2 CustInfo Object – Billing and Shipping Information 14.1.3 CustInfo Object – Item Information In addition to instantiating a transaction object and a connection object (as you would for a normal transaction), you must instantiate a CustInfo object. Any transaction that supports CustInfo has a setCustInfo method. This is used to write the customer information to the transaction object before writing the transaction object to the connection object. CustInfo object definition CustInfo customer = new CustInfo(); November 2018 Page 363 of 486 Moneris Gateway API - Integration Guide Transaction object set method .SetCustInfo(customer); 14.1.1 CustInfo Object – Miscellaneous Properties While most of the customer information data is organized into objects, there are some values that are properties of the CustInfo object itself. They are explained in the table below. Table 99: CustInfo object miscellaneous properties Value Type Limits Set method Email Address String 60-character alphanumeric customer.SetEmail(email); Instructions String 100-character alphanumeric customer.SetInstructions(note); 14.1.2 CustInfo Object – Billing and Shipping Information Billing and shipping information is stored as part of the CustInfo object. They can be written to the object in one of two ways: l l Using set methods Using hash tables Whichever method you use, you will be writing the information found in the table below for both the billing information and the shipping information. All values are alphanumeric strings. Their maximum lengths are given in the Limit column. Table 100: Billing and shipping information values Value Limit Hash table key First name 30 "first_name" Last name 30 "last_name" Company name 50 "company_name" Address 70 "address" City 30 "city" Province/State 30 "province" Page 364 of 486 November 2018 14 Customer Information Table 100: Billing and shipping information values (continued) Value Limit Hash table key Postal/Zip code 30 "postal_code" Country 30 "country" Phone number (voice) 30 "phone" Fax number 30 "fax" Federal tax 10 "tax1" Provincial/State tax 10 "tax2" County/Local/Specialty tax 10 "tax3" Shipping cost 10 "shipping_cost" 14.1.2.1 Set Methods for Billing and Shipping Info The billing information and the shipping information for a given CustInfo object are written by using the customer.SetBilling() and customer.SetShipping() methods respectively: customer.SetBilling(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); customer.SetShipping(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); Both of these methods have the same set of mandatory arguments. They are described in the Billing and shipping information values table in 14.1.2.1 Set Methods for Billing and Shipping Info. For sample code, see 14.2 Customer Information Sample Code. 14.1.2.2 Using Hash Tables for Billing and Shipping Info Writing billing or shipping information using hash tables is done as follows: 1. Instantiate a CustInfo object. 2. Instantiate a hash table object. (The sample code uses a different hash table for billing and shipping for clarity purposes. However, the skillful developer can re-use the same one.) 3. Build the hash table using put methods with the hash table keys found in the Billing and shipping information values table in 14.1.2 CustInfo Object – Billing and Shipping Information. 4. Call the CustInfo object's setBilling/setShipping method to pass the hash table information to the CustInfo object 5. Call the transaction object's setCustInfo method to write the CustInfo object (with the billing/shipping information to the transaction object. For sample code, see 14.2 Customer Information Sample Code. November 2018 Page 365 of 486 Moneris Gateway API - Integration Guide 14.1.3 CustInfo Object – Item Information The CustInfo object can hold information about multiple items. For each item, the values in the table below can be written. All values are strings, but note the guidelines in the Limits column. Table 101: Item information values Value Limits Hash table key Item name 45-character alphanumeric "name" Item quantity 5-character numeric "quantity" Item product code 20-character alphanumeric "product_code" Item extended amount "extended_ amount" 9-character decimal with at least 3 digits and 2 penny values. 0.01-999999.99 One way of representing multiple items is with four arrays. This is the method used in the sample code. However, there are two ways to write the item information to the CustInfo object: l l Set methods Hash tables 14.1.3.1 Set Methods for Item Information All the item information found in the Item information values table in 14.1.3 CustInfo Object – Item Information is written to the CustInfo object in one instruction for a given item. Such as: customer.setItem(item_description, item_quantity, item_product_code, item_ extended_amount); For sample code (showing how to use arrays to write information about two items), see 14.2 Customer Information Sample Code. 14.1.3.2 Using Hash Tables for Item Information Writing item information using hash tables is done as follows: 1. Instantiate a CustInfo object. 2. Instantiate a hash table object. (The sample code uses a different hash table for each item for clarity purposes. However, the skillful developer can re-use the same one.) 3. Build the hash table using put methods with the hash table keys in the Item information values table in 14.1.3 CustInfo Object – Item Information. 4. Call the CustInfo object's setItem method to pass the hash table information to the CustInfo object 5. Call the transaction object's setCustInfo method to write the CustInfo object (with the item information to the transaction object. Page 366 of 486 November 2018 14 Customer Information For sample code that shows how to use arrays to write information about two items, see 14.2 Customer Information Sample Code. 14.2 Customer Information Sample Code Below are two examples of a Basic Purchase Transaction with Customer Information. Both samples start with the same declaration of variables, as shown. Values that are not involved in the Customer Information feature are not shown. Note that the two items ordered are represented by four arrays, and the billing and shipping details are the same. Declaring the variables (common to both methods) string first_name = "Bob"; string last_name = "Smith"; string company_name = "ProLine Inc."; string address = "623 Bears Ave"; string city = "Chicago"; string province = "Illinois"; string postal_code = "M1M2M1"; string country = "Canada"; string phone = "777-999-7777"; string fax = "777-999-7778"; string tax1 = "10.00"; string tax2 = "5.78"; string tax3 = "4.56"; string shipping_cost = "10.00"; /********************* Order Line Item Variables *****************************/ string[] item_description = new string[] { "Chicago Bears Helmet", "Soldier Field Poster" }; string[] item_quantity = new string[] { "1", "1" }; string[] item_product_code = new string[] { "CB3450", "SF998S" }; string[] item_extended_amount = new string[] { "150.00", "19.79" }; Sample Purchase with Customer Information – Set method version CustInfo customer = new CustInfo(); /********************** Set Customer Billing Information **********************/ customer.SetBilling(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); /******************** Set Customer Shipping Information ***********************/ customer.SetShipping(first_name, last_name, company_name, address, city, province, postal_code, country, phone, fax, tax1, tax2, tax3, shipping_cost); /***************************** Order Line Items ******************************/ customer.SetItem(item_description[0], item_quantity[0], item_product_code[0], item_extended_amount[0]); customer.SetItem(item_description[1], item_quantity[1], item_product_code[1], item_extended_amount[1]); November 2018 Page 367 of 486 Moneris Gateway API - Integration Guide Sample Purchase with Customer Information – Hash table version CustInfo customer2 = new CustInfo(); /******************************* Billing Hashtable ***************************/ Hashtable b = new Hashtable(); //billing hashtable b.Add("first_name", first_name); b.Add("last_name", last_name); b.Add("company_name", company_name); b.Add("address", address); b.Add("city", city); b.Add("province", province); b.Add("postal_code", postal_code); b.Add("country", country); b.Add("phone", phone); b.Add("fax", fax); b.Add("tax1", tax1); //federal tax b.Add("tax2", tax2); //prov tax b.Add("tax3", tax3); //luxury tax b.Add("shipping_cost", shipping_cost); //shipping cost customer2.SetBilling(b); /****************************** Shipping Hashtable ***************************/ Hashtable s = new Hashtable(); //shipping hashtable s.Add("first_name", first_name); s.Add("last_name", last_name); s.Add("company_name", company_name); s.Add("address", address); s.Add("city", city); s.Add("province", province); s.Add("postal_code", postal_code); s.Add("country", country); s.Add("phone", phone); s.Add("fax", fax); s.Add("tax1", tax1); //federal tax s.Add("tax2", tax2); //prov tax s.Add("tax3", tax3); //luxury tax s.Add("shipping_cost", shipping_cost); //shipping cost customer2.SetShipping(s); /************************* Order Line Item1 Hashtable ************************/ Hashtable i1 = new Hashtable(); //item hashtable #1 i1.Add("name", item_description[0]); i1.Add("quantity", item_quantity[0]); i1.Add("product_code", item_product_code[0]); i1.Add("extended_amount", item_extended_amount[0]); customer2.SetItem(i1); /************************* Order Line Item2 Hashtable **************************/ Hashtable i2 = new Hashtable(); //item hashtable #2 i2.Add("name", "item2's name"); i2.Add("quantity", "7"); i2.Add("product_code", "item2's product code"); i2.Add("extended_amount", "5.01"); customer2.SetItem(i2); Page 368 of 486 November 2018 15 Status Check l l l 15.1 About Status Check 15.2 Using Status Check Response Fields 15.3 Sample Purchase with Status Check 15.1 About Status Check Status Check is a connection object value that allows merchants to verify whether a previously sent transaction was processed successfully. To submit a Status Check request, resend the original transaction with all the same parameter values, but set the status check value to either true or false. Once set to “true”, the gateway will check the status of a transaction that has an order_id that matches the one passed. l l If the transaction is found, the gateway will respond with the specifics of that transaction. If the transaction is not found, the gateway will respond with a not found message. Once it is set to “false”, the transaction will process as a new transaction. For example, if you send a Purchase transaction with Status Check, include the same values as the original Purchase such as the order ID and the amount. The feature must be enabled in your merchant profile. To have it enabled, contact Moneris. Things to Consider: l l l The Status Check request should only be used once and immediately (within 2 minutes) after the last transaction that had failed. The Status Check request should not be used to check openTotals & batchClose requests. Do not resend the Status Check request if it has timed out. Additional investigation is required. 15.2 Using Status Check Response Fields After you have used the connection object to send a Status Check request, you can use the Receipt object to obtain the information you want regarding the success of the original transaction. The status response fields related to the status check are Status Code and Status Message. Possible Status Code response values: l l 0-49: successful transaction 50-999: unsuccessful transaction. November 2018 Page 369 of 486 Moneris Gateway API - Integration Guide Possible Status Message response values: l l Found: Status code is 0-49 Not found or Null: Status code is 50-999) If the Status Message is Found, all other response fields are the same as those from the original transaction. If the Status Message is Not found, all other response fields will be Null. 15.3 Sample Purchase with Status Check Sample Purchase transaction with Status Check using System; using System.Collections.Generic; using System.Text; using Moneris; namespace CanadaPurchaseConsoleTest { class CanadaPurchaseTest { public static void Main(string[] args) { Purchase purchase = new Purchase(); purchase.SetOrderId("order"); purchase.SetAmount("1.00"); purchase.SetPan("4242424242424242"); purchase.SetExpDate("2202"); purchase.SetCryptType("1"); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode("CA"); mpgReq.SetTestMode(true); mpgReq.SetStoreId("store1"); mpgReq.SetApiToken("yesguy"); mpgReq.SetTransaction(purchase); mpgReq.SetStatusCheck(true); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Page 370 of 486 November 2018 16 Visa Checkout l l l l l l l l l l 16.1 About Visa Checkout 16.2 Transaction Types - Visa Checkout 16.3 Integrating Visa Checkout Lightbox 16.4 Transaction Flow for Visa Checkout 16.5 Visa Checkout Purchase 16.6 Visa Checkout Pre-Authorization 16.7 Visa Checkout Completion 16.8 Visa Checkout Purchase Correction 16.9 Visa Checkout Refund 16.10 Visa Checkout Information 16.1 About Visa Checkout Visa Checkout is a digital wallet service offered to customers using credit cards. Visa Checkout functionality can be integrated into the Moneris Gateway via the API. 16.2 Transaction Types - Visa Checkout Below is a list of transactions supported by the Visa Checkout API, other terms used for the transaction type are indicated in brackets. VdotMePurchase (sale) Call to Moneris to obtain funds on the Visa Checkout callId and ready them for deposit into the merchant’s account. It also updates the customer’s Visa Checkout transaction history. VdotMePreAuth (authorisation / pre-authorization) Call to Moneris to verify funds on the Visa Checkout callid and reserve those funds for your merchant account. The funds are locked for a specified amount of time, based on the card issuer. To retrieve the funds from this call so that they may be settled in the merchant’s account, a VdotMeCompletion must be performed. It also updates the customer’s Visa Checkout transaction history. VdotMeCompletion (Completion / Capture) Call to Moneris to obtain funds reserved by VdotMePreAuth call. This transaction call retrieves the locked funds and readies them for settlement into the merchant’s account. This call must be made typically within 72 hours of performing VdotMePreAuth. It also updates the customer’s Visa Checkout transaction history. VdotMePurchaseCorrection (Void / Purchase Correction) Call to Moneris to void the VdotMePurchases and VdotMeCompletions the same day* that they occurred on. It also updates the customer’s Visa Checkout transaction history. VdotMeRefund (Credit) Call to Moneris to refund against a VdotMePurchase or VdotMeCompletion to refund any part, or all of the transaction. It also updates the customer’s Visa Checkout transaction history. November 2018 Page 371 of 486 Moneris Gateway API - Integration Guide VdotMeInfo (Credit) Call to Moneris to obtain cardholder details such as, name on card, partial card number, expiry date, shipping and billing information. 16.3 Integrating Visa Checkout Lightbox 1. Using the API Key you obtained when you configured your Visa Checkout store, create Visa Checkout Lightbox integration with JavaScript by following the Visa documentation, which is available on Visa Developer portal: Visa Checkout General Information (JavaScript SDK download) https://developer.visa.com/products/visa_checkout Getting Started With Visa checkout https://developer.visa.com/products/visa_checkout/guides#getting_started Adding Visa Checkout to Your Web Page https://developer.visa.com/products/visa_checkout/guides#adding_to_page Submitting the Consumer Payment Request https://developer.visa.com/products/visa_checkout/guides#submitting_csr 2. If you get a payment success event from the resulting Visa Lightbox JavaScript, you will have to parse and obtain the callid from their JSON response. The additional information is obtained using VdotMeInfo. Once you have obtained the callid from Visa Lightbox, you can make appropriate Visa Checkout VdotMe transaction call to Moneris to process your transaction and obtain your funds. NOTE: During Visa Checkout testing in our QA test environment, please use the API key that you generated in the Visa Checkout configuration for the V.Init call in your JavaScript. Page 372 of 486 November 2018 16 Visa Checkout 16.4 Transaction Flow for Visa Checkout November 2018 Page 373 of 486 Moneris Gateway API - Integration Guide 16.5 Visa Checkout Purchase VdotMePurchase transaction object definition VdotMePurchase vmepurchase = new VdotMePurchase(); HttpsPostRequest for VdotMePurchase transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vmepurchase); VdotMePurchase transaction object values Table 1 VdotMePurchase transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vmepurchase.SetOrderId(order_ id); Call ID String 20-character numeric vmepurchase.SetCallId(call_ id); Amount String 10-character decimal vmepurchase.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 E-commerce indicator String 1-character alphanumeric vmepurchase.SetCryptType (crypt); Table 2 VdotMePurchase transaction object optional values Value Type Limits Set Method Dynamic descriptor String 20-character alphanumeric vmepurchase .SetDynamicDescriptor (dynamic_descriptor); Status check Boolean true/false mpgReq.SetStatusCheck(status_ check); Page 374 of 486 November 2018 16 Visa Checkout Sample VdotMePurchase using System; using System.Collections.Generic; using System.Text; using Moneris; namespace Moneris { class TestCanadaVdotMePurchase { public static void Main(string[] args) { string store_id = "store2"; string api_token = "yesguy"; string cust_id = "Joe Doe"; string order_id = "VmeOrder" + DateTime.Now.ToString("yyyyMMddhhmmss"); string amount = "8.00"; string crypt_type = "7"; string call_id = "2374837188642083454"; string dynamic_descriptor = "inv123"; string processing_country_code = "CA"; bool status_check = false; VdotMePurchase vmepurchase = new VdotMePurchase(); vmepurchase.SetOrderId(order_id); vmepurchase.SetCustId(cust_id); vmepurchase.SetAmount(amount); vmepurchase.SetCallId(call_id); vmepurchase.SetCryptType(crypt_type); vmepurchase.SetDynamicDescriptor(dynamic_descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vmepurchase); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.WriteLine("\r\nPress the enter key to exit"); Console.ReadLine(); } November 2018 Page 375 of 486 Moneris Gateway API - Integration Guide Sample VdotMePurchase catch (Exception e) { Console.WriteLine(e); } } } } 16.6 Visa Checkout Pre-Authorization VdotMePreAuth is virtually identical to the VdotMePurchase with the exception of the transaction type name. If the order could not be completed for some reason, such as an order is cancelled, made in error or not fulfillable, the VdotMePreAuth transaction must be reversed within 72 hours. To reverse an authorization, perform a VdotMeCompletion transaction for $0.00 (zero dollars). VdotMePreAuth transaction object definition VdotMePreauth vMePreauthRequest = new VdotMePreauth(); HttpsPostRequest object for VdotMePreAuth transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vMePreauthRequest); VdotMePreAuth transaction object values Table 1 VdotMePreAuth transaction object mandatory values Value Amount Type String Limits 10-character decimal Set Method vDotMeReauthRequest.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Call ID String 20-character numeric vDotMeReauthRequest.SetCallId (call_id); Order ID String 50-character alphanumeric vDotMeReauthRequest .SetOrderId(order_id); Page 376 of 486 November 2018 16 Visa Checkout Value Type E-commerce indicator String Limits 1-character alphanumeric Set Method vDotMeReauthRequest .SetCryptType(crypt); Table 2 VdotMePreAuth transaction object optional values Value Type Limits Set Method Customer ID String 50-character alphanumeric vMePreauthRequest.SetCustId (cust_id); Dynamic descriptor String 20-character alphanumeric vDotMeReauthRequest .SetDynamicDescriptor (dynamic_descriptor); Sample VdotMePreAuth using System; namespace Moneris { class TestCanadaVdotMePreauth { public static void Main(string[] args) { string store_id = "store2"; string api_token = "yesguy"; string amount = "5.00"; string crypt_type = "7"; string order_id = "VmeOrder" + DateTime.Now.ToString("yyyyMMddhhmmss"); string call_id = "2336392495138357172"; string cust_id = "my customer id"; string processing_country_code = "CA"; bool status_check = false; VdotMePreauth vMePreauthRequest = new VdotMePreauth(); vMePreauthRequest.SetOrderId(order_id); vMePreauthRequest.SetAmount(amount); vMePreauthRequest.SetCallId(call_id); vMePreauthRequest.SetCustId(cust_id); vMePreauthRequest.SetCryptType(crypt_type); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vMePreauthRequest); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); November 2018 Page 377 of 486 Moneris Gateway API - Integration Guide Sample VdotMePreAuth Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.WriteLine("\r\nPress the enter key to exit"); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 16.7 Visa Checkout Completion The VdotMeCompletion transaction is used to secure the funds locked by a VdotMePreAuth transaction. You may also perform this transaction at $0.00 (zero dollars) to reverse a VdotMePreauth transaction that you are unable to fulfill. VdotMeCompletion transaction object definition VdotMeCompletion vmecompletion = new VdotMeCompletion(); HttpsPostRequest object for VdotMeCompletion transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vmecompletion); Page 378 of 486 November 2018 16 Visa Checkout VdotMeCompletion transaction object values Table 1 VdotMeCompletion transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vmecompletion.SetOrderId (order_id); Transaction number String 255-character alphanumeric vmecompletion.SetTxnNumber (txn_number); Completion amount String 10-character decimal vmecompletion.SetCompAmount (comp_amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 E-commerce indicator String 1-character alphanumeric vmecompletion.SetCryptType (crypt); Table 2 VdotMeCompletion transaction object optional values Value Type Limits Set Method Customer ID String 50-character alphanumeric vmecompletion.SetCustId(cust_ id); Dynamic descriptor String 20-character alphanumeric vmecompletion .SetDynamicDescriptor (dynamic_descriptor); Sample VdotMeCompletion using System; namespace Moneris { class TestCanadaVdotMeCompletion { public static void Main(string[] args) { string store_id = "store2"; string api_token = "yesguy"; string order_id = "VmeOrder20150626023358"; string txn_number = "737541-0_10"; string comp_amount = "1.00"; November 2018 Page 379 of 486 Moneris Gateway API - Integration Guide Sample VdotMeCompletion string ship_indicator = "P"; string crypt_type = "7"; string cust_id = "mycustomerid"; string dynamic_descriptor = "inv 123"; string processing_country_code = "CA"; bool status_check = false; VdotMeCompletion vmecompletion = new VdotMeCompletion(); vmecompletion.SetOrderId(order_id); vmecompletion.SetTxnNumber(txn_number); vmecompletion.SetAmount(comp_amount); vmecompletion.SetCryptType(crypt_type); vmecompletion.SetDynamicDescriptor(dynamic_descriptor); vmecompletion.SetCustId(cust_id); vmecompletion.SetShipIndicator(ship_indicator); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vmecompletion); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.WriteLine("\r\nPress the enter key to exit"); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 16.8 Visa Checkout Purchase Correction VdotMePurchaseCorrection is used to cancel a VdotMeCompletion or VdotMePurchase trans- action that was performed in the current batch. No other transaction types can be corrected using this Page 380 of 486 November 2018 16 Visa Checkout method. No amount is required because it is always for 100% of the original transaction. VdotMePurchaseCorrection transaction object definition VdotMePurchaseCorrection vDotMePurchaseCorrection = new VdotMePurchaseCorrection(); HttpsPostRequest object for VdotMePurchaseCorrection transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vDotMePurchaseCorrection); VdotMePurchaseCorrection transaction object values Table 1 VdotMePurchaseCorrection transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vDotMePurchaseCorrection .SetOrderId(order_id); Transaction number String 255-character alphanumeric vDotMePurchaseCorrection .SetTxnNumber(txn_number); Table 2 VdotMePurchaseCorrection transaction object optional values Value Type Limits Set Method Customer ID String 50-character alphanumeric vDotMePurchaseCorrection .SetCustId(cust_id); Status check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample VdotMePurchaseCorrection using System; using Moneris; namespace ACME { class TestCanadaVdotMePurchaseCorrection { public static void Main(string[] args) { string store_id = "store2"; string api_token = "yesguy"; string order_id = "VmeOrder20150626022834"; string txn_number = "737534-0_10"; string crypt_type = "7"; string cust_id = "my customer id"; November 2018 Page 381 of 486 Moneris Gateway API - Integration Guide Sample VdotMePurchaseCorrection string processing_country_code = "CA"; bool status_check = false; VdotMePurchaseCorrection vDotMePurchaseCorrection = new VdotMePurchaseCorrection(); vDotMePurchaseCorrection.SetOrderId(order_id); vDotMePurchaseCorrection.SetCustId(cust_id); vDotMePurchaseCorrection.SetTxnNumber(txn_number); vDotMePurchaseCorrection.SetCryptType(crypt_type); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vDotMePurchaseCorrection); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.WriteLine("\r\nPress the enter key to exit"); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } 16.9 Visa Checkout Refund VdotMeRefund will credit a specified amount to the cardholder’s credit card and update their Visa Checkout transaction history. A refund can be sent up to the full value of the original VdotMeCompletion or VdotMePurchase. VdotMeRefund transaction object definition VdotMeRefund vDotMeRefundRequest = new VdotMeRefund(); Page 382 of 486 November 2018 16 Visa Checkout HttpsPostRequest object for VdotMeRefund transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vDotMeRefundRequest); VdotMeRefund transaction object values Table 1 VdotMeRefund transaction object mandatory values Value Type Limits Set Method Order ID String 50-character alphanumeric vDotMeRefundRequest .SetOrderId(order_id); Amount String 10-character decimal vDotMeRefundRequest.SetAmount (amount); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction number String 255-character alphanumeric vDotMeRefundRequest .SetTxnNumber(txn_number); E-commerce indicator String 1-character alphanumeric vDotMeRefundRequest .SetCryptType(crypt); Table 2 VdotMeRefund transaction object optional values Value Type Limits Set Method Customer ID String 50-character alphanumeric vDotMeRefundRequest.SetCustId (cust_id); Dynamic descriptor String 20-character alphanumeric vDotMeRefundRequest .SetDynamicDescriptor (dynamic_descriptor); Status check Boolean true/false mpgReq.SetStatusCheck(status_ check); Sample VdotMeRefund using System; using Moneris; November 2018 Page 383 of 486 Moneris Gateway API - Integration Guide Sample VdotMeRefund namespace ACME { class TestCanadaVdotMeRefund { public static void Main(string[] args) { string store_id = "store2"; string api_token = "yesguy"; string order_id = "VmeOrder20150626023725"; string txn_number = "737545-0_10"; string amount = "1.00"; string crypt_type = "7"; string dynamic_descriptor = "inv 123"; string cust_id = "my customer id"; string processing_country_code = "CA"; bool status_check = false; VdotMeRefund vDotMeRefundRequest = new VdotMeRefund(); vDotMeRefundRequest.SetOrderId(order_id); vDotMeRefundRequest.SetAmount(amount); vDotMeRefundRequest.SetCustId(cust_id); vDotMeRefundRequest.SetTxnNumber(txn_number); vDotMeRefundRequest.SetCryptType(crypt_type); vDotMeRefundRequest.SetDynamicDescriptor(dynamic_descriptor); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vDotMeRefundRequest); mpgReq.SetStatusCheck(status_check); mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("StatusCode = " + receipt.GetStatusCode()); Console.WriteLine("StatusMessage = " + receipt.GetStatusMessage()); Console.WriteLine("\r\nPress the enter key to exit"); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } Page 384 of 486 November 2018 16 Visa Checkout Sample VdotMeRefund } } } 16.10 Visa Checkout Information VdotMeInfo will get customer information from their Visa Checkout wallet. The details returned are dependent on what the customer has stored in Visa Checkout. VdotMeInfo transaction object definition VdotMeInfo vmeinfo = new VdotMeInfo(); HttpsPostRequest object for VdotMeInfo transaction HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetTransaction(vmeinfo); VdotMeInfo transaction object values Table 1 VdotMeInfo transaction object mandatory values Value Call ID Type Limits String 20-character numeric Set Method vmeinfo.SetCallId(call_id); Sample VdotMeInfo using System; using System.Collections.Generic; using System.Text; namespace Moneris { public class TestCanadaVdotMeInfo { public static void Main(string[] args) { string store_id = "store2"; string api_token = "yesguy"; string call_id = "5840726785406561048"; string processing_country_code = "CA"; bool status_check = false; VdotMeInfo vmeinfo = new VdotMeInfo(); vmeinfo.SetCallId(call_id); HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(vmeinfo); mpgReq.SetStatusCheck(status_check); November 2018 Page 385 of 486 Moneris Gateway API - Integration Guide Sample VdotMeInfo mpgReq.Send(); try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("Response Code: " + receipt.GetResponseCode()); Console.WriteLine("Response Message: " + receipt.GetMessage()); Console.WriteLine("Currency Code: " + receipt.GetCurrencyCode()); Console.WriteLine("Payment Totals: " + receipt.GetPaymentTotal()); Console.WriteLine("User First Name: " + receipt.GetUserFirstName()); Console.WriteLine("User Last Name: " + receipt.GetUserLastName()); Console.WriteLine("Username: " + receipt.GetUserName()); Console.WriteLine("User Email: " + receipt.GetUserEmail()); Console.WriteLine("Encrypted User ID: " + receipt.GetEncUserId()); Console.WriteLine("Creation Time Stamp: " + receipt.GetCreationTimeStamp()); Console.WriteLine("Name on Card: " + receipt.GetNameOnCard()); Console.WriteLine("Expiration Month: " + receipt.GetExpirationDateMonth()); Console.WriteLine("Expiration Year: " + receipt.GetExpirationDateYear()); Console.WriteLine("Last 4 Digits: " + receipt.GetLastFourDigits()); Console.WriteLine("Bin Number (6 Digits): " + receipt.GetBinSixDigits()); Console.WriteLine("Card Brand: " + receipt.GetCardBrand()); Console.WriteLine("Card Type: " + receipt.GetVdotMeCardType()); Console.WriteLine("Billing Person Name: " + receipt.GetPersonName()); Console.WriteLine("Billing Address Line 1: " + receipt.GetBillingAddressLine1()); Console.WriteLine("Billing City: " + receipt.GetBillingCity()); Console.WriteLine("Billing State/Province Code: " + receipt.GetBillingStateProvinceCode()); Console.WriteLine("Billing Postal Code: " + receipt.GetBillingPostalCode()); Console.WriteLine("Billing Country Code: " + receipt.GetBillingCountryCode()); Console.WriteLine("Billing Phone: " + receipt.GetBillingPhone()); Console.WriteLine("Billing ID: " + receipt.GetBillingId()); Console.WriteLine("Billing Verification Status: " + receipt.GetBillingVerificationStatus()); Console.WriteLine("Partial Shipping Country Code: " + receipt.GetPartialShippingCountryCode()); Console.WriteLine("Partial Shipping Postal Code: " + receipt.GetPartialShippingPostalCode()); Console.WriteLine("Shipping Person Name: " + receipt.GetShippingPersonName()); Console.WriteLine("Shipping Address Line 1: " + receipt.GetShipAddressLine1()); Console.WriteLine("Shipping City: " + receipt.GetShippingCity()); Console.WriteLine("Shipping State/Province Code: " + receipt.GetShippingStateProvinceCode()); Console.WriteLine("Shipping Postal Code: " + receipt.GetShippingPostalCode()); Console.WriteLine("Shipping Country Code: " + receipt.GetShippingCountryCode()); Console.WriteLine("Shipping Phone: " + receipt.GetShippingPhone()); Console.WriteLine("Shipping Default: " + receipt.GetShippingDefault()); Console.WriteLine("Shipping ID: " + receipt.GetShippingId()); Console.WriteLine("Shipping Verification Status: " + receipt.GetShippingVerificationStatus()); Console.WriteLine("isExpired: " + receipt.GetIsExpired()); Console.WriteLine("Base Image File Name: " + receipt.GetBaseImageFileName()); Console.WriteLine("Height: " + receipt.GetHeight()); Console.WriteLine("Width: " + receipt.GetWidth()); Console.WriteLine("Issuer Bid: " + receipt.GetIssuerBid()); Console.WriteLine("Risk Advice: " + receipt.GetRiskAdvice()); Console.WriteLine("Risk Score: " + receipt.GetRiskScore()); Console.WriteLine("AVS Response Code: " + receipt.GetAvsResponseCode()); Console.WriteLine("CVV Response Code: " + receipt.GetCvvResponseCode()); Console.WriteLine("\r\nPress the enter key to exit"); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Page 386 of 486 November 2018 17 Testing a Solution l l l l l l l l l l 17.1 About the Merchant Resource Center 17.2 Logging In to the QA Merchant Resource Center 17.3 Test Credentials for Merchant Resource Center 17.4 Getting a Unique Test Store ID and API Token 17.5 Processing a Transaction 17.6 Testing INTERAC® Online Payment Solutions 17.7 Testing MPI Solutions 17.8 Testing Visa Checkout 1 Test Cards 17.10 Simulator Host 17.1 About the Merchant Resource Center The Merchant Resource Center is the user interface for Moneris Gateway services. There is also a QA version of the Merchant Resource Center site specifically allocated for you and other developers to use to test your API integrations with the gateway. You can access the Merchant Resource Center in the test environment at: https://esqa.moneris.com/mpg (Canada) The test environment is generally available 24/7, but 100% availability is not guaranteed. Also, please be aware that other merchants are using the test environment in the Merchant Resource Center. Therefore, you may see transactions and user IDs that you did not create. As a courtesy to others who are testing, we ask that you use only the transactions/users that you created. This applies to processing Refund transactions, changing passwords or trying other functions. 17.2 Logging In to the QA Merchant Resource Center To log in to the QA Merchant Resource Center for testing purposes: 1. Go to the Merchant Resource Center QA website at https://esqa.moneris.com/mpg 2. Enter your username and password, which are the same email address and password you use to log in to the Developer Portal 3. Enter your Store ID, which you obtained from the Developer Portal's My Testing Credentials as described in Test Credentials for Merchant Resource Center (page 387) 17.3 Test Credentials for Merchant Resource Center For testing purposes, you can either use the pre-existing test stores in the Merchant Resource Center, or you can create your own unique test store where you will only see your own transactions. If you want to use the pre-existing stores, use the test credentials provided in the following tables with the corresponding lines of code, as in the examples below. November 2018 Page 387 of 486 Moneris Gateway API - Integration Guide Example of Corresponding Code For Canada: string store_id = "store5"; string api_token = "yesguy"; string processing_country_code = "CA"; mpgReq.SetTestMode(true); Table 102: Test Server Credentials - Canada store_id api_token Username Password Other Information store1 yesguy demouser password store2 yesguy demouser password store3 yesguy demouser password store4 yesguy demouser password store5 yesguy demouser password monca00392 yesguy demouser password Use this store to test Convenience Fee transactions moncaqagt1 mgtokenguy1 demouser password Use this store to test Token Sharing moncaqagt2 mgtokenguy2 demouser password Use this store to test Token Sharing moncaqagt3 mgtokenguy3 demouser password Use this store to test Token Sharing monca01428 mcmpguy demouser password Use this store to test MasterCard MasterPass Alternatively, you can create and use a unique test store where you will only see your own transactions. For more on this, see Getting a Unique Test Store ID and API Token (page 389) Page 388 of 486 November 2018 17 Testing a Solution 17.4 Getting a Unique Test Store ID and API Token Transactions requests via the API will require you to have a Store ID and a corresponding API token.For testing purposes, you can either use the pre-existing test stores in the Merchant Resource Center, or you can create your own unique test store where you will only see your own transactions. To get your unique Store ID and API token: 1. Log in to the Developer Portal at https://developer.moneris.com 2. 3. 4. 5. In the My Profile dialog, click the Full Profile button Under My Testing Credentials, select Request Testing Credentials Enter your Developer Portal password and select your country Record the Store ID and API token that are given, as you will need them for logging in to the Merchant Resource Center (Store ID) and for API requests (API token). Alternatively, you can use the pre-existing test stores already set up in the Merchant Resource Center as described in Test Credentials for Merchant Resource Center (page 387). November 2018 Page 389 of 486 17.5 Processing a Transaction l l l 1.1 Overview 1.2 HttpsPostRequest Object 1.3 Receipt Object 17.5.1 Overview There are some common steps for every transaction that is processed. 1. Instantiate the transaction object (e.g., Purchase), and update it with object definitions that refer to the individual transaction. 2. Instantiate the HttpsPostRequest connection object and update it with connection information, host information and the transaction object that you created in step 17.5 Section 17.5 (page 391) provides the HttpsPostRequest connection object definition. This object and its variables apply to every transaction request. 3. Invoke the HttpsPostRequest object's send() method. 4. Instantiate the Receipt object, by invoking the HttpsPostRequest object's get Receipt method. Use this object to retrieve the applicable response details. Some transactions may require steps in addition to the ones listed here. Below is a sample Purchase transaction with each major step outlined. For extensive code samples of other transaction types, refer to the Java API ZIP file. NOTE: For illustrative purposes, the order in which lines of code appear below may differ slightly from the same sample code presented elsewhere in this document. using using using using System; System.Collections.Generic; System.Text; Moneris; string string string string string string order_id = "Test" + DateTime.Now.ToString("yyyyMMddhhmmss"); amount = "5.00"; pan = "4242424242424242"; expdate = "1901"; //YYMM format crypt = "7"; processing_country_code = "CA"; string store_id = "store5"; string api_token = "yesguy"; Purchase purchase = new Purchase(); purchase.SetOrderId(order_id); purchase.SetAmount(amount); purchase.SetPan(pan); purchase.SetExpdate(expdate); purchase.SetCryptType(crypt); purchase.SetDynamicDescriptor("2134565"); November 2018 Include all necessary classes. Define all mandatory values for the transaction object properties. Define all mandatory values for the connection object properties. Instantiate the transaction object and assign values to properties. Page 391 of 486 Moneris Gateway API - Integration Guide HttpsPostRequest mpgReq = new HttpsPostRequest(); mpgReq.SetProcCountryCode(processing_country_code); mpgReq.SetTestMode(true); //false or comment out this line for production transactions mpgReq.SetStoreId(store_id); mpgReq.SetApiToken(api_token); mpgReq.SetTransaction(purchase); mpgReq.SetStatusCheck(status_check); Instantiate connection object and assign values to properties, including the transaction object you just created. try { Receipt receipt = mpgReq.GetReceipt(); Console.WriteLine("CardType = " + receipt.GetCardType()); Console.WriteLine("TransAmount = " + receipt.GetTransAmount()); Console.WriteLine("TxnNumber = " + receipt.GetTxnNumber()); Console.WriteLine("ReceiptId = " + receipt.GetReceiptId()); Console.WriteLine("TransType = " + receipt.GetTransType()); Console.WriteLine("ReferenceNum = " + receipt.GetReferenceNum()); Console.WriteLine("ResponseCode = " + receipt.GetResponseCode()); Console.WriteLine("ISO = " + receipt.GetISO()); Console.WriteLine("BankTotals = " + receipt.GetBankTotals()); Console.WriteLine("Message = " + receipt.GetMessage()); Console.WriteLine("AuthCode = " + receipt.GetAuthCode()); Console.WriteLine("Complete = " + receipt.GetComplete()); Console.WriteLine("TransDate = " + receipt.GetTransDate()); Console.WriteLine("TransTime = " + receipt.GetTransTime()); Console.WriteLine("Ticket = " + receipt.GetTicket()); Console.WriteLine("TimedOut = " + receipt.GetTimedOut()); Console.WriteLine("IsVisaDebit = " + receipt.GetIsVisaDebit()); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); } } } } Instantiate the Receipt object and use its get methods to retrieve the desired response data. 17.5.2 HttpsPostRequest Object The transaction object that you instantiate becomes a property of this object when you call its set transaction method. HttpsPostRequest Object Definition HttpsPostRequest mpgReq = new HttpsPostRequest(); After instantiating the HttpsPostRequest object, update its mandatory and optional values as outlined in the following values tables. Page 392 of 486 November 2018 Table 103: HttpsPostRequest object mandatory values Type Set method Limits Value Description Processing String 2-character alphabetic country code CA for Canada, US for USA. mpgReq.setProcCountryCode (processing_country_code); Test mode mpgReq.setTestMode(true); Boolean true/false Set to true when in test mode. Set to false (or comment out entire line) when in production mode. Store ID String 10-character alphanumeric mpgReq.setStoreId(store_id); Unique identifier provided by Moneris upon merchant account set up. See 17.1 About the Merchant Resource Center for test environment details. API Token String 20-character alphanumeric mpgReq.setApiToken(api_token); Unique alphanumeric string assigned upon merchant account activation. To locate your production API token, refer to the Merchant Resource Center Admin Store Settings. See 17.3 Test Credentials for Merchant Resource Center for test environment details. Transaction Object Not applicable mpgReq.setTransaction (transaction); This argument is one of the numerous transaction types discussed in the rest of this manual. (Such as Purchase, Refund and so on.) This object is instantiated in step 1 above. Table 1 HttpsPostRequest object optional values Type Value Set method Limits Description Status Check Boolean true/false mpgReq.setStatusCheck (status_check); See Appendix A Definitions of Request Fields. NOTE: while this value belongs to the HttpsPostRequest object, it is only supported by some transactions. Check the individual transaction definition to find out whether Status Check can be used. 17.5.3 Receipt Object After you send a transaction using the HttpsPostRequest object's send method, you can instantiate a receipt object. November 2018 Page 393 of 486 Moneris Gateway API - Integration Guide Receipt Object Definition Receipt receipt = mpgReq.GetReceipt(); For an in-depth explanation of Receipt object methods and properties, see Appendix B Definitions of Response Fields. 17.6 Testing INTERAC® Online Payment Solutions Acxsys has two websites where merchants can post transactions for testing the fund guarantee porting of INTERAC® Online Payment transactions. The test IDEBIT_MERCHNUM value is provided by Moneris after registering in the test environment. After registering, the following two links become accessible: l l Merchant Test Tool Certification Test Tool Merchant Test Tool https://merchant-test.interacidebit.ca/gateway/merchant_test_processor.do This URL is used to simulate the transaction response process, to validate response variables, and to properly integrate your checkout process. When testing INTERAC® Online Payment transactions, you are forwarded to the INTERAC® Online Payment Merchant Testing Tool. A screen appears where certain fields need to be completed. For an approved response, do not alter any of the fields except for the ones listed here. IDEBIT_TRACK2 To form a track2 when testing with the Moneris Gateway, use one of these three numbers: 3728024906540591206=01121122334455000 5268051119993326=01121122334455000000 453781122255=011211223344550000000000 IDEBIT_ISSNAME RBC IDEBIT_ISSCONF 123456 For a declined response, provide any other value as the IDEBIT_TRACK2. Click Post to Merchant. Whether the transaction is approved or declined, do not click Validate Data. This will return validation errors. Certification Test Tool https://merchant-test.interacidebit.ca/gateway/merchant_certification_processor.do This URL is used to complete the required INTERAC® Online Payment Merchant Front-End Certification test cases, which are outlined in Appendix E (page 464) and Appendix F (page 468). Page 394 of 486 November 2018 To confirm the fund that was guaranteed above, an INTERAC® Online Payment Purchase must be sent to the Moneris Gateway QAusing the following test store information: Host: esqa.moneris.com Store ID: store3 API Token: yesguy You can always log into the Merchant Resource Center to check the results using the following information: URL: https://esqa.moneris.com/mpg Store ID: store3 Note that all response variables that are posted back from the IOP gateway in step 5.4 of 5.4 must be validated for length of field, permitted characters and invalid characters. 17.7 Testing MPI Solutions When testing your implementation of the Moneris MPI, you can use the Visa/MasterCard/Amex PIT (production integration testing) environment. The testing process is slightly different than a production environment in that when the inline window is generated, it does not contain any input boxes. Instead, it contains a window of data and a Submit button. Clicking Submit loads the response in the testing window. The response will not be displayed in production. NOTE: MasterCard SecureCode and Amex SafeKey may not be directly tested within our current test environment. However, the process and behavior tested with the Visa test cards will be the same for MCSC and SafeKey. When testing you may use the following test card numbers with any future expiry date. Use the appropriate test card information from the tables below: Visa and MasterCard use the same test card information, while Amex uses unique information. Table 104: MPI test card numbers (Visa and MasterCard only) Card Number VERes 4012001037141112 Y PARes true TXN – Call function to create inLine window. ACS – Send CAVV to Moneris Gateway using either the Cavv Purchase or the Cavv Pre-Authorization transaction. NA Send transaction to Moneris Gateway using either the basic Purchase or the basic Pre-Authorization transaction. Set crypt_ type = 7. 4242424242424242 4012001038488884 U November 2018 Action Page 395 of 486 Moneris Gateway API - Integration Guide Table 104: MPI test card numbers (Visa and MasterCard only) (continued) Card Number VERes 4012001038443335 N PARes NA Action Send transaction to Moneris Gateway using either the basic Purchase or the basic Pre-Authorization transaction. Set crypt_type = 6. 4012001037461114 Y false Card failed to authenticate. Merchant may chose to send transaction or decline transaction. If transaction is sent, use crypt type = 7. Table 105: MPI test card numbers (Amex only) Card Number Password VERes Required? PARes Action 375987000000062 U Not required N/A TXN – Call function to create inLine window. ACS – Send CAVV to Moneris Gateway using either the Cavv Purchase or the Cavv Pre-Authorization transaction.Set crypt_type = 7. 375987000000021 Y Yes: false test13fail Card failed to authenticate. Merchant may chose to send transaction or decline transaction. If transaction is sent, use crypt type = 7. 375987000000013 N Not required N/A Send transaction to Moneris Gateway using either the basic Purchase or the basic Pre-Authorization transaction. Set crypt_type = 6. 374500261001009 Y Yes: test09 true Card failed to authenticate. Merchant may choose to send transaction or decline transaction. Set crypt_ type = 5. VERes The result U, Y or N is obtained by using getMessage(). PARes The result “true” or “false” is obtained by using getSuccess(). To access the Merchant Resource Center in the test environment go to https://esqa.moneris.com/mpg. Transactions in the test environment should not exceed $11.00. 17.8 Testing Visa Checkout In order to test Visa Checkout you need to: Page 396 of 486 November 2018 1. Create a Visa Checkout configuration profile in the Merchant Resource Center QA environment at https://esqa.moneris.com/mpg. To learn more about this, see "Creating a Visa Checkout Configuration for Testing" below. 2. Obtain a Lightbox API key to be used for Lightbox integration. To learn more about this, see "Integrating Visa Checkout Lightbox" on page 372. 3. For test card numbers specifically for use when testing Visa Checkout, see "Test Cards for Visa Checkout" on the next page 17.8.1 Creating a Visa Checkout Configuration for Testing Once you have a test store created, you need to activate Visa Checkout in the QA environment. To activate Visa Checkout in QA: 1. 2. 3. 4. Log in to the the QA environment at https://esqa.moneris.com/mpg In the Admin menu, select Visa Checkout Complete the applicable fields Click Save. 17.9 Test Card Numbers Because of security and compliance reasons, the use of live credit and debit card numbers for testing is strictly prohibited. Only test credit and debit card numbers are to be used. To test general transactions, use the following test card numbers: Table 106: General test card numbers Card Number Card Plan Mastercard 5454545454545454 Visa 4242424242424242 Amex 373599005095005 JCB 3566007770015365 Diners 36462462742008 Track2 5258968987035454=06061015454001060101? Discover 6510000000000182 UnionPay 6250944000000771 November 2018 Page 397 of 486 Moneris Gateway API - Integration Guide 17.9.1 Test Card Numbers for Level 2/3 When testing Level 2/3 transactions, use the card numbers below. Card Brand Test Card Number Mastercard 5454545442424242 Visa 4242424254545454 Amex 373269005095005 17.9.2 Test Cards for Visa Checkout Table 1 Test Cards Numbers – Visa Checkout Card Plan Card Number Visa 4005520201264821 (without card art) Visa 4242424242424242 (with card art) MasterCard 5500005555555559 American Express 340353278080900 Discover 6011003179988686 17.10 Simulator Host The test environment has been designed to replicate the production environment as closely as possible. One major difference is that Moneris is unable to send test transactions onto the production authorization network. Therefore, issuer responses are simulated. Additionally, the requirement to emulate approval, decline and error situations dictates that certain transaction variables initiate various response and error situations. The test environment approves and declines transactions based on the penny value of the amount sent. For example, a transaction made for the amount of $9.00 or $1.00 is approved because of the .00 penny value. Transactions in the test environment must not exceed $11.00. For a list of all current test environment responses for various penny values, please see the Test Environment Penny Response Table available at https://developer.moneris.com. Page 398 of 486 November 2018 NOTE: These responses may change without notice. Check the Moneris Developer Portal (https://developer.moneris.com) regularly to access the latest documentation and downloads. November 2018 Page 399 of 486 18 Moving to Production l l l l 18.1 Activating a Production Store Account 18.2 Configuring a Store for Production 18.3 Receipt Requirements 1 Getting Help 18.1 Activating a Production Store Account The steps below outline how to activate your production account so that you can process production transactions. 1. 2. 3. 4. Obtain your activation letter/fax from Moneris. Go to [[[Undefined variable URLs.ActivationCanada]]]. Input your store ID and merchant ID from the letter/fax and click Activate. Follow the on-screen instructions to create an administrator account. This account will grant you access to the Merchant Resource Center. 5. Log into the Merchant Resource Center at https://www3.moneris.com/mpg using the user credentials created in step 18.1. 6. Proceed to ADMIN and then STORE SETTINGS. 7. Locate the API token at the top of the page. You will use this API token along with the store ID that you received in your letter/fax and to send any production transactions through the API. When your production store is activated, you need to configure your store so that it points to the production host. To learn how do to this, see Configuring a Store for Production (page 401) NOTE: For more information about how to use the Merchant Resource Center, see the Moneris Gateway Merchant Resource Center User’s Guide, which is available at https://developer.moneris.com. 18.2 Configuring a Store for Production After you have completed your testing and have activated your production store, you are ready to point your store to the production host. To configure a store for production: 1. Change the test mode set method from true to false. 2. Change the Store ID to reflect the production store ID that you received when you activated your production store. To review the steps for activating a production store, see Activating a Production Store Account (page 401). 3. Change the API token to the production token that you received during activation. 4. If you haven't done so already, change the code to reflect the correct processing country (Canada for most merchants). For more on this, see The table below illustrates the steps above using the relevant code (and where X is an alphanumeric character). November 2018 Page 401 of 486 Moneris Gateway API - Integration Guide Step 1 Code in Testing No string changes for this item, only set method is altered: Changes for Production Set method for production: mpgReq.SetTestMode(false); mpgReq.SetTestMode(true); 2 String: String for Production: string store_id = "store5"; string store_id = "monXXXXXXXX"; Associated Set Method: mpgReq.SetStoreId(store_id); 3 String: String for Production: string api_token = "yesguy"; string api_token = "XXXX"; Associated Set Method: mpgReq.SetApiToken(api_token); 18.2.1 Configuring an INTERAC® Online Payment Store for Production Before you can process INTERAC® Online Payment transactions through your web site, you need to complete the certification registration process with Moneris, as described below. The production IDEBIT_ MERCHNUM value is provided by Moneris after you have successfully completed the certification. Acxsys’ production INTERAC® Online PaymentGateway URL is https://gateway.interaconline.com/merchant_processor.do. To access the Moneris Moneris Gateway production gateway URL, use the following: Store ID: Provided by Moneris API Token: Generated during your store activation process. Processing country code: CA The production Merchant Resource Center URL is https://www3.moneris.com/mpg/ 18.2.1.1 Completing the Certification Registration - Merchants To complete the certification registration, fax or email the information below to our Integration Support helpdesk: Page 402 of 486 November 2018 18 Moving to Production l l l l l Merchant logo to be displayed on the INTERAC® Online Payment Gateway page l In both French and English l 120 × 30 pixels l Only PNG format is supported. Merchant business name l In both English and French l Maximum 30 characters. List of all referrer URLs. That is, URLs from which the customer may be redirected to the INTERAC® Online Payment gateway. List of all URLs that may appear in the IDEBIT_FUNDEDURL field of the https form POST to the INTERAC® Online Payment Gateway. List of all URLs that may appear in the IDEBIT_NOTFUNDEDURL field of the https form POST to the INTERAC® Online Payment Gateway. 18.2.1.2 Third-Party Service/Shopping Cart Provider In your product documentation, instruct your clients to provide the information below to the Moneris Gateway Integration Support helpdesk for certification registration: l l l l l Merchant logo to be displayed on the INTERAC® Online Payment Gateway page l In both French and English l 120 × 30 pixels l Only PNG format is supported. Merchant business name l In both English and French l Maximum 30 characters. List of all referrer URLs. That is, URLs from which the customer may be redirected to the INTERAC® Online Payment gateway. List of all URLs that may appear in the IDEBIT_FUNDEDURL field of the https form POST to the INTERAC® Online Payment Gateway. List of all URLs that may appear in the IDEBIT_NOTFUNDEDURL field of the https form POST to the INTERAC® Online Payment Gateway. See 5.3.3, page 109 for additional client requirements. November 2018 Page 403 of 486 Moneris Gateway API - Integration Guide 18.3 Receipt Requirements Visa and MasterCard expect certain details to be provided to the cardholder and on the receipt when a transaction is approved. Receipts must comply with the standards outlined within the Integration Receipts Requirements. For all the receipt requirements covering all transaction scenarios, visit the Moneris Developer Portal at https://developer.moneris.com. Production of the receipt must begin when the appropriate response to the transaction request is received by the application. The transaction may be any of the following: l l l l l l Sale (Purchase) Authorization (PreAuth, Pre-Authorization) Authorization Completion (Completion, Capture) Offline Sale (Force Post) Sale Void (Purchase Correction, Void) Refund. The boldface terms listed above are the names for transactions as they are to be displayed on receipts. Other terms used for the transaction are indicated in brackets. 18.3.1 Certification Requirements Card-present transaction receipts are required to complete certification. Card-not-present integration Certification is optional but highly recommended. Card-present integration After you have completed the development and testing, your application must undergo a certification process where all the applicable transaction types must be demonstrated, and the corresponding receipts properly generated. Contact a Client Integration Specialist for the Certification Test checklist that must be completed and returned for verification. (See "Getting Help" on page 1 for contact details.) Be sure to include the application version of your product. Any further changes to the product after certification requires re-certification. After the certification requirements are met, Moneris will provide you with an official certification letter. Page 404 of 486 November 2018 Appendix A Definitions of Request Fields This appendix deals with values that belong to transaction objects. For information on values that belong to the (HttpsPostRequest) connection object, see "Processing a Transaction" on page 391. NOTE: Alphanumeric fields allow the following characters: a-z A-Z 0-9 _ - : . @ spaces All other request fields allow the following characters: a-z A-Z 0-9 _ - : . @ $ = / Note that the values listed in Appendix A are not mandatory for every transaction. Check the transaction definition. If it says that a value is mandatory, a further description is found here. Table 107: Request fields Type Limits Sample code variable definition Value Description General transaction values Order ID String 50-character alphanumeric string order_id; Merchant-defined transaction identifier that must be unique for every Purchase, PreAuth and Independent Refund transaction. No two transactions of these types may have the same order ID. For Refund, Completion and Purchase Correction transactions, the order ID must be the same as that of the original transaction. The last 10 characters of the order ID are displayed in the “Invoice Number” field on the Merchant Direct Reports. However only letters, numbers and spaces are sent to Merchant Direct. A minimum of 3 and a maximum of 10 valid characters are sent to Merchant Direct. Only the last characters beginning after any invalid characters are sent. For example, if the order ID is 1234-567890, only 567890 is sent to Merchant Direct. If the order ID has fewer than 3 characters, it may display a blank or 0000000000 in the Invoice Number field. November 2018 Page 405 of 486 Moneris Gateway API - Integration Guide Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description Amount String 10-character decimal string amount; Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction amount. Used in a number of transactions. Note that this is different from the amount used in a Completion transaction, which is an alphanumeric value. This must contain at least 3 digits, two of which are penny values. The minimum allowable value is $0.01, and the maximum allowable value is 9999999.99. Transaction amounts of $0.00 are not allowed. Credit card number String 20-character numeric string pan; (no spaces or dashes) Most credit card numbers today are 16 digits, but some 13-digit numbers are still accepted by some issuers. This field has been intentionally expanded to 20 digits in consideration for future expansion and potential support of private label card ranges. Expiry date String 4-character numeric string expiry_date; (YYMM format) Note: This is the reverse of the date displayed on the physical card, which is MMYY. Page 406 of 486 November 2018 Appendix A Definitions of Request Fields Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description E-Commerce indicator String 1-character alphanumeric string crypt; 1: Mail Order / Telephone Order—Single 2: Mail Order / Telephone Order—Recurring 3: Mail Order / Telephone Order—Instalment 4: Mail Order / Telephone Order—Unknown classification 5: Authenticated e-commerce transaction (VbV/MCSC/SafeKey) 6: Non-authenticated e-commerce transaction (VbV/MCSC/SafeKey) 7: SSL-enabled merchant 8: Non-secure transaction (web- or email-based) 9: SET non-authenticated transaction NOTE: When processing a Cavv Purchase or Pre-Authorization for Apple Pay or Android Pay transactions whereby the merchant is using their own API to decrypt the payload, this field is mandatory. For Apple Pay or Android Pay, send the value returned in the eciIndicator or 3dsEciIndicator respectively. If the value is not present, please send the value as 5. If you get a 2-character value (e.g.,. 05 or 07) from the payload, remove the initial 0 and just send us the 2nd character. Supported values for Apple Pay and Android Pay are: 5: Authenticated e-commerce transaction 7: SSL-enabled merchant November 2018 Page 407 of 486 Moneris Gateway API - Integration Guide Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description Completion Amount String 10-character decimal string comp_amount; Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Amount of a Completion transaction. This may not be equal to the amount value (described on page 405), which appeared in the original Pre-Authorization transaction. Shipping Indicator1 String 1-character alphanumeric string ship_indicator; Used to identify completion transactions that require multiple shipments, also referred to as multiple completions. By default, if the shipping indicator is not passed, all completions are listed as final completions. To indicate that the completion is to be left open by the issuer as supplemental shipments or completions are pending, a value of P is submitted. Possible values: P = Partial F = Final 1Available to Canadian integrations only. Page 408 of 486 November 2018 Appendix A Definitions of Request Fields Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description Transaction number String 255-character alphanumeric string txn_number; Used when performing follow-on transactions. (That is, Completion, Purchase Correction or Refund.) This must be the value that was returned as the transaction number in the response of the original transaction. When performing a Completion, this value must reference the Pre-Authorization. When performing a Refund or a Purchase Correction, this value must reference the Completion or the Purchase. Authorization code String 8-character alphanumeric string auth_code; Authorization code provided in the transaction response from the issuing bank. This is required for Force Post transactions. ECR number String 8-character alphanumeric string ecr_no; Electronic cash register number, also referred to as TID or Terminal ID. MPI transaction values XID String 20-character alphanumeric string xid; Can also be used as your order ID when using Moneris Gateway. Fixed length — must be exactly 20 characters. MD (Merchant Data) String 1024-character alpha- string MD; numeric Information to be echoed back in the response. Merchant URL String Variable length string merchantUrl; URL to which the MPI response is to be sent. Accept String Variable length string accept; MIME types that the browser accepts User Agent String Variable length string userAgent; Browser details PARes String Variable length (Not shown) Value passed back to the API during the TXN, and returned to the MPI when an ACS request is made. November 2018 Page 409 of 486 Moneris Gateway API - Integration Guide Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description string cavv; Cardholder String 50-character alphaAuthentication Verinumeric fication Value Value provided by the Moneris MPI or by a third-party MPI. It is part of a Verified (CAVV) by Visa/MasterCard SecureCode/American Express SafeKey transaction. NOTE: For Apple Pay and Android Pay Cavv Purchase and Cavv Pre-Authorization transactions, CAVV field contains the decrypted cryptogram. Vault transaction values Data key String 28-character alphanumeric string data_key; Profile identifier that all future financial Vault transactions (that is, they occur after the profile was registered by a Vault Add Credit Card- ResAddCC, Vault Encrypted Add Credit Card - EncResAddCC, Vault Tokenize Credit Card - ResTokenizeCC, Vault Add Temporary Token - ResTempAdd or Vault Add Token - ResAddToken transaction) will use to associate with the saved information. The data key is generated by Moneris, and is returned to the merchant (via the Receipt object) when the profile is first registered. Duration String 3-character numeric string duration; Amount of time the temporary token should be available, up to 900 seconds. Page 410 of 486 November 2018 Appendix A Definitions of Request Fields Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description Data key format1 String 2-character alphanumeric string data_key_format; This field will specify the data key format being returned. If left blank, Data Key format will default to 25-character alphanumeric. Valid values: no value sent or 0 = 25-character alpha-numeric Data Key By using the following values, a unique token is generated specifically for the PAN that is presented for tokenization. Any subsequent tokenization requests for the same PAN will result in the same token 0U = 25-character alpha-numeric Data Key, Unique Mag Swipe transaction values POS code String 20-character numeric string pos_code; Under normal presentment situations, the value is 00. If a Pre-Authorization transaction was card-present and keyed-in, then the POS code for the corresponding Completion transaction is 71. In an unmanned kiosk environment where the card is present, the value is 27. If the solution is not “merchant and cardholder present”, contact Moneris for the proper POS code. Track2 data String 40-character alphanumeric string track2; Retrieved from the mag stripe of a credit card by swiping it through a card reader, or the "fund guarantee" value returned by the INTERAC® Online Payment system. Encrypted track2 data String Variable length string enc_track2; String that is retrieved by swiping or keying in a credit card number through a Moneris-provided encrypted mag swipe card reader. It is part of an encrypted keyed or swiped transaction only. This string must be retrieved by a specific device. (See below for the list of current available devices.) 1Available to Canadian integrations only. November 2018 Page 411 of 486 Moneris Gateway API - Integration Guide Table 107: Request fields (continued) Type Limits Sample code variable definition Value Description Device type String 30-character alphanumeric string device_type; Type of encrypted mag swipe reader that was read the credit card. This must be a Moneris-provided device so that the values are properly encrypted and decrypted. This field is case-sensitive. Available values are: "idtech_bdk" Page 412 of 486 November 2018 Appendix A Definitions of Request Fields Note that the values listed in Appendix A are not supported by every transaction. Check the transaction definition. If it says that a value is optional, a further description is found here. Table 108: Optional transaction values Type Limits Sample code variable definition Value Description General transaction values Customer ID String 30-character alphanumeric string cust_id; This can be used for policy number, membership number, student ID, invoice number and so on. This field is searchable from the Moneris Merchant Resource Center. Status Check String true/false string status_check; 20-character alphanumeric string dynamic_descriptor; See . Dynamic descriptor String Combined with merchant's business name cannot exceed 25 characters. Merchant-defined description sent on a per-transaction basis that will appear on the credit card statement appended to the merchant’s business name. November 2018 Page 413 of 486 Moneris Gateway API - Integration Guide Table 108: Optional transaction values (continued) Type Limits Sample code variable definition Value Description Wallet indicator1 String 3-character alphanumeric string wallet_indicator; Optional value to indicate when the credit card details were collected from a wallet such as Apple Pay, Android Pay, Visa Checkout, MasterCard MasterPass. This field is applicable to Apple Pay and Android Pay transactions whereby the merchant is using their own API to decrypt the payload. This is a mandatory field for these types of Apple Pay and Android Pay transactions. l l Apple Pay and Android Pay wallet indicator is applicable to Cavv Purchase – Apple Pay and Cavv Pre-Authorization – Apple Pay Visa Checkout and MasterCard MasterPass wallet indicator is applicable to basic Purchase and Pre-Authorization Possible values are: l l l l l APP = Apple Pay In-App APW = Apple Pay on the Web ANP = Android Pay In-App VCO = Visa Checkout MMP = MasterCard MasterPass NOTE: Please note that if this field is included to indicate Apple Pay or Android Pay, then Convenience Fee is not supported. Vault transaction values Phone number String 30-character alphanumeric string phone; Phone number of the customer. Can be sent in when creating or updating a Vault profile. Email address String 30-character alphanumeric string email; Email address of the customer. Can be sent in when creating or updating a Vault profile. Additional notes String 30-character alphanumeric string note; This optional field can be used for supplementary information to be sent in with the transaction. This field can be sent in when creating or updating a Vault profile. For information about Customer Information request fields see 14 Customer Information 1Available to Canadian integrations only. Page 414 of 486 November 2018 Appendix A Definitions of Request Fields For information about Address Verification Service (AVS) request fields see 9.1 Address Verification Service For information about Card Validation Digits (CVD) request fields see For information about Recurring Billing request fields see Appendix A Recurring Billing. For information about Convenience Fee request fields see Appendix A Convenience Fee. For information about Level 2/3 Visa, Level 2/3 MasterCard and Level 2/3 American Express, see A.3 Definition of Request Fields for Level 2/3 - Visa, A.5 Definition of Request Fields for Level 2/3 - Amex November 2018 Page 415 of 486 Moneris Gateway API - Integration Guide A.1 Definitions of Request Fields – Credential on File Variable Name Issuer ID Type String NOTE: This variable is required for all merchant-intiated transactions following the first one; upon sending the first transaction, the Issuer ID value is received in the transaction response and then used in subsequent transaction requests. Payment Indicator Limits Description 15-character alphanumeric Unique identifier for the cardholder's stored credentials Variable length Sent back in the response from the card brand when processing a Credential on File transaction If the cardholder's credentials are being stored for the first time, you must save the Issuer ID on your system to use in subsequent Credential on File transactions (applies to merchant-initiated transactions only) String 1-character alphabetic Indicates the intended or current use of the credentials Possible values for first transactions: C - unscheduled credential on file (first transaction only) R - recurring Possible values for subsequent transactions: R - recurring U - unscheduled merchant-initiated transaction Z - unscheduled cardholder-initiated transaction Payment Information String 1-character numeric Describes whether the transaction is the first or subsequent in the series Possible values are: 0 - first transaction in a series (storing payment details provided by the cardholder) 2 - subsequent transactions (using previously stored payment details) Page 416 of 486 November 2018 Appendix A Definitions of Request Fields A.2 Definition of Request Fields – Recurring Recurring Billing Info Object Request Fields Variable and Field Name Type and Limits Number of Recurs String num_recurs numeric, 1-99 Period String period numeric, 1-999 Start Date String start_date YYYY/MM/DD Description The number of times that the transaction must recur Number of recur units that must pass between recurring billings Date of the first future recurring billing transaction This value must be a date in the future If an additional charge is to be made immediately, the value of Start Now must be set to true Start Now String start_now true/false If a single charge is to be made against the card immediately, set this value to true; the amount to be billed immediately may differ from the amount billed on a regular basis thereafter If the billing is to start in the future, set this value to false When set to false, use Card Verification prior to sending the Purchase with Recur and Credential on File objects Recurring Amount String recur_amount 10-character decimal Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point Amount of the recurring transaction This is the amount that will be billed on the Start Date and then billed repeatedly based on the interval defined by Period and Recur Unit EXAMPLE: 1234567.89 November 2018 Page 417 of 486 Moneris Gateway API - Integration Guide Variable and Field Name Type and Limits Recur Unit String recur_unit day, week, month or eom Description Unit to be used as a basis for the interval Works in conjunction with Period to define the billing frequency Possible values are: day week month eom (end of month) A.3 Definition of Request Fields for Level 2/3 - Visa Table 1 Visa - Corporate Card Common Data - Level 2 Request Fields Req* Y Field Name National Tax Limits 12-character decimal Set Method TRANSACTIONNAME .SetNationalTax (national_tax); Description Must reflect the amount of National Tax (GST or HST) appearing on the invoice. Minimum - 0.01 Maximum 999999.99. Must have 2 decimal places. Y Merchant VAT Registration/Single Business Reference Number 20-character alphanumeric TRANSACTIONNAME .SetMerchantVatNo (merchant_vat_no); Merchant’s Tax Registration Number must be provided if tax is included on the invoice NOTE: Must not be all spaces or all zeroes Page 418 of 486 November 2018 Appendix A Definitions of Request Fields Req* C Field Name Local Tax Limits 12-character decimal Set Method TRANSACTIONNAME .SetLocalTax (local_tax); Description Must reflect the amount of Local Tax (PST or QST) appearing on the invoice If Local Tax included then must not be all spaces or all zeroes; Must be provided if Local Tax (PST or QST) applies Minimum = 0.01 Maximum = 999999.99 Must have 2 decimal places C Local Tax (PST or QST) Registration Number 15-character alphanumeric TRANSACTIONNAME .SetLocalTaxNo (local_tax_no); Merchant's Local Tax (PST/QST) Registration Number Must be provided if tax is included on the invoice; If Local Tax included then must not be all spaces or all zeroes Must be provided if Local Tax (PST or QST) applies C Customer VAT Registration Number November 2018 13-character alphanumeric TRANSACTIONNAME .SetCustomerVatNo (customer_vat_no); If the Customer’s Tax Registration Number Page 419 of 486 Moneris Gateway API - Integration Guide Req* Field Name Limits Set Method Description appears on the invoice to support tax exempt transactions it must be provided here C Customer Code/Customer Reference Identifier (CRI) 16-character alphanumeric TRANSACTIONNAME .SetCri(cri); Value which the customer may choose to provide to the supplier at the point of sale – must be provided if given by the customer N Customer Code 17-character alphanumeric TRANSACTIONNAME .SetCustomerCode (customer_code); Optional customer code field that will not be passed along to Visa, but will be included on Moneris reporting N Invoice Number 17-character alphanumeric TRANSACTIONNAME .SetInvoiceNumber (invoice_number); Optional invoice number field that will not be passed along to Visa, but will be included on Moneris reporting *Y = Required, N = Optional, C = Conditional Table 2 Visa - Corporate Card Common Data- Level 2 Request Fields (VSPurcha) Req C* Variable Name Buyer Name Field Name buyer_name Size/Type 30-character alphanumeric Description Buyer/Receipient Name *only required by CRA if transaction is >$150 Page 420 of 486 November 2018 Appendix A Definitions of Request Fields Req C* Variable Name Local tax rate Field Name local_tax_rate Size/Type 4-character decimal Description Indicates the detailed tax rate applied in relationship to a local tax amount EXAMPLE: 8% PST should be 8.0. maximum 99.99 *Must be provided if Local Tax (PST or QST) applies. N Duty Amount duty_amount 9-character decimal Duty on total purchase amount A minus sign means 'amount is a credit', plus sign or no sign means 'amount is a debit' maximum without sign is 999999.99 N Invoice Discount Treatment discount_treatment 1-character numeric Indicates how the merchant is managing discounts Must be one of the following values: 0 - if no invoice level discounts apply for this invoice 1 - if Tax was calculated on Post-Discount totals 2 - if Tax was calculated on Pre-Discount totals N Invoice Level Discount Amount November 2018 discount_amt 9-character decimal Amount of discount (if provided at the invoice level according to the Page 421 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description Invoice Discount Treatment) Must be non-zero if Invoice Discount Treatment is 1 or 2 Minimum amount is 0.00 and maximum is 999999.99 C* Ship To Postal Code / Zip Code ship_to_pos_code 10-character alphanumeric The postal code or zip code for the destination where goods will be delivered *Required if shipment is involved Full alpha postal code - Valid ANANAN format required if shipping to an address within Canada C Ship From Postal Code / Zip Code ship_from_pos_code 10-character alphanumeric The postal code or zip code from which items were shipped For Canadian addresses,requires full alpha postal code for the merchant with Valid ANANAN format C* Destination Coun- des_cou_code try Code 2-character alphanumeric Code of country where purchased goods will be delivered Use ISO 3166-1 alpha-2 format Page 422 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description NOTE: Required if it appears on the invoice for an international transaction Y Unique VAT Invoice Reference Number vat_ref_num 25-character alphanumeric Unique Value Added Tax Invoice Reference Number Must be populated with the invoice number and this cannot be all spaces or zeroes Y Tax Treatment tax_treatment 1-character numeric Must be one of the following values: 0 = Net Prices with tax calculated at line item level; 1 = Net Prices with tax calculated at invoice level; 2 = Gross prices given with tax information provided at line item level; 3 = Gross prices given with tax information provided at invoice level; 4 = No tax applies (small merchant) on the invoice for the transaction N Freight/Shipping Amount (Ship Amount) freight_amount 9-character decimal Freight charges on total purchase If shipping is not provided as a line item it must be provided here, if applicable Signed monetary November 2018 Page 423 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description amount: minus sign means 'amount is a credit', plus sign or no sign means 'amount is a debit', maximum without sign is 999999.99 C GST HST Freight Rate gst_hst_freight_rate 4-character decimal Rate of GST (excludes PST) or HST charged on the shipping amount (in accordance with the Tax Treatment) If Freight/Shipping Amount is provided then this (National GST or HST) tax rate must be provided. Monetary amount, maximum is 99.99. Such as 13% HST is 13.00 C GST HST Freight Amount gst_hst_freight_ amount 9-character decimal Amount of GST (excludes PST) or HST charged on the shipping amount If Freight/Shipping Amount is provided then this (National GST or HST) tax amount must be provided if taxTreatment is 0 or 2 Signed monetary amount: maximum without sign is 999999.99. Page 424 of 486 November 2018 Appendix A Definitions of Request Fields Table 3 Visa - Line Item Details - Level 3 Request Fields (VSPurchl) Req Variable Name Field Name Size/Type Description C Item Commodity Code item_com_code 12-character alphanumeric Line item Commodity Code (if this field is not sent, then productCode must be sent) Y Product Code product_code 12-character alphanumeric Product code for this line item – merchant’s product code, manufacturer’s product code or buyer’s product code Typically this will be the SKU or identifier by which the merchant tracks and prices the item or service This should always be provided for every line item Y Item Description item_description 35-character alphanumeric Line item description Y Item Quantity item_quantity 12-character decimal Quantity invoiced for this line item Up to 4 decimal places supported, whole numbers are accepted Minimum = 0.0001 Maximum = 999999999999 Y Item Unit of Measure November 2018 item_uom 2-character alphanumeric Unit of Measure Use ANSI X-12 EDI Allowable Units of Measure and Codes Page 425 of 486 Moneris Gateway API - Integration Guide Req Y Variable Name Item Unit Cost Field Name unit_cost Size/Type 12-character decimal Description Line item cost per unit 2-4 decimal places accepted Minimum = 0.0001 Maximum = 999999.9999 N VAT Tax Amount vat_tax_amt 12-character decimal Any value-added tax or other sales tax amount Must have 2 decimal places Minimum = 0.01 Maximum = 999999.99 N VAT Tax Rate vat_tax_rate 4-character decimal Sales tax rate EXAMPLE: 8% PST should be 8.0 maximum 99.99 Y Discount Treatment discount_treatmentL 1-character numeric Must be one of the following values: 0 if no invoice level discounts apply for this invoice 1 if Tax was calculated on Post-Discount totals 2 if Tax was calculated on Pre-Discount totals. C Discount Amount discount_amtL 12-character decimal Amount of discount, if provided for this line item according to the Line Item Discount Treatment Must be non-zero if Page 426 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description Line Item Discount Treatment is 1 or 2 Must have 2 decimal places Minimum = 0.01 Maximum = 999999.99 A.4 Definition of Request Fields for Level 2/3 - MasterCard Table 1 Objects - Level 2/3 MasterCard MCCorpais Objects Description MCCorpac Corporate Card Common data MCCorpal Line Item Details Table 2 MasterCard - Corporate Card Common Data (MCCorpac) - Level 2 Request Fields Req Variable Name Field Name Size/Type Description N AustinTetraNumber AustinTetra Number 15-character alphanumeric Merchant’s Austin-Tetra Number N NaicsCode NAICS Code 15-character alphanumeric North American Industry Classification System (NAICS) code assigned to the merchant N CustomerCode Customer Code 25-character alphanumeric A control number, such as purchase order number, project number, department allocation number or name that the purchaser supplied the merchant. Left-justified; may be spaces N UniqueInvoiceNumber Unique Invoice Number 17-character alphanumeric Unique number associated with the individual transaction provided by the merchant November 2018 Page 427 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description N CommodityCode Commodity Code 15-character alphanumeric Code assigned by the merchant that best categorizes the item(s) being purchased N OrderDate Order Date 6-character numeric The date the item was ordered. If present, must contain a valid date in the format YYMMDD. N CorporationVatNumber Corporation VAT Number 20-character alphanumeric Contains a corporation’s value added tax (VAT) number N CustomerVatNumber Customer VAT Number 20-character alphanumeric Contains the VAT number for the customer/cardholder used to identify the customer when purchasing goods and services from the merchant N FreightAmount Freight Amount 12-character decimal The freight on the total purchase. Must have 2 decimals N DutyAmount Duty Amount 12-character decimal The duty on the total purchase, Must have 2 decimals N DestinationProvinceCode Destination State / Province Code 3-character alphanumeric State or Province of the country where the goods will be delivered. Left justified with trailing spaces. e.g., ONT Ontario N DestinationCountryCode Destination Country Code 3-character alphanumeric The country code where goods will be delivered. Left justified with trailing spaces. e.g., CAN - Canada N ShipFromPosCode Ship From Postal Code 10-character alphanumeric The postal code or zip code from which items were shipped N ShipToPosCode Destination Postal Code 10-character alphanumeric The postal code or zip code where goods will be delivered N AuthorizedContactName Authorized Contact 36-character alpha- Name of an individual or company contacted for company Page 428 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description Name numeric authorized purchases N AuthorizedContactPhone Authorized Contact Phone 17-character alphanumeric Phone number of an individual or company contacted for company authorized purchases N AdditionalCardAcceptordata Additional Card Acceptor Data 40-character alphanumeric Information pertaining to the card acceptor N CardAcceptorType Card Acceptor Type 8-character alphanumeric Various classifications of business ownership characteristics This field takes 8 characters. Each character represents a different component, as follows: 1st character represents ‘Business Type’ and contains a code to identify the specific classification or type of business: 1. Corporation 2. Not known 3. Individual/Sole Proprietorship 4. Partnership 5. Association/Estate/Trust 6. Tax Exempt Organizations (501C) 7. International Organization 8. Limited Liability Company (LLC) 9. Government Agency 2nd character represents 'Business Owner Type'. Contains a code to identify specific characteristics about the business owner. November 2018 Page 429 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description 1 - No application classification 2 - Female business owner 3 - Physically handicapped female business owner 4 - Physically handicapped male business owner 0 - Unknown 3rd character represents 'Business Certification Type'. Contains a code to identify specific characteristics about the business certification type, such as small business, disadvantaged, or other certification type: 1 - Not certified 2 - Small Business Administration (SBA) certification small business 3 - SBA certification as small disadvantaged business 4 - Other government or agency-recognized certification (such as Minority Supplier Development Council) 5 - Self-certified small business 6 - SBA certification as small and other government or agencyrecognized certification 7 - SBA certification as small disadvantaged business and other gov- Page 430 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description ernment or agencyrecognized certification 8 - Other government or agency-recognized certification and self-certified small business A - SBA certification as 8 (a) B - Self-certified small disadvantaged business (SDB) C - SBA certification as HUBZone 0 - Unknown 4th character represents 'Business Racial/Ethnic Type'. Contains a code identifying the racial or ethnic type of the majority owner of the business. 1 - African American 2 - Asian Pacific American 3 - Subcontinent Asian American 4 - Hispanic American 5 - Native American Indian 6 - Native Hawaiian 7 - Native Alaskan 8 - Caucasian 9 - Other 0 - Unknown 5th character represents 'Business Type Provided Code' Y - Business type is provided. N - Business type was not provided. R - Card acceptor November 2018 Page 431 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description refused to provide business type 6th character represents 'Business Owner Type Provided Code' Y - Business owner type is provided. N - Business owner type was not provided. R - Card acceptor refused to provide business type 7th character represents 'Business Certification Type Provided Code' Y - Business certification type is provided. N - Business certification type was not provided. R - Card acceptor refused to provide business type 8th character represents 'Business Racial/Ethnic Type’ Y - Business racial/ethnic type is provided. N - Business racial/ethnic type was not provided. R - Card acceptor refused to provide business racial/ethnic type N CardAcceptorTaxId Page 432 of 486 Card Acceptor Tax ID 20-character alphanumeric US Federal tax ID number for value added tax (VAT) ID. November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description N CardAcceptorReferenceNumber Card Acceptor Reference Number 25-character alphanumeric Code that facilitates card acceptor/corporation communication and record keeping N CardAcceptorVatNumber Card Acceptor VAT Number 20-character alphanumeric Value added tax (VAT) number for the card acceptor location used to identify the card acceptor when collecting and reporting taxes C* Tax Tax up to 6 arrays Can have up to 6 arrays contains different tax details. See Tax Array below for each field description. *This field is conditionally mandatory — if you use this array, you must fill in all tax array fields as listed in the Tax Array Request Fields below. Table 3 MasterCard - Line Item Details (MCCorpal) - Level 3 Request Fields Req Variable Name Field Name Size/Type Description N CustomerCode Customer Code 25-character alphanumeric A control number, such as purchase order number, project number, department allocation number or name that the purchaser supplied the merchant. Left-justified; may be spaces N LineItemDate Line Item Date 6-character numeric The purchase date of the line item referenced in the associated Corporate Card Line Item November 2018 Page 433 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description Detail. YYMMDD format N ShipDate Ship Date 6-character numeric The date the merchandise was shipped to the destination. YYMMDD format N OrderDate Order Date 6-character numeric The date the item was ordered YYMMDD format Y ProductCode Product Code 12-character alphanumeric Line item Product Code (if this field is not sent, then itemComCode) If the order has a Freight/Shipping line item, the productCode value has to be “Freight/Shipping” If the order has a Discount line item, the productCode value has to be “Discount” Y ItemDescription Item Description 35-character alphanumeric Line Item description Y ItemQuantity Item Quantity 12-character alphanumeric Quantity of line item Y UnitCost Unit Cost 12-character decimal Line item cost per unit. Must contain a minimum of 2 decimal places, up to 5 decimal places supported. Page 434 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description Minimum amount is 0.00001 and maximum is 999999.99999 Y ItemUnitMeasure Item Unit Measure 12-character alphanumeric The line item unit of measurement code Y ExtItemAmount Extended Item Amount 9-character decimal Contains the individual item amount that is normally calculated as price multiplied by quantity Must contain 2 decimal places Minimum amount is 0.00 and maximum is 999999.99 N DiscountAmount Discount Amount 9-character decimal Contains the item discount amount Must contain 2 decimal places Minimum amount is 0.00 and maximum is 999999.99 N CommodityCode Commodity Code 15-character alphanumeric Code assigned to the merchant that best categorizes the item(s) being purchased C* Tax Tax Up to 6 arrays Can have up to 6 arrays contains different tax details. See Tax Array below for each field description. *This field is conditionally man- November 2018 Page 435 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description datory — if you use this array, you must fill in all tax array fields as listed in the Tax Array Request Fields below. Table 4 Tax Array Request Fields - MasterCard Level 2/3 Transactions Req M Variable Name tax_amount Field Name Tax Amount Size/Type 12-character decimal Description Contains detail tax amount for purchase of goods or service Must be 2 decimal places Maximum 999999.99 M tax_rate Tax Rate 5-character decimal Contains the detailed tax rate applied in relationship to a specific tax amount EXAMPLE: 5% GST should be ‘5.0’ or or 9.975% QST should be ‘9.975’ May contain up to 3 decimals, minimum 0.001, maximum up to 9999.9 M tax_type Tax Type 4-character alphanumeric Contains tax type such as GST,QST,PST,HST M tax_id Tax ID 20-character alphanumeric Provides an identification number Page 436 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description used by the card acceptor with the tax authority in relationship to a specific tax amount such as GST/HST number M tax_included_in_ sales Tax included in sales indicator 1-character alphanumeric This is the indicator used to reflect additional tax capture and reporting. Valid values are: Y = Tax included in total purchase amount N = Tax not included in total purchase amount A.5 Definition of Request Fields for Level 2/3 - Amex Table 1 Amex- Level 2/3 Request Fields - Table 1 - Heading Fields Req C Variable Name big04 Field Name Purchase Order Number Size/Type 22-character alphanumeric Description The cardholder supplied Purchase Order Number, which is entered by the merchant at the point-ofsale This entry is used in the Statement/Reporting process and may include accounting information specific to the client Mandatory if the merchant's customer provides a Purchase Order Number November 2018 Page 437 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description N big05 Release Number 30-character alphanumeric A number that identifies a release against a Purchase Order previously placed by the parties involved in the transaction N big10 Invoice Number 8-character alphanumeric Contains the Amex invoice/reference number Y n101 Entity Identifier Code 2-character alphanumeric Supported values: ‘R6’ - Requester (required) ‘BG’ - Buying Group (optional) ‘SF’ - Ship From (optional) ‘ST’ - Ship To (optional) ‘40’ - Receiver (optional) Y n102 Name 40-character alphanumeric n101 code n102 meaning R6 Requester Name BG Buying Group Name SF Ship From Name ST Ship To Name 40 Receiver Name N n301 Address 40-character alphanumeric Address N n401 City 30-character alphanumeric City N n402 State or Province 2-character alphanumeric State or Province Page 438 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description N n403 Postal Code 15-character alphanumeric Postal Code Y ref01 Reference Identification Qualifier 2-character alphanumeric This element may contain the following qualifiers for the corresponding occurrences of the N1Loop: n101 ref01 value denotation R6 Supported values: 4C - Shipment Destination Code (mandatory) CR - Customer Reference Number (conditional) Y ref02 Reference Identification 15-character alphanumeric BG n/a SF n/a ST n/a 40 n/a VR is the Vendor ID Number, other codes describe the following: ref01 ref02 code denotation November 2018 4C Ship to Zip or Canadian Postal Code (required) CR Cardmember Reference Number (optional) Page 439 of 486 Moneris Gateway API - Integration Guide Table 2 Amex - Level 2/3 Request Fields - Table 2 - Detail Fields Req Y Variable Name it102 Field Name Line Item Quantity Invoiced Size/Type 10-character decimal Description Quantity of line item. Up to 2 decimal places supported. Minimum amount is 0.0 and maximum is 9999999999. Y it103 Unit or Basis for Measurement Code 2-character alphanumeric The line item unit of measurement code Must contain a code that specifies the units in which the value is expressed or the manner in which a measurement is taken EXAMPLE: EA = each, E5=inches See ANSI X-12 EDI Allowable Units of Measure and Codes for the list of codes Y it104 Unit Price 15-character decimal Line item cost per unit Must contain 2 decimal places Minimum amount is 0.00 and maximum is 999999.99 N it105 Page 440 of 486 Basis or Unit Price Code 2-character alphanumeric Code identifying the type of unit price for an item November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description EXAMPLE: DR = dealer, AP = advise price See ASC X12 004010 Element 639 for list of codes N it10618 Product/Service ID Qualifier 2-character alphanumeric Supported values: ‘MG’ - Manufacturer’s Part Number ‘VC’ - Supplier Catalog Number ‘SK’ - Supplier Stock Keeping Unit Number ‘UP’ - Universal Product Code ‘VP’ – Vendor Part Number ‘PO’ – Purchase Order Number ‘AN’ – Client Defined Asset Code N C it10719 txi01 Product/Service ID Tax Type code it10618 it10719 size/type VC 20-character alphanumeric PO 22-character alphanumeric Other 30-character alphanumeric 2-character alphanumeric Product/Service ID corresponds to the preceding qualifier defined in it10618 The maximum length depends on the qualifier defined in it10618 Supported values: ‘CA’ – City Tax (optional) ‘CT’ – County/Tax (optional) ‘EV’ – Environmental Tax (optional) ‘GS’ – Good and Services Tax (GST) November 2018 Page 441 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description (optional) ‘LS’ – State and Local Sales Tax (optional) ‘LT’ – Local Sales Tax (optional) ‘PG’ – Provincial Sales Tax (PST) (optional) ‘SP’ – State/Provincial Tax a.k.a. Quebec Sales Tax (QST) (optional) ‘ST’ – State Sales Tax (optional) ‘TX’ – All Taxes (required) ‘VA’ – Value-Added Tax a.k.a. Canadian Harmonized Sales Tax (HST) (optional) C txi02 Monetary Amount 6-character decimal This element may contain the monetary tax amount that corresponds to the Tax Type Code in txi01 NOTE: If txi02 is used in mandatory occurrence txi01=TX, txi02 must contain the total tax amount applicable to the entire invoice (transaction) If taxes are not applicable for the entire invoice (transaction), txi02 must be 0.00. The maximum value that can be entered in this field is “9999.99”, which is $9,999.99 (CAD) A debit is entered as: 9999.99 A credit is entered Page 442 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description as: –9999.99 C txi03 Percent 10-character decimal Contains the tax percentage (in decimal format) that corresponds to the tax type code defined in txi01 Up to 2 decimal places supported C txi06 Tax Exempt Code 1-character alphanumeric This element may contain the Tax Exempt Code that identifies the exemption status from sales and tax that corresponds to the Tax Type Code in txi01 Supported values: 1 – Yes (Tax Exempt) 2 – No (Not Tax Exempt) 4 – Not Exempt/For Resale A – Labor Taxable, Material Exempt B – Material Taxable, Labor Exempt C – Not Taxable F – Exempt (Goods / Services Tax) G – Exempt (Provincial Sales Tax) L – Exempt Local Service R – Recurring Exempt U – Usage Exempt November 2018 Page 443 of 486 Moneris Gateway API - Integration Guide Req Y Variable Name pam05 Field Name Line Item Extended Amount Size/Type 8-character decimal Description Contains the individual item amount that is normally calculated as price multiplied by quantity Must contain 2 decimal places Minimum amount is 0.00 and maximum is 99999.99 Y pid05 Line Item Description 80-character alphanumeric Line Item description Contains the description of the individual item purchased This field pertain to each line item in the transaction Table 3 Amex - Level 2/3 Request Fields - Table 3 - Summary Fields Req C Variable Name txi01 Field Name Tax Type code Size/Type 2-character alphanumeric Description Supported values: ‘CA’ – City Tax (optional) ‘CT’ – County/Tax (optional) ‘EV’ – Environmental Tax (optional) ‘GS’ – Good and Services Tax (GST) (optional) ‘LS’ – State and Local Sales Tax (optional) ‘LT’ – Local Sales Tax (optional) ‘PG’ – Provincial Sales Page 444 of 486 November 2018 Appendix A Definitions of Request Fields Req Variable Name Field Name Size/Type Description Tax (PST) (optional) ‘SP’ – State/Provincial Tax a.k.a. Quebec Sales Tax (QST) (optional) ‘ST’ – State Sales Tax (optional) ‘TX’ – All Taxes (required) ‘VA’ – Value-Added Tax a.k.a. Canadian Harmonized Sales Tax (HST) (optional) C txi02 Monetary Amount 6-character decimal This element may contain the monetary tax amount that corresponds to the Tax Type Code in txi01 NOTE: If txi02 is used in mandatory occurrence txi01=TX, txi02 must contain the total tax amount applicable to the entire invoice (transaction) If taxes are not applicable for the entire invoice (transaction), txi02 must be 0.00. The maximum value that can be entered in this field is “9999.99”, which is $9,999.99 (CAD) A debit is entered as: 9999.99 A credit is entered as: –9999.99 C txi03 November 2018 Percent 10-character decimal Contains the tax percentage (in decimal format) that corresponds to the tax type Page 445 of 486 Moneris Gateway API - Integration Guide Req Variable Name Field Name Size/Type Description code defined in txi01 Up to 2 decimal places supported C txi06 Tax Exempt Code 1-character alphanumeric Supported values: 1 – Yes (Tax Exempt) 2 – No (Not Tax Exempt) 4 – Not Exempt/For Resale A – Labor Taxable, Material Exempt B – Material Taxable, Labor Exempt C – Not Taxable F – Exempt (Goods / Services Tax) G – Exempt (Provincial Sales Tax) L – Exempt Local Service R – Recurring Exempt U – Usage Exempt A.6 Definition of Request Fields – Offlinx™ Applies to Offlinx™ integration only Type and Limits Variable and Field Name Card Match ID String 50-character alphanumeric Description Corresponds to the Transaction ID used for the Offlinx™ Card Match Pixel Tag, a unique identifier created by the merchant Must be unique value for each transaction Page 446 of 486 November 2018 Appendix B Definitions of Response Fields Table 109: Receipt object response values Value Type Limits Get Method Description General response fields Card type String receipt.GetCardType(); 2-character alphabetic (min. 1) Represents the type of card in the transaction, e.g., Visa, Mastercard. Possible values: l l l l l l l l Transaction amount String V = Visa M = Mastercard AX = American Express DC = Diner's Card NO = Novus/Discover SE = Sears D = Debit C1 = JCB 10-character decimal receipt.GetTransAmount(); Up to 7 digits (dollars) + decimal point (.) + 2 digits (cents) after the decimal point EXAMPLE: 1234567.89 Transaction amount that was processed. receipt.GetTxnNumber(); 255-character Transaction num- String alphanumeric ber Gateway Transaction identifier often needed for follow-on transactions (such as Refund and Purchase Correction) to reference the originally processed transaction. Receipt ID String 50-character alphanumeric receipt.GetReceiptId(); Order ID that was specified in the transaction request. November 2018 Page 447 of 486 Moneris Gateway API - Integration Guide Table 109: Receipt object response values (continued) Type Value Limits Get Method Description Transaction type String l l l l l Reference number String 2-character alphanumeric receipt.GetTransType(); 0 = Purchase 1 = Pre-Authorization 2 = Completion 4 = Refund 11 = Void 18-character numeric receipt.GetReferenceNum(); Terminal used to process the transaction as well as the shift, batch and sequence number. This data is typically used to reference transactions on the host systems, and must be displayed on any receipt presented to the customer. This information is to be stored by the merchant. Example: 660123450010690030 l l l l Response code String l l l 66012345: Terminal ID 001: Shift number 069: Batch number 003: Transaction number within the batch. 3-character numeric receipt.GetResponseCode(); < 50: Transaction approved ≥ 50: Transaction declined Null: Transaction incomplete. For further details on the response codes that are returned, see the Response Codes document at https://developer.moneris.com. ISO String 2-character numeric receipt.GetISO(); ISO response code Bank totals Object receipt.GetBankTotals(); Response data returned in a Batch Close and Open Totals request. See "Definitions of Response Fields" on the previous page. Page 448 of 486 November 2018 Appendix B Definitions of Response Fields Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Message String 100-character alphanumeric receipt.GetMessage(); Response description returned from issuer. The message returned from the issuer is intended for merchant information only, and is not intended for customer receipts. Authorization code String 8-character alphanumeric receipt.GetAuthCode(); Authorization code returned from the issuing institution. Complete String true/false receipt.GetComplete(); Transaction was sent to authorization host and a response was received Transaction date String Format: yyyy-mm- receipt.GetTransDate(); dd Processing host date stamp Transaction time String Format: ##:##:## receipt.GetTransTime(); Processing host time stamp Ticket String N/A receipt.GetTicket(); Reserved field. Timed out String true/false receipt.GetTimedOut(); Transaction failed due to a process timing out. Is Visa Debit String true/false receipt.GetIsVisaDebit(); Indicates whether the card processed is a Visa Debit. Batch Close/Open Totals response fields Processed card types String Array N/A receipt.GetCreditCards(ecr); Returns all of the processed card types in the current batch for the terminal ID/ECR Number from the request. Terminal IDs String 8-character alpha- receipt.GetTerminalIDs(); numeric Returns the terminal ID/ECR Number from the request. November 2018 Page 449 of 486 Moneris Gateway API - Integration Guide Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Purchase count String 4-character numeric receipt.GetPurchaseCount(ecr, cardType); Indicates the # of Purchase, Pre-Authorization Completion and Force Post transactions processed. If none were processed in the batch, then the value returned will be 0000. Purchase amount String 11-character alpha- receipt.GetPurchaseAmount(ecr, cardType); numeric Indicates the dollar amount processed for Purchase, Pre-Authorization Completion or Force Post transactions. This field begins with a + and is followed by 10 numbers, the first 8 indicate the amount and the last 2 indicate the penny value. EXAMPLE: +0000000000 = 0.00 and +0000041625 = 416.25 Refund count String 4-character numeric receipt.GetRefundCount(ecr, cardType); Indicates the # of Refund or Independent Refund transactions processed. If none were processed in the batch, then the value returned will be 0000. Refund amount String 11-character alpha- receipt.GetRefundAmount(ecr, cardType); numeric Indicates the dollar amount processed for Refund, Independent Refund or ACH Credit transactions. This field begins with a + and is followed by 10 numbers, the first 8 indicate the amount and the last 2 indicate the penny value. Example, +0000000000 = 0.00 and +0000041625 = 416.25 Correction count String 4-character numeric receipt.GetCorrectionCount(ecr, cardType); Indicates the # of Purchase Correction transactions processed. If none were processed in the batch, then the value returned will be 0000. Correction amount String 11-character alpha- receipt.GetCorrectionAmount (ecr,cardType); numeric Indicates the dollar amount processed for Purchase Correction transactions. This field begins with a + and is followed by 10 numbers, the first 8 indicate the amount and the last 2 indicate the penny value. EXAMPLE: +0000000000 = 0.00 and +0000041625 = 416.25 Recurring Billing Response Fields (see Appendix A, page 1) Page 450 of 486 November 2018 Appendix B Definitions of Response Fields Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Recurring billing success String true/false receipt.GetRecurSuccess(); Indicates whether the recurring billing transaction has been successfully set up for future billing. receipt.GetRecurUpdateSuccess(); Recur update suc- String true/false cess Indicates recur update success. Next recur date String yyyy-mm-dd receipt.GetNextRecurDate(); Indicates next recur billing date. Recur end date String yyyy-mm-dd receipt.GetRecurEndDate(); Indicates final recur billing date. Status Check response fields (see ) Status code String l l 3-character alpha- receipt.GetStatusCode(); numeric < 50: Transaction found and successful ≥ 50: Transaction not found and not successful NOTE: the status code is only populated if the connection object's Status Check property is set to true. Status message String l l found/not found receipt.GetStatusMessage(); Found: 0 ≤ Status Code ≤ 49 Not Found or null: 50 ≤ Status Code ≤ 999. NOTE: The status message is only populated if the connection object's Status Check property is set to true. AVS response fields (see 9.1, page 291) AVS result code String 1-character alpha- receipt.GetAvsResultCode(); numeric Indicates the address verification result. For a full list of possible response codes refer to Section Appendix B. CVD response fields (see ) November 2018 Page 451 of 486 Moneris Gateway API - Integration Guide Table 109: Receipt object response values (continued) Value Type Limits Get Method Description CVD result code 2-character alpha- receipt.GetCvdResultCode(); numeric String Indicates the CVD validation result. The first byte is the numeric CVD indicator sent in the request; the second byte is the response code. Possible response codes are shown in Appendix B MPI response fields (see "MPI" on page 1) Type String 99-character alphanumeric VERes, PARes or error defines what type of response you are receiving . Success Boolean true/false receipt.GetMpiSuccess(); True if attempt was successful, false if attempt was unsuccessful. Message String 100-character alphabetic receipt.GetMpiMessage(); MPI TXN transactions can produce the following values: l l l Y: Create VBV verification form popup window. N: Send purchase or preauth with crypt type 6 U: Send purchase or preauth with crypt type 7. MPI ACS transactions can produce the following values: l l l Term URL String Y or A: (Also receipt.getMpiSuccess()=true) Proceed with cavv purchase or cavv preauth. N: Authentication failed or high-risk transaction. It is recommended that you do not to proceed with the transaction. Depending on a merchant’s risk tolerance and results from other methods of fraud detection, transaction may proceed with crypt type 7. U or time out: Send purchase or preauth as crypt type 7. 255-character alphanumeric URL to which the PARes is returned Page 452 of 486 November 2018 Appendix B Definitions of Response Fields Table 109: Receipt object response values (continued) Value Type Limits Get Method Description MD String 1024-character alphanumeric Merchant-defined data that was echoed back ACS URL String 255-character alphanumeric URL that will be for the generated pop-up MPI CAVV String 28-character alpha- receipt.GetMpiCavv(); numeric VbV/MCSC/American Express SafeKey authentication data MPI E-Commerce String Indicator 1-character alphanumeric CAVV result code 1-character alpha- receipt.GetCavvResultCode(); numeric String Indicates the Visa CAVV result. For more information, see 8.6.7 Cavv Result Codes for Verified by Visa. l l l l l l l l 0 = CAVV authentication results invalid 1 = CAVV failed validation; authentication 2 = CAVV passed validation; authentication 3 = CAVV passed validation; attempt 4 = CAVV failed validation; attempt 7 = CAVV failed validation; attempt (US issued cards only) 8 = CAVV passed validation; attempt (US issued cards only) The CAVV result code indicates the result of the CAVV validation. receipt.GetInLineForm()); MPI inline form Vault response fields (see 4.1, page 53) Data key String 28-character alpha- receipt.GetDataKey(); numeric The data key response field is populated when you send a Vault Add Credit Card – ResAddCC (page 55), Vault Encrypted Add Credit Card – EncResAddCC (page 59), Vault Tokenize Credit Card – ResTokenizeCC (page 82), Vault Temporary Token Add – ResTempAdd (page 62) or Vault Add Token – ResAddToken (page 78) transaction. It is the profile identifier that all future financial Vault transactions will use to associate with the saved information. November 2018 Page 453 of 486 Moneris Gateway API - Integration Guide Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Vault payment type String Expiring card's Payment type String cc receipt.GetPaymentType(); Indicates the payment type associated with a Vault profile cc receipt.GetExpPaymentType(); Indicates the payment type associated with a Vault profile. Applicable to Vault Get Expiring transaction type. Vault masked PAN String 20-character numeric receipt.GetResMaskedPan(); Returns the first 4 and/or last 4 of the card number saved in the profile. Expiring card's Masked PAN String 20-character numeric receipt.GetExpMaskedPan(); Returns the first 4 and/or last 4 of the card number saved in the profile. Applicable to Vault Get Expiring transaction type. Vault success String true/false receipt.GetResSuccess(); Indicates whether Vault transaction was successful. Vault customer ID String 30-character alpha- receipt.GetResDataCustId(); numeric Returns the customer ID saved in the profile. Expiring card's cus- String tomer ID 30-character alpha- receipt.GetExpCustId(); numeric Returns the customer ID saved in the profile. Applicable to Vault Get Expiring transaction type. Vault phone num- String ber 30-character alpha- receipt.GetResDataPhone(); numeric Returns the phone number saved in the profile. Page 454 of 486 November 2018 Appendix B Definitions of Response Fields Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Expiring card's phone number String 30-character alpha- receipt.GetExpPhone(); numeric Returns the phone number saved in the profile. Applicable to Vault Get Expiring transaction type. Vault email address String 30-character alpha- receipt.GetResDataEmail(); numeric Returns the email address saved in the profile. Expiring card's email address String 30-character alpha- receipt.GetExpEmail(); numeric Returns the email address saved in the profile. Applicable to Vault Get Expiring transaction type. Vault note String 30-character alpha- receipt.GetResDataNote(); numeric Returns the note saved in the profile. Expiring card's note String 30-character alpha- receipt.GetExpNote(); numeric Returns the note saved in the profile. Applicable to Vault Get Expiring transaction type. Vault expiry date String 4-character numeric receipt.GetResDataExpdate(); Returns the expiry date of the card number saved in the profile. YYMM format. Expiring card's expiry date String 4-character numeric receipt.GetExpExpdate(); Returns the expiry date of the card number saved in the profile. YYMM format. Applicable to Vault Get Expiring transaction type. Vault E-commerce String indicator 1-character numeric receipt.GetResDataCryptType(); Returns the e-commerce indicator saved in the profile. Expiring card's Ecommerce indicator November 2018 String 1-character numeric receipt.GetExpCryptType(); Returns the e-commerce indicator saved in the profile. Applicable to Vault Get Expiring transaction type. Page 455 of 486 Moneris Gateway API - Integration Guide Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Vault AVS street number String 19-character alpha- receipt.GetResDataAvsStreetNumber(); numeric Returns the AVS street number saved in the profile. If no other AVS street number is passed in the transaction request, this value will be submitted along with the financial transaction to the issuer. Expiring card's AVS street number String Vault AVS street name String 19-character alpha- receipt.GetExpAvsStreetNumber(); numeric Returns the AVS street number saved in the profile. If no other AVS street number is passed in the transaction request, this value will be submitted along with the financial transaction to the issuer. Applicable to Vault Get Expiring transaction type. 19-character alpha- receipt.GetResDataAvsStreetName(); numeric Returns the AVS street name saved in the profile. If no other AVS street number is passed in the transaction request, this value will be submitted along with the financial transaction to the issuer. Expiring card's AVS street name String 19-character alpha- receipt.GetExpAvsStreetName(); numeric Returns the AVS street name saved in the profile. If no other AVS street number is passed in the transaction request, this value will be submitted along with the financial transaction to the issuer. Applicable to Vault Get Expiring transaction type. Vault AVS ZIP code String 9-character alpha- receipt.GetResDataAvsZipcode(); numeric Returns the AVS zip/postal code saved in the profile. If no other AVS street number is passed in the transaction request, this value will be submitted along with the financial transaction to the issuer. Expiring card's AVS ZIP code String 9-character alpha- receipt.GetExpAvsZipcode(); numeric Returns the AVS zip/postal code saved in the profile. If no other AVS street number is passed in the transaction request, this value will be submitted along with the financial transaction to the issuer. Applicable to Vault Get Expiring transaction type. Vault credit card number String 20-character numeric receipt.GetResPan(); Returns the full credit card number saved in the Vault profile. Applicable to Vault Lookup Full transaction only. Page 456 of 486 November 2018 Appendix B Definitions of Response Fields Table 109: Receipt object response values (continued) Value Type Limits Get Method Description Corporate card String true/false receipt.GetCorporateCard(); Indicates whether the card associated with the Vault profile is a corporate card. Encrypted Mag Swipe response fields (see 6, page 120) Masked credit card number String 20-character alpha- receipt.GetMaskedPan(); numeric Convenience Fee response fields (see Appendix A, page 1) Convenience fee success String Convenience fee status String true/false receipt.GetCfSuccess(); Indicates whether the Convenience Fee transaction processed successfully. 2-character alpha- receipt.GetCfStatus(); numeric Indicates the status of the merchant and convenience fee transactions. The CfStatus field provides details about the transaction behavior and should be referenced when contacting Moneris Customer Support. Possible values are: l l l l l l l l l Convenience fee amount String 1 or 1F – Completed 1st purchase transaction 2 or 2F – Completed 2nd purchase transaction 3 – Completed void transaction 4A or 4D – Completed refund transaction 7 or 7F – Completed merchant independent refund transaction 8 or 8F – Completed merchant refund transaction 9 or 9F – Completed 1st void transaction 10 or 10F – Completed 2nd void transaction 11A or 11D – Completed refund transaction 9-character decimal receipt.GetFeeAmount(); The expected Convenience Fee amount. This field will return the amount submitted by the merchant for a successful transaction. For an unsuccessful transaction, it will return the expected convenience fee amount November 2018 Page 457 of 486 Moneris Gateway API - Integration Guide Table 109: Receipt object response values (continued) Type Value Limits Get Method Description Convenience fee rate String 9-character decimal receipt.GetFeeRate(); The convenience fee rate that has been defined on the merchant’s profile. For example: 1.00 – a fixed amount or 10.0 - a percentage amount Convenience fee type String AMT/PCT receipt.GetFeeType(); The type of convenience fee that has been defined on the merchant’s profile. Available options are: AMT – fixed amount PCT – percentage Code Table 110: Financial transaction response codes Description < 50 Transaction approved ≥ 50 Transaction declined NULL Transaction was not sent for authorization For more details on the response codes that are returned, see the Response Codes document available at https://developer.moneris.com Table 111: Vault Admin Responses Code 001 Description Successfully registered CC details. Successfully updated CC details. Successfully deleted CC details. Successfully located CC details. Successfully located # expiring cards. (NOTE: # = the number of cards located) 983 Page 458 of 486 Cannot find previous November 2018 Appendix B Definitions of Response Fields Code Description 986 Incomplete: timed out 987 Invalid transaction 988 Cannot find expiring cards Null Error: Malformed XML November 2018 Page 459 of 486 Appendix C Error Messages Error messages that are returned if the gateway is unreachable Global Error Receipt You are not connecting to our servers. This can be caused by a firewall or your internet connection. Response Code = NULL The response code can be returned as null for a variety of reasons. The majority of the time, the explanation is contained within the Message field. When a ‘NULL’ response is returned, it can indicate that the issuer, the credit card host, or the gateway is unavailable. This may be because they are offline or because you are unable to connect to the internet. A ‘NULL’ can also be returned when a transaction message is improperly formatted. Error messages that are returned in the Message field of the response XML Parse Error in Request: An improper XML document was sent from the API to the servlet. XML Parse Error in Response: An improper XML document was sent back from the servlet. Transaction Not Completed Timed Out Transaction timed out before the host responds to the gateway. Request was not allowed at this time The host is disconnected. Could not establish connection with the gateway: Gateway is not accepting transactions or server does not have proper access to internet. Input/Output Error: Servlet is not running. The transaction was not sent to the host because of a duplicate order id Tried to use an order id which was already in use. The transaction was not sent to the host because of a duplicate order id Expiry Date was sent in the wrong format. Vault error messages Can not find previous Data key provided was not found in our records or profile is no longer active. Invalid Transaction Transaction cannot be performed because improper data was sent. or Mandatory field is missing or an invalid SEC code was sent. Malformed XML Parse error. Incomplete Timed out. or Cannot find expiring cards. November 2018 Page 461 of 486 Appendix D Process Flow for Basic Pre-Auth, Re-Auth and Completion Transactions November 2018 Page 463 of 486 Appendix E Merchant Checklists for INTERAC® Online Payment Certification Testing Merchant Information Name and URL Merchant Name (English) Homepage URL (English) Merchant Name (French) Homepage URL (French) Number Merchant Number Transaction fee category Government (Circle one) Education General Checklist for Front-End Tests Case # Date Completed Remarks 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 November 2018 Canada Only Page 464 of 486 Moneris Gateway API - Integration Guide Case # Date Completed Remarks 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 Merchant Requirements Table 112: Checklist for web display requirements Done Requirement Checkout page Page 465 of 486 Canada Only November 2018 Appendix E Merchant Checklists for INTERAC® Online Payment Certification Testing Table 112: Checklist for web display requirements (continued) Done Requirement Displays the INTERAC Online design (logo), wordmark (text "INTERAC Online) or both Design and Wordmark Requirements (any page) Other payment option logos: l l Displays the INTERAC Online design (logo) if the merchant displays the trademarks or logos of other payment options. Design is equal in size and no less prominent than other payment option trademarks. INTERAC wordmark: l l l INTERAC is always either in capital letters or italics (as in "the INTERAC Online service") In the first use of the INTERAC Online wordmark, INTERAC is followed by the ® notation in superscript. For example, "Interac®" (English) or <> (French). On the same page as the first occurence of the wordmark, the following language-appropriate footnote appears: l ® Trademark of Interac Inc. Used under licence" MD l Marque de commerce d'Interac Inc. Utilisée sous licence Version of design Uses the two-colour design on the web: l l Horizontal version—height no shorter than 25 pixels (width-to-height ratio of 2:37:1) Vertical version—width no narrower than 30 pixels (widteh-to-height ratio of 1:1:37) "Learn more" information Provides consumers with a link to www.interaconline.com/learn (preferably on the checkout page) Confirmation page States that the transaction is successful Displays the financial institution's name and confirmation number Provides ability to print November 2018 Canada Only Page 466 of 486 Moneris Gateway API - Integration Guide Table 112: Checklist for web display requirements (continued) Done Requirement Error page Indicates that payment was unsuccsessful States that the order is cancelled or displays other payment options Timeout message Is displayed if consumer has less than 30 minutes to complete payment Payment Displays the total in Canadian dollars Table 113: Checklist for security/privacy requirements Done Requirement Merchant Uses no less than 128-bit SSL encryption when collecting personal information Protects consumer information in accordance with applicable federal and provincial privacy legislation Adheres to the Canadian Code of Practice for Consumer Protection in Electronic Commerce Provided screenshots Checkout page (where customer selects INTERAC Online option) Confirmation page (one of the test case 1, 2, or 3) Error page (test case 4) Page 467 of 486 Canada Only November 2018 Appendix F Third-Party Service Provider Checklists for INTERAC® Online Payment Certification Testing Third-Party Service Provider Information Name English French Merchant Web Application Solution Name Version Acquirer Interaconline.com/Interacenlgne.com Web Site Listing Information See http://www.interaconline.com/merchants_thirdparty.php for examples. English contact information 5 lines maximum. 35 characters/line maximum. For example, contact name and title, department, telephone, web site, email. English logo File type: PNG. Maximum size: 120x120 pixels. French contact information 5 lines maximum. 35 characters/line maximum. For example, contact name and title, department, telephone, web site, email. French logo File type: PNG. Maximum size: 120x120 pixels. November 2018 Canada Only Page 468 of 486 Moneris Gateway API - Integration Guide Table 114: Checklist for front-end tests Case # Date Completed Remarks 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Page 469 of 486 Canada Only November 2018 Appendix F Third-Party Service Provider Checklists for INTERAC® Online Payment Certification Testing Table 114: Checklist for front-end tests Case # Date Completed Remarks 30 31 32 33 34 35 36 37 38 39 Merchant Requirements Table 115: Checklist for web display requirements Done Requirement Checkout page Displays the INTERAC Online design (logo), wordmark (text "INTERAC Online) or both Design and Wordmark Requirements (any page) Other payment option logos: l l November 2018 Displays the INTERAC Online design (logo) if the merchant displays the trademarks or logos of other payment options. Design is equal in size and no less prominent than other payment option trademarks. Canada Only Page 470 of 486 Moneris Gateway API - Integration Guide Table 115: Checklist for web display requirements (continued) Done Requirement INTERAC wordmark: l l l INTERAC is always either in capital letters or italics (as in "the INTERAC Online service") In the first use of the INTERAC Online wordmark, INTERAC is followed by the ® notation in superscript. For example, "Interac®" (English) or <> (French). On the same page as the first occurence of the wordmark, the following language-appropriate footnote appears: l ® Trademark of Interac Inc. Used under licence" MD l Marque de commerce d'Interac Inc. Utilisée sous licence Version of design Uses the two-colour design on the web: l l Horizontal version—height no shorter than 25 pixels (width-to-height ratio of 2:37:1) Vertical version—width no narrower than 30 pixels (widteh-to-height ratio of 1:1:37) "Learn more" information Provides consumers with a link to www.interaconline.com/learn (preferably on the checkout page) Confirmation page States that the transaction is successful Displays the financial institution's name and confirmation number Provides the ability to print Error page Indicates that payment was unsuccsessful States that the order is cancelled or displays other payment options Timeout message Is displayed if consumer has less than 30 minutes to complete payment Payment Displays the total in Canadian dollars Page 471 of 486 Canada Only November 2018 Appendix F Third-Party Service Provider Checklists for INTERAC® Online Payment Certification Testing Table 116: Checklist for security/privacy requirements Done Requirement Merchant Uses no less than 128-bit SSL encryption when collecting personal information Protects consumer information in accordance with applicable federal and provincial privacy legislation Adheres to the Canadian Code of Practice for Consumer Protection in Electronic Commerce Table 117: Checklist for required screenshots Done Requirement Provided screenshots Checkout page (where customer selects INTERAC Online option) Confirmation page (one of the test case 1, 2, or 3) Error page (test case 4) November 2018 Canada Only Page 472 of 486 Appendix G Merchant Checklists for INTERAC® Online Payment Certification Merchant Information Name and URL Merchant Name (English) Homepage URL (English) Merchant Name (French) Homepage URL (French) Number Merchant Number Transaction fee category Government (Circle one) Education General Third-party service provider Company name Service provider's merchant web application Solution name Version Merchant Requirements Table 118: Checklist for web display requirements Done Requirement Checkout page Displays the INTERAC Online design (logo), wordmark (text "INTERAC Online) or both Design and Wordmark Requirements (any page) Other payment option logos: l l November 2018 Displays the INTERAC Online design (logo) if the merchant displays the trademarks or logos of other payment options. Design is equal in size and no less prominent than other payment option trademarks. Canada Only Page 473 of 486 Moneris Gateway API - Integration Guide Table 118: Checklist for web display requirements (continued) Done Requirement INTERAC wordmark: l l l INTERAC is always either in capital letters or italics (as in "the INTERAC Online service") In the first use of the INTERAC Online wordmark, INTERAC is followed by the ® notation in superscript. For example, "Interac®" (English) or <> (French). On the same page as the first occurence of the wordmark, the following language-appropriate footnote appears: l ® Trademark of Interac Inc. Used under licence" MD l Marque de commerce d'Interac Inc. Utilisée sous licence Version of design Uses the two-colour design on the web: l l Horizontal version—height no shorter than 25 pixels (width-to-height ratio of 2:37:1) Vertical version—width no narrower than 30 pixels (widteh-to-height ratio of 1:1:37) "Learn more" information Provides consumers with a link to www.interaconline.com/learn (preferably on the checkout page) Confirmation page States that the transaction is successful Displays the financial institution's name and confirmation number Provides ability to print Error page Indicates that payment was unsuccsessful States that the order is cancelled or displays other payment options Timeout message Is displayed if consumer has less than 30 minutes to complete payment Payment Displays the total in Canadian dollars Page 474 of 486 Canada Only November 2018 Appendix G Merchant Checklists for INTERAC® Online Payment Certification Table 119: Checklist for security/privacy requirements Done Requirement Merchant Uses no less than 128-bit SSL encryption when collecting personal information Protects consumer information in accordance with applicable federal and provincial privacy legislation Adheres to the Canadian Code of Practice for Consumer Protection in Electronic Commerce Provided screenshots Checkout page (where customer selects INTERAC Online option) Confirmation page (one of the test case 1, 2, or 3) Error page (test case 4) November 2018 Canada Only Page 475 of 486 Appendix H INTERAC® Online Payment Certification Test Case Detail l l l H.1 Common Validations H.2 Test Cases H.3 Merchant front-end test case values H.1 Common Validations The Merchant sends a request to the INTERAC Online Merchant Test Tool, which validates the fields as follows: l l l l l l All mandatory fields are present. All fields are valid according to their definition in the INTERAC Online Functional Specifications (including field lengths, valid characters and so on). Merchant number is that of a valid registered merchant. Funded URL matches one of the merchant's registered funded URLs that were provided during merchant registration. The not funded URL matches one of the merchant's registered Not Funded URLs that were provided during merchant registration. No additional fields are present. H.2 Test Cases Table 120: Cases 1-3 Objective To test that the merchant can do all of the following: l l l l Send a valid request to the Gateway page Receive a valid confirmation of funding from the Issuer Online Banking application Issue a request for purchase completion to the acquirer Receive an approved response from the acquirer. Pre-requisites None Configuration Merchant sends form posts to the Merchant Test Tool, which in turn responds to either the Funded or Not Funded URL. The Merchant is connected to an acquirer emulator, which can be set to confirm any request for payment confirmation. (That is, the back-end process of sending a 0200 Message to the issuer is emulated to always accept the purchase request). Special tools required None November 2018 Canada Only Page 476 of 486 Moneris Gateway API - Integration Guide Table 120: Cases 1-3 (continued) Input data Acquirer must have registered the merchant using the administration system, and requirements have supplied the following: l l l IDEBIT_FUNDEDURL(S) IDEBIT_NOTFUNDEDURL(S) HTTP REFERERURL(S) Data will be provided by the Merchant Test Tool. Execution strategy Initiate a payment at the merchant. The two least significant digits of the dollar amount must be equal to the test case number. For example, if you are executing test case 3, the format of the amount must be ### ### #03.##. Expected out- The merchant indicates to the customer that the purchase was completed and come presents a confirmation screen that includes (depending on the test case) the correct amount, the issuer name and the issuer confirmation number. Test case 1 l l Issuer name: 123Bank Issuer confirmation number: CONF#123 Test case 2 l l Issuer name: Bank Éàêëï#$.,-/=?@' Issuer confirmation number: #$.,-/=?@'UPdn9 Test case 3 l l Applicable logs l l Issuer name: B Issuer confirmation number: C Merchant Test Tool logs Screen capture of the merchant's confirmation page. Table 121: Case 4 Objective To test that the merchant handles a rejection in response to the acquirer Pre-requisites None Configuration Same as test cases 1-3 except that the acquirer emulator must be set to decline the request for mayment confirmation. (That is, to emulate the scenario in which an issuer sends a delcine in the 0210 response to the acquirer's 0200 message.) Page 477 of 486 Canada Only November 2018 Appendix H INTERAC® Online Payment Certification Test Case Detail Table 121: Case 4 (continued) Special tools required None Input data Acquirer must have registered the merchant using the administration system, and requirements have supplied the following: l l l IDEBIT_FUNDEDURL(S) IDEBIT_NOTFUNDEDURL(S) HTTP REFERERURL(S) Data will be provided by the Merchant Test Tool. Execution strategy Initiate a payment at the merchant for any amount where the two least significant dollar digits are 04. (That is, of the form ### ### #04.##.) Expected out- The merchant indicates to the customer that the purchase was declined. Neither the come issuer name nor the issuer confirmation number are displayed. Applicable logs Merchant Test Tool logs Table 122: Cases 5-22 Objective To test that a merchant safely handles redirections to the Funded URL with invalid data, and treats the transaction as funded. Pre-requisites None Configuration None. The acquirer emulator is not needed because the merchant does not submit any requests for payment confirmation. Special tools required None Input data Acquirer must have registered the merchant using the administration system, and requirements have supplied the following: l l l IDEBIT_FUNDEDURL(S) IDEBIT_NOTFUNDEDURL(S) HTTP REFERERURL(S) Data will be provided by the Merchant Test Tool. Execution strategy Initiate a payment at the merchant. The two least significant digits of the dollar amount must be equal to the test case number. For example, if you are executing test case 13, the format of the amount must be ### ### #13.##. November 2018 Canada Only Page 478 of 486 Moneris Gateway API - Integration Guide Table 122: Cases 5-22 (continued) Expected out- The merchant indicates to the customer that the purchase was declined. Neither the come issuer name nor the issuer confirmation number are displayed. Applicable logs Merchant Test Tool logs Table 123: Case 23 Objective To test that a merchant can receive a valid redirection from the issuer that indicates the payment was not funded. Pre-requisites None Configuration None. The acquirer emulator is not needed because the merchant does not submit any requests for payment confirmation. Special tools required None Input data Acquirer must have registered the merchant using the administration system, and requirements have supplied the following: l l l IDEBIT_FUNDEDURL(S) IDEBIT_NOTFUNDEDURL(S) HTTP REFERERURL(S) Data is provided by the Merchant Test Tool. Execution strategy Initiate a payment at the merchant for any amount where the two least significant dollar digits are 23. (That is, of the form ### ### #23.##.) Expected out- The merchant indicates to the customer that the purchase was declined. Neither the come issuer name nor the issuer confirmation number are displayed. Applicable logs Merchant Test Tool logs Table 124: Cases 24-39 Objective To test that a merchant safely handles redirections to the Not Funded URL with invalid data, and treats the transaction as not funded. Pre-requisites None Configuration None. The acquirer emulator is not needed because the merchant does not submit any requests for payment confirmation. Page 479 of 486 Canada Only November 2018 Appendix H INTERAC® Online Payment Certification Test Case Detail Table 124: Cases 24-39 (continued) Special tools required None Input data Acquirer must have registered the merchant using the administration system, and requirements have supplied the following: l l l IDEBIT_FUNDEDURL(S) IDEBIT_NOTFUNDEDURL(S) HTTP REFERERURL(S) Data is provided by the Merchant Test Tool. Execution strategy Initiate a payment at the merchant. The two least significant digits of the dollar amount must be equal to the test case number. For example, if you are executing test case 27, the format of the amount must be ### ### #27.##. Expected out- The merchant indicates to the customer that the purchase was declined. Neither the come issuer name nor the issuer confirmation number are displayed. Applicable logs Merchant Test Tool logs H.3 Merchant front-end test case values These values are automatically sent by the INTERAC Online Merchant Test Tool. They are provided here for reference only. Table 125: Test cases 1 and 4—Funded URL Redirection URL Funded ISSLANG en TRACK2 3728024906540591206=12010123456789XYZ ISSCONF CONF#123 ISSNAME 123Bank INVOICE (Same as supplied by merchant) MERCHDATA (Same as supplied by merchant) VERSION 1 Table 126: Test case 2—Funded URL Redirection URL Funded ISSLANG en November 2018 Canada Only Page 480 of 486 Moneris Gateway API - Integration Guide Table 126: Test case 2—Funded URL TRACK2 5268051119993326=29129999999999999000 ISSCONF #$.,-/=?@'UPdn9 ISSNAME 987Bank Éàêëï#$.,-/=?@'Àôùûüÿç INVOICE (Same as supplied by merchant) MERCHDATA (Same as supplied by merchant) VERSION 1 Table 127: Test case 3—Funded URL Redirection URL Funded ISSLANG fr TRACK2 453781122255=1001ABC11223344550000000 ISSCONF C ISSNAME B INVOICE (Same as supplied by merchant) MERCHDATA (Same as supplied by merchant) VERSION 123 Table 128: Test cases 5-22—invalid fields, Funded URL Test case Purpose Field Value 5 missing field IDEBIT_INVOICE (missing) 6 missing field IDEBIT_MERCHDATA (missing) 7 missing field IDEBIT_ISSLANG (missing) 8 missing field IDEBIT_TRACK2 (missing) 9 missing field IDEBIT_ISSCONF (missing) 10 missing field IDEBIT_ISSNAME (missing) 11 missing field IDEBIT_VERSION (missing) 12 missing field IDEBIT_TRACK2, IDEBIT_ ISSCONF, IDEBIT_ISSNAME (missing) 13 wrong value IDEBIT_INVOICE XXX 14 wrong value IDEBIT_MERCHDATA XXX Page 481 of 486 Canada Only November 2018 Appendix H INTERAC® Online Payment Certification Test Case Detail Table 128: Test cases 5-22—invalid fields, Funded URL (continued) Test Purpose case Field Value 15 invalid value IDEBIT_ISSLANG de 16 value too long IDEBIT_TRACK2 3728024906540591206=12010123456789XYZA 17 invalid check digit IDEBIT_TRACK2 3728024906540591207=12010123456789XYZ 18 field too long IDEBIT_ISSCONF Too long confirm 19 invalid character IDEBIT_ISSCONF CONF<123 20 field too long Very, very, very long issuer name 21 invalid character IDEBIT_ISSNAME 123 tricky data 33 wrong value IDEBIT_MERCHDATA XXX 34 invalid value IDEBIT_MERCHDATA <2000 characters in the range hex 20-7E 35 invalid value IDEBIT_ISSLANG de 36 invalid IDEBIT_ TRACK2 is present IDEBIT_TRACK2 INVALIDTRACK2, incorrect format and too long 37 invalid IDEBIT_ ISSCONF is present IDEBIT_ISSCONF Too long confirm 38 invalid IDEBIT_ ISSNAME is present IDEBIT_ISSNAME Very, very, very long issuer name 39 invalid value IDEBIT_VERSION 2 Page 483 of 486 Canada Only November 2018 Copyright Notice Copyright © November 2018 Moneris Solutions, 3300 Bloor Street West, Toronto, Ontario, M8X 2X2 All Rights Reserved. This manual shall not wholly or in part, in any form or by any means, electronic, mechanical, including photocopying, be reproduced or transmitted without the authorized, written consent of Moneris Solutions. This document has been produced as a reference guide to assist Moneris client’s hereafter referred to as merchants. Every effort has been made to the make the information in this reference guide as accurate as possible. The authors of Moneris Solutions shall have neither liability nor responsibility to any person or entity with respect to any loss or damage in connection with or arising from the information contained in this reference guide. Trademarks Moneris and the Moneris Solutions logo are registered trademarks of Moneris Solutions Corporation. Any software, hardware and or technology products named in this document are claimed as trademarks or registered trademarks of their respective companies. Printed in Canada. 10 9 8 7 6 5 4 3 2 1 November 2018 Page 485 of 486

Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.4
Linearized                      : No
Page Count                      : 486
Page Mode                       : UseOutlines
Page Layout                     : SinglePage
Language                        : en-us
Producer                        : madbuild
Create Date                     : 2018:11:27 16:59:25-05:00
Modify Date                     : 2018:11:27 16:59:25-05:00
Title                           : My Document
Author                          : michael.pukin
Subject                         : 
EXIF Metadata provided by EXIF.tools

Navigation menu