====== .NET XML Secure Cards ====== **NOTE:** * - Supported on .NET Framework 4.5 * - .NET Core is not supported The sample code below requires the **{{:developer:sample_codes:nuvei-api-dotnet.zip|.NET XML API}}**. \\ ---- **SecureCard registration:** using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Text; using NuveiClient; namespace ApiTest { class SecureCardRegistrationSample { static void Main (string[] args) { String gateway = "nuvei"; // Gateway that will process the transaction. String terminalId = ""; // Terminal ID String secret = ""; // Shared Secret as configured in the Terminal Setup in your Nuvei SelfCare System String secureCardMerchantRef = ""; // Unique Merchant Reference. Length is limited to 48 chars. String cardNumber = ""; // The cardholders PAN (or SecureCard Card Reference); String cardType = ""; // See our Integrator Guide for a list of valid Card Type parameters String cardExpiry = ""; // Format: MMYY String cardHolderName = ""; // Cardholders name String dontCheckSecurity = ""; // (optional) "Y" if you do not want the CVV to be validated online. String cvv = ""; // (optional) 3 digit (4 for AMEX cards) security digit on the back of the card. String issueNo = ""; // (optional) Issue number for Switch and Solo cards. IList permittedTerminals = new List (); // PERMITTED TERMINALS //permittedTerminals.Add ("1002"); //permittedTerminals.Add ("1009"); IList customFields = new List (); // CustomFields //customFields.Add ("name1", "value1")); //customFields.Add ("name2", "value2")); Boolean testAccount = true; XmlSecureCardRegRequest securereg = new XmlSecureCardRegRequest (secureCardMerchantRef, terminalId, cardNumber, cardExpiry, cardType, cardHolderName); if (!String.IsNullOrEmpty (dontCheckSecurity)) { securereg.SetDontCheckSecurity (dontCheckSecurity); } if (!String.IsNullOrEmpty (cvv)) { securereg.SetCvv (cvv); } if (!String.IsNullOrEmpty (issueNo)) { securereg.SetIssueNo (issueNo); } if (permittedTerminals != null && permittedTerminals.Count != 0) { securereg.SetPermittedTerminals (permittedTerminals); } if (customFields != null && customFields.Count != 0) { securereg.SetCustomFields (customFields); } XmlSecureCardRegResponse response = securereg.ProcessRequest (secret, testAccount, gateway); String expectedResponseHash = Response.GetResponseHash (terminalId + response.MerchantRef + response.CardRef + response.DateTimeHashString + secret); if (response.IsError == true) { Console.Out.WriteLine ("ERROR : " + response.ErrorString); //Handle Error Response } else if (response.Hash != expectedResponseHash) { Console.Out.WriteLine ("ERROR : Response HASH parameter not as expected. If live possible man-in-the-middle attack."); //Handle Invalid Hash scenario - inform merchant that transaction may have to be voided. } else { Console.Out.WriteLine ("SecureCard successfully stored."); Console.Out.WriteLine ("CARDREFERENCE : " + response.CardRef); //Handle Response } } } } \\ ---- **SecureCard record update:** using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Text; using NuveiClient; namespace ApiTest { class SecureCardRecordUpdateSample { static void Main (string[] args) { String gateway = "nuvei"; // Gateway that will process the transaction. String terminalId = ""; // Terminal ID String secret = ""; // Shared Secret as configured in the Terminal Setup in your Nuvei SelfCare System String secureCardMerchantRef = ""; // Unique Merchant Reference. Length is limited to 48 chars. String cardNumber = ""; // The cardholders PAN (or SecureCard Card Reference); String cardType = ""; // See our Integrator Guide for a list of valid Card Type parameters String cardExpiry = ""; // Format: MMYY String cardHolderName = ""; // Cardholders name String dontCheckSecurity = ""; // (optional) "Y" if you do not want the CVV to be validated online. String cvv = ""; // (optional) 3 digit (4 for AMEX cards) security digit on the back of the card. String issueNo = ""; // (optional) Issue number for Switch and Solo cards. IList permittedTerminals = new List (); // PERMITTED TERMINALS //permittedTerminals.Add ("1003"); //permittedTerminals.Add ("1013"); IList customFields = new List (); // CustomFields //customFields.Add (new CustomField ("name1", "value1")); //customFields.Add (new CustomField ("name2", "value2")); Boolean testAccount = true; XmlSecureCardUpdRequest secureupd = new XmlSecureCardUpdRequest (secureCardMerchantRef, terminalId, cardNumber, cardExpiry, cardType, cardHolderName); if (!String.IsNullOrEmpty (dontCheckSecurity)) { secureupd.SetDontCheckSecurity (dontCheckSecurity); } if (!String.IsNullOrEmpty (cvv)) { secureupd.SetCvv (cvv); } if (!String.IsNullOrEmpty (issueNo)) { secureupd.SetIssueNo (issueNo); } if (permittedTerminals != null && permittedTerminals.Count != 0) { secureupd.SetPermittedTerminals (permittedTerminals); } if (customFields != null && customFields.Count != 0) { secureupd.SetCustomFields (customFields); } XmlSecureCardUpdResponse response = secureupd.ProcessRequest (secret, testAccount, gateway); String expectedResponseHash = Response.GetResponseHash (terminalId + response.MerchantRef + response.CardRef + response.DateTimeHashString + secret); if (response.IsError == true) { Console.Out.WriteLine ("ERROR : " + response.ErrorString); //Handle Error Response } else if (response.Hash != expectedResponseHash) { Console.Out.WriteLine ("ERROR : Response HASH parameter not as expected. If live possible man-in-the-middle attack."); //Handle Invalid Hash scenario - inform merchant that transaction may have to be voided. } else { Console.Out.WriteLine ("SecureCard successfully updated."); //Handle Response } } } } \\ ---- **SecureCard record deletion:** using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Text; using $GatewayClient; namespace ApiTest { class SecureCardRecordDeletionSample { static void Main (string[] args) { String gateway = "nuvei"; // Gateway that will process the transaction. String terminalId = ""; // Terminal ID String secret = ""; // Shared Secret as configured in the Terminal Setup in your Nuvei SelfCare System String secureCardMerchantRef = ""; // Unique Merchant Reference. Length is limited to 48 chars. String secureCardCardRef = ""; // This is the Nuvei generated 16 digit card number token Boolean testAccount = false; XmlSecureCardDelRequest securedel = new XmlSecureCardDelRequest (secureCardMerchantRef, terminalId, secureCardCardRef); XmlSecureCardDelResponse response = securedel.ProcessRequest (secret, testAccount, gateway); String expectedResponseHash = Response.GetResponseHash (terminalId + response.MerchantRef + response.DateTimeHashString + secret); if (response.IsError == true) { Console.Out.WriteLine ("ERROR : " + response.ErrorString); //Handle Error Response } else if (response.Hash != expectedResponseHash) { Console.Out.WriteLine ("ERROR : Response HASH parameter not as expected. If live possible man-in-the-middle attack."); //Handle Invalid Hash scenario - inform merchant that transaction may have to be voided. } else { Console.Out.WriteLine ("SecureCard successfully deleted."); //Handle Response } } } } \\ ---- **SecureCard Search:** using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Text; using NuveiClient; namespace ApiTest { class SecureCardSearchSample { static void Main (string[] args) { String gateway = "nuvei"; // Gateway that will process the transaction. String terminalId = ""; // Terminal ID String secret = ""; // Shared Secret as configured in the Terminal Setup in your Nuvei SelfCare System String secureCardMerchantRef = ""; // Unique Merchant Reference. Length is limited to 48 chars. Boolean testAccount = true; XmlSecureCardSearchRequest securesearch = new XmlSecureCardSearchRequest (secureCardMerchantRef, terminalId); XmlSecureCardSearchResponse response = securesearch.ProcessRequest (secret, testAccount, gateway); String expectedResponseHash = Response.GetResponseHash (terminalId + response.MerchantRef + response.CardRef + response.CardType + response.CardExpiry + response.CardHolderName + response.DateTimeHashString + secret); if (response.IsError == true) { Console.Out.WriteLine ("ERROR : " + response.ErrorString); //Handle Error Response } else if (response.Hash != expectedResponseHash) { Console.Out.WriteLine ("ERROR : Response HASH parameter not as expected. If live possible man-in-the-middle attack."); //Handle Invalid Hash scenario - inform merchant that transaction may have to be voided. } else { Console.Out.WriteLine ("SecureCard successfully found."); Console.Out.WriteLine ("MERCHANTREF : " + response.MerchantRef); Console.Out.WriteLine ("CARDREFERENCE : " + response.CardRef); Console.Out.WriteLine ("CARDTYPE : " + response.CardType); Console.Out.WriteLine ("CARDEXPIRY : " + response.CardExpiry); Console.Out.WriteLine ("CARDHOLDERNAME : " + response.CardHolderName); //Handle Response } } } }