diff --git a/GlobalPayments.Api.sln b/GlobalPayments.Api.sln
index b6c47e35..c22ff196 100644
--- a/GlobalPayments.Api.sln
+++ b/GlobalPayments.Api.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.28922.388
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.12
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9876175E-E3D9-4F53-B8D3-6FEB12CD64A8}"
EndProject
@@ -32,7 +32,4 @@ Global
{F17FCB7C-D151-42A3-92F0-D07C6BAEBE1E} = {9876175E-E3D9-4F53-B8D3-6FEB12CD64A8}
{B6046949-26BA-4F0C-A6AD-5836ADAF479F} = {8E5CBF7F-AF5F-462D-9C3B-3660C36D0C4A}
EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {092A21D0-A224-4A40-9C9C-F4D9EB8751B0}
- EndGlobalSection
EndGlobal
diff --git a/README.md b/README.md
index 74ace378..56890847 100644
--- a/README.md
+++ b/README.md
@@ -1,162 +1,2 @@
-
-
-
+# CSharp-SDK
-# Heartland & Global Payments .NET SDK
-
-This SDK makes it easy to integrate your .NET application with our Card Not Present and Card Present APIs.
-
-## Solutions
-
-### General / Omnichannel
-
-* API Payment Processing
-* Apple Pay & Google Pay
-* Secure Card Storage & Customer Management
-* Subscriptions / Recurring Billing Solutions
-* Credit, Debit, Gift & Loyalty, and eCheck/ACH
-
-### Card Not Present (Ecommerce & MOTO) Specific
-
-* Minimize PCI compliance requirements with Hosted Payment Solutions
-* 140+ Authorization Currencies & 16 Settlement Currencies
-* 150+ Local Payment Methods Worldwide
-* Account Updater
-* Inbuilt Fraud Prevention Rules
-* 3D Secure, AVS and CVV Checks
-* 260+ Global Enterprise Fraud Rules
-
-### Card Present (Terminal & POS) Specific
-
-* Minimize PCI Compliance requirements with Semi-Integrated / Out of Scope devices
-* Secure End-To-End Encryption
-
-## Requirements
-
-- .NET Standard 1.3 compatible project, for example:
- - .NET Core 1.0+
- - .NET Framework 4.6+
- - Mono 4.6+
-
-## Installation
-
-Installing the SDK into your solution is usually be done by either using NuGet, or by adding the project to your solution and creating a project reference.
-
-The project is compiled with environments compatible with `dotnet` tooling 2.0+ (e.g. Visual Studio 2017+) and requires .NET Standard version 1.3 or later.
-
-To install via [Nuget Manager Console](https://docs.nuget.org/consume/package-manager-console):
-
-```
-PM> Install-Package GlobalPayments.Api -Version 1.0.20-BETA
-```
-
-To install via [`dotnet` CLI](https://docs.microsoft.com/en-us/dotnet/core/tools/):
-
-```
-dotnet add package GlobalPayments.Api --version 1.0.20-BETA
-```
-
-To install via a Project Reference:
-
-Download and unzip or, using Git, [clone the repository](https://github.com/globalpayments/dotnet-sdk) from GitHub. See more on [how to clone repositories](https://help.github.com/articles/cloning-a-repository/).
-
-```
-git clone https://github.com/globalpayments/dotnet-sdk
-```
-
-## Documentation and Examples
-
-You can find the latest SDK documentation along with code examples and test cards on the [Global Payments](https://developer.realexpayments.com) and [Heartland](https://developer.heartlandpaymentsystems.com/documentation) Developer Hubs.
-
-In addition you can find working examples in the our example code repository.
-
-*Quick Tip*: The included [test suite](https://github.com/globalpayments/dotnet-sdk/tree/master/tests/GlobalPayments.Api.Tests) can be a great source of code samples for using the SDK!
-
-#### Process a Payment Example
-
-```csharp
-var card = new CreditCardData
-{
- Number = "4263970000005262",
- ExpMonth = 12,
- ExpYear = 2025,
- Cvn = "131",
- CardHolderName = "James Mason"
-};
-
-try
-{
- var response = card.Charge(129.99m)
- .WithCurrency("EUR")
- .Execute();
-
- var result = response.ResponseCode; // 00 == Success
- var message = response.ResponseMessage; // [ test system ] AUTHORISED
-}
-catch (ApiException e)
-{
- // handle errors
-}
-```
-
-#### Test Card Data
-
-Name | Number | Exp Month | Exp Year | CVN
------------ | ---------------- | --------- | -------- | ----
-Visa | 4263970000005262 | 12 | 2025 | 123
-MasterCard | 2223000010005780 | 12 | 2019 | 900
-MasterCard | 5425230000004415 | 12 | 2025 | 123
-Discover | 6011000000000087 | 12 | 2025 | 123
-Amex | 374101000000608 | 12 | 2025 | 1234
-JCB | 3566000000000000 | 12 | 2025 | 123
-Diners Club | 36256000000725 | 12 | 2025 | 123
-
-#### Testing Exceptions
-
-During your integration you will want to test for specific issuer responses such as 'Card Declined'. Because our sandbox environments do not actually reach out to issuing banks for authorizations, there are specific transaction amounts and/or card numbers that will trigger gateway and issuing bank responses. Please contact your support representative for a complete listing of values used to simulate transaction AVS/CVV results, declines, errors, and other responses that can be caught in your code. Example error handling code:
-
-```csharp
-try
-{
- var response = card.Charge(5.00m)
- .WithCurrency("USD")
- .WithAddress(address)
- .Execute();
-}
-catch (BuilderException e)
-{
- // handle builder errors
-}
-catch (ConfigurationException e)
-{
- // handle errors related to your services configuration
-}
-catch (GatewayException e)
-{
- // handle gateway errors/exceptions
-}
-catch (UnsupportedTransactionException e)
-{
- // handle errors when the configured gateway doesn't support
- // desired transaction
-}
-catch (ApiException e)
-{
- // handle all other errors
-}
-```
-
-## Contributing
-
-All our code is open sourced and we encourage fellow developers to contribute and help improve it!
-
-1. Fork it
-2. Create your feature branch (`git checkout -b my-new-feature`)
-3. Ensure SDK tests are passing
-4. Commit your changes (`git commit -am 'Add some feature'`)
-5. Push to the branch (`git push origin my-new-feature`)
-6. Create new Pull Request
-
-## License
-
-This project is licensed under the GNU General Public License v2.0. Please see [LICENSE.md](LICENSE.md) located at the project's root for more details.
diff --git a/examples/webforms/end-to-end/Response.aspx.cs b/examples/webforms/end-to-end/Response.aspx.cs
index 95347dde..735fcebb 100644
--- a/examples/webforms/end-to-end/Response.aspx.cs
+++ b/examples/webforms/end-to-end/Response.aspx.cs
@@ -1,24 +1,24 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web;
-using System.Web.UI;
-using System.Web.UI.WebControls;
-
-namespace end_to_end {
- public partial class Success : System.Web.UI.Page {
- protected void Page_Load(object sender, EventArgs e) {
- string firstname = Request.QueryString["FirstName"];
- string transactionId = Request.QueryString["TransactionId"];
- string response = Request.QueryString["response"];
- if (response == "Success!") {
- header.InnerText = response;
- lblStatus.Text = "Thank you, " + firstname + ", for your order of $15.15.
Transaction Id: " + transactionId + "
";
- }
- else if (response == "Failed!") {
- header.InnerText = response;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace end_to_end {
+ public partial class Success : System.Web.UI.Page {
+ protected void Page_Load(object sender, EventArgs e) {
+ string firstname = Request.QueryString["FirstName"];
+ string transactionId = Request.QueryString["TransactionId"];
+ string response = Request.QueryString["response"];
+ if (response == "Success!") {
+ header.InnerText = response;
+ lblStatus.Text = "Thank you, " + firstname + ", for your order of $15.15. Transaction Id: " + transactionId + "
";
+ }
+ else if (response == "Failed!") {
+ header.InnerText = response;
lblStatus.Text = "Thank you," + firstname;
- }
- }
- }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs b/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs
index 4b8618f7..00c17cd8 100644
--- a/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs
+++ b/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Network.Entities;
using GlobalPayments.Api.PaymentMethods;
namespace GlobalPayments.Api.Builders {
@@ -16,12 +15,10 @@ public class AuthorizationBuilder : TransactionBuilder {
internal bool AllowDuplicates { get; set; }
internal bool AllowPartialAuth { get; set; }
internal decimal? Amount { get; set; }
- internal bool AmountEstimated { get; set; }
internal decimal? AuthAmount { get; set; }
internal AutoSubstantiation AutoSubstantiation { get; set; }
internal InquiryType? BalanceInquiryType { get; set; }
internal Address BillingAddress { get; set; }
- internal string CardBrandTransactionId { get; set; }
internal decimal? CashBackAmount { get; set; }
internal string ClientTransactionId { get; set; }
internal CommercialData CommercialData { get; set; }
@@ -65,19 +62,12 @@ public class AuthorizationBuilder : TransactionBuilder {
internal Dictionary> SupplementaryData { get; set; }
internal string TagData { get; set; }
internal string Timestamp { get; set; }
- internal decimal FeeAmount { get; set; }
- internal FeeType FeeType { get; set; }
- internal string ShiftNumber { get; set; }
- internal string ClerkId { get; set; }
- internal string TransportData { get; set; }
- internal StoredCredentialInitiator? TransactionInitiator { get; set; }
internal bool HasEmvFallbackData {
get {
return (EmvFallbackCondition != null || EmvLastChipRead != null || !string.IsNullOrEmpty(PaymentApplicationVersion));
}
}
- internal EmvLastChipRead EmvChipCondition { get; set; }
///
/// Indicates the type of account provided; see the associated Type enumerations for specific values supported.
@@ -145,11 +135,6 @@ public AuthorizationBuilder WithAmount(decimal? value) {
return this;
}
- public AuthorizationBuilder WithAmountEstimated(bool value) {
- AmountEstimated = value;
- return this;
- }
-
///
/// Sets the transaction's authorization amount; where applicable.
///
@@ -178,8 +163,8 @@ public AuthorizationBuilder WithAutoSubstantiation(AutoSubstantiation value) {
/// Sets the Multicapture value as true/false.
///
/// AuthorizationBuilder
- public AuthorizationBuilder WithMultiCapture(bool value = true) {
- MultiCapture = value;
+ public AuthorizationBuilder WithMultiCapture(bool value) {
+ MultiCapture = value;
return this;
}
@@ -188,12 +173,6 @@ internal AuthorizationBuilder WithBalanceInquiryType(InquiryType? value) {
return this;
}
- public AuthorizationBuilder WithCardBrandStorage(StoredCredentialInitiator transactionInitiator, string value = null) {
- TransactionInitiator = transactionInitiator;
- CardBrandTransactionId = value;
- return this;
- }
-
///
/// Sets the cash back amount.
///
@@ -392,7 +371,8 @@ public AuthorizationBuilder WithGratuity(decimal? value) {
///
/// The Convenience amount
/// AuthorizationBuilder
- public AuthorizationBuilder WithConvenienceAmount(decimal? value) {
+ public AuthorizationBuilder WithConvenienceAmount(decimal? value)
+ {
ConvenienceAmount = value;
return this;
}
@@ -402,7 +382,8 @@ public AuthorizationBuilder WithConvenienceAmount(decimal? value) {
///
/// The Shipping amount
/// AuthorizationBuilder
- public AuthorizationBuilder WithShippingAmt(decimal? value) {
+ public AuthorizationBuilder WithShippingAmt(decimal? value)
+ {
ShippingAmt = value;
return this;
}
@@ -776,73 +757,5 @@ protected override void SetupValidations() {
Validations.For(PaymentMethodType.Recurring).Check(() => ShippingAmt).IsNull();
}
-
- public AuthorizationBuilder WithForceGatewayTimeout(bool value) {
- ForceGatewayTimeout = value;
- return this;
- }
-
- public AuthorizationBuilder WithFee(FeeType feeType, decimal feeAmount) {
- FeeType = feeType;
- FeeAmount = feeAmount;
-
- return this;
- }
-
- public AuthorizationBuilder WithUniqueDeviceId(string value) {
- UniqueDeviceId = value;
- return this;
- }
-
- public AuthorizationBuilder WithClerkId(string value) {
- ClerkId = value;
- return this;
- }
-
- public AuthorizationBuilder WithShiftNumber(string value) {
- ShiftNumber = value;
- return this;
- }
- public AuthorizationBuilder WithTransportData(string value) {
- TransportData = value;
- return this;
- }
- public AuthorizationBuilder WithBatchNumber(int value) {
- BatchNumber = value;
- return this;
- }
- public AuthorizationBuilder WithBatchNumber(int batchNumber, int sequenceNumber) {
- BatchNumber = batchNumber;
- SequenceNumber = sequenceNumber;
- return this;
- }
- public AuthorizationBuilder WithCompanyId(string value) {
- CompanyId = value;
- return this;
- }
- public AuthorizationBuilder WithFleetData(FleetData value) {
- FleetData = value;
- return this;
- }
- public AuthorizationBuilder WithIssuerData(Dictionary value) {
- IssuerData = value;
- return this;
- }
- public AuthorizationBuilder WithSystemTraceAuditNumber(int value) {
- SystemTraceAuditNumber = value;
- return this;
- }
- public AuthorizationBuilder WithTransactionMatchingData(TransactionMatchingData value) {
- TransactionMatchingData = value;
- return this;
- }
- public AuthorizationBuilder WithChipCondition(EmvLastChipRead value) {
- EmvChipCondition = value;
- return this;
- }
- public AuthorizationBuilder WithProductData(ProductData value) {
- ProductData = value;
- return this;
- }
}
-}
\ No newline at end of file
+}
diff --git a/src/GlobalPayments.Api/Builders/ManagementBuilder.cs b/src/GlobalPayments.Api/Builders/ManagementBuilder.cs
index cd7f1af7..9fca16bb 100644
--- a/src/GlobalPayments.Api/Builders/ManagementBuilder.cs
+++ b/src/GlobalPayments.Api/Builders/ManagementBuilder.cs
@@ -1,5 +1,4 @@
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Network.Entities;
using GlobalPayments.Api.PaymentMethods;
using System.Collections.Generic;
@@ -35,8 +34,6 @@ internal string ClientTransactionId {
internal decimal? Gratuity { get; set; }
internal string InvoiceNumber { get; set; }
internal LodgingData LodgingData { get; set; }
- internal int? MultiCapturePaymentCount { get; set; }
- internal int? MultiCaptureSequence { get; set; }
internal string OrderId {
get {
if (PaymentMethod is TransactionReference) {
@@ -56,18 +53,6 @@ internal string TransactionId {
return null;
}
}
- internal int TransactionCount { get; set; }
- internal decimal TotalCredits { get; set; }
- internal decimal TotalDebits { get; set; }
- internal string ReferenceNumber { get; set; }
- internal BatchCloseType BatchCloseType { get; set; }
- internal decimal? CashBackAmount { get; set; }
- internal bool ForcedReversal { get; set; }
- internal bool CustomerInitiated { get; set; }
- internal string TransportData { get; set; }
- internal string Timestamp { get; set; }
- internal VoidReason? VoidReason { get; set; }
- internal bool AllowDuplicates { get; set; }
///
/// Sets the current transaction's amount.
@@ -93,16 +78,8 @@ public ManagementBuilder WithAuthAmount(decimal? value) {
/// Sets the Multicapture value as true/false.
///
/// ManagementBuilder
- //public ManagementBuilder WithMultiCapture(bool value) {
- // MultiCapture = value;
- // return this;
- //}
-
- public ManagementBuilder WithMultiCapture(int sequence = 1, int paymentCount = 1) {
- MultiCapture = true;
- MultiCaptureSequence = sequence;
- MultiCapturePaymentCount = paymentCount;
-
+ public ManagementBuilder WithMultiCapture(bool value) {
+ MultiCapture = value;
return this;
}
@@ -239,50 +216,7 @@ internal ManagementBuilder WithModifier(TransactionModifier value) {
///
///
public ManagementBuilder WithAlternativePaymentType(AlternativePaymentType value) {
- AlternativePaymentType = value;
- return this;
- }
- public ManagementBuilder WithCashBackAmount(decimal? value) {
- CashBackAmount = value;
- return this;
- }
- public ManagementBuilder WithBatchNumber(int batchNumber, int sequenceNumber = 0) {
- BatchNumber = batchNumber;
- SequenceNumber = sequenceNumber;
- return this;
- }
- public ManagementBuilder WithBatchCloseType(BatchCloseType value) {
- BatchCloseType = value;
- return this;
- }
- public ManagementBuilder WithBatchTotals(int transactionCount, decimal totalDebits, decimal totalCredits) {
- TransactionCount = transactionCount;
- TotalDebits = totalDebits;
- TotalCredits = totalCredits;
-
- return this;
- }
- public ManagementBuilder WithTransportData(string value) {
- TransportData = value;
- return this;
- }
- public ManagementBuilder WithTimestamp(string value) {
- Timestamp = value;
- return this;
- }
- public ManagementBuilder WithReferenceNumber(string value) {
- ReferenceNumber = value;
- return this;
- }
-
- ///
- /// Allows duplicate transactions by skipping the
- /// gateway's duplicate checking.
- ///
- /// The duplicate skip flag
- /// ManagementBuilder
- public ManagementBuilder WithAllowDuplicates(bool value) {
- AllowDuplicates = value;
+ this.AlternativePaymentType = value;
return this;
}
@@ -296,11 +230,6 @@ public ManagementBuilder WithLodgingData(LodgingData value) {
return this;
}
- public ManagementBuilder WithVoidReason(VoidReason? value) {
- VoidReason = value;
- return this;
- }
-
internal ManagementBuilder(TransactionType type) : base(type) {}
///
@@ -316,7 +245,7 @@ public override Transaction Execute(string configName = "default") {
protected override void SetupValidations() {
Validations.For(TransactionType.Capture | TransactionType.Edit | TransactionType.Hold | TransactionType.Release)
- .Check(() => PaymentMethod).IsNotNull();
+ .Check(() => TransactionId).IsNotNull();
// TODO: Need level validations
//Validations.For(TransactionType.Edit).With(TransactionModifier.Level_II)
@@ -338,37 +267,6 @@ protected override void SetupValidations() {
Validations.For(TransactionType.TokenUpdate)
.Check(() => PaymentMethod).Is();
-
- Validations.For(
- TransactionType.Capture |
- TransactionType.Edit |
- TransactionType.Hold |
- TransactionType.Release |
- TransactionType.TokenUpdate |
- TransactionType.TokenDelete |
- TransactionType.VerifySignature |
- TransactionType.Refund)
- .Check(() => VoidReason).IsNull();
- }
- public ManagementBuilder WithForcedReversal(bool value) {
- ForcedReversal = value;
- return this;
- }
- public ManagementBuilder WithProductData(ProductData value) {
- ProductData = value;
- return this;
- }
- public ManagementBuilder WithFleetData(FleetData value) {
- FleetData = value;
- return this;
- }
- public ManagementBuilder WithCustomerInitiated(bool value) {
- CustomerInitiated = value;
- return this;
- }
- public ManagementBuilder WithForceGatewayTimeout(bool value) {
- ForceGatewayTimeout = value;
- return this;
}
}
}
diff --git a/src/GlobalPayments.Api/Builders/TransactionBuilder.cs b/src/GlobalPayments.Api/Builders/TransactionBuilder.cs
index d16ba272..aa813df3 100644
--- a/src/GlobalPayments.Api/Builders/TransactionBuilder.cs
+++ b/src/GlobalPayments.Api/Builders/TransactionBuilder.cs
@@ -1,9 +1,8 @@
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Network.Entities;
using GlobalPayments.Api.PaymentMethods;
-using System.Collections.Generic;
-namespace GlobalPayments.Api.Builders {
+namespace GlobalPayments.Api.Builders
+{
public abstract class TransactionBuilder : BaseBuilder {
internal TransactionType TransactionType { get; set; }
internal TransactionModifier TransactionModifier { get; set; }
@@ -11,25 +10,8 @@ public abstract class TransactionBuilder : BaseBuilder {
internal bool MultiCapture { get; set; }
internal DccRateData DccRateData { get; set; }
- //network fields
- internal int BatchNumber{ get; set; }
- internal string CompanyId{ get; set; }
- internal FleetData FleetData{ get; set; }
- internal Dictionary IssuerData{ get; set; }
- internal PriorMessageInformation PriorMessageInformation{ get; set; }
- internal ProductData ProductData{ get; set; }
- internal int SequenceNumber{ get; set; }
- internal int SystemTraceAuditNumber{ get; set; }
- internal string UniqueDeviceId{ get; set; }
- internal TransactionMatchingData TransactionMatchingData{ get; set; }
- // network fields
- internal bool ForceGatewayTimeout { get; set; }
public TransactionBuilder(TransactionType type) : base() {
TransactionType = type;
}
- public TransactionBuilder(TransactionType type, IPaymentMethod paymentMethod) : base() {
- this.TransactionType = type;
- this.PaymentMethod = paymentMethod;
- }
}
}
diff --git a/src/GlobalPayments.Api/Entities/Address.cs b/src/GlobalPayments.Api/Entities/Address.cs
index 89e708d8..3ed3ec72 100644
--- a/src/GlobalPayments.Api/Entities/Address.cs
+++ b/src/GlobalPayments.Api/Entities/Address.cs
@@ -1,10 +1,12 @@
using GlobalPayments.Api.Utils;
-namespace GlobalPayments.Api.Entities {
+namespace GlobalPayments.Api.Entities
+{
///
/// Represents a billing or shipping address for the consumer.
///
- public class Address {
+ public class Address
+ {
private string province;
internal AddressType Type { get; set; }
@@ -86,12 +88,5 @@ public string CountryCode {
public bool IsCountry(string countryCode) {
return CountryUtils.IsCountry(this, countryCode);
}
-
- public string Name { get; set; }
-
- public Address(string streetAddress1 = null, string code = null) {
- this.StreetAddress1 = streetAddress1;
- this.PostalCode = code;
- }
}
}
diff --git a/src/GlobalPayments.Api/Entities/BatchSummary.cs b/src/GlobalPayments.Api/Entities/BatchSummary.cs
index 30ad5ae2..fcd16352 100644
--- a/src/GlobalPayments.Api/Entities/BatchSummary.cs
+++ b/src/GlobalPayments.Api/Entities/BatchSummary.cs
@@ -1,5 +1,4 @@
-using GlobalPayments.Api.Builders;
-using System;
+using System;
using System.Collections.Generic;
namespace GlobalPayments.Api.Entities {
@@ -23,44 +22,10 @@ public class BatchSummary {
public decimal? SaleAmount { get; set; }
public int SaleCount { get; set; }
public string SequenceNumber { get; set; }
- public string SicCode { get; set; }
public string SiteId { get; set; }
public string Status { get; set; }
public decimal? TotalAmount { get; set; }
public int TransactionCount { get; set; }
public string TransactionToken { get; set; }
- public bool IsBalanced {
- get {
- if (ResponseCode != null) {
- return ResponseCode.Equals("500");
- }
- return false;
- }
- set { }
- }
-
- public BatchSummary ResubmitTransactions(List transactionTokens, String configName) {
- if(!ResponseCode.Equals("580")) {
- throw new BuilderException("Batch recovery has not been requested for this batch.");
- }
-
- // resubmit the tokens
- LinkedList responses = new LinkedList();
- foreach(string token in transactionTokens) {
- Transaction response = new ResubmitBuilder(TransactionType.DataCollect)
- .WithTransactionToken(token)
- .Execute(configName);
- responses.AddLast(response);
- }
- ResentTransactions = responses;
-
- // resubmit the batch summary
- Transaction batchResponse = new ResubmitBuilder(TransactionType.BatchClose)
- .WithTransactionToken(TransactionToken)
- .Execute(configName);
- ResentBatchClose = batchResponse;
- ResponseCode = batchResponse.ResponseCode;
- return this;
- }
}
-}
\ No newline at end of file
+}
diff --git a/src/GlobalPayments.Api/Entities/CommercialData.cs b/src/GlobalPayments.Api/Entities/CommercialData.cs
index d535259d..20b3774c 100644
--- a/src/GlobalPayments.Api/Entities/CommercialData.cs
+++ b/src/GlobalPayments.Api/Entities/CommercialData.cs
@@ -1,21 +1,14 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
namespace GlobalPayments.Api.Entities {
public class CommercialData {
- public AdditionalTaxDetails AdditionalTaxDetails { get; set; }
-
public CommercialIndicator CommercialIndicator { get; private set; }
- public string CustomerVAT_Number { get; set; }
-
- public string CustomerReferenceId { get; set; }
-
public string Description { get; set; }
public decimal? DiscountAmount { get; set; }
- public decimal? DutyAmount { get; set; }
+ public decimal DutyAmount { get; set; }
public string DestinationPostalCode { get; set; }
@@ -25,22 +18,14 @@ public class CommercialData {
public List LineItems { get; private set; }
- public DateTime? OrderDate { get; set; }
-
public string OriginPostalCode { get; set; }
public string PoNumber { get; set; }
- public string SupplierReferenceNumber { get; set; }
-
- public string SummaryCommodityCode { get; set; }
-
public decimal? TaxAmount { get; set; }
public TaxType TaxType { get; private set; }
- public string VAT_InvoiceNumber { get; set; }
-
public CommercialData(TaxType taxType, CommercialIndicator level = CommercialIndicator.Level_II) {
TaxType = taxType;
CommercialIndicator = level;
diff --git a/src/GlobalPayments.Api/Entities/CommercialLineItem.cs b/src/GlobalPayments.Api/Entities/CommercialLineItem.cs
index 4c82c900..d6895300 100644
--- a/src/GlobalPayments.Api/Entities/CommercialLineItem.cs
+++ b/src/GlobalPayments.Api/Entities/CommercialLineItem.cs
@@ -1,12 +1,10 @@
namespace GlobalPayments.Api.Entities {
public class CommercialLineItem {
- public string AlternateTaxId { get; set; }
public string CommodityCode { get; set; }
public CreditDebitIndicator CreditDebitIndicator { get; set; }
public string Description { get; set; }
- public DiscountDetails DiscountDetails { get; set; }
+ public decimal? DiscountAmount { get; set; }
public decimal? ExtendedAmount { get; set; }
- public string Name { get; set; }
public NetGrossIndicator NetGrossIndicator { get; set; }
public string ProductCode { get; set; }
public decimal? Quantity { get; set; }
diff --git a/src/GlobalPayments.Api/Entities/Enums.cs b/src/GlobalPayments.Api/Entities/Enums.cs
index 3378a05a..82addf4e 100644
--- a/src/GlobalPayments.Api/Entities/Enums.cs
+++ b/src/GlobalPayments.Api/Entities/Enums.cs
@@ -55,7 +55,27 @@ public enum DeviceType {
///
/// Indicates a genius terminal
///
- GENIUS
+ GENIUS,
+
+ ///
+ /// Indicates an Ingenico Desk/5000 terminal underlying in Epos software package.
+ ///
+ Ingenico_EPOS_Desk5000,
+
+ ///
+ /// Indicates an Ingenico Lane/3000 terminal underlying in Epos software package.
+ ///
+ Ingenico_EPOS_Lane3000,
+
+ ///
+ /// Indicates an Ingenico Move/3500 terminal underlying in Epos software package.
+ ///
+ Ingenico_EPOS_Move3500,
+
+ ///
+ /// Indicates an Ingenico Move/5000 terminal underlying in Epos software package.
+ ///
+ Ingenico_EPOS_Move5000
}
///
@@ -181,7 +201,182 @@ public enum GiftEntryMethod {
/// Indicates manual entry.
///
Manual
- }
+ }
+
+ ///
+ /// Indicates the transaction type.
+ ///
+ [Flags]
+ public enum TransactionType : long{
+ ///
+ /// Indicates a decline.
+ ///
+ Decline = 0,
+
+ ///
+ /// Indicates an account verify.
+ ///
+ Verify = 1 << 0,
+
+ ///
+ /// Indicates a capture/add to batch.
+ ///
+ Capture = 1 << 1,
+
+ ///
+ /// Indicates an authorization without capture.
+ ///
+ Auth = 1 << 2,
+
+ ///
+ /// Indicates a refund/return.
+ ///
+ Refund = 1 << 3,
+
+ ///
+ /// Indicates a reversal.
+ ///
+ Reversal = 1 << 4,
+
+ ///
+ /// Indicates a sale/charge/authorization with capture.
+ ///
+ Sale = 1 << 5,
+
+ ///
+ /// Indicates an edit.
+ ///
+ Edit = 1 << 6,
+
+ ///
+ /// Indicates a void.
+ ///
+ Void = 1 << 7,
+
+ ///
+ /// Indicates value should be added.
+ ///
+ AddValue = 1 << 8,
+
+ ///
+ /// Indicates a balance inquiry.
+ ///
+ Balance = 1 << 9,
+
+ ///
+ /// Indicates an activation.
+ ///
+ Activate = 1 << 10,
+
+ ///
+ /// Indicates an alias should be added.
+ ///
+ Alias = 1 << 11,
+
+ ///
+ /// Indicates the payment method should be replaced.
+ ///
+ Replace = 1 << 12,
+
+ ///
+ /// Indicates a reward.
+ ///
+ Reward = 1 << 13,
+
+ ///
+ /// Indicates a deactivation.
+ ///
+ Deactivate = 1 << 14,
+
+ ///
+ /// Indicates a batch close.
+ ///
+ BatchClose = 1 << 15,
+
+ ///
+ /// Indicates a resource should be created.
+ ///
+ Create = 1 << 16,
+
+ ///
+ /// Indicates a resource should be deleted.
+ ///
+ Delete = 1 << 17,
+
+ ///
+ /// Indicates a benefit withdrawal.
+ ///
+ BenefitWithdrawal = 1 << 18,
+
+ ///
+ /// Indicates a resource should be fetched.
+ ///
+ Fetch = 1 << 19,
+
+ ///
+ /// Indicates a resource type should be searched.
+ ///
+ Search = 1 << 20,
+
+ ///
+ /// Indicates a hold.
+ ///
+ Hold = 1 << 21,
+
+ ///
+ /// Indicates a release.
+ ///
+ Release = 1 << 22,
+
+ ///
+ /// Indicates a verify 3d Secure enrollment transaction
+ ///
+ VerifyEnrolled = 1 << 23,
+
+ ///
+ /// Indicates a verify 3d secure verify signature transaction
+ ///
+ VerifySignature = 1 << 24,
+
+ ///
+ /// Indcates a TokenUpdateExpiry Transaction
+ ///
+ TokenUpdate = 1 << 25,
+
+ ///
+ /// Indicates a Token Delete Transaction
+ ///
+ TokenDelete = 1 << 26,
+
+ ///
+ /// Indicates a verify authentication 3DS2 call
+ ///
+ VerifyAuthentication = 1 << 27,
+
+ ///
+ /// Indicates an Initiate Authentication 3DS2 call
+ ///
+ InitiateAuthentication = 1 << 28,
+
+ ///
+ /// Indicates a DataCollect.
+ ///
+ DataCollect = 1 << 29,
+
+ ///
+ /// Indicates a PreAuthCompletion.
+ ///
+ PreAuthCompletion = 1 << 30,
+
+ ///
+ /// Indicates a DccRateLookup.
+ ///
+ DccRateLookup = 1 << 31,
+
+ Increment = 1L << 32,
+ PayAtTable = 1L << 33,
+ Referral = 1L << 34
+ }
///
/// Indicates if a transaction should be specialized.
@@ -937,15 +1132,4 @@ public enum Secure3dVersion {
Two,
Any
}
-
- public enum EbtCardType {
- CashBenefit,
- FoodStamp
- }
-
- public enum BatchCloseType {
- Forced,
- EndOfShift,
- //EndOfDay
- }
}
diff --git a/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs b/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs
index dbfc670b..a66efbf3 100644
--- a/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs
+++ b/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs
@@ -1,6 +1,6 @@
namespace GlobalPayments.Api.Entities {
public enum CreditDebitIndicator {
- Debit,
- Credit
+ Credit,
+ Debit
}
}
diff --git a/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs b/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs
index cd29d31c..bedc6b43 100644
--- a/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs
+++ b/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs
@@ -12,8 +12,8 @@ public static class ServiceEndpoints {
public const string TABLE_SERVICE_TEST = "https://www.freshtxt.com/api31/";
public const string GENIUS_API_PRODUCTION = "";
public const string GENIUS_API_TEST = "https://ps1.merchantware.net/Merchantware/ws/RetailTransaction/v45/Credit.asmx";
- public const string GENIUS_TERMINAL_PRODUCTION = "";
- public const string GENIUS_TERMINAL_TEST = "https://transport.merchantware.net/v4/transportService.asmx";
+ public const string GENIUS_TERMIAL_PRODUCTION = "";
+ public const string GENIUS_TERMIAL_TEST = "https://transport.merchantware.net/v4/transportService.asmx";
public const string TRANSIT_MULTIPASS_PRODUCTION = "https://gateway.transit-pass.com/servlets/TransNox_API_Server";
public const string TRANSIT_MULTIPASS_TEST = "https://stagegw.transnox.com/servlets/TransNox_API_Server";
}
diff --git a/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs b/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs
index b04219f3..04297098 100644
--- a/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs
+++ b/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs
@@ -1,12 +1,7 @@
-using GlobalPayments.Api.Utils;
-
-namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.Portico)]
+namespace GlobalPayments.Api.Entities {
public enum StoredCredentialInitiator {
- [Map(Target.Portico, "C")]
CardHolder,
- [Map(Target.Portico, "M")]
- Merchant,
+ Merchant,
Scheduled
}
}
diff --git a/src/GlobalPayments.Api/Entities/Exceptions.cs b/src/GlobalPayments.Api/Entities/Exceptions.cs
index c2662cf4..d8d3349c 100644
--- a/src/GlobalPayments.Api/Entities/Exceptions.cs
+++ b/src/GlobalPayments.Api/Entities/Exceptions.cs
@@ -1,8 +1,8 @@
-using GlobalPayments.Api.Gateways.Events;
-using System;
+using System;
using System.Collections.Generic;
-namespace GlobalPayments.Api.Entities {
+namespace GlobalPayments.Api.Entities
+{
///
/// A general error occurred.
///
@@ -41,7 +41,6 @@ public class GatewayException : ApiException {
/// The gateway response message.
///
public string ResponseMessage { get; private set; }
- public List GatewayEvents { get; set; }
internal GatewayException(string message, string responseCode = null, string responseMessage = null) : base(message) {
ResponseCode = responseCode;
@@ -74,14 +73,4 @@ public class ValidationException : ApiException {
ValidationErrors = validationErrors;
}
}
- public class GatewayTimeoutException : GatewayException {
- public string Host { get; set; }
- public string MessageTypeIndicator { get; set; }
- public string ProcessingCode { get; set; }
- public int ReversalCount { get; set; }
- public string ReversalResponseCode { get; set; }
- public string ReversalResponseText { get; set; }
- public GatewayTimeoutException() : base("The gateway did not respond within the given timeout.") { }
- public GatewayTimeoutException(Exception innerException) : base("The gateway did not respond within the given timeout.", innerException) { }
- }
}
diff --git a/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs b/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs
index bb4e5e79..60336cb7 100644
--- a/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs
+++ b/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs
@@ -9,17 +9,12 @@ internal class PayrollEncoder : IRequestEncoder {
public string Username { get; set; }
public string ApiKey { get; set; }
- public PayrollEncoder(string username = null, string apiKey = null) {
- this.Username = username;
- this.ApiKey = apiKey;
- }
-
public string Encode(object value) {
if (value == null)
return null;
using (var aes = Aes.Create()) {
- var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username.PadRight(8, ' ')), 1000);
+ var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username), 1000);
var ems = new MemoryStream();
using (var encrypt = new CryptoStream(ems, aes.CreateEncryptor(key.GetKey(), key.GetVector()), CryptoStreamMode.Write)) {
@@ -36,7 +31,7 @@ public string Decode(object value) {
return null;
using (var aes = Aes.Create()) {
- var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username.PadRight(8, ' ')), 1000);
+ var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username), 1000);
var dms = new MemoryStream();
using (var decrypt = new CryptoStream(dms, aes.CreateDecryptor(key.GetKey(), key.GetVector()), CryptoStreamMode.Write)) {
diff --git a/src/GlobalPayments.Api/Entities/ThreeDSecure.cs b/src/GlobalPayments.Api/Entities/ThreeDSecure.cs
index 647eb768..5eafcaaf 100644
--- a/src/GlobalPayments.Api/Entities/ThreeDSecure.cs
+++ b/src/GlobalPayments.Api/Entities/ThreeDSecure.cs
@@ -149,8 +149,6 @@ public string OrderId {
public IEnumerable SdkUiType { get; set; }
- public string SecureCode { get; set; }
-
public string ServerTransactionId { get; set; }
///
@@ -160,8 +158,6 @@ public string OrderId {
public string StatusReason { get; set; }
- public UCAFIndicator UCAFIndicator { get; set; }
-
public Secure3dVersion? _version;
public Secure3dVersion? Version {
get { return _version; }
diff --git a/src/GlobalPayments.Api/Entities/Transaction.cs b/src/GlobalPayments.Api/Entities/Transaction.cs
index eb629934..5a0417f1 100644
--- a/src/GlobalPayments.Api/Entities/Transaction.cs
+++ b/src/GlobalPayments.Api/Entities/Transaction.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using GlobalPayments.Api.Builders;
-using GlobalPayments.Api.Gateways.Events;
-using GlobalPayments.Api.Network.Entities;
using GlobalPayments.Api.PaymentMethods;
namespace GlobalPayments.Api.Entities {
@@ -21,15 +19,13 @@ public class Transaction {
///
public string AuthorizationCode {
get {
- if (TransactionReference != null) {
+ if (TransactionReference != null)
return TransactionReference.AuthCode;
- }
return null;
}
set {
- if (TransactionReference == null) {
+ if (TransactionReference == null)
TransactionReference = new TransactionReference();
- }
TransactionReference.AuthCode = value;
}
}
@@ -59,8 +55,6 @@ public string AuthorizationCode {
///
public BatchSummary BatchSummary { get; set; }
- public string CardBrandTransactionId { get; set; }
-
///
/// The type of card used in the transaction.
///
@@ -83,75 +77,17 @@ public string AuthorizationCode {
///
public string ClientTransactionId {
get {
- if (TransactionReference != null) {
+ if (TransactionReference != null)
return TransactionReference.ClientTransactionId;
- }
return null;
}
set {
- if (TransactionReference == null) {
+ if (TransactionReference == null)
TransactionReference = new TransactionReference();
- }
TransactionReference.ClientTransactionId = value;
}
}
- public NtsData NTSData {
- get {
- if (TransactionReference != null) {
- return TransactionReference.NtsData;
- }
- return null;
- }
- set {
- if (TransactionReference == null) {
- TransactionReference = new TransactionReference();
- }
- TransactionReference.NtsData = value;
- }
- }
- public string MessageTypeIndicator {
- get {
- if (TransactionReference != null) {
- return TransactionReference.MessageTypeIndicator;
- }
- return null;
- }
- set {
- if (TransactionReference == null) {
- TransactionReference = new TransactionReference();
- }
- TransactionReference.MessageTypeIndicator = value;
- }
- }
- public string SystemTraceAuditNumber {
- get {
- if (TransactionReference != null) {
- return TransactionReference.SystemTraceAuditNumber;
- }
- return null;
- }
- set {
- if (TransactionReference == null) {
- TransactionReference = new TransactionReference();
- }
- TransactionReference.SystemTraceAuditNumber = value;
- }
- }
- public string OriginalTransactionTime {
- get {
- if (TransactionReference != null) {
- return TransactionReference.OriginalTransactionTime;
- }
- return null;
- }
- set {
- if (TransactionReference == null) {
- TransactionReference = new TransactionReference();
- }
- TransactionReference.OriginalTransactionTime = value;
- }
- }
///
/// The commercial indicator for Level II/III.
///
@@ -184,26 +120,20 @@ public string OriginalTransactionTime {
///
/// The Auto settle Flag which comes in response
///
- public bool MultiCapture { get { return (MultiCapturePaymentCount != null && MultiCapturePaymentCount != null); } }
-
- public int? MultiCapturePaymentCount { get; set; }
-
- public int? MultiCaptureSequence { get; set; }
+ public bool MultiCapture { get; set; }
///
/// The order ID supplied in the request.
///
public string OrderId {
get {
- if (TransactionReference != null) {
+ if (TransactionReference != null)
return TransactionReference.OrderId;
- }
return null;
}
set {
- if (TransactionReference == null) {
+ if (TransactionReference == null)
TransactionReference = new TransactionReference();
- }
TransactionReference.OrderId = value;
}
}
@@ -213,15 +143,13 @@ public string OrderId {
///
public PaymentMethodType PaymentMethodType {
get {
- if (TransactionReference != null) {
+ if (TransactionReference != null)
return TransactionReference.PaymentMethodType;
- }
return PaymentMethodType.Credit;
}
set {
- if (TransactionReference == null) {
+ if (TransactionReference == null)
TransactionReference = new TransactionReference();
- }
TransactionReference.PaymentMethodType = value;
}
}
@@ -275,32 +203,16 @@ public PaymentMethodType PaymentMethodType {
///
public string TransactionId {
get {
- if (TransactionReference != null) {
+ if (TransactionReference != null)
return TransactionReference.TransactionId;
- }
return null;
}
set {
- if (TransactionReference == null) {
+ if (TransactionReference == null)
TransactionReference = new TransactionReference();
- }
TransactionReference.TransactionId = value;
}
}
- public string ProcessingCode {
- get {
- if (TransactionReference != null) {
- return TransactionReference.OriginalProcessingCode;
- }
- return null;
- }
- set {
- if (TransactionReference == null) {
- TransactionReference = new TransactionReference();
- }
- TransactionReference.OriginalProcessingCode = value;
- }
- }
///
/// The payment token returned in the transaction.
@@ -310,9 +222,48 @@ public string ProcessingCode {
internal GiftCard GiftCard { get; set; }
internal TransactionReference TransactionReference { get; set; }
- public PriorMessageInformation MessageInformation { get; set; }
- public string TransactionToken { get; set; }
- public List GatewayEvents { get; set; }
+
+ ///
+ /// Creates a `Transaction` object from a stored transaction ID.
+ ///
+ ///
+ /// Used to expose management requests on the original transaction
+ /// at a later date/time.
+ ///
+ /// The original transaction ID
+ ///
+ /// The original payment method type. Defaults to `PaymentMethodType.Credit`.
+ ///
+ public static Transaction FromId(string transactionId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit) {
+ return new Transaction {
+ TransactionReference = new TransactionReference {
+ TransactionId = transactionId,
+ PaymentMethodType = paymentMethodType
+ }
+ };
+ }
+
+ ///
+ /// Creates a `Transaction` object from a stored transaction ID.
+ ///
+ ///
+ /// Used to expose management requests on the original transaction
+ /// at a later date/time.
+ ///
+ /// The original transaction ID
+ /// The original transaction's order ID
+ ///
+ /// The original payment method type. Defaults to `PaymentMethodType.Credit`.
+ ///
+ public static Transaction FromId(string transactionId, string orderId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit) {
+ return new Transaction {
+ TransactionReference = new TransactionReference {
+ TransactionId = transactionId,
+ PaymentMethodType = paymentMethodType,
+ OrderId = orderId
+ }
+ };
+ }
///
/// Creates an additional authorization against the original transaction.
@@ -324,26 +275,15 @@ public ManagementBuilder AdditionalAuth(decimal? amount = null) {
.WithAmount(amount);
}
- public ManagementBuilder Cancel(decimal? amount = null) {
- return new ManagementBuilder(TransactionType.Void)
- .WithPaymentMethod(TransactionReference)
- .WithCustomerInitiated(true)
- .WithAmount(amount);
- }
-
///
/// Captures the original transaction.
///
/// The amount to capture
public ManagementBuilder Capture(decimal? amount = null) {
- var builder = new ManagementBuilder(TransactionType.Capture)
+ return new ManagementBuilder(TransactionType.Capture)
+ .WithMultiCapture(MultiCapture)
.WithPaymentMethod(TransactionReference)
.WithAmount(amount);
-
- if (MultiCapture) {
- builder.WithMultiCapture(MultiCaptureSequence.Value, MultiCapturePaymentCount.Value);
- }
- return builder;
}
///
@@ -360,12 +300,6 @@ public ManagementBuilder Hold() {
return new ManagementBuilder(TransactionType.Hold).WithPaymentMethod(TransactionReference);
}
- public ManagementBuilder PreAuthCompletion(decimal? amount = null) {
- return new ManagementBuilder(TransactionType.PreAuthCompletion)
- .WithPaymentMethod(TransactionReference)
- .WithAmount(amount);
- }
-
///
/// Refunds/returns the original transaction.
///
@@ -396,84 +330,12 @@ public ManagementBuilder Reverse(decimal? amount = null) {
///
/// Voids the original transaction.
///
- public ManagementBuilder Void(VoidReason? reason = null, decimal? amount = null, bool force = false) {
- return new ManagementBuilder(TransactionType.Void)
- .WithPaymentMethod(TransactionReference)
- .WithVoidReason(reason)
- .WithAmount(amount)
- .WithForcedReversal(force);
+ public ManagementBuilder Void() {
+ return new ManagementBuilder(TransactionType.Void).WithPaymentMethod(TransactionReference);
}
public ManagementBuilder Increment(decimal? amount = null) {
return new ManagementBuilder(TransactionType.Increment).WithAmount(amount).WithPaymentMethod(TransactionReference);
}
-
- ///
- /// Creates a `Transaction` object from a stored transaction ID.
- ///
- ///
- /// Used to expose management requests on the original transaction
- /// at a later date/time.
- ///
- /// The original transaction ID
- ///
- /// The original payment method type. Defaults to `PaymentMethodType.Credit`.
- ///
- public static Transaction FromId(string transactionId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit)
- {
- return new Transaction
- {
- TransactionReference = new TransactionReference
- {
- TransactionId = transactionId,
- PaymentMethodType = paymentMethodType
- }
- };
- }
-
- ///
- /// Creates a `Transaction` object from a stored transaction ID.
- ///
- ///
- /// Used to expose management requests on the original transaction
- /// at a later date/time.
- ///
- /// The original transaction ID
- /// The original transaction's order ID
- ///
- /// The original payment method type. Defaults to `PaymentMethodType.Credit`.
- ///
- public static Transaction FromId(string transactionId, string orderId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit)
- {
- return new Transaction
- {
- TransactionReference = new TransactionReference
- {
- TransactionId = transactionId,
- PaymentMethodType = paymentMethodType,
- OrderId = orderId
- }
- };
- }
-
- public static Transaction FromNetwork(decimal? amount, string authCode, NtsData originalNtsCode, IPaymentMethod originalPaymentMethod, string messageTypeIndicator = null, string stan = null, string originalTransactionTime = null, string originalProcessingCode = null, string acquirerId = null)
- {
- TransactionReference reference = new TransactionReference();
- reference.OriginalAmount = amount;
- reference.AcquiringInstitutionId = acquirerId;
- reference.AuthCode = authCode;
- reference.MessageTypeIndicator = messageTypeIndicator;
- reference.NtsData = originalNtsCode;
- reference.OriginalPaymentMethod = originalPaymentMethod;
- reference.OriginalTransactionTime = originalTransactionTime;
- reference.SystemTraceAuditNumber = stan;
- reference.OriginalProcessingCode = originalProcessingCode;
-
- Transaction trans = new Transaction();
- trans.TransactionReference = reference;
-
- return trans;
- }
-
}
}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Gateways/Gateway.cs b/src/GlobalPayments.Api/Gateways/Gateway.cs
index a61366b5..ef082204 100644
--- a/src/GlobalPayments.Api/Gateways/Gateway.cs
+++ b/src/GlobalPayments.Api/Gateways/Gateway.cs
@@ -5,16 +5,11 @@
using System.Text;
using GlobalPayments.Api.Entities;
using System.Threading.Tasks;
-using System.Diagnostics;
-using GlobalPayments.Api.Logging;
-using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Gateways {
internal abstract class Gateway {
private string _contentType;
- //public bool EnableLogging { get; set; }
- public IRequestLogger RequestLogger { get; set; }
public Dictionary Headers { get; set; }
public int Timeout { get; set; }
public string ServiceUrl { get; set; }
@@ -39,17 +34,12 @@ protected GatewayResponse SendRequest(HttpMethod verb, string endpoint, string d
try {
if (verb != HttpMethod.Get && data != null) {
request.Content = new StringContent(data, Encoding.UTF8, contentType ?? _contentType);
- RequestLogger?.RequestSent(data);
}
response = httpClient.SendAsync(request).Result;
-
- string rawResponse = response.Content.ReadAsStringAsync().Result;
- RequestLogger?.ResponseReceived(rawResponse);
-
return new GatewayResponse {
StatusCode = response.StatusCode,
RequestUrl = response.RequestMessage.RequestUri.ToString(),
- RawResponse = rawResponse
+ RawResponse = response.Content.ReadAsStringAsync().Result
};
}
catch (Exception exc) {
@@ -66,18 +56,12 @@ protected async Task SendRequestAsync(string endpoint, Multipar
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, ServiceUrl + endpoint);
HttpResponseMessage response = null;
try {
- RequestLogger?.RequestSent(content.ToString());
-
request.Content = content;
response = await httpClient.SendAsync(request);
-
- string rawResponse = response.Content.ReadAsStringAsync().Result;
- RequestLogger?.ResponseReceived(rawResponse);
-
return new GatewayResponse {
StatusCode = response.StatusCode,
RequestUrl = response.RequestMessage.RequestUri.ToString(),
- RawResponse = rawResponse
+ RawResponse = response.Content.ReadAsStringAsync().Result
};
}
catch (Exception exc) {
@@ -93,18 +77,12 @@ protected GatewayResponse SendRequest(string endpoint, MultipartFormDataContent
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, ServiceUrl + endpoint);
HttpResponseMessage response = null;
try {
- RequestLogger?.RequestSent(content.ToString());
-
request.Content = content;
response = httpClient.SendAsync(request).Result;
-
- string rawResponse = response.Content.ReadAsStringAsync().Result;
- RequestLogger?.ResponseReceived(rawResponse);
-
return new GatewayResponse {
StatusCode = response.StatusCode,
RequestUrl = response.RequestMessage.RequestUri.ToString(),
- RawResponse = rawResponse
+ RawResponse = response.Content.ReadAsStringAsync().Result
};
}
catch (Exception exc) {
diff --git a/src/GlobalPayments.Api/Gateways/GatewayResponse.cs b/src/GlobalPayments.Api/Gateways/GatewayResponse.cs
index 6f5b46ab..20c9e5ef 100644
--- a/src/GlobalPayments.Api/Gateways/GatewayResponse.cs
+++ b/src/GlobalPayments.Api/Gateways/GatewayResponse.cs
@@ -1,6 +1,7 @@
using System.Net;
-namespace GlobalPayments.Api.Gateways {
+namespace GlobalPayments.Api.Gateways
+{
internal class GatewayResponse {
public string RawResponse { get; set; }
public string RequestUrl { get; set; }
diff --git a/src/GlobalPayments.Api/Gateways/GeniusConnector.cs b/src/GlobalPayments.Api/Gateways/GeniusConnector.cs
index 90df1b8b..717eb424 100644
--- a/src/GlobalPayments.Api/Gateways/GeniusConnector.cs
+++ b/src/GlobalPayments.Api/Gateways/GeniusConnector.cs
@@ -116,7 +116,7 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
et.SubElement(lineItem, "Quantity", item.Quantity);
et.SubElement(lineItem, "UnitOfMeasure", item.UnitOfMeasure);
et.SubElement(lineItem, "UnitCost", item.UnitCost);
- et.SubElement(lineItem, "DiscountAmount", item.DiscountDetails?.DiscountAmount);
+ et.SubElement(lineItem, "DiscountAmount", item.DiscountAmount);
et.SubElement(lineItem, "TotalAmount", item.TotalAmount);
et.SubElement(lineItem, "TaxAmount", item.TaxAmount);
et.SubElement(lineItem, "ExtendedAmount", item.ExtendedAmount);
diff --git a/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs b/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs
index ecced69a..6fb17221 100644
--- a/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs
+++ b/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs
@@ -661,11 +661,11 @@ private Transaction MapResponse(string rawResponse, TransactionBuilder();
- if (builder is AuthorizationBuilder authBuilder) {
- acceptedCodes = MapAcceptedCodes(MapAuthRequestType(authBuilder));
+ if (builder is AuthorizationBuilder) {
+ acceptedCodes = MapAcceptedCodes(MapAuthRequestType(builder as AuthorizationBuilder));
}
- else if (builder is ManagementBuilder managementBuilder) {
- acceptedCodes = MapAcceptedCodes(MapManageRequestType(managementBuilder));
+ else if (builder is ManagementBuilder) {
+ acceptedCodes = MapAcceptedCodes(MapManageRequestType(builder as ManagementBuilder));
}
CheckResponse(root, acceptedCodes);
@@ -682,14 +682,10 @@ private Transaction MapResponse(string rawResponse, TransactionBuilder("pasref"),
AlternativePaymentType = root.GetValue("paymentmethod"),
BatchNumber = root.GetValue("batchid")
- }
+ },
+ MultiCapture = builder.MultiCapture
};
- if (builder is ManagementBuilder mb && mb.MultiCapture) {
- result.MultiCapturePaymentCount = mb.MultiCapturePaymentCount;
- result.MultiCaptureSequence = mb.MultiCaptureSequence;
- }
-
// dccinfo
if (root.Has("dccinfo")) {
DccRateData dccRateData = new DccRateData();
diff --git a/src/GlobalPayments.Api/Gateways/PorticoConnector.cs b/src/GlobalPayments.Api/Gateways/PorticoConnector.cs
index 822f7f37..fb976ed2 100644
--- a/src/GlobalPayments.Api/Gateways/PorticoConnector.cs
+++ b/src/GlobalPayments.Api/Gateways/PorticoConnector.cs
@@ -53,8 +53,8 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
}
#region card holder
- if (builder.PaymentMethod.PaymentMethodType != PaymentMethodType.Recurring) {
- var isCheck = (builder.PaymentMethod.PaymentMethodType == PaymentMethodType.ACH);
+ var isCheck = (builder.PaymentMethod.PaymentMethodType == PaymentMethodType.ACH);
+ if (isCheck || builder.BillingAddress != null) {
var holder = et.SubElement(block1, isCheck ? "ConsumerInfo" : "CardHolderData");
if (builder.BillingAddress != null) {
@@ -83,15 +83,9 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
}
}
else {
- var card = builder.PaymentMethod as CreditCardData;
- if (!string.IsNullOrEmpty(card.CardHolderName)) {
- var names = card.CardHolderName.Split(new char[] {' '}, 2);
- et.SubElement(holder, "CardHolderFirstName", names[0]);
- et.SubElement(holder, "CardHolderLastName", names[1]);
- }
+ // TODO: card holder name
}
}
-
#endregion
// card data
@@ -108,13 +102,6 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
if (builder.PaymentMethod is ICardData) {
var card = builder.PaymentMethod as ICardData;
- //credential on file
- if (builder.TransactionInitiator != null) {
- Element cardOnFileData = et.SubElement(block1, "CardOnFileData");
- et.SubElement(cardOnFileData, "CardOnFile", EnumConverter.GetMapping(Target.Portico, builder.TransactionInitiator));
- et.SubElement(cardOnFileData, "CardBrandTxnId", builder.CardBrandTransactionId);
- }
-
var manualEntry = et.SubElement(cardData, hasToken ? "TokenData" : "ManualEntry");
et.SubElement(manualEntry, hasToken ? "TokenValue" : "CardNbr").Text(tokenValue ?? card.Number);
et.SubElement(manualEntry, "ExpMonth", card.ExpMonth?.ToString());
@@ -135,7 +122,7 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
et.SubElement(secureEcommerce, "ECommerceIndicator", secureEcom.Eci);
et.SubElement(secureEcommerce, "XID", secureEcom.Xid);
}
- }
+ }
// recurring data
if (builder.TransactionModifier == TransactionModifier.Recurring) {
@@ -205,17 +192,17 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
// check action
et.SubElement(block1, "CheckAction").Text("SALE");
- var accountInfo = et.SubElement(block1, "AccountInfo");
// account info
if (string.IsNullOrEmpty(check.Token)) {
+ var accountInfo = et.SubElement(block1, "AccountInfo");
et.SubElement(accountInfo, "RoutingNumber", check.RoutingNumber);
et.SubElement(accountInfo, "AccountNumber", check.AccountNumber);
et.SubElement(accountInfo, "CheckNumber", check.CheckNumber);
et.SubElement(accountInfo, "MICRData", check.MicrNumber);
+ et.SubElement(accountInfo, "AccountType", check.AccountType.ToString());
}
else et.SubElement(block1, "TokenValue").Text(tokenValue);
- et.SubElement(accountInfo, "AccountType", check.AccountType.ToString());
et.SubElement(block1, "DataEntryMode", check.EntryMode.ToString().ToUpper());
et.SubElement(block1, "CheckType", check.CheckType.ToString());
et.SubElement(block1, "SECCode", check.SecCode);
@@ -236,12 +223,6 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
#region RecurringPaymentMethod
if (builder.PaymentMethod is RecurringPaymentMethod) {
var method = builder.PaymentMethod as RecurringPaymentMethod;
- //credential on file
- if (builder.TransactionInitiator != null) {
- Element cardOnFileData = et.SubElement(block1, "CardOnFileData");
- et.SubElement(cardOnFileData, "CardOnFile", EnumConverter.GetMapping(Target.Portico, builder.TransactionInitiator));
- et.SubElement(cardOnFileData, "CardBrandTxnId", builder.CardBrandTransactionId);
- }
// check action
if (method.PaymentType == "ACH") {
@@ -335,7 +316,7 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
var amountNode = et.SubElement(autoSub, fieldNames[index++] + "AdditionalAmtInfo");
et.SubElement(amountNode, "AmtType", amount.Key);
- et.SubElement(amountNode, "Amt", amount.Value?.ToString());
+ et.SubElement(amountNode, "Amt", amount.Value?.ToNumericString());
}
}
@@ -422,10 +403,6 @@ public Transaction ManageTransaction(ManagementBuilder builder) {
et.SubElement(root, "ClientTxnId", builder.ClientTransactionId);
}
- if (builder.AllowDuplicates) {
- et.SubElement(root, "AllowDup", "Y");
- }
-
// Level II Data
if (builder.CommercialData != null) {
var cpc = et.SubElement(root, "CPCData");
@@ -609,7 +586,6 @@ private Transaction MapResponse(string rawResponse, IPaymentMethod payment) {
result.PointsBalanceAmount = root.GetValue("PointsBalanceAmt");
result.RecurringDataCode = root.GetValue("RecurringDataCode");
result.ReferenceNumber = root.GetValue("RefNbr");
- result.CardBrandTransactionId = root.GetValue("CardBrandTxnId");
result.ResponseCode = NormalizeResponse(root.GetValue("RspCode")) ?? gatewayRspCode;
result.ResponseMessage = root.GetValue("RspText", "RspMessage") ?? gatewayRspText;
result.TransactionDescriptor = root.GetValue("TxnDescriptor");
@@ -621,7 +597,7 @@ private Transaction MapResponse(string rawResponse, IPaymentMethod payment) {
AuthCode = root.GetValue("AuthCode")
};
}
-
+
// gift card create data
if (root.Has("CardData")) {
result.GiftCard = new GiftCard {
@@ -748,7 +724,7 @@ private T MapReportResponse(string rawResponse, ReportType reportType) where
};
// card holder data
-
+
// lodging data
if (root.Has("LodgingData")) {
summary.LodgingData = new LodgingData {
@@ -1015,11 +991,6 @@ private bool HasToken(IPaymentMethod paymentMethod, out string tokenValue) {
tokenValue = ((ITokenizable)paymentMethod).Token;
return true;
}
-
- if (paymentMethod is eCheck && !string.IsNullOrEmpty(((eCheck)paymentMethod).Token)) {
- tokenValue = ((eCheck)paymentMethod).Token;
- return true;
- }
return false;
}
#endregion
diff --git a/src/GlobalPayments.Api/Gateways/TransitConnector.cs b/src/GlobalPayments.Api/Gateways/TransitConnector.cs
index faad4fb2..419cf66a 100644
--- a/src/GlobalPayments.Api/Gateways/TransitConnector.cs
+++ b/src/GlobalPayments.Api/Gateways/TransitConnector.cs
@@ -6,13 +6,88 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Gateways {
- internal class TransitConnector : XmlGateway, IPaymentGateway, ISecure3dProvider {
+ internal class TransitRequest {
+ private string _root;
+ private Dictionary _values;
+
+ private string this[string key] {
+ get {
+ if (_values.ContainsKey(key)) {
+ return _values[key];
+ }
+ return null;
+ }
+ }
+
+ public TransitRequest(string root) {
+ _root = root;
+ _values = new Dictionary();
+ }
+
+ public TransitRequest Set(string key, string value) {
+ if (value != null) {
+ _values.Add(key, value);
+ }
+ return this;
+ }
+
+ public string BuildRequest(T builder) where T : TransactionBuilder {
+ var et = new ElementTree();
+
+ Element transaction = et.Element(_root);
+ foreach (var element in BuildRequestMap(builder)) {
+ et.SubElement(transaction, element, this[element]);
+ }
+
+ return et.ToString(transaction);
+ }
+
+ private LinkedList BuildRequestMap(T builder) where T : TransactionBuilder {
+ IPaymentMethod paymentMethod = builder.PaymentMethod;
+
+ switch (builder.TransactionType) {
+ case TransactionType.Auth:
+ case TransactionType.Sale: {
+ if (paymentMethod is Debit) {
+ return BuildList("deviceID|transactionKey|manifest|cardDataSource|transactionAmount|tip|salesTax|taxType|taxAmount|taxRate|currencyCode|track2Data|track3Data|emulatedTrackData|emvTags|emvFallbackCondition|lastChipRead|paymentAppVersion|emcContactlessToContactChip|pin|pinKsn|secureCode|paymentAccountReference|panReferenceIdentifier|nfcTags|ksn|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|tokenRequired|healthCareAccountType|prescriptionAmount|visionAmount|dentalAmount|clinicAmount|isQualifiedIIAS|rxNumber|couponID|providerID|providerToken|locationID|notifyEmailID|customerCode|firstName|lastName|transTotalDiscountAmount|transDiscountName|transDiscountAmount|transDiscountPercentage|priority|stackable|productCode|productName|price|quantity|measurementUnit|productDiscountName|productDiscountAmount|productDiscountPercentage|productDiscountType|priority|stackable|productTaxName|productTaxAmount|productTaxPercentage|productTaxType|productVariation|modifierName|modifierValue|modifierPrice|productNotes|softDescriptor|developerID|registeredUserIndicator|lastRegisteredChangeDate|laneID|authorizationIndicator|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|splitTenderPayment|splitTenderID|splitTenderConsolidatedReceipt|noIndividualTransactionReceipt");
+ }
+ return BuildList("deviceID|transactionKey|manifest|cardDataSource|transactionAmount|tip|salesTax|taxType|taxAmount|taxRate|taxCategory|shippingCharges|dutyCharges|surcharge|additionalAmountType|additionalAmount|additionalAmountSign|currencyCode|cardNumber|expirationDate|cvv2|track1Data|track2Data|track3Data|emulatedTrackData|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|cardOnFileTransactionIdentifier|emvTags|pin|pinKsn|emvFallbackCondition|lastChipRead|paymentAppVersion|emvContactlessToContactChip|nfcTags|walletSource|checkOutID|addressLine1|zip|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|ksn|tokenRequired|healthCareAccountType|prescriptionAmount|visionAmount|dentalAmount|clinicAmount|isQualifiedIIAS|rxNumber|couponID|providerID|providerToken|locationID|notifyEmailID|orderID|customerCode|firstName|lastName|customerPhone|transTotalDiscountAmount|transDiscountName|transDiscountAmount|transDiscountPercentage|priority|stackable|productCode|productName|price|quantity|measurementUnit|productDiscountName|productDiscountAmount|productDicsountPercentage|productDiscountType|priority|stackable|productTaxName|productTaxAmount|productTaxPercentage|productTaxType|productVariation|modifierName|modifierValue|modifierPrice|productNotes|productDiscountIndicator|productCommodityCode|alternateTaxID|creditIndicator|orderNotes|orderServiceTimestamp|commercialCardLevel|purchaseOrder|chargeDescriptor|customerVATNumber|customerRefID|orderDate|summaryCommodityCode|vatInvoice|chargeDescriptor2|chargeDescriptor3|chargeDescriptor4|supplierReferenceNumber|shipFromZip|shipToZip|destinationCountryCode|orderID|tokenRequesterID|softDescriptor|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType|developerID|paymentFacilitatorIdentifier|paymentFacilitatorName|subMerchantIdentifier|subMerchantName|subMerchantCountryCode|subMerchantStateCode|subMerchantCity|subMerchantPostalCode|subMerchantEmailId|subMerchantPhone|isoIdentifier|isRecurring|billingType|paymentCount|currentPaymentCount|isoIdentifier|registeredUserIndicator|lastRegisteredChangeDate|laneID|authorizationIndicator|splitTenderPayment|splitTenderID|splitTenderConsolidatedReceipt|noIndividualTransactionReceipt");
+ }
+ case TransactionType.Balance:
+ return BuildList("deviceID|transactionKey|manifest|cardDataSource|currencyCode|track1Data|track2Data|track3Data|emulatedTrackData|cardNumber|expirationDate|cvv2|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|cardOnFileTransactionIdentifier|nfcTags|walletSource|checkOutID|dtvv|addressLine1|zip|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|encryptionType|ksn|tokenRequired|customerCode|firstName|lastName|customerPhone|tokenRequesterID|softDescriptor|developerID|laneID|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType");
+ case TransactionType.Capture:
+ return BuildList("deviceID|transactionKey|manifest|transactionAmount|tip|salesTax|taxType|taxAmount|taxRate|taxCategory|shippingCharges|dutyCharges|surcharge|additionalAmountType|additionalAmount|additionalAmountSign|transactionID|externalReferenceID|operatorID|isPartialShipment|currentPaymentSequenceNumber|totalPaymentCount|softDescriptor|merchantReportID|customerCode|firstName|lastName|transTotalDiscountAmount|transDiscountName|transDiscountAmount|transDiscountPercentage|priority|stackable|productCode|productName|price|quantity|measurementUnit|productDiscountName|productDiscountAmount|productDicsountPercentage|productDiscountType|priority|stackable|productTaxName|productTaxAmount|productTaxPercentage|productTaxType|productVariation|modifierName|modifierValue|modiferPrice|productNotes|productDiscountIndicator|productCommodityCode|alternateTaxID|creditIndicator|orderNotes|orderServiceTimestamp|commercialCardLevel|purchaseOrder|chargeDescriptor|customerVATNumber|customerRefID|orderDate|summaryCommodityCode|vatInvoice|chargeDescriptor2|chargeDescriptor3|chargeDescriptor4|supplierReferenceNumber|shipFromZip|shipToZip|destinationCountryCode|developerID|paymentFacilitatorIdentifier|paymentFacilitatorName|subMerchantIdentifier|subMerchantName|subMerchantCountryCode|subMerchantStateCode|subMerchantCity|subMerchantPostalCode|subMerchantEmailId|subMerchantPhone");
+ case TransactionType.Verify: {
+ /* This is the list for the zero dollar authorization */
+ return BuildList("deviceID|transactionKey|manifest|cardDataSource|currencyCode|track1Data|track2Data|track3Data|emulatedTrackData|cardNumber|expirationDate|cvv2|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|nfcTags|walletSource|checkOutID|addressLine1|zip|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|ksn|tokenRequired|customerCode|firstName|lastName|tokenRequesterID|softDescriptor|developerID|laneID|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType");
+
+ /* This is the list for the card AVS and CVV check */
+ //return BuildList("deviceID|transactionKey|manifest|cardDataSource|emulatedTrackData|cardNumber|expirationDate|cvv2|walletSource|checkOutID|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|nfcTags|addressLine1|zip|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|ksn|tokenRequired|customerCode|firstName|lastName|tokenRequesterID|softDescriptor|developerID|laneID|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType");
+ }
+ default: throw new UnsupportedTransactionException();
+ }
+ }
+
+ private LinkedList BuildList(string str) {
+ var list = new LinkedList();
+
+ string[] values = str.Split('|');
+ foreach (string value in values) {
+ if (!string.IsNullOrEmpty(value)) {
+ list.AddLast(value);
+ }
+ }
+
+ return list;
+ }
+ }
+
+ internal class TransitConnector : XmlGateway, IPaymentGateway {
public AcceptorConfig AcceptorConfig { get; set; }
public string DeviceId { get; set; }
public string DeveloperId { get; set; }
public string MerchantId { get; set; }
public string TransactionKey { get; set; }
- public Secure3dVersion Version { get; set; }
public bool SupportsHostedPayments { get { return false; } }
@@ -46,42 +121,28 @@ private string GenerateManifest(decimal amount, string timestamp) {
}
public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
- var request = new TransitRequestBuilder(MapTransactionType(builder))
+ var request = new TransitRequest(MapTransactionType(builder))
.Set("developerID", DeveloperId)
.Set("deviceID", DeviceId)
.Set("transactionKey", TransactionKey)
- .Set("transactionAmount", builder.Amount.ToCurrencyString())
- .Set("tokenRequired", builder.RequestMultiUseToken ? "Y" : "N")
- .Set("externalReferenceID", builder.ClientTransactionId);
+ .Set("transactionAmount", builder.Amount.ToCurrencyString());
request.Set("cardDataSource", MapCardDataSource(builder));
if (builder.PaymentMethod is ICardData card) {
- string cardNumber = card.Number;
- string cardDataInputMode = "ELECTRONIC_COMMERCE_NO_SECURITY_CHANNEL_ENCRYPTED_SET_WITHOUT_CARDHOLDER_CERTIFICATE";
- if (card.CardType.Equals("Amex") && !string.IsNullOrEmpty(card.Cvn)) {
- cardDataInputMode = "MANUALLY_ENTERED_WITH_KEYED_CID_AMEX_JCB";
- }
-
- if (card is ITokenizable token && token.Token != null) {
- cardNumber = token.Token;
- //cardDataInputMode = "MERCHANT_INITIATED_TRANSACTION_CARD_CREDENTIAL_STORED_ON_FILE";
- }
-
- request.Set("cardNumber", cardNumber)
+ request.Set("cardNumber", card.Number)
.Set("expirationDate", card.ShortExpiry)
.Set("cvv2", card.Cvn)
.Set("cardPresentDetail", card.CardPresent ? "CARD_PRESENT" : "CARD_NOT_PRESENT")
.Set("cardholderPresentDetail", card.CardPresent ? "CARDHOLDER_PRESENT" : "CARDHOLDER_NOT_PRESENT_ELECTRONIC_COMMERCE")
- .Set("cardDataInputMode", cardDataInputMode)
- .Set("cardholderAuthenticationMethod", "NOT_AUTHENTICATED")
- .Set("authorizationIndicator", builder.AmountEstimated ? "PREAUTH" : "FINAL");
+ .Set("cardDataInputMode", card.CardPresent ? "KEY_ENTERED_INPUT" : "PAN_ENTRY_ELECTRONIC_COMMERCE_INCLUDING_REMOTE_CHIP")
+ .Set("cardholderAuthenticationMethod", "UNKNOWN");
}
else if (builder.PaymentMethod is ITrackData track) {
request.Set(track.TrackNumber.Equals(TrackNumber.TrackTwo) ? "track2Data" : "track1Data", track.TrackData);
request.Set("cardPresentDetail", "CARD_PRESENT")
.Set("cardholderPresentDetail", "CARDHOLDER_PRESENT")
.Set("cardDataInputMode", "MAGNETIC_STRIPE_READER_INPUT")
- .Set("cardholderAuthenticationMethod", "NOT_AUTHENTICATED");
+ .Set("cardholderAuthenticationMethod", "UNKNOWN");
if (builder.HasEmvFallbackData) {
request.Set("emvFallbackCondition", EnumConverter.GetMapping(Target.Transit, builder.EmvFallbackCondition))
@@ -90,67 +151,12 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
}
}
- // AVS
- if (builder.BillingAddress != null) {
- request.Set("addressLine1", builder.BillingAddress.StreetAddress1)
- .Set("zip", builder.BillingAddress.PostalCode);
- }
-
// PIN Debit
if (builder.PaymentMethod is IPinProtected pinProtected) {
request.Set("pin", pinProtected.PinBlock.Substring(0, 16))
.Set("pinKsn", pinProtected.PinBlock.Substring(16));
}
- #region 3DS 1/2
- if (builder.PaymentMethod is ISecure3d secure && secure.ThreeDSecure != null) {
- if (secure.ThreeDSecure.Version.Equals(Secure3dVersion.One)) {
- request.Set("programProtocol", "1");
- }
- else {
- request.Set("programProtocol", "2")
- .Set("directoryServerTransactionID", secure.ThreeDSecure.DirectoryServerTransactionId);
- }
-
- request.Set("eciIndicator", secure.ThreeDSecure.Eci)
- .Set("secureCode", secure.ThreeDSecure.SecureCode)
- .Set("digitalPaymentCryptogram", secure.ThreeDSecure.AuthenticationValue)
- .Set("securityProtocol", secure.ThreeDSecure.AuthenticationType)
- .Set("ucafCollectionIndicator", EnumConverter.GetMapping(Target.Transit, secure.ThreeDSecure.UCAFIndicator));
-
- }
- #endregion
-
- #region Commercial Card Requests
- if (builder.CommercialData != null) {
- var cd = builder.CommercialData;
-
- if (cd.CommercialIndicator.Equals(CommercialIndicator.Level_II)) {
- request.Set("commercialCardLevel", "LEVEL2");
- }
- else {
- request.Set("commercialCardLevel", "LEVEL3");
- request.SetProductDetails(cd.LineItems);
- }
-
- request.Set("salesTax", cd.TaxAmount.ToCurrencyString())
- .Set("chargeDescriptor", cd.Description)
- .Set("customerRefID", cd.CustomerReferenceId)
- .Set("purchaseOrder", cd.PoNumber)
- .Set("shipToZip", cd.DestinationPostalCode)
- .Set("shipFromZip", cd.OriginPostalCode)
- .Set("supplierReferenceNumber", cd.SupplierReferenceNumber)
- .Set("customerVATNumber", cd.CustomerVAT_Number)
- .Set("summaryCommodityCode", cd.SummaryCommodityCode)
- .Set("shippingCharges", cd.FreightAmount.ToCurrencyString())
- .Set("dutyCharges", cd.DutyAmount.ToCurrencyString())
- .Set("destinationCountryCode", cd.DestinationCountryCode)
- .Set("vatInvoice", cd.VAT_InvoiceNumber)
- .Set("orderDate", cd.OrderDate?.ToString("dd/MM/yyyy"))
- .SetAdditionalTaxDetails(cd.AdditionalTaxDetails);
- }
- #endregion
-
// Acceptor Config
request.Set("terminalCapability", EnumConverter.GetMapping(Target.Transit, AcceptorConfig.CardDataInputCapability))
.Set("terminalCardCaptureCapability", AcceptorConfig.CardCaptureCapability ? "CARD_CAPTURE_CAPABILITY" : "NO_CAPABILITY")
@@ -166,17 +172,14 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) {
}
public Transaction ManageTransaction(ManagementBuilder builder) {
- var request = new TransitRequestBuilder(MapTransactionType(builder))
+ var request = new TransitRequest(MapTransactionType(builder))
.Set("developerID", DeveloperId)
.Set("deviceID", DeviceId)
.Set("transactionKey", TransactionKey)
.Set("transactionAmount", builder.Amount.ToCurrencyString())
.Set("tip", builder.Gratuity.ToCurrencyString())
.Set("transactionID", builder.TransactionId)
- .Set("isPartialShipment", builder.MultiCapture ? "Y" : null)
- .SetPartialShipmentData(builder.MultiCaptureSequence, builder.MultiCapturePaymentCount)
- .Set("externalReferenceID", builder.ClientTransactionId)
- .Set("voidReason", EnumConverter.GetMapping(Target.Transit, builder.VoidReason));
+ .Set("isPartialShipment", builder.MultiCapture ? "Y" : null);
string response = DoTransaction(request.BuildRequest(builder));
return MapResponse(builder, response);
@@ -186,10 +189,6 @@ public string SerializeRequest(AuthorizationBuilder builder) {
throw new UnsupportedTransactionException();
}
- public Transaction ProcessSecure3d(Secure3dBuilder builder) {
- throw new NotImplementedException();
- }
-
private Transaction MapResponse(T builder, string rawResponse) where T : TransactionBuilder {
string rootName = "{0}Response".FormatWith(MapTransactionType(builder));
@@ -227,7 +226,7 @@ private Transaction MapResponse(T builder, string rawResponse) where T : Tran
// cardHolderVerificationCode
CardType = root.GetValue("cardType"),
CardLast4 = root.GetValue("maskedCardNumber"),
- Token = root.GetValue("token"),
+ // token
// expirationDate
// accountUpdaterResponseCode
CommercialIndicator = root.GetValue("commercialCard"),
@@ -262,20 +261,6 @@ private Transaction MapResponse(T builder, string rawResponse) where T : Tran
// additionalAmountAndAccountType
};
- // batch response
- if (root.Has("batchInfo")) {
- Element batchInfo = root.Get("batchInfo");
-
- trans.BatchSummary = new BatchSummary {
- ResponseCode = responseCode,
- SicCode = batchInfo.GetValue("SICCODE"),
- SaleCount = batchInfo.GetValue("saleCount"),
- SaleAmount = batchInfo.GetValue("saleAmount"),
- ReturnCount = batchInfo.GetValue("returnCount"),
- ReturnAmount = batchInfo.GetValue("returnAmount")
- };
- }
-
return trans;
}
@@ -292,20 +277,12 @@ private string MapTransactionType(T builder) where T : TransactionBuilder
3.0.0
- netstandard1.3
+ netstandard2.0
GlobalPayments.Api
GlobalPayments.Api
1.6.1
@@ -15,13 +15,13 @@
false
false
false
- 7
-
+
+
+
-
@@ -31,4 +31,8 @@
+
+
+
+
diff --git a/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs b/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs
index 445e5955..f3e44fbc 100644
--- a/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs
+++ b/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs
@@ -1,159 +1,124 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum CardDataInputCapability {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "UNKNOWN")]
- [Map(Target.NWS, "0")]
Unknown,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "NO_TERMINAL_MANUAL")]
- [Map(Target.NWS, "1")]
Manual,
[Map(Target.VAPS, "2")]
[Map(Target.Transit, "MAGSTRIPE_READ_ONLY")]
- [Map(Target.NWS, "2")]
MagStripe,
[Map(Target.VAPS, "3")]
- [Map(Target.NWS, "3")]
BarCode,
[Map(Target.VAPS, "4")]
[Map(Target.Transit, "OCR")]
- [Map(Target.NWS, "4")]
OCR,
[Map(Target.VAPS, "5")]
[Map(Target.Transit, "ICC_CHIP_READ_ONLY")]
- [Map(Target.NWS, "5")]
ContactEmv,
[Map(Target.VAPS, "6")]
[Map(Target.Transit, "KEYED_ENTRY_ONLY")]
- [Map(Target.NWS, "6")]
KeyEntry,
[Map(Target.VAPS, "9")]
[Map(Target.Transit, "ICC_CONTACTLESS_ONLY")]
- [Map(Target.NWS, "9")]
ContactlessEmv,
[Map(Target.VAPS, "A")]
[Map(Target.Transit, "MAGSTRIPE_CONTACTLESS_ONLY")]
- [Map(Target.NWS, "A")]
ContactlessMsd,
[Map(Target.VAPS, "B")]
[Map(Target.Transit, "MAGSTRIPE_KEYED_ENTRY_ONLY")]
- [Map(Target.NWS, "B")]
MagStripe_KeyEntry,
[Map(Target.VAPS, "C")]
- [Map(Target.NWS, "C")]
ContactEmv_MagStripe_KeyEntry,
[Map(Target.VAPS, "D")]
[Map(Target.Transit, "MAGSTRIPE_ICC_ONLY")]
- [Map(Target.NWS, "D")]
ContactEmv_MagStripe,
[Map(Target.VAPS, "E")]
[Map(Target.Transit, "ICC_KEYED_ENTRY_ONLY")]
- [Map(Target.NWS, "E")]
ContactEmv_KeyEntry,
[Map(Target.VAPS, "F")]
- [Map(Target.NWS, "F")]
ContactlessMsd_KeyEntry,
[Map(Target.VAPS, "G")]
- [Map(Target.NWS, "G")]
ContactlessMsd_MagStripe,
[Map(Target.VAPS, "H")]
- [Map(Target.NWS, "H")]
ContactlessMsd_MagStripe_KeyEntry,
[Map(Target.VAPS, "I")]
- [Map(Target.NWS, "I")]
ContactEmv_ContactlessMsd,
[Map(Target.VAPS, "J")]
- [Map(Target.NWS, "J")]
ContactEmv_ContactlessMsd_KeyEntry,
[Map(Target.VAPS, "K")]
- [Map(Target.NWS, "K")]
ContactEmv_ContactlessMsd_MagStripe,
[Map(Target.VAPS, "L")]
- [Map(Target.NWS, "L")]
ContactEmv_ContactlessMsd_MagStripe_KeyEntry,
[Map(Target.VAPS, "M")]
- [Map(Target.NWS, "M")]
ContactlessEmv_KeyEntry,
[Map(Target.VAPS, "N")]
- [Map(Target.NWS, "N")]
ContactlessEmv_MagStripe,
[Map(Target.VAPS, "O")]
- [Map(Target.NWS, "O")]
ContactlessEmv_ContactlessMsd,
[Map(Target.VAPS, "P")]
- [Map(Target.NWS, "P")]
ContactlessEmv_ContactlessMsd_KeyEntry,
[Map(Target.VAPS, "Q")]
- [Map(Target.NWS, "Q")]
ContactlessEmv_ContactlessMsd_MagStripe,
[Map(Target.VAPS, "R")]
- [Map(Target.NWS, "R")]
ContactlessEmv_ContactlessMsd_MagStripe_KeyEntry,
[Map(Target.VAPS, "S")]
- [Map(Target.NWS, "S")]
- [Map(Target.Transit, "MAGSTRIPE_ICC_KEYED_ENTRY_ONLY")]
+ [Map(Target.Transit, "MAGSTRIPE_ICC_KEYED_ENTRY_ONLY")]
ContactlessEmv_MagStripe_KeyEntry,
[Map(Target.VAPS, "T")]
- [Map(Target.NWS, "T")]
- [Map(Target.Transit, "ICC_CHIP_CONTACT_CONTACTLESS")]
+ [Map(Target.Transit, "ICC_CHIP_CONTACT_CONTACTLESS")]
ContactlessEmv_ContactEmv,
[Map(Target.VAPS, "U")]
- [Map(Target.NWS, "U")]
ContactlessEmv_ContactEmv_KeyEntry,
[Map(Target.VAPS, "V")]
- [Map(Target.NWS, "V")]
ContactlessEmv_ContactEmv_MagStripe,
[Map(Target.VAPS, "W")]
- [Map(Target.NWS, "W")]
ContactlessEmv_ContactEmv_MagStripe_KeyEntry,
[Map(Target.VAPS, "X")]
- [Map(Target.NWS, "X")]
ContactlessEmv_ContactEmv_ContactlessMsd,
[Map(Target.VAPS, "Y")]
- [Map(Target.NWS, "Y")]
ContactlessEmv_ContactEmv_ContactlessMsd_KeyEntry,
[Map(Target.VAPS, "Z")]
- [Map(Target.NWS, "Z")]
ContactlessEmv_ContactEmv_ContactlessMsd_MagStripe,
[Map(Target.VAPS, "a")]
- [Map(Target.NWS, "a")]
ContactlessEmv_ContactEmv_ContactlessMsd_MagStripe_KeyEntry
}
}
diff --git a/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs b/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs
index c7dbd1c2..2eabf920 100644
--- a/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs
+++ b/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs
@@ -1,26 +1,22 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum CardDataOutputCapability {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "OTHER")]
- [Map(Target.NWS, "0")]
Unknown,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "NONE")]
- [Map(Target.NWS, "1")]
None,
[Map(Target.VAPS, "2")]
[Map(Target.Transit, "MAGNETIC_STRIPE_WRITE")]
- [Map(Target.NWS, "2")]
MagStripe_Write,
[Map(Target.VAPS, "3")]
[Map(Target.Transit, "ICC")]
- [Map(Target.NWS, "3")]
ICC
}
}
diff --git a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs
index d6bc838f..381cc006 100644
--- a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs
+++ b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs
@@ -1,47 +1,38 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum CardHolderAuthenticationCapability {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "NO_CAPABILITY")]
- [Map(Target.NWS, "0")]
None,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "PIN_ENTRY")]
- [Map(Target.NWS, "1")]
PIN,
[Map(Target.VAPS, "2")]
[Map(Target.Transit, "SIGNATURE_ANALYSIS")]
- [Map(Target.NWS, "2")]
ElectronicSignature,
[Map(Target.VAPS, "3")]
- [Map(Target.NWS, "3")]
Biometrics,
[Map(Target.VAPS, "4")]
- [Map(Target.NWS, "4")]
Biographic,
[Map(Target.VAPS, "5")]
- [Map(Target.NWS, "5")]
[Map(Target.Transit, "SIGNATURE_ANALYSIS_INOPERATIVE")]
ElectronicAuthenticationInoperable,
[Map(Target.VAPS, "6")]
- [Map(Target.NWS, "6")]
- [Map(Target.Transit, "OTHER")]
+ [Map(Target.Transit, "OTHER")]
Other,
[Map(Target.VAPS, "9")]
- [Map(Target.NWS, "9")]
OnCardSecurityCode,
[Map(Target.VAPS, "S")]
- [Map(Target.NWS, "S")]
ElectronicAuthentication,
[Map(Target.Transit, "UNKNOWN")]
diff --git a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs
index b45e6457..5521b797 100644
--- a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs
+++ b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs
@@ -1,44 +1,36 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum CardHolderAuthenticationEntity {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "NOT_AUTHENTICATED")]
- [Map(Target.NWS, "0")]
NotAuthenticated,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "ICC_OFFLINE_PIN")]
- [Map(Target.NWS, "1")]
ICC,
[Map(Target.VAPS, "2")]
[Map(Target.Transit, "CARD_ACCEPTANCE_DEVICE")]
- [Map(Target.NWS, "2")]
CAD,
[Map(Target.VAPS, "3")]
[Map(Target.Transit, "AUTHORIZING_AGENT_ONLINE_PIN")]
- [Map(Target.NWS, "3")]
AuthorizingAgent,
[Map(Target.VAPS, "4")]
[Map(Target.Transit, "MERCHANT_CARD_ACCEPTOR_SIGNATURE")]
- [Map(Target.NWS, "4")]
ByMerchant,
[Map(Target.VAPS, "5")]
[Map(Target.Transit, "OTHER")]
- [Map(Target.NWS, "5")]
Other,
[Map(Target.VAPS, "8")]
- [Map(Target.NWS, "8")]
CallCenter,
[Map(Target.VAPS, "9")]
- [Map(Target.NWS, "9")]
CardIssuer
}
}
diff --git a/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs b/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs
index d486b238..85cd7a87 100644
--- a/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs
+++ b/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs
@@ -1,36 +1,30 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum OperatingEnvironment {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "NO_TERMINAL")]
- [Map(Target.NWS, "0")]
NoTerminalUsed,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "ON_MERCHANT_PREMISES_ATTENDED")]
- [Map(Target.NWS, "1")]
OnPremises_CardAcceptor_Attended,
[Map(Target.VAPS, "2")]
[Map(Target.Transit, "ON_MERCHANT_PREMISES_UNATTENDED")]
- [Map(Target.NWS, "2")]
OnPremises_CardAcceptor_Unattended,
[Map(Target.VAPS, "3")]
[Map(Target.Transit, "OFF_MERCHANT_PREMISES_ATTENDED")]
- [Map(Target.NWS, "3")]
OffPremises_CardAcceptor_Attended,
[Map(Target.VAPS, "4")]
[Map(Target.Transit, "OFF_MERCHANT_PREMISES_UNATTENDED")]
- [Map(Target.NWS, "4")]
OffPremises_CardAcceptor_Unattended,
[Map(Target.VAPS, "5")]
[Map(Target.Transit, "ON_CUSTOMER_PREMISES_UNATTENDED")]
- [Map(Target.NWS, "0")]
OnPremises_CardHolder_Unattended,
[Map(Target.Transit, "OFF_MERCHANT_PREMISES_MPOS")]
@@ -38,7 +32,6 @@ public enum OperatingEnvironment {
[Map(Target.VAPS, "9")]
[Map(Target.Transit, "ON_MERCHANT_PREMISES_MPOS")]
- [Map(Target.NWS, "9")]
OnPremises_CardAcceptor_Unattended_Mobile,
[Map(Target.Transit, "OFF_MERCHANT_PREMISES_CUSTOMER_POS")]
@@ -60,7 +53,6 @@ public enum OperatingEnvironment {
AMEX_Physical_Delivery,
[Map(Target.VAPS, "S")]
- [Map(Target.NWS, "S")]
Internet_With_SSL,
[Map(Target.VAPS, "T")]
diff --git a/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs b/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs
index e85fd351..9773e3de 100644
--- a/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs
+++ b/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs
@@ -1,61 +1,50 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum PinCaptureCapability {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "NOT_SUPPORTED")]
- [Map(Target.NWS, "0")]
None,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "UNKNOWN")]
- [Map(Target.NWS, "1")]
Unknown,
[Map(Target.VAPS, "4")]
[Map(Target.Transit, "4")]
- [Map(Target.NWS, "4")]
FourCharacters,
[Map(Target.VAPS, "5")]
[Map(Target.Transit, "5")]
- [Map(Target.NWS, "5")]
FiveCharacters,
[Map(Target.VAPS, "6")]
[Map(Target.Transit, "6")]
- [Map(Target.NWS, "6")]
SixCharacters,
[Map(Target.VAPS, "7")]
[Map(Target.Transit, "7")]
- [Map(Target.NWS, "7")]
SevenCharacters,
[Map(Target.VAPS, "8")]
[Map(Target.Transit, "8")]
- [Map(Target.NWS, "8")]
EightCharacters,
[Map(Target.VAPS, "9")]
[Map(Target.Transit, "9")]
- [Map(Target.NWS, "9")]
NineCharacters,
[Map(Target.VAPS, "A")]
[Map(Target.Transit, "10")]
- [Map(Target.NWS, "A")]
TenCharacters,
[Map(Target.VAPS, "B")]
[Map(Target.Transit, "11")]
- [Map(Target.NWS, "B")]
ElevenCharacters,
[Map(Target.VAPS, "C")]
[Map(Target.Transit, "12")]
- [Map(Target.NWS, "C")]
TwelveCharacters
}
}
diff --git a/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs b/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs
index 84458d3e..dd58a8a5 100644
--- a/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs
+++ b/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs
@@ -1,35 +1,29 @@
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api.Entities {
- [MapTarget(Target.VAPS | Target.Transit | Target.NWS)]
+ [MapTarget(Target.VAPS | Target.Transit)]
public enum TerminalOutputCapability {
[Map(Target.VAPS, "0")]
[Map(Target.Transit, "UNKNOWN")]
- [Map(Target.NWS, "0")]
Unknown,
[Map(Target.VAPS, "1")]
[Map(Target.Transit, "NONE")]
- [Map(Target.NWS, "1")]
None,
[Map(Target.VAPS, "2")]
[Map(Target.Transit, "PRINT_ONLY")]
- [Map(Target.NWS, "2")]
Printing,
[Map(Target.VAPS, "3")]
[Map(Target.Transit, "DISPLAY_ONLY")]
- [Map(Target.NWS, "3")]
Display,
[Map(Target.VAPS, "4")]
[Map(Target.Transit, "PRINT_AND_DISPLAY")]
- [Map(Target.NWS, "4")]
Printing_Display,
[Map(Target.VAPS, "9")]
- [Map(Target.NWS, "9")]
Coupon_Printing
}
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/Credit.cs b/src/GlobalPayments.Api/PaymentMethods/Credit.cs
index 7194b8f9..6bcaa941 100644
--- a/src/GlobalPayments.Api/PaymentMethods/Credit.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/Credit.cs
@@ -5,7 +5,7 @@ namespace GlobalPayments.Api.PaymentMethods {
///
/// Use credit as a payment method.
///
- public abstract class Credit : IPaymentMethod, IEncryptable, ITokenizable, IChargable, IAuthable, IRefundable, IReversable, IVerifiable, IPrePaid, IBalanceable, ISecure3d {
+ public abstract class Credit : IPaymentMethod, IEncryptable, ITokenizable, IChargable, IAuthable, IRefundable, IReversable, IVerifiable, IPrePayable, IBalanceable, ISecure3d {
///
/// The card type of the manual entry data.
///
@@ -41,8 +41,6 @@ public abstract class Credit : IPaymentMethod, IEncryptable, ITokenizable, IChar
public bool FleetCard { get; set; }
- public bool PurchaseCard { get; set; }
-
public Credit() {
CardType = "Unknown";
}
@@ -52,13 +50,12 @@ public Credit() {
///
/// The amount of the transaction
/// AuthorizationBuilder
- public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = false) {
+ public AuthorizationBuilder Authorize(decimal? amount = null) {
return new AuthorizationBuilder(TransactionType.Auth, this)
.WithAmount(amount ?? ThreeDSecure?.Amount)
.WithCurrency(ThreeDSecure?.Currency)
- .WithOrderId(ThreeDSecure?.OrderId)
- .WithAmountEstimated(isEstimated);
- }
+ .WithOrderId(ThreeDSecure?.OrderId);
+ }
///
/// Creates a charge (sale) against the payment method.
@@ -122,13 +119,8 @@ public AuthorizationBuilder Verify() {
///
/// AuthorizationBuilder
public string Tokenize(string configName = "default") {
- return Tokenize(true, configName);
- }
- public string Tokenize(bool verifyCard, string configName = "default") {
- TransactionType type = verifyCard ? TransactionType.Verify : TransactionType.Tokenize;
-
- var response = new AuthorizationBuilder(type, this)
- .WithRequestMultiUseToken(verifyCard)
+ var response = new AuthorizationBuilder(TransactionType.Verify, this)
+ .WithRequestMultiUseToken(true)
.Execute(configName);
return response.Token;
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs b/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs
index e2254720..82b86b7c 100644
--- a/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs
@@ -60,7 +60,6 @@ public string Number {
try {
CardType = CardUtils.MapCardType(_number);
FleetCard = CardUtils.IsFleet(CardType, _number);
- PurchaseCard = CardUtils.IsPurchase(CardType, _number);
}
catch (Exception) {
CardType = "Unknown";
@@ -73,21 +72,10 @@ public string Number {
///
public int? ExpMonth { get; set; }
- internal int? _expYear;
-
///
/// The card's expiration year.
///
- public int? ExpYear {
- get { return _expYear; }
- set {
- if (value.HasValue && (int)Math.Floor(Math.Log10(value.Value)) + 1 == 2) {
- _expYear = value + 2000;
- } else {
- _expYear = value;
- }
- }
- }
+ public int? ExpYear { get; set; }
public string ShortExpiry {
get {
diff --git a/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs b/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs
index 609b5e9f..185125ca 100644
--- a/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs
@@ -31,14 +31,12 @@ public string Value {
CardUtils.ParseTrackData(this);
CardType = CardUtils.MapCardType(Pan);
FleetCard = CardUtils.IsFleet(CardType, Pan);
- PurchaseCard = CardUtils.IsPurchase(CardType, Pan);
if (CardType.Equals("WexFleet") && DiscretionaryData != null && DiscretionaryData.Length >= 8) {
PurchaseDeviceSequenceNumber = DiscretionaryData.Substring(3, 5);
}
}
}
- public string PinBlock { get; set; }
public CreditTrackData() : base() { }
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/Debit.cs b/src/GlobalPayments.Api/PaymentMethods/Debit.cs
index 24fe89fc..97243cdb 100644
--- a/src/GlobalPayments.Api/PaymentMethods/Debit.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/Debit.cs
@@ -2,11 +2,12 @@
using GlobalPayments.Api.Builders;
using GlobalPayments.Api.Entities;
-namespace GlobalPayments.Api.PaymentMethods {
+namespace GlobalPayments.Api.PaymentMethods
+{
///
/// Use PIN debit as a payment method.
///
- public abstract class Debit : IPaymentMethod, IPrePaid, IRefundable, IReversable, IChargable, IEncryptable, IPinProtected {
+ public abstract class Debit : IPaymentMethod, IPrePayable, IRefundable, IReversable, IChargable, IEncryptable, IPinProtected {
public string CardType { get; set; }
public EncryptionData EncryptionData { get; set; }
@@ -37,10 +38,5 @@ public AuthorizationBuilder Refund(decimal? amount = null) {
public AuthorizationBuilder Reverse(decimal? amount = null) {
return new AuthorizationBuilder(TransactionType.Reversal, this).WithAmount(amount);
}
- public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = true) {
- return new AuthorizationBuilder(TransactionType.Auth, this)
- .WithAmount(amount)
- .WithAmountEstimated(true);
- }
- }
+ }
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/EBT.cs b/src/GlobalPayments.Api/PaymentMethods/EBT.cs
index 5b68781e..63c98100 100644
--- a/src/GlobalPayments.Api/PaymentMethods/EBT.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/EBT.cs
@@ -9,7 +9,6 @@ public abstract class EBT : IPaymentMethod, IBalanceable, IChargable, IRefundabl
///
/// Set to `PaymentMethodType.EBT` for internal methods.
///
- public EbtCardType EbtCardType { get; set; }
public PaymentMethodType PaymentMethodType { get { return PaymentMethodType.EBT; } }
public string PinBlock { get; set; }
@@ -28,54 +27,5 @@ public AuthorizationBuilder Charge(decimal? amount = null) {
public AuthorizationBuilder Refund(decimal? amount = null) {
return new AuthorizationBuilder(TransactionType.Refund, this).WithAmount(amount);
}
- public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = true) {
- return new AuthorizationBuilder(TransactionType.Auth, this)
- .WithAmount(amount)
- .WithAmountEstimated(true);
- }
}
-
- /////
- ///// Use EBT manual entry data as a payment method.
- /////
- //public class EBTCardData : EBT, ICardData {
- // public string ApprovalCode { get; set; }
- // public bool CardPresent { get; set; }
- // public string Cvn { get; set; }
- // public CvnPresenceIndicator CvnPresenceIndicator { get; set; }
- // public int? ExpMonth { get; set; }
- // public int? ExpYear { get; set; }
- // public string Number { get; set; }
- // public bool ReaderPresent { get; set; }
- // public string SerialNumber { get; set; }
- // public string ShortExpiry {
- // get {
- // var month = (ExpMonth.HasValue) ? ExpMonth.ToString().PadLeft(2, '0') : string.Empty;
- // var year = (ExpYear.HasValue) ? ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : string.Empty;
- // return month + year;
- // }
- // }
- // public EBTCardData() { }
- // public EBTCardData(EbtCardType cardType) {
- // EbtCardType = cardType;
- // }
- //}
-
- /////
- ///// Use EBT track data as a payment method.
- /////
- //public class EBTTrackData : EBT, ITrackData, IEncryptable {
- // public EncryptionData EncryptionData { get; set; }
- // public EntryMethod EntryMethod { get; set; }
- // public string Value { get; set; }
- // public TrackNumber TrackNumber { get; set; }
- // public string TrackData { get; set; }
- // public string Pan { get; set; }
- // public string DiscretionaryData { get; set; }
- // public string Expiry { get; set; }
- // public EBTTrackData() { }
- // public EBTTrackData(EbtCardType cardType) {
- // EbtCardType = cardType;
- // }
- //}
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs b/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs
index 91de0ee0..19bad7a4 100644
--- a/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs
@@ -7,7 +7,6 @@ namespace GlobalPayments.Api.PaymentMethods {
public class EBTCardData : EBT, ICardData {
public string ApprovalCode { get; set; }
public bool CardPresent { get; set; }
- public string CardType { get; set; }
public string Cvn { get; set; }
public CvnPresenceIndicator CvnPresenceIndicator { get; set; }
public int? ExpMonth { get; set; }
@@ -19,13 +18,8 @@ public string ShortExpiry {
get {
var month = (ExpMonth.HasValue) ? ExpMonth.ToString().PadLeft(2, '0') : string.Empty;
var year = (ExpYear.HasValue) ? ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : string.Empty;
- return year + month;
+ return month + year;
}
}
- public EBTCardData() {
- }
- public EBTCardData(EbtCardType cardType) {
- EbtCardType = cardType;
- }
}
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs b/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs
index ab1048c0..41d0c38a 100644
--- a/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs
@@ -35,8 +35,5 @@ public string Value {
}
public EBTTrackData() : base() { }
- public EBTTrackData(EbtCardType cardType) {
- EbtCardType = cardType;
- }
}
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs b/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs
index 6e8f31dc..cff5060b 100644
--- a/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs
@@ -1,26 +1,22 @@
-using GlobalPayments.Api.Builders;
+using System;
+using GlobalPayments.Api.Builders;
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Utils;
-namespace GlobalPayments.Api.PaymentMethods {
+namespace GlobalPayments.Api.PaymentMethods
+{
///
/// Use gift/loyaly/stored value account as a payment method.
///
- public class GiftCard : IPaymentMethod, IPrePaid, IBalanceable, IReversable, IChargable, IAuthable, IRefundable {
- private string _token;
- private string _trackData;
- private string _number;
- private string _alias;
-
+ public class GiftCard : IPaymentMethod, IPrePayable, IBalanceable, IReversable, IChargable {
///
/// The gift card's alias.
///
public string Alias {
get {
- return _alias;
+ return Value;
}
set {
- _alias = value;
+ Value = value;
ValueType = "Alias";
}
}
@@ -30,16 +26,11 @@ public string Alias {
///
public string Number {
get {
- return _number;
+ return Value;
}
set {
- if (string.IsNullOrEmpty(Value)) {
- SetValue(value);
- }
- else {
- _number = value;
- ValueType = "CardNbr";
- }
+ Value = value;
+ ValueType = "CardNbr";
}
}
@@ -58,10 +49,10 @@ public string Number {
///
public string Token {
get {
- return _token;
+ return Value;
}
set {
- _token = value;
+ Value = value;
ValueType = "TokenValue";
}
}
@@ -71,42 +62,34 @@ public string Token {
///
public string TrackData {
get {
- return _trackData;
+ return Value;
}
set {
- if (string.IsNullOrEmpty(Value)) {
- SetValue(value);
- }
- else {
- _trackData = value;
- ValueType = "TrackData";
- }
+ Value = value;
+ ValueType = "TrackData";
}
}
internal string Value { get; set; }
+
internal string ValueType { get; private set; }
- internal TrackNumber TrackNumber { get; set; }
- internal string Pan { get; set; }
- internal string Expiry { get; set; }
- internal string CardType { get; set; }
///
- /// Activates an existing gift card.
+ /// Adds an alias to to an existing gift card.
///
- /// The amount of the transaction
+ /// The phone number to add as an alias
/// AuthorizationBuilder
- public AuthorizationBuilder Activate(decimal? amount = null) {
- return new AuthorizationBuilder(TransactionType.Activate, this).WithAmount(amount);
+ public AuthorizationBuilder AddAlias(string phoneNumber) {
+ return new AuthorizationBuilder(TransactionType.Alias, this).WithAlias(AliasAction.ADD, phoneNumber);
}
///
- /// Adds an alias to to an existing gift card.
+ /// Activates an existing gift card.
///
- /// The phone number to add as an alias
+ /// The amount of the transaction
/// AuthorizationBuilder
- public AuthorizationBuilder AddAlias(string phoneNumber) {
- return new AuthorizationBuilder(TransactionType.Alias, this).WithAlias(AliasAction.ADD, phoneNumber);
+ public AuthorizationBuilder Activate(decimal? amount = null) {
+ return new AuthorizationBuilder(TransactionType.Activate, this).WithAmount(amount);
}
///
@@ -118,13 +101,6 @@ public AuthorizationBuilder AddValue(decimal? amount = null) {
return new AuthorizationBuilder(TransactionType.AddValue, this).WithAmount(amount);
}
- public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimate = false)
- {
- return new AuthorizationBuilder(TransactionType.Auth, this)
- .WithAmount(amount)
- .WithAmountEstimated(isEstimate);
- }
-
///
/// Completes a balance inquiry (lookup) on an activated gift card.
///
@@ -134,11 +110,6 @@ public AuthorizationBuilder BalanceInquiry(InquiryType? inquiry = null) {
return new AuthorizationBuilder(TransactionType.Balance, this);
}
- public AuthorizationBuilder CashOut()
- {
- return new AuthorizationBuilder(TransactionType.CashOut, this);
- }
-
///
/// Creates a charge (sale) transaction against an activated gift card.
///
@@ -148,30 +119,6 @@ public AuthorizationBuilder Charge(decimal? amount = null) {
return new AuthorizationBuilder(TransactionType.Sale, this).WithAmount(amount);
}
- ///
- /// Creates a gift card with an alias.
- ///
- ///
- /// Thrown when the gift card cannot be created.
- ///
- /// The phone number to be used as the alias
- /// GiftCard
- public static GiftCard Create(string phoneNumber)
- {
- var card = new GiftCard { };
-
- var response = new AuthorizationBuilder(TransactionType.Alias, card)
- .WithAlias(AliasAction.CREATE, phoneNumber)
- .Execute();
-
- // if success return a card
- if (response.ResponseCode == "00")
- {
- return response.GiftCard;
- }
- else throw new GatewayException("Failed to create gift card.", response.ResponseCode, response.ResponseMessage);
- }
-
///
/// Deactivates a gift card.
///
@@ -180,11 +127,6 @@ public AuthorizationBuilder Deactivate() {
return new AuthorizationBuilder(TransactionType.Deactivate, this);
}
- public AuthorizationBuilder Refund(decimal? amount = null) {
- return new AuthorizationBuilder(TransactionType.Refund, this)
- .WithAmount(amount);
- }
-
///
/// Removes an alias from an existing gift card.
///
@@ -197,7 +139,7 @@ public AuthorizationBuilder RemoveAlias(string phoneNumber) {
///
/// Replaces an existing gift card with a new one,
/// transferring the balance from the old card to
- /// the new card in the process.
+ // the new card in the process.
///
/// The replacement gift card
/// AuthorizationBuilder
@@ -223,15 +165,26 @@ public AuthorizationBuilder Rewards(decimal? amount = null) {
return new AuthorizationBuilder(TransactionType.Reward, this).WithAmount(amount);
}
- public void SetValue(string value) {
- Value = value;
+ ///
+ /// Creates a gift card with an alias.
+ ///
+ ///
+ /// Thrown when the gift card cannot be created.
+ ///
+ /// The phone number to be used as the alias
+ /// GiftCard
+ public static GiftCard Create(string phoneNumber) {
+ var card = new GiftCard { };
+
+ var response = new AuthorizationBuilder(TransactionType.Alias, card)
+ .WithAlias(AliasAction.CREATE, phoneNumber)
+ .Execute();
- CardUtils.ParseTrackData(this);
- if (string.IsNullOrEmpty(TrackData)) {
- Number = value;
- Pan = value;
+ // if success return a card
+ if (response.ResponseCode == "00") {
+ return response.GiftCard;
}
- CardType = CardUtils.MapCardType(Pan);
+ else throw new GatewayException("Failed to create gift card.", response.ResponseCode, response.ResponseMessage);
}
}
}
diff --git a/src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs b/src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs
new file mode 100644
index 00000000..81ddaab8
--- /dev/null
+++ b/src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs
@@ -0,0 +1,84 @@
+using System;
+using GlobalPayments.Api.Builders;
+using GlobalPayments.Api.Entities;
+
+namespace GlobalPayments.Api.PaymentMethods
+{
+ public interface IPaymentMethod {
+ PaymentMethodType PaymentMethodType { get; }
+ }
+
+ public interface ICardData {
+ bool CardPresent { get; set; }
+ string Cvn { get; set; }
+ CvnPresenceIndicator CvnPresenceIndicator { get; set; }
+ string Number { get; set; }
+ int? ExpMonth { get; set; }
+ int? ExpYear { get; set; }
+ bool ReaderPresent { get; set; }
+ string ShortExpiry { get; }
+ }
+
+ public interface ITrackData {
+ string Expiry { get; set; }
+ string Pan { get; set; }
+ TrackNumber TrackNumber { get; set; }
+ string TrackData { get; set; }
+ string DiscretionaryData { get; set; }
+ string Value { get; set; }
+ EntryMethod EntryMethod { get; set; }
+ }
+
+ interface IAuthable {
+ AuthorizationBuilder Authorize(decimal? amount = null);
+ }
+
+ interface IChargable {
+ AuthorizationBuilder Charge(decimal? amount = null);
+ }
+
+ interface IBalanceable {
+ AuthorizationBuilder BalanceInquiry(InquiryType? inquiry);
+ }
+
+ interface IEditable {
+ ManagementBuilder Edit(decimal? amount = null);
+ }
+
+ interface IEncryptable {
+ EncryptionData EncryptionData { get; set; }
+ }
+
+ interface IPinProtected {
+ string PinBlock { get; set; }
+ }
+
+ interface IPrePayable {
+ AuthorizationBuilder AddValue(decimal? amount = null);
+ }
+
+ interface IRefundable {
+ AuthorizationBuilder Refund(decimal? amount = null);
+ }
+
+ interface IReversable {
+ AuthorizationBuilder Reverse(decimal? amount = null);
+ }
+
+ interface ITokenizable {
+ string Token { get; set; }
+ string Tokenize(string configName = "default");
+ bool UpdateTokenExpiry(string configName = "default");
+ bool DeleteToken(string configName = "default");
+ }
+
+ interface IVerifiable {
+ AuthorizationBuilder Verify();
+ }
+
+ interface ISecure3d {
+ ThreeDSecure ThreeDSecure { get; set; }
+ }
+
+ interface IVoidable { }
+}
diff --git a/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs b/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs
index 3e1211a8..1e43339e 100644
--- a/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs
@@ -81,11 +81,8 @@ public RecurringPaymentMethod(string customerId, string paymentId) {
///
/// The amount of the transaction
/// AuthorizationBuilder
- public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = false) {
- return new AuthorizationBuilder(TransactionType.Auth, this)
- .WithAmount(amount)
- .WithOneTimePayment(true)
- .WithAmountEstimated(isEstimated);
+ public AuthorizationBuilder Authorize(decimal? amount = null) {
+ return new AuthorizationBuilder(TransactionType.Auth, this).WithAmount(amount).WithOneTimePayment(true);
}
///
diff --git a/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs b/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs
index abdb558c..7b20db36 100644
--- a/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs
+++ b/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs
@@ -1,35 +1,13 @@
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Network.Entities;
namespace GlobalPayments.Api.PaymentMethods {
internal class TransactionReference : IPaymentMethod {
- internal PaymentMethodType _paymentMethodType;
- public PaymentMethodType PaymentMethodType {
- get {
- if (OriginalPaymentMethod != null) {
- return OriginalPaymentMethod.PaymentMethodType;
- }
- return _paymentMethodType;
- }
- set { _paymentMethodType = value; }
- }
+ public PaymentMethodType PaymentMethodType { get; set; }
public string AuthCode { get; set; }
public string BatchNumber { get; set; }
public string OrderId { get; set; }
public string TransactionId { get; set; }
public string ClientTransactionId { get; set; }
public string AlternativePaymentType { get; set; }
- public string AcquiringInstitutionId{ get; set; }
- public string MessageTypeIndicator{ get; set; }
- public decimal? OriginalAmount{ get; set; }
- public IPaymentMethod OriginalPaymentMethod{ get; set; }
- public string OriginalProcessingCode{ get; set; }
- public string OriginalTransactionTime{ get; set; }
- public int SequenceNumber{ get; set; }
- public string SystemTraceAuditNumber{ get; set; }
- public NtsData NtsData { get; set; }
- public void SetNtsData(string value) {
- this.NtsData = NtsData.FromString(value);
- }
}
}
diff --git a/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs b/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs
index 090681b8..97e1a1a4 100644
--- a/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs
+++ b/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs
@@ -1,5 +1,4 @@
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Logging;
namespace GlobalPayments.Api {
public abstract class Configuration {
@@ -8,8 +7,6 @@ public abstract class Configuration {
public Environment Environment { get { return _environment; } set { _environment = value; } }
- public IRequestLogger RequestLogger { get; set; }
-
///
/// Gateway service URL
///
@@ -23,8 +20,6 @@ public abstract class Configuration {
internal bool Validated { get; private set; }
internal abstract void ConfigureContainer(ConfiguredServices services);
- public bool EnableLogging { get; set; }
- public bool ForceGatewayTimeout { get; set; }
internal virtual void Validate() {
Validated = true;
diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs
index 0f8e8ef5..f2e1fe00 100644
--- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs
+++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs
@@ -1,7 +1,5 @@
-using System;
-using System.Reflection;
+using System.Reflection;
using GlobalPayments.Api.Entities;
-using GlobalPayments.Api.Network.Entities;
using GlobalPayments.Api.Utils;
namespace GlobalPayments.Api {
@@ -14,20 +12,6 @@ public class AcceptorConfig {
public CardDataOutputCapability CardDataOutputCapability { get; set; }
public TerminalOutputCapability TerminalOutputCapability { get; set; }
public PinCaptureCapability PinCaptureCapability { get; set; }
- public string HardwareLevel { get; set; }
- public string SoftwareLevel { get; set; }
- public string OperatingSystemLevel { get; set; }
- public string Timezone { get; set; }
- public bool? SupportsPartialApproval { get; set; }
- public bool? SupportsReturnBalance { get; set; }
- public bool? SupportsCashOver { get; set; }
- public bool? MobileDevice { get; set; }
- public bool? SupportsShutOffAmount { get; set; }
- public bool? SupportsDiscoverNetworkReferenceId { get; set; }
- public bool? SupportsAvsCnvVoidReferrals { get; set; }
- public bool? SupportsEmvPin { get; set; }
- public EncryptionType SupportedEncryptionType { get; set; }
- public Address Address { get; set; }
public AcceptorConfig() {
CardDataInputCapability = CardDataInputCapability.MagStripe_KeyEntry;
@@ -37,7 +21,6 @@ public AcceptorConfig() {
CardDataOutputCapability = CardDataOutputCapability.None;
TerminalOutputCapability = TerminalOutputCapability.None;
PinCaptureCapability = PinCaptureCapability.TwelveCharacters;
- SupportedEncryptionType = EncryptionType.TEP2;
}
public void Validate(Target target) {
@@ -54,33 +37,5 @@ public void Validate(Target target) {
}
}
}
- public bool HasPosConfiguration_MessageControl() {
- return (!string.IsNullOrEmpty(Timezone)
- || SupportsPartialApproval != null
- || SupportsReturnBalance != null
- || SupportsCashOver != null
- || MobileDevice != null);
- }
- public bool HasPosConfiguration_IssuerData() {
- return (SupportsPartialApproval != null
- || SupportsShutOffAmount != null
- || SupportsReturnBalance != null
- || SupportsDiscoverNetworkReferenceId != null
- || SupportsAvsCnvVoidReferrals != null
- || SupportsEmvPin != null
- || MobileDevice != null);
- }
- public string GetPosConfigForIssuerData() {
- string rvalue = SupportsPartialApproval != null ? (bool)SupportsPartialApproval ? "Y" : "N" : "N";
- rvalue = string.Concat(rvalue, (SupportsShutOffAmount != null ? (bool)SupportsShutOffAmount ? "Y" : "N" : "N")
- , ("N")
- , (SupportsReturnBalance != null ? (bool)SupportsReturnBalance ? "Y" : "N" : "N")
- , (SupportsDiscoverNetworkReferenceId != null ? (bool)SupportsDiscoverNetworkReferenceId ? "Y" : "N" : "N")
- , (SupportsAvsCnvVoidReferrals != null ? (bool)SupportsAvsCnvVoidReferrals ? "Y" : "N" : "N")
- , (SupportsEmvPin != null ? (bool)SupportsEmvPin ? "Y" : "N" : "N")
- , (MobileDevice != null ? (bool)MobileDevice ? "Y" : "N" : "N")
- , ("N"));
- return rvalue;
- }
}
}
diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs
index 74bcae73..ddd0e50e 100644
--- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs
+++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs
@@ -48,12 +48,10 @@ internal override void Validate() {
// data client
if (!string.IsNullOrEmpty(DataClientId) || !string.IsNullOrEmpty(DataClientSecret)) {
- if (string.IsNullOrEmpty(DataClientId) || string.IsNullOrEmpty(DataClientSecret)) {
+ if (string.IsNullOrEmpty(DataClientId) || string.IsNullOrEmpty(DataClientSecret))
throw new ConfigurationException("Both \"DataClientID\" and \"DataClientSecret\" are required for data client services.");
- }
- if (string.IsNullOrEmpty(DataClientUserId)) {
+ if (string.IsNullOrEmpty(DataClientUserId))
throw new ConfigurationException("DataClientUserId required for data client services.");
- }
}
}
}
diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs
index 35c35a02..a27f15c2 100644
--- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs
+++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs
@@ -88,8 +88,7 @@ internal override void ConfigureContainer(ConfiguredServices services) {
VersionNumber = VersionNumber,
Timeout = Timeout,
ServiceUrl = ServiceUrl + "/Hps.Exchange.PosGateway/PosGatewayService.asmx",
- UniqueDeviceId = UniqueDeviceId,
- RequestLogger = RequestLogger
+ UniqueDeviceId = UniqueDeviceId
};
services.GatewayConnector = gateway;
@@ -101,8 +100,7 @@ internal override void ConfigureContainer(ConfiguredServices services) {
var payplan = new PayPlanConnector {
SecretApiKey = SecretApiKey,
Timeout = Timeout,
- ServiceUrl = ServiceUrl + PayPlanEndpoint,
- RequestLogger = RequestLogger
+ ServiceUrl = ServiceUrl + PayPlanEndpoint
};
services.RecurringConnector = payplan;
}
diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs
index 71ad9598..d5a9aa61 100644
--- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs
+++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs
@@ -28,8 +28,7 @@ internal override void ConfigureContainer(ConfiguredServices services) {
MerchantId = MerchantId,
TransactionKey = TransactionKey,
ServiceUrl = ServiceUrl,
- Timeout = Timeout,
- RequestLogger = RequestLogger
+ Timeout = Timeout
};
services.GatewayConnector = gateway;
diff --git a/src/GlobalPayments.Api/Services/BatchService.cs b/src/GlobalPayments.Api/Services/BatchService.cs
index 094aa593..3b457dd4 100644
--- a/src/GlobalPayments.Api/Services/BatchService.cs
+++ b/src/GlobalPayments.Api/Services/BatchService.cs
@@ -7,123 +7,5 @@ public static BatchSummary CloseBatch() {
var response = new ManagementBuilder(TransactionType.BatchClose).Execute();
return response.BatchSummary;
}
- public static BatchSummary CloseBatch(BatchCloseType closeType) {
- return CloseBatch(closeType, "default");
- }
- public static BatchSummary CloseBatch(BatchCloseType closeType, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchCloseType(closeType)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(int batchNumber) {
- return CloseBatch(batchNumber, "default");
- }
- public static BatchSummary CloseBatch(int batchNumber, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber) {
- return CloseBatch(batchNumber, sequenceNumber, "default");
- }
- public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber, sequenceNumber)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber) {
- return CloseBatch(closeType, batchNumber, "default");
- }
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber)
- .WithBatchCloseType(closeType)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber) {
- return CloseBatch(closeType, batchNumber, sequenceNumber, "default");
- }
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber, sequenceNumber)
- .WithBatchCloseType(closeType)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(int transactionTotal, decimal totalCredits, decimal totalDebits) {
- return CloseBatch(transactionTotal, totalCredits, totalDebits, "default");
- }
- public static BatchSummary CloseBatch(int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchTotals(transactionTotal, totalDebits, totalCredits)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(BatchCloseType closeType, int transactionTotal, decimal totalCredits, decimal totalDebits) {
- return CloseBatch(closeType, transactionTotal, totalCredits, totalDebits, "default");
- }
- public static BatchSummary CloseBatch(BatchCloseType closeType, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchTotals(transactionTotal, totalDebits, totalCredits)
- .WithBatchCloseType(closeType)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) {
- return CloseBatch(batchNumber, transactionTotal, totalCredits, totalDebits, "default");
- }
- public static BatchSummary CloseBatch(int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber)
- .WithBatchTotals(transactionTotal, totalDebits, totalCredits)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) {
- return CloseBatch(batchNumber, sequenceNumber, transactionTotal, totalCredits, totalDebits, "default");
- }
- public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber, sequenceNumber)
- .WithBatchTotals(transactionTotal, totalDebits, totalCredits)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) {
- return CloseBatch(closeType, batchNumber, transactionTotal, totalCredits, totalDebits, "default");
- }
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber)
- .WithBatchTotals(transactionTotal, totalDebits, totalCredits)
- .WithBatchCloseType(closeType)
- .Execute(configName);
- return response.BatchSummary;
- }
-
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) {
- return CloseBatch(closeType, batchNumber, sequenceNumber, transactionTotal, totalCredits, totalDebits, "default");
- }
- public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) {
- Transaction response = new ManagementBuilder(TransactionType.BatchClose)
- .WithBatchNumber(batchNumber, sequenceNumber)
- .WithBatchTotals(transactionTotal, totalDebits, totalCredits)
- .WithBatchCloseType(closeType)
- .Execute(configName);
- return response.BatchSummary;
- }
}
}
diff --git a/src/GlobalPayments.Api/Services/TableService.cs b/src/GlobalPayments.Api/Services/TableService.cs
index f77bd8d8..b883de1a 100644
--- a/src/GlobalPayments.Api/Services/TableService.cs
+++ b/src/GlobalPayments.Api/Services/TableService.cs
@@ -9,7 +9,7 @@ public class TableService {
private readonly string _configName;
///
- /// string array of the bump statuses as reported by the table service API.
+ /// String array of the bump statuses as reported by the table service API.
///
public string[] BumpStatuses {
get {
diff --git a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs
index 2113d5bb..2200cb9b 100644
--- a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs
@@ -9,5 +9,9 @@ public interface IDeviceCommInterface {
byte[] Send(IDeviceMessage message);
event MessageSentEventHandler OnMessageSent;
+
+ event BroadcastMessageEventHandler OnBroadcastMessage;
+
+ event PayAtTableRequestEventHandler OnPayAtTableRequest;
}
}
diff --git a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs
index 17ec5cf4..9b61458c 100644
--- a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs
@@ -2,14 +2,23 @@
using GlobalPayments.Api.Entities;
using GlobalPayments.Api.Terminals.Abstractions;
using GlobalPayments.Api.Terminals.Builders;
+using GlobalPayments.Api.Terminals.Ingenico;
using GlobalPayments.Api.Terminals.Messaging;
namespace GlobalPayments.Api.Terminals {
public interface IDeviceInterface : IDisposable {
event MessageSentEventHandler OnMessageSent;
+ event BroadcastMessageEventHandler OnBroadcastMessage;
+ event PayAtTableRequestEventHandler OnPayAtTableRequest;
#region Admin Calls
- void Cancel();
+
+ ///
+ /// A method to Cancel a live transaction.
+ ///
+ /// Amount to be passed for cancel request.
+ /// TerminalManageBuilder
+ IDeviceResponse Cancel();
IDeviceResponse CloseLane();
IDeviceResponse DisableHostResponseBeep();
ISignatureResponse GetSignatureFile();
@@ -24,10 +33,44 @@ public interface IDeviceInterface : IDisposable {
ISAFResponse SendStoreAndForward();
IDeviceResponse SetStoreAndForwardMode(bool enabled);
IDeviceResponse StartCard(PaymentMethodType paymentMethodType);
+
+ ///
+ /// The terminal immediately initiates a duplicate of the last completed transaction
+ ///
+ /// IDeviceResponse
+ IDeviceResponse Duplicate();
+
+ ///
+ /// Command used to gain feedback as to the status of the terminal.
+ ///
+ ///
+ IDeviceResponse GetTerminalStatus();
+
+ ///
+ /// Command used to request for CALL TMS in the terminal.
+ ///
+ /// IDeviceResponse
+ IDeviceResponse GetTerminalConfiguration();
+
+ IDeviceResponse TestConnection();
#endregion
#region reporting
TerminalReportBuilder LocalDetailReport();
+ ///
+ /// Used to request the XML data for the last completed report that is stored in the terminal’s memory
+ ///
+ /// Receipt Type
+ ///
+ TerminalReportBuilder GetLastReceipt(ReceiptType type = ReceiptType.TICKET);
+
+ ///
+ /// Instruct the terminal to initiate report and stores it in terminal's memory.
+ /// GetLastReceipt can be used to extract XML data after.
+ ///
+ /// Report Type
+ ///
+ TerminalReportBuilder GetReport(Ingenico.ReportType type);
#endregion
#region Batch Calls
@@ -65,14 +108,61 @@ public interface IDeviceInterface : IDisposable {
#region Generic Calls
TerminalAuthBuilder AddValue(decimal? amount = null);
+
+ ///
+ /// Instructs the terminal to transact a pre-authorization transaction.
+ ///
+ /// Amount
+ ///
TerminalAuthBuilder Authorize(decimal? amount = null);
TerminalAuthBuilder Balance();
TerminalManageBuilder Capture(decimal? amount = null);
+
+ ///
+ /// Instruct the terminal to refund the last completed transaction.
+ ///
+ /// Refund Amount
+ ///
TerminalAuthBuilder Refund(decimal? amount = null);
+
+ ///
+ /// Instruct the terminal to process sale transaction.
+ ///
+ /// Sale Amount
+ ///
TerminalAuthBuilder Sale(decimal? amount = null);
+
+ ///
+ /// Verify the account of the card holder.
+ ///
+ ///
TerminalAuthBuilder Verify();
TerminalManageBuilder Void();
TerminalAuthBuilder Withdrawal(decimal? amount = null);
#endregion
+
+ #region Terminal Management
+
+ ///
+ /// The terminal immediately performs a reversal of the last completed transaction if no Transaction Id is set.
+ ///
+ /// Amount to be passed for cancel request.
+ /// TerminalManageBuilder
+ TerminalManageBuilder Reverse(decimal? amount = null);
+
+ #endregion
+
+ #region Pay@Table Feature
+
+ ///
+ /// Response to terminal after Pay@Table request has been made.
+ ///
+ ///
+ ///
+ TerminalAuthBuilder PayAtTableResponse();
+
+ #endregion
+
+ TerminalManageBuilder ReferralConfirmation();
}
}
diff --git a/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs b/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs
index 99058151..343b2eb8 100644
--- a/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs
+++ b/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs
@@ -2,6 +2,7 @@
using GlobalPayments.Api.Entities;
using GlobalPayments.Api.PaymentMethods;
using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Ingenico;
namespace GlobalPayments.Api.Terminals.Builders {
public class TerminalAuthBuilder : TerminalBuilder {
@@ -10,8 +11,9 @@ public class TerminalAuthBuilder : TerminalBuilder {
internal decimal? Amount { get; set; }
internal string AuthCode {
get {
- if (PaymentMethod is TransactionReference)
+ if (PaymentMethod is TransactionReference) {
return (PaymentMethod as TransactionReference).AuthCode;
+ }
return null;
}
}
@@ -30,11 +32,19 @@ internal string AuthCode {
internal string TaxExemptId { get; set; }
internal string TransactionId {
get {
- if (PaymentMethod is TransactionReference)
+ if (PaymentMethod is TransactionReference) {
return (PaymentMethod as TransactionReference).TransactionId;
+ }
return null;
}
}
+ internal string CurrencyCode { get; set; }
+ internal PaymentMode PaymentMode { get; set; }
+ internal string TableNumber { get; set; }
+ internal TaxFreeType? TaxFreeType { get; set; }
+ internal PATPaymentMode? AdditionalMessage { get; set; }
+ internal PATResponseType? PayAtTableResponse { get; private set; }
+ public string FilePath { get; private set; }
public TerminalAuthBuilder WithAddress(Address address) {
Address = address;
@@ -48,9 +58,16 @@ public TerminalAuthBuilder WithAmount(decimal? amount) {
Amount = amount;
return this;
}
+
+ ///
+ /// Sets the authorization code for the transaction.
+ ///
+ /// Authorization Code
+ ///
public TerminalAuthBuilder WithAuthCode(string value) {
- if (PaymentMethod == null || !(PaymentMethod is TransactionReference))
+ if (PaymentMethod == null || !(PaymentMethod is TransactionReference)) {
PaymentMethod = new TransactionReference();
+ }
(PaymentMethod as TransactionReference).AuthCode = value;
return this;
}
@@ -64,6 +81,12 @@ public TerminalAuthBuilder WithAutoSubstantiation(AutoSubstantiation value) {
AutoSubstantiation = value;
return this;
}
+
+ ///
+ /// Sets the cash back for the transaction.
+ ///
+ ///
+ ///
public TerminalAuthBuilder WithCashBack(decimal? amount) {
CashBackAmount = amount;
return this;
@@ -126,9 +149,80 @@ public TerminalAuthBuilder WithTransactionId(string value) {
return this;
}
- internal TerminalAuthBuilder(TransactionType type, PaymentMethodType paymentType) : base(type, paymentType) {
+ ///
+ /// Sets the currency code for the transaction.
+ ///
+ /// Currency Code
+ ///
+ public TerminalAuthBuilder WithCurrencyCode(string value) {
+ CurrencyCode = value;
+ return this;
+ }
+
+ ///
+ /// Sets the payment mode for the transaction.
+ ///
+ /// Payment Mode
+ ///
+ public TerminalAuthBuilder WithPaymentMode(PaymentMode value) {
+ PaymentMode = value;
+ return this;
+ }
+
+ ///
+ /// Sets the payment mode for the Pay@Table feature
+ ///
+ /// Pay@Table Payment Mode
+ ///
+ public TerminalAuthBuilder WithPaymentMode(PATPaymentMode additionalMessage) {
+ AdditionalMessage = additionalMessage;
+ return this;
+ }
+
+ ///
+ /// Sets the table number for the transaction.
+ ///
+ /// Table Number
+ ///
+ public TerminalAuthBuilder WithTableNumber(string value) {
+ TableNumber = value;
+ return this;
}
+ ///
+ /// Method used for requesting a Tax Free Refund Payment type transaction.
+ ///
+ ///
+ /// Payment Type of refund. Either Cash or Credit
+ ///
+ ///
+ public TerminalAuthBuilder WithTaxFree(TaxFreeType taxFreeType) {
+ TaxFreeType = taxFreeType;
+ return this;
+ }
+
+ public TerminalAuthBuilder WithPayAtTableResponseType(PATResponseType response) {
+ PayAtTableResponse = response;
+ return this;
+ }
+
+ ///
+ /// Sets the path of the XML Document.
+ ///
+ /// XML Document Path
+ ///
+ public TerminalAuthBuilder WithXMLPath(string filePath) {
+ FilePath = filePath;
+ return this;
+ }
+
+ internal TerminalAuthBuilder(TransactionType type, PaymentMethodType paymentType) : base(type, paymentType) { }
+
+ ///
+ /// Executes the transaction.
+ ///
+ ///
+ ///
public override ITerminalResponse Execute(string configName = "default") {
base.Execute(configName);
diff --git a/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs b/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs
index 8fd725c4..06e2ab68 100644
--- a/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs
+++ b/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs
@@ -1,6 +1,7 @@
using GlobalPayments.Api.Entities;
using GlobalPayments.Api.PaymentMethods;
using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Ingenico;
namespace GlobalPayments.Api.Terminals.Builders {
public class TerminalManageBuilder : TerminalBuilder {
@@ -10,12 +11,32 @@ public class TerminalManageBuilder : TerminalBuilder {
internal decimal? Gratuity { get; set; }
internal string TransactionId {
get {
- if (PaymentMethod is TransactionReference)
+ if (PaymentMethod is TransactionReference) {
return (PaymentMethod as TransactionReference).TransactionId;
+ }
+ return null;
+ }
+ }
+ internal string CurrencyCode { get; set; }
+ internal PaymentMode PaymentMode { get; set; }
+ internal string AuthCode {
+ get {
+ if (PaymentMethod is TransactionReference)
+ return (PaymentMethod as TransactionReference).AuthCode;
return null;
}
}
+ ///
+ /// Sets the currency code for the transaction.
+ ///
+ /// Currency Code
+ ///
+ public TerminalManageBuilder WithCurrencyCode(string value) {
+ CurrencyCode = value;
+ return this;
+ }
+
public TerminalManageBuilder WithAmount(decimal? amount) {
Amount = amount;
return this;
@@ -32,10 +53,25 @@ public TerminalManageBuilder WithGratuity(decimal? amount) {
Gratuity = amount;
return this;
}
+
+ ///
+ /// Sets the authorization code for the transaction.
+ ///
+ /// Authorization Code
+ ///
+ public TerminalManageBuilder WithAuthCode(string value) {
+ if (PaymentMethod == null || !(PaymentMethod is TransactionReference)) {
+ PaymentMethod = new TransactionReference();
+ }
+ (PaymentMethod as TransactionReference).AuthCode = value;
+ return this;
+ }
+
public TerminalManageBuilder WithTransactionId(string value) {
if (PaymentMethod == null || !(PaymentMethod is TransactionReference))
PaymentMethod = new TransactionReference();
(PaymentMethod as TransactionReference).TransactionId = value;
+
return this;
}
@@ -57,7 +93,7 @@ public override byte[] Serialize(string configName = "default") {
}
protected override void SetupValidations() {
- Validations.For(TransactionType.Capture).Check(() => TransactionId).IsNotNull();
+ Validations.For(TransactionType.Capture).When(() => AuthCode).IsNull().Check(() => TransactionId).IsNotNull();
Validations.For(TransactionType.Void).When(() => ClientTransactionId).IsNull().Check(() => TransactionId).IsNotNull();
Validations.For(PaymentMethodType.Gift).Check(() => Currency).IsNotNull();
}
diff --git a/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs b/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs
index 56156875..454f4979 100644
--- a/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs
+++ b/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs
@@ -1,4 +1,5 @@
using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Ingenico;
using GlobalPayments.Api.Terminals.PAX;
using System;
using System.Linq;
@@ -7,6 +8,8 @@
namespace GlobalPayments.Api.Terminals.Builders {
public class TerminalReportBuilder {
internal TerminalReportType ReportType { get; set; }
+ internal ReceiptType ReceiptType { get; set; }
+ internal ReportType? Type { get; set; }
private TerminalSearchBuilder _searchBuilder;
internal TerminalSearchBuilder SearchBuilder {
@@ -22,6 +25,14 @@ public TerminalReportBuilder(TerminalReportType reportType) {
ReportType = reportType;
}
+ public TerminalReportBuilder(ReceiptType receiptType) {
+ ReceiptType = receiptType;
+ }
+
+ public TerminalReportBuilder(ReportType reportType) {
+ Type = reportType;
+ }
+
public TerminalSearchBuilder Where(PaxSearchCriteria criteria, T value) {
return SearchBuilder.And(criteria, value);
}
diff --git a/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs b/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs
index f200899b..d9afb498 100644
--- a/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs
+++ b/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs
@@ -3,31 +3,27 @@
using GlobalPayments.Api.Terminals.HPA;
using GlobalPayments.Api.Terminals.Abstractions;
using GlobalPayments.Api.Terminals.Genius;
+using System.IO.Ports;
+using GlobalPayments.Api.Terminals.Ingenico;
namespace GlobalPayments.Api.Terminals {
public enum ConnectionModes {
SERIAL,
TCP_IP,
SSL_TCP,
- HTTP
+ HTTP,
+ TCP_IP_SERVER,
+ PAY_AT_TABLE
}
public enum BaudRate {
+ r9600 = 9600,
r38400 = 38400,
r57600 = 57600,
r19200 = 19200,
r115200 = 115200
}
- public enum Parity {
- None = 0,
- Odd,
- Even,
- }
- public enum StopBits {
- One = 1,
- Two
- }
public enum DataBits {
Seven = 7,
Eight = 8
@@ -47,9 +43,11 @@ public interface ITerminalConfiguration {
Parity Parity { get; set; }
StopBits StopBits { get; set; }
DataBits DataBits { get; set; }
+ Handshake Handshake { get; set; }
// Timeout
int Timeout { get; set; }
+ int TimeDelay { get; set; }
// Associated Gateway
GatewayConfig GatewayConfig { get; set; }
@@ -62,10 +60,12 @@ public class ConnectionConfig : Configuration, ITerminalConfiguration {
public Parity Parity { get; set; }
public StopBits StopBits { get; set; }
public DataBits DataBits { get; set; }
+ public Handshake Handshake { get; set; }
public string IpAddress { get; set; }
public string Port { get; set; }
public IRequestIdProvider RequestIdProvider { get; set; }
public GatewayConfig GatewayConfig { get; set; }
+ public int TimeDelay { get; set; }
public ConnectionConfig() {
Timeout = -1;
@@ -84,8 +84,14 @@ internal override void ConfigureContainer(ConfiguredServices services) {
services.DeviceController = new HpaController(this);
break;
//case DeviceType.GENIUS:
- //services.DeviceController = new GeniusController(this);
- //break;
+ //services.DeviceController = new GeniusController(this);
+ //break;
+ case DeviceType.Ingenico_EPOS_Desk5000:
+ case DeviceType.Ingenico_EPOS_Lane3000:
+ case DeviceType.Ingenico_EPOS_Move3500:
+ case DeviceType.Ingenico_EPOS_Move5000:
+ services.DeviceController = new IngenicoController(this);
+ break;
default:
break;
}
@@ -97,7 +103,7 @@ internal override void Validate() {
if (ConnectionMode == ConnectionModes.TCP_IP || ConnectionMode == ConnectionModes.HTTP) {
if (string.IsNullOrEmpty(IpAddress))
throw new ApiException("IpAddress is required for TCP or HTTP communication modes.");
- if(string.IsNullOrEmpty(Port))
+ if (string.IsNullOrEmpty(Port))
throw new ApiException("Port is required for TCP or HTTP communication modes.");
}
}
diff --git a/src/GlobalPayments.Api/Terminals/ControlCodes.cs b/src/GlobalPayments.Api/Terminals/ControlCodes.cs
index af2587a9..ac4fb88e 100644
--- a/src/GlobalPayments.Api/Terminals/ControlCodes.cs
+++ b/src/GlobalPayments.Api/Terminals/ControlCodes.cs
@@ -15,6 +15,11 @@ public enum ControlCodes : byte {
GS = 0x1D,
EOT = 0x04,
+ // Ingenico Currency Symbol
+ NUM = 0x23,
+ GBP = 0xA3,
+ SP = 0x20,
+
// PAX Specific ??
US = 0x1F,
RS = 0x1E,
diff --git a/src/GlobalPayments.Api/Terminals/DeviceController.cs b/src/GlobalPayments.Api/Terminals/DeviceController.cs
index c494ca55..8d6e6028 100644
--- a/src/GlobalPayments.Api/Terminals/DeviceController.cs
+++ b/src/GlobalPayments.Api/Terminals/DeviceController.cs
@@ -33,6 +33,8 @@ public IRequestIdProvider RequestIdProvider {
}
public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
internal DeviceController(ITerminalConfiguration settings) {
_settings = settings;
@@ -40,6 +42,14 @@ internal DeviceController(ITerminalConfiguration settings) {
_connector.OnMessageSent += (message) => {
OnMessageSent?.Invoke(message);
};
+
+ _connector.OnBroadcastMessage += (code, message) => {
+ OnBroadcastMessage?.Invoke(code, message);
+ };
+
+ _connector.OnPayAtTableRequest += (request) => {
+ OnPayAtTableRequest?.Invoke(request);
+ };
}
public byte[] Send(IDeviceMessage message) {
diff --git a/src/GlobalPayments.Api/Terminals/DeviceInterface.cs b/src/GlobalPayments.Api/Terminals/DeviceInterface.cs
index 3813a178..c1aa8c76 100644
--- a/src/GlobalPayments.Api/Terminals/DeviceInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/DeviceInterface.cs
@@ -1,6 +1,8 @@
-using GlobalPayments.Api.Entities;
+using System;
+using GlobalPayments.Api.Entities;
using GlobalPayments.Api.Terminals.Abstractions;
using GlobalPayments.Api.Terminals.Builders;
+using GlobalPayments.Api.Terminals.Ingenico;
using GlobalPayments.Api.Terminals.Messaging;
namespace GlobalPayments.Api.Terminals {
@@ -9,17 +11,29 @@ public abstract class DeviceInterface : IDeviceInterface where T : DeviceCont
protected IRequestIdProvider _requestIdProvider;
public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
internal DeviceInterface(T controller) {
_controller = controller;
_controller.OnMessageSent += (message) => {
OnMessageSent?.Invoke(message);
};
+
+ _controller.OnBroadcastMessage += (code, message) => {
+ OnBroadcastMessage?.Invoke(code, message);
+ };
+
+ _controller.OnPayAtTableRequest += (request) => {
+ OnPayAtTableRequest?.Invoke(request);
+ };
+
+
_requestIdProvider = _controller.RequestIdProvider;
}
#region Admin Methods
- public virtual void Cancel() {
+ public virtual IDeviceResponse Cancel() {
throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
}
@@ -78,6 +92,22 @@ public virtual IDeviceResponse SetStoreAndForwardMode(bool enabled) {
public virtual IDeviceResponse StartCard(PaymentMethodType paymentMethodType) {
throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
}
+
+ public virtual IDeviceResponse Duplicate() {
+ throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
+ }
+
+ public virtual IDeviceResponse GetTerminalStatus() {
+ throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
+ }
+
+ public virtual IDeviceResponse GetTerminalConfiguration() {
+ throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
+ }
+
+ public virtual IDeviceResponse TestConnection() {
+ throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
+ }
#endregion
#region Batching
@@ -94,6 +124,15 @@ public virtual IEODResponse EndOfDay() {
public virtual TerminalReportBuilder LocalDetailReport() {
throw new UnsupportedTransactionException("This function is not supported by the currently configured device.");
}
+ public virtual TerminalReportBuilder GetLastReceipt(ReceiptType type = ReceiptType.TICKET) {
+ return new TerminalReportBuilder(type);
+ }
+
+ public virtual TerminalReportBuilder GetReport(Ingenico.ReportType type) {
+ //return new TerminalReportBuilder(TerminalReportType.LocalDetailReport).WithReportType(type);
+ return new TerminalReportBuilder(type);
+ }
+
#endregion
#region Transactions
@@ -120,8 +159,10 @@ public virtual TerminalAuthBuilder Sale(decimal? amount = null) {
return new TerminalAuthBuilder(TransactionType.Sale, PaymentMethodType.Credit)
.WithAmount(amount);
}
+
public virtual TerminalAuthBuilder Verify() {
- return new TerminalAuthBuilder(TransactionType.Verify, PaymentMethodType.Credit);
+ return new TerminalAuthBuilder(TransactionType.Verify, PaymentMethodType.Credit)
+ .WithAmount(6.18m);
}
public virtual TerminalManageBuilder Void() {
return new TerminalManageBuilder(TransactionType.Void, PaymentMethodType.Credit);
@@ -137,5 +178,30 @@ public void Dispose() {
_controller.Dispose();
}
#endregion
+
+ #region For clarification
+
+ #region Transaction Management
+ public virtual TerminalManageBuilder Reverse(decimal? amount = null) {
+ return new TerminalManageBuilder(TransactionType.Reversal, PaymentMethodType.Credit)
+ .WithAmount(amount);
+ }
+
+ #endregion
+
+ #region Pay@Table Methods
+
+ public virtual TerminalAuthBuilder PayAtTableResponse() {
+ return new TerminalAuthBuilder(TransactionType.PayAtTable, PaymentMethodType.Other);
+ }
+
+ #endregion
+
+ public virtual TerminalManageBuilder ReferralConfirmation() {
+ return new TerminalManageBuilder(TransactionType.Referral, PaymentMethodType.Credit)
+ .WithAmount(6.18m);
+ }
+
+ #endregion
}
}
diff --git a/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs b/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs
index 55eaea1c..eaa44b98 100644
--- a/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs
@@ -17,6 +17,8 @@ internal class GeniusHttpInterface : IDeviceCommInterface {
private GeniusConfig _gatewayConfig;
public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
public GeniusHttpInterface(ITerminalConfiguration settings) {
_settings = settings;
@@ -66,9 +68,9 @@ private async Task StageTransactionAsync(IDeviceMessage message
try {
string payload = Encoding.UTF8.GetString(message.GetSendBuffer());
- string url = ServiceEndpoints.GENIUS_TERMINAL_TEST;
+ string url = ServiceEndpoints.GENIUS_TERMIAL_TEST;
if (_gatewayConfig.Environment.Equals(Entities.Environment.PRODUCTION)) {
- url = ServiceEndpoints.GENIUS_TERMINAL_PRODUCTION;
+ url = ServiceEndpoints.GENIUS_TERMIAL_PRODUCTION;
}
HttpClient httpClient = new HttpClient {
diff --git a/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs b/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs
index 71be05bd..9f4c4226 100644
--- a/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs
@@ -14,9 +14,10 @@ internal HpaInterface(HpaController controller) : base(controller) {
}
#region Admin Messages
- public override void Cancel() {
+ public override IDeviceResponse Cancel() {
// TODO: Cancel for HPA?
Reset();
+ return null;
}
public override IDeviceResponse CloseLane() {
diff --git a/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs b/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs
index 8ebdb03b..af4bae6a 100644
--- a/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs
@@ -16,6 +16,8 @@ internal class HpaTcpInterface : IDeviceCommInterface {
List message_queue;
public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
public HpaTcpInterface(ITerminalConfiguration settings) {
this._settings = settings;
diff --git a/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs b/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs
index a33768a3..0a7ec44b 100644
--- a/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs
+++ b/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs
@@ -41,7 +41,7 @@ public SipBaseResponse(byte[] buffer, params string[] messageIds) {
RequestId = root.GetValue("RequestId");
ResponseId = root.GetValue("ResponseId");
Status = root.GetValue("MultipleMessage");
- DeviceResponseCode = NormalizeResponse(root.GetValue("Result"));
+ DeviceResponseCode = NormalizeResponse(root.GetValue("Result"));
DeviceResponseText = root.GetValue("ResultText");
if ((DeviceResponseCode.Equals("00", StringComparison.OrdinalIgnoreCase)) || (DeviceResponseCode.Equals("2501", StringComparison.OrdinalIgnoreCase))){
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs
new file mode 100644
index 00000000..7d07bc0b
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs
@@ -0,0 +1,309 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Builders;
+using GlobalPayments.Api.Terminals.Ingenico.Responses;
+using GlobalPayments.Api.Utils;
+using System;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class IngenicoController : DeviceController {
+ public IngenicoController(ITerminalConfiguration settings) : base(settings) { }
+
+ internal override IDeviceInterface ConfigureInterface() {
+ if (_interface == null) {
+ _interface = new IngenicoInterface(this);
+ }
+ return _interface;
+ }
+
+ internal override IDeviceCommInterface ConfigureConnector() {
+ switch (_settings.ConnectionMode) {
+ case ConnectionModes.SERIAL:
+ return new IngenicoSerialInterface(_settings);
+ case ConnectionModes.TCP_IP_SERVER:
+ case ConnectionModes.PAY_AT_TABLE:
+ return new IngenicoTcpInterface(_settings);
+ default:
+ throw new NotImplementedException();
+ }
+ }
+
+ #region overrides
+ internal override ITerminalResponse ManageTransaction(TerminalManageBuilder builder) {
+ IDeviceMessage request = BuildManageTransaction(builder);
+
+ if (builder.TransactionType == TransactionType.Reversal) {
+ return DoReverseRequest(request);
+ } else {
+ return DoRequest(request);
+ }
+ }
+
+ internal override ITerminalReport ProcessReport(TerminalReportBuilder builder) {
+ IDeviceMessage request;
+ if (builder.Type != null) {
+ request = BuildReportTransaction(builder);
+ return ReportRequest(request);
+ } else {
+ request = TerminalUtilities.BuildRequest(INGENICO_REQ_CMD.RECEIPT.FormatWith(builder.ReceiptType), settings: _settings.ConnectionMode);
+ return XmlRequest(request);
+ }
+ }
+
+ internal override ITerminalResponse ProcessTransaction(TerminalAuthBuilder builder) {
+ IDeviceMessage request = BuildProcessTransaction(builder);
+ return DoRequest(request);
+ }
+
+ internal override byte[] SerializeRequest(TerminalAuthBuilder builder) {
+ return BuildProcessTransaction(builder).GetSendBuffer();
+ }
+
+ internal override byte[] SerializeRequest(TerminalManageBuilder builder) {
+ return BuildManageTransaction(builder).GetSendBuffer();
+ }
+
+ internal override byte[] SerializeRequest(TerminalReportBuilder builder) {
+ throw new NotImplementedException();
+ }
+ #endregion
+
+ #region Methods
+ internal IDeviceMessage BuildManageTransaction(TerminalManageBuilder builder) {
+ int refNumber = builder.ReferenceNumber;
+ decimal? amount = ValidateAmount(builder.Amount);
+ int returnRep = 1;
+ int paymentMode = ValidatePaymentMode(builder.PaymentMode);
+ int? paymentType = (int?)((IngenicoInterface)_interface).paymentMethod ?? 0;
+ string currencyCode = (string.IsNullOrEmpty(builder.CurrencyCode) ? "826" : builder.CurrencyCode);
+ string privData = "EXT0100000";
+ int immediateAns = 0;
+ int forceOnline = 0;
+ string extendedData = "0000000000";
+
+ // Validation for Authcode
+ if (!string.IsNullOrEmpty(builder.AuthCode)) {
+ extendedData = INGENICO_REQ_CMD.AUTHCODE.FormatWith(builder.AuthCode);
+ }
+ // Validation for Reversal with Transaction Id value in Extended data
+ else if (builder.TransactionId != null && builder.TransactionType == TransactionType.Reversal) {
+ extendedData = INGENICO_REQ_CMD.REVERSE_WITH_ID.FormatWith(builder.TransactionId);
+ } else if (builder.TransactionType == TransactionType.Reversal) {
+ extendedData = INGENICO_REQ_CMD.REVERSE;
+ }
+
+ // Concat all data to create a request string.
+ var sb = new StringBuilder();
+
+ sb.Append(builder.ReferenceNumber.ToString("00"));
+ sb.Append(amount?.ToString("00000000"));
+ sb.Append(returnRep);
+ sb.Append(paymentMode);
+ sb.Append(paymentType);
+ sb.Append(currencyCode);
+ sb.Append(privData);
+ sb.Append("A01" + immediateAns);
+ sb.Append("B01" + forceOnline);
+ sb.Append(extendedData);
+
+ return TerminalUtilities.BuildRequest(sb.ToString(), _settings.ConnectionMode);
+ }
+
+ internal IDeviceMessage BuildProcessTransaction(TerminalAuthBuilder builder) {
+ string message = string.Empty;
+
+ // Pay@Table functionalities
+ if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) {
+ if (builder.PayAtTableResponse != null && builder.AdditionalMessage != null) {
+ StringBuilder payAtTableResp = new StringBuilder();
+ string privData = builder.PayAtTableResponse.ToString();
+
+ if (privData.Length < 10) {
+ for (int i = privData.Length; i < 10; i++) {
+ privData += (char)ControlCodes.SP;
+ }
+ }
+
+ decimal? patAmount = ValidateAmount(builder.Amount);
+ string patCurrency = ValidateCurrency(builder.CurrencyCode);
+ int additionalMsg = (int?)builder.AdditionalMessage ?? 0;
+
+ payAtTableResp.Append(PAYATTABLE_RESP.PAT_EPOS_NUMBER);
+ payAtTableResp.Append(PAYATTABLE_RESP.PAT_STATUS);
+ payAtTableResp.Append(patAmount?.ToString("00000000"));
+ payAtTableResp.Append(additionalMsg);
+ payAtTableResp.Append(patCurrency);
+ payAtTableResp.Append(privData);
+
+ message = payAtTableResp.ToString();
+ } else if (!string.IsNullOrEmpty(builder.FilePath)) {
+ message = TerminalUtilities.GetTextContent(builder.FilePath);
+ } else {
+ throw new BuilderException("PayAtTable Response type and Additional message cannot be null.");
+ }
+ } else {
+ // Standard functionalities
+ int referenceNumber = builder.ReferenceNumber;
+ decimal? amount = builder.Amount;
+ int returnRep = 1;
+ int paymentMode = 0;
+ int paymentType = (int)((IngenicoInterface)_interface).paymentMethod;
+ string currencyCode = "826";
+ string privateData = "EXT0100000";
+ int immediateAnswer = 0;
+ int forceOnline = 0;
+ string extendedData = "0000000000";
+
+ decimal? cashbackAmount = builder.CashBackAmount;
+ string authCode = builder.AuthCode;
+ string tableId = builder.TableNumber;
+
+ // Validations
+ if (referenceNumber == default(int) && RequestIdProvider != null) {
+ referenceNumber = RequestIdProvider.GetRequestId();
+ }
+ amount = ValidateAmount(amount);
+
+ // Tax free Refund handling
+ if (paymentType == (int)PaymentType.Refund && builder.TaxFreeType == TaxFreeType.CASH) {
+ paymentType = (int)PaymentType.TaxFreeCashRefund;
+ } else if (paymentType == (int)PaymentType.Refund && builder.TaxFreeType == TaxFreeType.CREDIT) {
+ paymentType = (int)PaymentType.TaxFreeCreditRefund;
+
+ }
+
+ paymentMode = ValidatePaymentMode(builder.PaymentMode);
+ currencyCode = ValidateCurrency((string.IsNullOrEmpty(builder.CurrencyCode) ? currencyCode : builder.CurrencyCode));
+
+ if (!string.IsNullOrEmpty(tableId)) {
+ ValidateTableId(tableId);
+ extendedData = INGENICO_REQ_CMD.TABLE_WITH_ID.FormatWith(tableId);
+ } else if (!string.IsNullOrEmpty(authCode)) {
+ extendedData = INGENICO_REQ_CMD.AUTHCODE.FormatWith(authCode);
+ } else if (cashbackAmount != null) {
+ ValidateCashbackAmount(cashbackAmount);
+ cashbackAmount *= 100;
+ extendedData = INGENICO_REQ_CMD.CASHBACK.FormatWith(Convert.ToInt64(Math.Round(cashbackAmount.Value, MidpointRounding.AwayFromZero)));
+ }
+
+ // Concat all data to create a request string.
+ var sb = new StringBuilder();
+
+ sb.Append(referenceNumber.ToString("00").Substring(0, 2));
+ sb.Append(amount?.ToString("00000000"));
+ sb.Append(returnRep);
+ sb.Append(paymentMode);
+ sb.Append(paymentType);
+ sb.Append(currencyCode);
+ sb.Append(privateData);
+ sb.Append("A01" + immediateAnswer);
+ sb.Append("B01" + forceOnline);
+ sb.Append(extendedData);
+
+ message = sb.ToString();
+ }
+
+ return TerminalUtilities.BuildRequest(message, _settings.ConnectionMode);
+ }
+
+ internal IDeviceMessage BuildReportTransaction(TerminalReportBuilder builder) {
+ if (!IsObjectNullOrEmpty(builder.Type)) {
+ string message = INGENICO_REQ_CMD.REPORT.FormatWith(builder.Type);
+ return TerminalUtilities.BuildRequest(message, settings: _settings.ConnectionMode);
+ } else {
+ throw new BuilderException("Type of report is missing in request.");
+ }
+ }
+
+ internal IngenicoTerminalReportResponse XmlRequest(IDeviceMessage request) {
+ byte[] send = Send(request);
+ return new IngenicoTerminalReportResponse(send);
+ }
+
+ internal ReportResponse ReportRequest(IDeviceMessage request) {
+ byte[] send = Send(request);
+ return new ReportResponse(send);
+ }
+
+ #region Validations
+ private bool IsObjectNullOrEmpty(object value) {
+ bool response = false;
+ if (value == null || string.IsNullOrWhiteSpace(value.ToString())) {
+ response = true;
+ } else {
+ response = false;
+ }
+
+ return response;
+ }
+
+ private void ValidateTableId(string value) {
+ if (value.Length > 8) {
+ throw new BuilderException("The maximum length for table number is 8.");
+ }
+ }
+
+ private void ValidateCashbackAmount(decimal? value) {
+ if (value >= 1000000m) {
+ throw new BuilderException("Cashback Amount exceed.");
+ }
+ if (value < 0m) {
+ throw new BuilderException("Cashback Amount must not be in less than zero.");
+ }
+ }
+
+ private int ValidatePaymentMode(PaymentMode? paymentMode) {
+ if (IsObjectNullOrEmpty(paymentMode)) {
+ paymentMode = PaymentMode.APPLICATION;
+ }
+
+ return (int)paymentMode;
+ }
+
+ private string ValidateCurrency(string currencyCode) {
+ if (!string.IsNullOrWhiteSpace(currencyCode)) {
+ currencyCode = currencyCode.PadLeft(3, '0');
+ } else {
+ currencyCode = "826";
+ }
+
+ return currencyCode.Substring(0, 3);
+ }
+
+ private decimal? ValidateAmount(decimal? amount) {
+ if (amount != null && amount > 0 && amount < 1000000m) {
+ amount *= 100;
+ } else if (amount == null) {
+ throw new BuilderException("Amount can not be null.");
+ } else if (amount >= 1000000m) {
+ throw new BuilderException("Amount exceed.");
+ } else {
+ throw new BuilderException("Invalid input amount.");
+ }
+
+ return amount;
+ }
+
+ #endregion
+
+ #endregion
+
+ #region Request
+ internal IngenicoTerminalResponse DoRequest(IDeviceMessage request) {
+ byte[] response = Send(request);
+ return new IngenicoTerminalResponse(response);
+ }
+
+ private CancelResponse DoCancelRequest(IDeviceMessage request) {
+ byte[] response = Send(request);
+ return new CancelResponse(response);
+ }
+
+ private IngenicoTerminalResponse DoReverseRequest(IDeviceMessage request) {
+ byte[] response = Send(request);
+ return new IngenicoTerminalResponse(response);
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs
new file mode 100644
index 00000000..04db6b97
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs
@@ -0,0 +1,306 @@
+
+using GlobalPayments.Api.Utils;
+using System;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ internal class INGENICO_REQ_CMD {
+ // Request Transactions
+ public const string AUTHCODE = "AUTHCODE={0}";
+ public const string CASHBACK = "CASHB={0};";
+
+ // Request Commands
+ /**
+ * REQUEST_MESSAGE is hard-coded in order to fulfill the request message frame 3
+ * and values in here are ignored in the terminal.
+ */
+ public const string REQUEST_MESSAGE = "0100000001100826EXT0100000A010B010";
+ public const string CANCEL = "CMD=CANCEL";
+ public const string DUPLICATE = "CMD=DUPLIC";
+ public const string REVERSE = "CMD=REVERSE";
+ public const string REVERSE_WITH_ID = "CMD=REV{0}";
+ public const string TABLE_WITH_ID = "CMD=ID{0}";
+
+ // Terminal Management Commands
+ public const string STATE = "CMD=STATE";
+ public const string PID = "CMD=PID";
+ public const string LOGON = "CMD=LOGON";
+ public const string RESET = "CMD=RESET";
+ public const string CALLTMS = "CMD=CALLTMS";
+
+ // Request Report
+ public const string REPORT = "0100000001100826EXT0100000A010B010CMD={0}";
+ public const string RECEIPT = "0100000001100826EXT0100000A010B010CMD={0}";
+ }
+
+ internal class INGENICO_GLOBALS {
+ public const string BROADCAST = "BROADCAST CODE";
+ public const string CANCEL = "CMD=CANCEL";
+ public const string TID_CODE = "TID CODE";
+ public const string KEEP_ALIVE_RESPONSE = " OK";
+ public static bool KeepAlive = true;
+ public const int IP_PORT = 18101;
+ public const int RAW_RESPONSE_LENGTH = 80;
+ public const string MGMT_SCOPE = "root\\CIMV2";
+ public const string MGMT_QUERY = "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"";
+ public const int MSG_FRAME_TWO_LEN = 80;
+ public const string XML_TAG = "", "LF" };
+ public readonly static string INVALID = "\u0005\u0004";
+ public readonly static string ENDXML = "";
+ }
+
+ internal static class PAYATTABLE_RESP {
+ public readonly static string PAT_EPOS_NUMBER = "00";
+ public readonly static string PAT_STATUS = "0";
+ }
+
+ public enum ReceiptType {
+ TICKET,
+ SPLITR,
+ TAXFREE,
+ REPORT
+ }
+
+ public enum ReportType {
+ EOD,
+ BANKING,
+ XBAL,
+ ZBAL
+ }
+
+ public enum TransactionStatus {
+ SUCCESS = 0,
+ REFERRAL = 2,
+ CANCELLED_BY_USER = 6,
+ FAILED = 7,
+ RECEIVED = 9
+ }
+
+ public enum ReverseStatus {
+ REVERSAL_SUCCESS = 0,
+ REVERSAL_FAILED = 7,
+ NOTHING_TO_REVERSE = 9
+ }
+
+ public enum CancelStatus {
+ CANCEL_DONE = 9,
+ CANCEL_FAILED = 7
+ }
+
+ public enum DynamicCurrencyStatus {
+ CONVERSION_APPLIED = 1,
+ REJECTED = 0
+ }
+
+ public enum TransactionSubTypes {
+ [Description("S")]
+ SPLIT_SALE_TXN,
+
+ [Description("D")]
+ DCC_TXN,
+
+ [Description("R")]
+ REFERRAL_RESULT
+ }
+
+ public enum TerminalStatus {
+ NOT_READY = 0,
+ READY = 1
+ }
+
+ public enum SalesMode {
+ STANDARD_SALE_MODE = 0,
+ VENDING_MODE = 1
+ }
+
+ public enum PaymentMethod {
+ Keyed = 1,
+ Swiped = 2,
+ Chip = 3,
+ Conctactless = 4
+ }
+
+ public enum PaymentType {
+ Sale = 0,
+ Refund = 1,
+ CompletionMode = 2,
+ PreAuthMode = 3,
+ TaxFreeCreditRefund = 4,
+ TaxFreeCashRefund = 5,
+ AccountVerification = 6,
+ ReferralConfirmation = 9
+ }
+
+ public enum PaymentMode {
+ APPLICATION = 0,
+ MAILORDER = 1
+ }
+
+ public enum TaxFreeType {
+ CREDIT = 0,
+ CASH = 1
+ }
+
+ // Codes in Response field for TLV format
+ public enum RepFieldCode {
+ AuthCode = 67, // C
+ CashbackAmount = 90, // Z
+ GratuityAmount = 89, // Y
+ FinalTransactionAmount = 77, // M
+ AvailableAmount = 65, // A
+ DccCurrency = 85, // U
+ DccConvertedAmount = 79, // O
+ PaymentMethod = 80, // P
+ TransactionSubType = 84, // T
+ SplitSalePaidAmount = 83, // S
+ DccOperationStatus = 68, // D
+ }
+
+ public enum StateResponseCode {
+ Status = 83, // S
+ AppVersionNumber = 86, // V
+ HandsetNumber = 72, // H
+ TerminalId = 84, // T
+ }
+
+ public enum TLVFormat {
+ ///
+ /// Format for transaction request.
+ ///
+ Standard,
+
+ ///
+ /// Format for State command request.
+ ///
+ State,
+
+ ///
+ /// Format ffor PayAtTable parsing
+ ///
+ PayAtTable
+ }
+
+ public enum ParseFormat {
+ ///
+ /// For Transaction response parsing format
+ ///
+ Transaction = 0,
+
+ ///
+ /// For State Command response parsing format
+ ///
+ State = 1,
+
+ ///
+ /// For PID Command response parsing format
+ ///
+ PID = 2,
+
+ ///
+ /// For Pay@Table functionalities in terminal
+ ///
+ PayAtTableRequest,
+
+ ///
+ /// For XML commands response format
+ ///
+ XML
+ }
+
+ ///
+ /// Type of request message from terminal during Pay@Table mode.
+ ///
+ public enum PATRequestType {
+ ///
+ /// Indicates a Table Lock
+ ///
+ TableLock = 1,
+
+ ///
+ /// Indicates a Table Unlock
+ ///
+ TableUnlock = 2,
+
+ ///
+ /// Indicates a Receipt for table
+ ///
+ TableReceipt = 3,
+
+ ///
+ /// Indicates a List of Table.
+ ///
+ TableList = 4,
+
+ ///
+ /// Indicates a Transaction Outcome request
+ ///
+ TransactionOutcome,
+
+ ///
+ /// Indicates a Additional Message XML request
+ ///
+ AdditionalMessage,
+
+ ///
+ /// Indicates a Transfer of Data request
+ ///
+ TransferData,
+
+ ///
+ /// Indicates a Split Sale Report XML request
+ ///
+ SplitSaleReport,
+
+ ///
+ /// Indicates a Ticket XML request
+ ///
+ Ticket,
+
+ ///
+ /// Indicates a End of Day Report XML request
+ ///
+ EndOfDayReport
+ }
+
+ ///
+ /// Confirmation options
+ ///
+ public enum PATResponseType {
+ ///
+ /// Positive confirmation
+ ///
+ CONF_OK,
+
+ ///
+ /// Negative confirmation
+ ///
+ CONF_NOK
+ }
+
+ ///
+ /// Indicates if the EPOS want to uses the additional Message
+ ///
+ public enum PATPaymentMode {
+ NO_ADDITIONAL = 0,
+
+ USE_ADDITIONAL = 1
+ }
+
+ public enum PATPrivateDataCode {
+ WaiterId = 79,
+ TableId = 76,
+ TerminalId = 84,
+ TerminalCurrency = 67
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs
new file mode 100644
index 00000000..97769740
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs
@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using GlobalPayments.Api.Builders;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Builders;
+using GlobalPayments.Api.Utils;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class IngenicoInterface : DeviceInterface, IDeviceInterface {
+ internal PaymentType? paymentMethod = null;
+ internal IngenicoInterface(IngenicoController controller) : base(controller) {
+ }
+
+ #region Terminal Management/Admin Methods
+ public override IDeviceResponse GetTerminalStatus() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.STATE);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new StateResponse(response);
+ }
+
+ public override IInitializeResponse Initialize() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.PID);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new POSIdentifierResponse(response);
+ }
+
+ public override IDeviceResponse GetTerminalConfiguration() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.CALLTMS);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new IngenicoTerminalResponse(response);
+ }
+
+ public override IDeviceResponse TestConnection() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.LOGON);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new IngenicoTerminalResponse(response);
+ }
+
+ public override IDeviceResponse Reboot() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.RESET);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new IngenicoTerminalResponse(response);
+ }
+
+ #endregion
+
+ #region Payment Transaction Management
+
+ public override TerminalAuthBuilder Sale(decimal? amount = null) {
+ paymentMethod = PaymentType.Sale;
+ return base.Sale(amount);
+ }
+
+ public override TerminalAuthBuilder Refund(decimal? amount = null) {
+ paymentMethod = PaymentType.Refund;
+ return base.Refund(amount);
+ }
+
+ public override TerminalManageBuilder Capture(decimal? amount = null) {
+ paymentMethod = PaymentType.CompletionMode;
+ return base.Capture(amount);
+ }
+
+ ///
+ /// Authorize method is Equivalent of Pre-Authorisation from Ingenico
+ ///
+ ///
+ ///
+ public override TerminalAuthBuilder Authorize(decimal? amount = null) {
+ paymentMethod = PaymentType.PreAuthMode;
+ return base.Authorize(amount);
+ }
+
+ public override TerminalAuthBuilder Verify() {
+ paymentMethod = PaymentType.AccountVerification;
+ return base.Verify();
+ }
+ #endregion
+
+ #region XML & Report Management
+ public override TerminalReportBuilder GetReport(ReportType type) {
+ return base.GetReport(type);
+ }
+
+ public override TerminalReportBuilder GetLastReceipt(ReceiptType type = ReceiptType.TICKET) {
+ return base.GetLastReceipt(type);
+ }
+ #endregion
+
+ #region Transaction Management
+
+ public override IDeviceResponse Cancel() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.CANCEL);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new IngenicoTerminalResponse(response);
+ }
+
+ public override TerminalManageBuilder Reverse(decimal? amount = null) {
+ if (amount != null) {
+ return base.Reverse(amount);
+ }
+ else throw new BuilderException("Amount can't be null.");
+ }
+
+ /////
+ ///// Duplicate falls under lost transaction recovery and we have mechanisms for this which we'll need to look into further
+ /////
+ public override IDeviceResponse Duplicate() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE);
+ sb.Append(INGENICO_REQ_CMD.DUPLICATE);
+
+ byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value));
+
+ return new IngenicoTerminalResponse(response);
+ }
+
+ #endregion
+
+ public override TerminalAuthBuilder PayAtTableResponse() {
+ return base.PayAtTableResponse();
+ }
+
+ public override TerminalManageBuilder ReferralConfirmation() {
+ paymentMethod = PaymentType.ReferralConfirmation;
+ return base.ReferralConfirmation();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs
new file mode 100644
index 00000000..157b1c8e
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs
@@ -0,0 +1,346 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.INGENICO.Interfaces;
+using GlobalPayments.Api.Terminals.Messaging;
+using GlobalPayments.Api.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ internal class IngenicoSerialInterface : IDeviceCommInterface {
+ private ITerminalConfiguration _settings;
+
+ private object _lock;
+ private bool _isTransComplete;
+
+ private string _buffer;
+ private List _messageResponse;
+
+ public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest; // not required for this connection mode
+
+ public IngenicoSerialInterface(ITerminalConfiguration settings) {
+ _settings = settings;
+ Connect();
+ }
+
+ public void Connect() {
+ if (_settings == null) {
+ throw new ConfigurationException("Please create connection between device and serial port.");
+ }
+
+ if (_settings.Timeout <= 0) {
+ _settings.Timeout = Timeout.Infinite;
+ }
+
+ try {
+ var param = new SerialPort.SerialParameters() {
+ portName = "COM{0}".FormatWith(_settings.Port),
+ baudrate = (int)_settings.BaudRate,
+ byteSize = 8,
+ parityBit = (int)_settings.Parity,
+ stopBit = 0,
+ timeout = new SerialPort.Timeout() {
+ readIntervalTimeout = 0,
+ readTotalTimeoutConstant = 0,
+ writeTotalTimeoutConstant = 0
+ },
+ flowControl = 0
+ };
+
+ SerialPort.setSerialParameters(param);
+ var param2 = SerialPort.getSerialParameters();
+
+ if (!SerialPort.isOpen()) {
+ SerialPort.initialize();
+ int code = SerialPort.open();
+
+ if (code != 0) {
+ throw new ConfigurationException(GetWinErrMsg(code));
+ }
+
+ _lock = new object();
+ }
+ } catch (Exception e) {
+ throw new ConfigurationException(e.Message);
+ }
+ }
+
+ public void Disconnect() {
+ SerialPort.close();
+ }
+
+ public byte[] Send(IDeviceMessage message) {
+ try {
+ _messageResponse = new List();
+
+ OnMessageSent?.Invoke(RemoveControlCodes(message.GetSendBuffer()));
+ Thread.Sleep(250);
+
+ var writeMessage = WriteMessage(message);
+
+ lock (_lock) {
+ while (!_isTransComplete) {
+ if (!Monitor.Wait(_lock, _settings.Timeout)) {
+ throw new ApiException("Terminal did not respond within timeout.");
+ }
+ }
+ }
+
+ return _messageResponse.ToArray();
+ } catch (Exception e) {
+ throw new ApiException(e.Message);
+ }
+ }
+
+ #region Internal Methods
+ private void SendRequest(IDeviceMessage message) {
+ do {
+ SerialPort.write(Encoding.ASCII.GetString(new byte[] { 0x05 }), 1);
+ SerialPort.read(ref _buffer, 1);
+
+ if (_buffer.Contains((char)0x06)) {
+ _buffer = string.Empty;
+
+ lock (_lock) {
+ Monitor.Pulse(_lock);
+ }
+
+ Thread.Sleep(_settings.TimeDelay);
+ SerialPort.write(Encoding.ASCII.GetString(message.GetSendBuffer()),
+ message.GetSendBuffer().Length);
+ SerialPort.read(ref _buffer, 1);
+
+ if (_buffer.Contains((char)0x06)) {
+ _buffer = string.Empty;
+
+ lock (_lock) {
+ Monitor.Pulse(_lock);
+ }
+
+ Thread.Sleep(_settings.TimeDelay);
+ SerialPort.write(Encoding.ASCII.GetString(new byte[] { 0x04 }), 1);
+ break;
+ }
+ }
+
+ } while (true);
+ }
+
+ private void ReceivedMessage() {
+ try {
+ do {
+ SerialPort.read(ref _buffer, 1);
+
+ if (_buffer.Contains((char)0x05)) {
+ _buffer = string.Empty;
+
+ lock (_lock) {
+ Monitor.Pulse(_lock);
+ }
+
+ Thread.Sleep(_settings.TimeDelay);
+ SerialPort.write(Encoding.ASCII.GetString(new byte[] { 0x06 }), 1);
+ string response = string.Empty;
+
+ do {
+ SerialPort.read(ref _buffer, 1);
+ response += _buffer;
+ _buffer = string.Empty;
+
+ lock (_lock) {
+ Monitor.Pulse(_lock);
+ }
+
+ if (response.Contains((char)0x03)) {
+ byte lrc = TerminalUtilities.CalculateLRC(
+ Encoding.ASCII.GetBytes(response));
+
+ SerialPort.read(ref _buffer, 1);
+
+ string receivedLRC = _buffer.ToHexString();
+ string sLRC = lrc.ToString("X2");
+
+ lock (_lock) {
+ Monitor.Pulse(_lock);
+ }
+
+ Thread.Sleep(_settings.TimeDelay);
+
+ if (receivedLRC.Equals(sLRC)) {
+ SerialPort.write(Encoding.ASCII.GetString(new byte[] { 0x06 }), 1);
+ break;
+ } else {
+ SerialPort.write(Encoding.ASCII.GetString(new byte[] { 0x15 }), 1);
+ }
+
+ _buffer = string.Empty;
+ }
+ } while (true);
+
+ if (response.Contains(INGENICO_GLOBALS.BROADCAST)) {
+ byte[] bMsg = Encoding.GetEncoding(28591).GetBytes(response);
+ BroadcastMessage broadcastMsg = new BroadcastMessage(bMsg);
+ OnBroadcastMessage?.Invoke(broadcastMsg.Code, broadcastMsg.Message);
+ } else {
+ byte[] byteArr = Encoding.ASCII.GetBytes(response);
+ MessageReceived(RemoveControlCodes(byteArr));
+ _isTransComplete = true;
+
+ lock (_lock) {
+ Monitor.Pulse(_lock);
+ }
+ }
+
+ SerialPort.read(ref _buffer, 1);
+
+ if (!_buffer.Contains((char)0x04)) {
+ Thread.Sleep(_settings.TimeDelay);
+
+ SerialPort.write(Encoding.ASCII.GetString(new byte[] { 0x15 }), 1);
+ }
+ }
+ } while (!_isTransComplete);
+
+ _isTransComplete = false;
+ } catch (Exception e) {
+ throw new ApiException(e.Message);
+ }
+ }
+
+ private async Task WriteMessage(IDeviceMessage message) {
+ await Task.Run(() => {
+ try {
+ SendRequest(message);
+ ReceivedMessage();
+ } catch (Exception e) {
+ throw new ApiException(e.Message);
+ }
+ });
+ }
+
+ private string RemoveControlCodes(byte[] data) {
+ string response = string.Empty;
+
+ byte stx = (byte)ControlCodes.STX;
+ byte etx = (byte)ControlCodes.ETX;
+ byte ack = (byte)ControlCodes.ACK;
+ byte nak = (byte)ControlCodes.NAK;
+ byte eot = (byte)ControlCodes.EOT;
+
+ var length = data.Length;
+ if (data[data.Length - 1] != etx) {
+ length--;
+ }
+
+ for (int i = 0; i < length; i++) {
+ if (data[i] == stx ||
+ data[i] == etx ||
+ data[i] == ack ||
+ data[i] == nak ||
+ data[i] == eot) {
+ continue;
+ }
+
+ response += (char)data[i];
+ }
+
+ return response;
+ }
+
+ private void MessageReceived(string messageData) {
+ foreach (char b in messageData) {
+ _messageResponse.Add((byte)b);
+ }
+ }
+
+ public static string GetWinErrMsg(int errorCode) {
+ if (errorCode <= 499) {
+ switch (errorCode) {
+ case 1: return "[" + errorCode.ToString() + "] Incorrect function.";
+ case 2: return "[" + errorCode.ToString() + "] The system cannot find the file specified.";
+ case 3: return "[" + errorCode.ToString() + "] The system cannot find the path specified.";
+ case 4: return "[" + errorCode.ToString() + "] The system cannot open the file.";
+ case 5: return "[" + errorCode.ToString() + "] Access is denied.";
+ case 6: return "[" + errorCode.ToString() + "] The handle is invalid.";
+ case 87: return "[" + errorCode.ToString() + "] The parameter is incorrect.";
+ case 170: return "[" + errorCode.ToString() + "] The requested resource is in use.";
+
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-";
+ }
+ }
+
+ if (errorCode >= 500 && errorCode <= 999) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--500-999-";
+ }
+ }
+
+ if (errorCode >= 1000 && errorCode <= 1299) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1000-1299-";
+ }
+ }
+
+ if (errorCode >= 1300 && errorCode <= 1699) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1300-1699-";
+ }
+ }
+
+ if (errorCode >= 1700 && errorCode <= 3999) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1700-3999-";
+ }
+ }
+
+ if (errorCode >= 4000 && errorCode <= 5999) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--4000-5999-";
+ }
+ }
+
+ if (errorCode >= 6000 && errorCode <= 8199) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--6000-8199-";
+ }
+ }
+
+ if (errorCode >= 8200 && errorCode <= 8999) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--8200-8999-";
+ }
+ }
+
+ if (errorCode >= 9000 && errorCode <= 11999) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--9000-11999-";
+ }
+ }
+
+ if (errorCode >= 12000 && errorCode <= 15999) {
+ switch (errorCode) {
+ default:
+ return "[" + errorCode.ToString() + "] Unhandled Error Code. See https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--12000-15999-";
+ }
+ }
+
+ return "[" + errorCode.ToString() + "] Unhandled Error Code.";
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs
new file mode 100644
index 00000000..eb3ce080
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs
@@ -0,0 +1,344 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Ingenico.Requests;
+using GlobalPayments.Api.Terminals.Messaging;
+using GlobalPayments.Api.Utils;
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ internal class IngenicoTcpInterface : IDeviceCommInterface {
+ private volatile TcpClient _client;
+ private NetworkStream _stream;
+ private ITerminalConfiguration _settings;
+ private TcpListenerEx _listener;
+ private Socket _server;
+ private List _ipAddresses = new List();
+ private BroadcastMessage _broadcastMessage;
+ private byte[] _termResponse;
+ private Thread _dataReceiving;
+ private bool _isKeepAlive;
+ private bool _isKeepAliveRunning;
+ private Exception _receivingException;
+ private bool _isResponseNeeded;
+ private volatile bool _readData;
+ private volatile bool _disposable;
+ private volatile bool _bufferSend;
+ private object _lock;
+ private string _lastErrorMsg;
+
+ public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
+
+ public IngenicoTcpInterface(ITerminalConfiguration settings) {
+ _settings = settings;
+ _client = new TcpClient(); ;
+ _ipAddresses = new List();
+
+ InitializeServer();
+
+ // Start listening to port.
+ Connect();
+
+ // Accepting client connected to port.
+ AcceptingClient();
+ }
+
+ public void Connect() {
+ try {
+ if (!_listener.Active) {
+ _listener.Start();
+ } else {
+ throw new ConfigurationException("Server already started.");
+ }
+ } catch (SocketException ex) {
+ throw new ConfigurationException(ex.Message);
+ }
+ }
+
+ public void Disconnect() {
+ try {
+ if (_listener.Active) {
+ _readData = false;
+ _stream.Close();
+
+ // Closing and disposing current clients
+ //if (!_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) {
+ // while (true) {
+ // if (_disposable) {
+ // _client.Close();
+ // _client.Dispose();
+ // break;
+ // }
+ // }
+ //} else {
+ // _client.Close();
+ // _client.Dispose();
+ //}
+
+ _client.Close();
+ _client.Dispose();
+
+ // Stopping server listening
+ _listener.Stop();
+ _ipAddresses.Clear();
+ }
+ } catch (Exception ex) {
+ throw new ConfigurationException(ex.Message);
+ }
+ }
+
+ public byte[] Send(IDeviceMessage message) {
+ byte[] buffer = message.GetSendBuffer();
+ _termResponse = null;
+ _bufferSend = false;
+ _isResponseNeeded = true;
+
+ try {
+ // Validate if server is starting
+ if (!_listener.Active) {
+ throw new ConfigurationException("Server is not running.");
+ }
+
+ // Validate keep alive for setting of timeout during Transaction
+ //_stream.ReadTimeout = _settings.Timeout;
+
+ if (_ipAddresses.Count > 0 || _client.Connected) {
+ _stream.Write(buffer, 0, buffer.Length);
+ _bufferSend = true;
+
+ if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) {
+ string data = Encoding.GetEncoding(28591).GetString(buffer);
+ OnMessageSent?.Invoke(data.Substring(1, data.Length - 3));
+
+ return null;
+ }
+
+ OnMessageSent?.Invoke(Encoding.GetEncoding(28591).GetString(RemoveHeader(buffer)));
+ lock(_lock) {
+ while (_termResponse == null) {
+ if(!Monitor.Wait(_lock, _settings.Timeout)) {
+ if (!string.IsNullOrEmpty(_lastErrorMsg)) {
+ throw new ApiException(_lastErrorMsg);
+ } else {
+ throw new ApiException("Terminal did not respond within timeout.");
+ }
+ //Thread.Sleep(100);
+ //if (_receivingException != null)
+ //{
+ // Exception ex = _receivingException;
+ // _receivingException = null;
+ // throw ex;
+ //}
+ }
+
+ if (_termResponse != null) {
+ // Remove timeout for stream read
+ if (!_isKeepAlive) {
+ _stream.ReadTimeout = -1;
+ }
+
+ _isResponseNeeded = false;
+ _receivingException = null;
+ }
+ }
+ }
+
+ return _termResponse;
+ } else {
+ throw new ConfigurationException("No terminal connected to server.");
+ }
+ } catch (Exception ex) {
+ throw new ApiException(ex.Message);
+ }
+ }
+
+ #region Interface private Methods
+ private void InitializeServer() {
+ try {
+ if (_listener == null) {
+ int _port = INGENICO_GLOBALS.IP_PORT; // Default port.
+ if (!string.IsNullOrWhiteSpace(_settings.Port)) {
+ if (!int.TryParse(_settings.Port, out _port)) {
+ throw new ConfigurationException("Invalid port number.");
+ }
+ }
+
+ _listener = new TcpListenerEx(IPAddress.Any, _port);
+
+ // Set timeout for client to send data.
+ _server = _listener.Server;
+
+ // Initialize keep Alive value to false.
+ _isKeepAlive = false;
+ _isKeepAliveRunning = false;
+
+ _readData = true;
+ _disposable = false;
+
+ _lock = new object();
+ } else {
+ throw new ConfigurationException("Server already initialize.");
+ }
+ } catch (Exception e) {
+ throw new ConfigurationException(e.Message);
+ }
+ }
+
+ private void AcceptingClient() {
+ try {
+ _client = _listener.AcceptTcpClient();
+ _stream = _client.GetStream();
+ _ipAddresses.Add(((IPEndPoint)_client.Client.RemoteEndPoint).Address);
+
+ //if (_settings.ConnectionMode != ConnectionModes.PAY_AT_TABLE) {
+ // if (_settings.Timeout <= 0) {
+ // _settings.Timeout = Timeout.Infinite;
+ // }
+
+ // _stream.ReadTimeout = _settings.Timeout;
+ //}
+
+ // Start thread for handling keep alive request.
+ if (_dataReceiving == null || _dataReceiving.ThreadState != ThreadState.Running) {
+ _dataReceiving = new Thread(new ThreadStart(AnalyzeReceivedData));
+ _dataReceiving.Start();
+ }
+ } catch (Exception e) {
+ throw new ConfigurationException(e.Message);
+ }
+ }
+
+ private bool isBroadcast(byte[] terminalResponse) {
+ return Encoding.GetEncoding(28591).GetString(terminalResponse).Contains(INGENICO_GLOBALS.BROADCAST);
+ }
+
+ private bool isKeepAlive(byte[] buffer) {
+ return Encoding.GetEncoding(28591).GetString(buffer).Contains(INGENICO_GLOBALS.TID_CODE);
+ }
+
+ private byte[] RemoveHeader(byte[] buffer) {
+ return buffer.SubArray(2, buffer.Length - 2);
+ }
+
+ private byte[] KeepAliveResponse(byte[] buffer) {
+ if (buffer.Length > 0) {
+ var tIdIndex = Encoding.GetEncoding(28591).GetString(buffer, 0, buffer.Length).IndexOf(INGENICO_GLOBALS.TID_CODE);
+ var tId = Encoding.GetEncoding(28591).GetString(buffer, tIdIndex + 10, 8);
+
+ var respData = INGENICO_GLOBALS.KEEP_ALIVE_RESPONSE.FormatWith(tId);
+ respData = TerminalUtilities.CalculateHeader(Encoding.GetEncoding(28591).GetBytes(respData)) + respData;
+ return Encoding.GetEncoding(28591).GetBytes(respData);
+ } else {
+ return null;
+ }
+ }
+
+ private async void AnalyzeReceivedData() {
+ try {
+ var headerBuffer = new byte[2];
+ while (_readData) {
+ // Pay@Table functionalities handling.
+ if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) {
+ byte[] buffer = new byte[8192];
+ int bytesReceived = _stream.ReadAsync(buffer, 0, buffer.Length).Result;
+
+ if (bytesReceived > 0) {
+ byte[] readBuffer = buffer.SubArray(0, bytesReceived);
+ string raw = Encoding.GetEncoding(28591).GetString(readBuffer);
+ string dataETX = raw.Substring(1, raw.Length - 2);
+
+ byte[] bufferLRC = TerminalUtilities.CalculateLRC(raw.Substring(raw.Length - 1));
+ string receivedLRC = BitConverter.ToString(bufferLRC);
+
+ byte[] calculateLRC = TerminalUtilities.CalculateLRC(dataETX);
+ string calculatedLRC = BitConverter.ToString(calculateLRC);
+
+ if (receivedLRC.Equals(calculatedLRC)) {
+ string data = raw.Substring(1, raw.Length - 3);
+ byte[] patRequest = Encoding.GetEncoding(28591).GetBytes(data);
+ OnPayAtTableRequest?.Invoke(new PATRequest(patRequest));
+ }
+ }
+ } else {
+ // Standard functionalities handling
+ _stream.Read(headerBuffer, 0, headerBuffer.Length);
+
+ if (!_readData) {
+ throw new Exception();
+ }
+
+ int dataLength = await Task.Run(() => TerminalUtilities.HeaderLength(headerBuffer));
+ if (dataLength > 0) {
+ byte[] dataBuffer = new byte[dataLength];
+
+ var incomplete = true;
+ int offset = 0;
+ int tempLength = dataLength;
+
+ do {
+
+ // Read data
+ int bytesReceived = _stream.Read(dataBuffer, offset, tempLength);
+ if (!_readData) {
+ throw new Exception();
+ }
+ if (bytesReceived != tempLength) {
+ offset += bytesReceived;
+ tempLength -= bytesReceived;
+ } else {
+ incomplete = false;
+ }
+ } while (incomplete);
+
+ var readBuffer = new byte[dataLength];
+ Array.Copy(dataBuffer, readBuffer, dataLength);
+
+ if (isBroadcast(readBuffer)) {
+ _broadcastMessage = new BroadcastMessage(readBuffer);
+ OnBroadcastMessage?.Invoke(_broadcastMessage.Code, _broadcastMessage.Message);
+ } else if (isKeepAlive(readBuffer) && INGENICO_GLOBALS.KeepAlive) {
+
+ _isKeepAlive = true;
+
+ if (_isKeepAlive && !_isKeepAliveRunning) {
+ _stream.ReadTimeout = _settings.Timeout;
+ _isKeepAliveRunning = true;
+ }
+
+ var keepAliveRep = KeepAliveResponse(readBuffer);
+ _stream.WriteAsync(keepAliveRep, 0, keepAliveRep.Length).Wait();
+ } else { // Receiving request response data.
+ _termResponse = readBuffer;
+ }
+ } else {
+ _lastErrorMsg = "No data received";
+ //_receivingException = new ApiException("No data received.");
+ }
+ }
+ }
+ } catch (Exception ex) {
+ if (_settings.ConnectionMode != ConnectionModes.PAY_AT_TABLE) {
+ if (_isResponseNeeded || _isKeepAlive) {
+ _receivingException = ex;
+ _stream.ReadTimeout = -1;
+ _isKeepAlive = false;
+ }
+
+ if (_readData) {
+ AnalyzeReceivedData();
+ } else {
+ _disposable = true;
+ }
+ }
+ }
+ }
+ #endregion
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/SerialPort.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/SerialPort.cs
new file mode 100644
index 00000000..3926186a
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/SerialPort.cs
@@ -0,0 +1,246 @@
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace GlobalPayments.Api.Terminals.INGENICO.Interfaces {
+ public class SerialPort {
+
+ #region P/Invokes
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern bool listPort(
+ [MarshalAs(UnmanagedType.BStr)] ref string port,
+ [MarshalAs(UnmanagedType.BStr)] ref string desc,
+ [MarshalAs(UnmanagedType.BStr)] ref string hwId,
+ int index);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ [return: MarshalAs(UnmanagedType.BStr)]
+ public static extern string getPort();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int getBaudrate();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int getByteSize();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int getParityBit();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int getStopBit();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int getFlowControl();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern long getTimeoutRIT();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern long getTimeoutRTTC();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern long getTimeoutRTTM();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern long getTimeoutWTTC();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern long getTimeoutWTTM();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern bool isOpen();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setPort([MarshalAs(UnmanagedType.BStr)] string port);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setBaudrate(int baudrate);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setByteSize(int byteSize);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setParityBit(int parityBit);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setStopBit(int stopBit);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setflowControl(int flowControl);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setTimeoutRIT(long readIntervalTimeout);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setTimeoutRTTC(long readTotalTimeoutConstant);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setTimeoutRTTM(long readTotalTimeoutMultiplier);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setTimeoutWTTC(long writeTotalTimeoutConstant);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern void setTimeoutWTTM(long writeTotalTimeoutMultiplier);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern bool waitReadable(int timeout);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern bool waitByteTimes(int count);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern bool waitForChange();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int initialize();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int open();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int close();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int available(ref long bytesAvaialble);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int read([MarshalAs(UnmanagedType.BStr)] ref string buffer, long size);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int write(string data, long size);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int flush();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int flushInput();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int flushOutput();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int sendBreak(int duration);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int setEscapeCommFunction(int escapeFunction);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int getCommModemStatus(ref int modemStatus);
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int readLock();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int readUnlock();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int writeLock();
+
+ [DllImport("ING-CSRP-SerialLibrary.dll")]
+ public static extern int writeUnlock();
+ #endregion
+
+ #region Structures
+ [StructLayout(LayoutKind.Sequential)]
+ public struct PortInfo {
+ [MarshalAs(UnmanagedType.BStr)]
+ public string portName;
+
+ [MarshalAs(UnmanagedType.BStr)]
+ public string description;
+
+ [MarshalAs(UnmanagedType.BStr)]
+ public string hardwareId;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Timeout {
+ public long readIntervalTimeout;
+ public long readTotalTimeoutConstant;
+ public long readTotalTimeoutMultiplier;
+ public long writeTotalTimeoutConstant;
+ public long writeTotalTimeoutMultiplier;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct SerialParameters {
+ [MarshalAs(UnmanagedType.BStr)]
+ public string portName;
+ public int baudrate;
+ public Timeout timeout;
+ public int byteSize;
+ public int parityBit;
+ public int stopBit;
+ public int flowControl;
+ }
+ #endregion
+
+ #region Internal Methods
+ public static List getPortInfoList() {
+ List portInfoList = new List();
+ PortInfo portInfo = new PortInfo();
+
+ string port = "";
+ string desc = "";
+ string hwId = "";
+ int index = 0;
+
+ while (listPort(ref port, ref desc, ref hwId, index)) {
+ index++;
+
+ portInfo.portName = port;
+ portInfo.description = desc;
+ portInfo.hardwareId = hwId;
+
+ portInfoList.Add(portInfo);
+ }
+
+ return portInfoList;
+ }
+
+ public static SerialParameters getSerialParameters() {
+ SerialParameters sp = new SerialParameters();
+
+ sp.portName = getPort();
+ sp.baudrate = getBaudrate();
+ sp.timeout = getTimeout();
+ sp.byteSize = getByteSize();
+ sp.parityBit = getParityBit();
+ sp.stopBit = getStopBit();
+ sp.flowControl = getFlowControl();
+
+ return sp;
+ }
+
+ public static void setSerialParameters(SerialParameters sp) {
+ setPort(sp.portName);
+ setBaudrate(sp.baudrate);
+ setTimeout(sp.timeout);
+ setByteSize(sp.byteSize);
+ setParityBit(sp.parityBit);
+ setStopBit(sp.stopBit);
+ setflowControl(sp.flowControl);
+ }
+
+ public static Timeout getTimeout() {
+ Timeout timeout = new Timeout();
+
+ timeout.readIntervalTimeout = getTimeoutRIT();
+ timeout.readTotalTimeoutConstant = getTimeoutRTTC();
+ timeout.readTotalTimeoutMultiplier = getTimeoutRTTM();
+ timeout.writeTotalTimeoutConstant = getTimeoutWTTC();
+ timeout.writeTotalTimeoutMultiplier = getTimeoutWTTM();
+
+ return timeout;
+ }
+
+ public static void setTimeout(Timeout timeout) {
+ setTimeoutRIT(timeout.readIntervalTimeout);
+ setTimeoutRTTC(timeout.readTotalTimeoutConstant);
+ setTimeoutRTTM(timeout.readTotalTimeoutMultiplier);
+ setTimeoutWTTC(timeout.writeTotalTimeoutConstant);
+ setTimeoutWTTM(timeout.writeTotalTimeoutMultiplier);
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs
new file mode 100644
index 00000000..c15fcfad
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs
@@ -0,0 +1,12 @@
+using System.Net;
+using System.Net.Sockets;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class TcpListenerEx : TcpListener {
+ public TcpListenerEx(IPAddress localaddr, int port) : base(localaddr, port) {
+
+ }
+
+ public new bool Active { get { return base.Active; } }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs
new file mode 100644
index 00000000..a6a29eb1
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs
@@ -0,0 +1,115 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Utils;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace GlobalPayments.Api.Terminals.Ingenico.Requests {
+ public class PATRequest {
+ private byte[] _buffer;
+
+ public PATRequestType RequestType { get; set; }
+ public string WaiterId { get; set; }
+ public string TableId { get; set; }
+ public string TerminalId { get; set; }
+ public string TerminalCurrency { get; set; }
+ public string XMLData { get; set; }
+ public TransactionOutcomeRequest TransactionOutcome { get; set; }
+
+ public override string ToString() => Encoding.GetEncoding(28591).GetString(_buffer);
+
+ // Assign passed value of buffer into private variable.
+ public PATRequest(byte[] buffer) {
+ _buffer = buffer;
+ ParseData();
+ }
+
+ private void ParseData() {
+ string strBuffer = Encoding.GetEncoding(28591).GetString(_buffer);
+
+ // XML
+ if (strBuffer.Contains(INGENICO_GLOBALS.XML_TAG)) {
+ if (!strBuffer.EndsWith(">")) {
+ char[] xmlArr = strBuffer.ToCharArray();
+
+ for (int i = strBuffer.Length - 1; i <= strBuffer.Length; i--) {
+ if (xmlArr[i] == '>') {
+ XMLData = strBuffer.Substring(0, (i + 1));
+ break;
+ }
+ }
+ } else {
+ XMLData = strBuffer;
+ }
+
+ // Convert String to XML
+ XmlDocument xmlDoc = new XmlDocument();
+ xmlDoc.LoadXml(XMLData);
+
+ XmlElement root = xmlDoc.DocumentElement;
+ string rootTag = root.Name;
+
+ if (rootTag == INGENICO_GLOBALS.ADDITIONAL_MSG) {
+ RequestType = PATRequestType.AdditionalMessage;
+ } else if (rootTag == INGENICO_GLOBALS.TRANSFER_DATA) {
+ RequestType = PATRequestType.TransferData;
+ } else if (rootTag == INGENICO_GLOBALS.TRANSACTION_XML) {
+ XmlNodeList nList = xmlDoc.GetElementsByTagName("RECEIPT");
+ XmlNode node = nList.Item(0);
+
+ if (node.NodeType == XmlNodeType.Element) {
+ XmlElement element = (XmlElement)node;
+ string sType = element.GetAttribute("STYPE");
+
+ if (sType.Equals("SPLITSALE REPORT")) {
+ RequestType = PATRequestType.SplitSaleReport;
+ } else if (sType.Equals("CUSTOMER")) {
+ RequestType = PATRequestType.Ticket;
+ } else {
+ RequestType = PATRequestType.EndOfDayReport;
+ }
+ } else {
+ throw new ApiException("First child node is not an element");
+ }
+ } else {
+ throw new ApiException("The root tag of the xml cannot recognize");
+ }
+ } else {
+ // Workaround for split sale but not final logic
+ if (strBuffer.ToLower().Contains("split_sale")) {
+ RequestType = PATRequestType.SplitSaleReport;
+ XMLData = strBuffer;
+ }
+
+ // Message Frame 2
+ else if (_buffer.Length >= INGENICO_GLOBALS.MSG_FRAME_TWO_LEN) {
+ RequestType = PATRequestType.TransactionOutcome;
+ TransactionOutcome = new TransactionOutcomeRequest(_buffer);
+ } else {
+ // Message Frame 1
+ RequestType = (PATRequestType)strBuffer.Substring(11, 1).ToInt32();
+ string privData = strBuffer.Substring(16);
+
+ if (privData.Length < 55) {
+ switch (RequestType) {
+ case PATRequestType.TableLock:
+ case PATRequestType.TableUnlock:
+ TableId = privData;
+ break;
+ default:
+ break;
+ }
+ } else {
+ var tlvData = new TypeLengthValue(_buffer);
+
+ WaiterId = tlvData.GetValue((byte)PATPrivateDataCode.WaiterId, typeof(string))?.ToString();
+ TableId = tlvData.GetValue((byte)PATPrivateDataCode.TableId, typeof(string), TLVFormat.PayAtTable)?.ToString();
+ TerminalId = tlvData.GetValue((byte)PATPrivateDataCode.TerminalId, typeof(string))?.ToString();
+ TerminalCurrency = tlvData.GetValue((byte)PATPrivateDataCode.TerminalCurrency, typeof(string))?.ToString();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs
new file mode 100644
index 00000000..48f73b02
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs
@@ -0,0 +1,33 @@
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico.Requests {
+ public class TransactionOutcomeRequest : DeviceResponse {
+ private byte[] _buffer;
+
+ public new TransactionStatus Status { get; private set; }
+ public string Amount { get; private set; }
+ public string CurrencyCode { get; private set; }
+ public string PrivateData { get; private set; }
+ public DataResponse RepField { get; private set; }
+
+ internal TransactionOutcomeRequest(byte[] buffer) {
+ _buffer = buffer;
+ ParseData();
+ }
+
+ private void ParseData() {
+ Status = (TransactionStatus)Encoding.GetEncoding(28591).GetString(_buffer.SubArray(2, 1)).ToInt32();
+ Amount = Encoding.GetEncoding(28591).GetString(_buffer.SubArray(3, 8));
+ RepField = new DataResponse(_buffer.SubArray(12, 55));
+ CurrencyCode = Encoding.GetEncoding(28591).GetString(_buffer.SubArray(67, 3));
+ PrivateData = Encoding.GetEncoding(28591).GetString(_buffer.SubArray(70, _buffer.Length - 70));
+ DeviceResponseText = Encoding.GetEncoding(28591).GetString(_buffer);
+ }
+
+ public override string ToString() {
+ return DeviceResponseText;
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs
new file mode 100644
index 00000000..5c2e0854
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs
@@ -0,0 +1,60 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Ingenico;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class BroadcastMessage {
+ private byte[] _buffer;
+ private string _code;
+ private string _message;
+ public string Code {
+ get { return _code; }
+ }
+ public string Message {
+ get { return _message; }
+ }
+
+ private Dictionary _broadcastData = new Dictionary {
+ {"A0", "CONNECTING" },
+ {"A1", "CONNECTION MADE" },
+ {"A2", "APPROVED" },
+ {"A3", "DECLINED" },
+ {"A4", "INSERT CARD" },
+ {"A5", "CARD ERROR" },
+ {"A6", "PROCESSING ERROR" },
+ {"A7", "REMOVE CARD" },
+ {"A8", "TRY AGAIN" },
+ {"A9", "PRESENT CARD" },
+ {"AA", "RE-PRESENT CARD" },
+ {"AB", "CARD NOT SUPPORTED" },
+ {"AC", "PRESENT ONLY ONE CARD" },
+ {"AD", "PLEASE WAIT" },
+ {"AE", "BAD SWIPE" },
+ {"AF", "CARD EXPIRED" },
+ {"B0", "DECLINED BY CARD" },
+ {"B1", "PIN ENTRY" },
+ {"B2", "CASHBACK AMOUNT ENTRY" },
+ {"B3", "PAPER OUT" },
+ };
+
+ public BroadcastMessage(byte[] buffer) {
+ _buffer = buffer;
+ ParseBroadcast(_buffer);
+ }
+
+ private void ParseBroadcast(byte[] broadBuffer) {
+ if (broadBuffer.Length > 0) {
+ var strBroadcast = Encoding.GetEncoding(28591).GetString(broadBuffer);
+ int findIndex = strBroadcast.IndexOf(INGENICO_GLOBALS.BROADCAST);
+ int findLen = 14 + 2; // additional 2 is for extra char '="'
+ _code = strBroadcast.Substring(findIndex + findLen, 2);
+ _message = _broadcastData[_code];
+ }
+ else {
+ throw new MessageException("No broadcast message.");
+ }
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs
new file mode 100644
index 00000000..8e291721
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs
@@ -0,0 +1,18 @@
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class CancelResponse : IngenicoTerminalResponse, IDeviceResponse{
+ public CancelResponse(byte[] buffer) : base(buffer) {
+ ParseResponse(buffer);
+ }
+
+ public override void ParseResponse(byte[] response) {
+ base.ParseResponse(response);
+ Status = ((CancelStatus)Encoding.GetEncoding(28591).GetString(response.SubArray(2, 1)).ToInt32()).ToString();
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs
new file mode 100644
index 00000000..a500e2b6
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using GlobalPayments.Api.Terminals.Ingenico;
+using GlobalPayments.Api.Utils;
+using System.Linq;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class DataResponse {
+
+ private string _authCode;
+ private string _finalAmount;
+ private PaymentMethod? _paymentMethod;
+ private string _cashbackAmount;
+ private string _gratuityAmount;
+ private string _availableAmount;
+ private string _dccCode;
+ private string _dccAmount;
+ private TransactionSubTypes? _txnSubType;
+ private string _splitSaleAmount;
+ private DynamicCurrencyStatus? _dccStatus;
+
+ private byte[] _buffer;
+
+ public DataResponse(byte[] buffer) {
+ _buffer = buffer;
+ ParseData();
+ }
+
+ #region Property Fields
+
+ public string AuthorizationCode {
+ get { return _authCode ?? string.Empty; }
+ }
+
+ public decimal? FinalAmount {
+ get { return _finalAmount.ToAmount(); }
+ set { _finalAmount = value.ToString(); }
+ }
+
+ public PaymentMethod? PaymentMethod {
+ get { return _paymentMethod; }
+ set { _paymentMethod = value; }
+ }
+
+ public decimal? CashbackAmount {
+ get { return _cashbackAmount.ToAmount(); }
+ set { _cashbackAmount = value.ToString(); }
+ }
+
+ public decimal? GratuityAmount {
+ get { return _gratuityAmount.ToAmount(); }
+ set { _gratuityAmount = value.ToString(); }
+ }
+
+ public decimal? AvailableAmount {
+ get { return _availableAmount.ToAmount(); }
+ set { _availableAmount = value.ToString(); }
+ }
+ public string DccCode {
+ get { return _dccCode; }
+ set { _dccCode = value; }
+ }
+
+ public decimal? DccAmount {
+ get { return _dccAmount.ToAmount(); }
+ set { _dccAmount = value.ToString(); }
+ }
+
+ public TransactionSubTypes? TransactionSubType {
+ get { return _txnSubType; }
+ set { _txnSubType = value; }
+ }
+
+ public decimal? SplitSaleAmount {
+ get { return _splitSaleAmount.ToAmount(); }
+ set { _splitSaleAmount = value.ToString(); }
+ }
+
+ public DynamicCurrencyStatus? DccStatus {
+ get { return _dccStatus; }
+ set { _dccStatus = value; }
+ }
+
+ #endregion
+
+ private void ParseData() {
+
+ var tlv = new TypeLengthValue(_buffer);
+
+ Type stringType = typeof(string);
+
+ _authCode = (string)tlv.GetValue((byte)RepFieldCode.AuthCode, stringType);
+ _cashbackAmount = (string)tlv.GetValue((byte)RepFieldCode.CashbackAmount, stringType);
+ _gratuityAmount = (string)tlv.GetValue((byte)RepFieldCode.GratuityAmount, stringType);
+ _finalAmount = (string)tlv.GetValue((byte)RepFieldCode.FinalTransactionAmount, stringType);
+ _availableAmount = (string)tlv.GetValue((byte)RepFieldCode.AvailableAmount, stringType);
+ _dccCode = (string)tlv.GetValue((byte)RepFieldCode.DccCurrency, stringType);
+ _dccAmount = (string)tlv.GetValue((byte)RepFieldCode.DccConvertedAmount, stringType);
+ _txnSubType = EnumConverter.FromDescription(tlv.GetValue((byte)RepFieldCode.TransactionSubType, stringType));
+ _dccStatus = (DynamicCurrencyStatus?)tlv.GetValue((byte)RepFieldCode.DccOperationStatus, typeof(DynamicCurrencyStatus?));
+ _splitSaleAmount = (string)tlv.GetValue((byte)RepFieldCode.SplitSalePaidAmount, stringType);
+ _paymentMethod = (PaymentMethod?)tlv.GetValue((byte)RepFieldCode.PaymentMethod, typeof(PaymentMethod?));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs
new file mode 100644
index 00000000..3050047b
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs
@@ -0,0 +1,141 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public abstract class IngenicoBaseResponse : DeviceResponse {
+ protected byte[] _buffer;
+ protected ParseFormat _parseFormat;
+ internal DataResponse _respField;
+
+ #region Added Properties Specific for Ingenico
+ public string DccCurrency { get; set; }
+ public DynamicCurrencyStatus? DccStatus { get; set; }
+ public decimal? DccAmount { get; set; }
+ public TransactionSubTypes? TransactionSubType { get; set; }
+ public decimal? SplitSaleAmount { get; set; }
+ public PaymentMode PaymentMode { get; set; }
+ public string CurrencyCode { get; set; }
+ public string PrivateData { get; set; }
+ public decimal? FinalTransactionAmount { get; set; }
+
+ internal string Amount { get; set; }
+ #endregion
+
+ internal IngenicoBaseResponse(byte[] buffer, ParseFormat format = ParseFormat.Transaction) {
+ if (buffer != null) {
+ _buffer = buffer;
+ _parseFormat = format;
+
+ if (_parseFormat != ParseFormat.XML) {
+ ParseResponse(_buffer);
+ }
+ }
+ }
+
+
+ public virtual void ParseResponse(byte[] response) {
+ if (response != null) {
+ ReferenceNumber = Encoding.GetEncoding(28591).GetString(response.SubArray(0, 2));
+ Status = ((TransactionStatus)Encoding.GetEncoding(28591).GetString(response.SubArray(2, 1)).ToInt32()).ToString();
+ Amount = Encoding.GetEncoding(28591).GetString(response.SubArray(3, 8));
+ PaymentMode = (PaymentMode)Encoding.GetEncoding(28591).GetString(response.SubArray(11, 1)).ToInt32();
+ CurrencyCode = Encoding.GetEncoding(28591).GetString(response.SubArray(67, 3));
+ PrivateData = Encoding.GetEncoding(28591).GetString(response.SubArray(70, response.Length - 70));
+
+ // This is for parsing of Response field for Transaction request
+ if (_parseFormat == ParseFormat.Transaction) {
+ _respField = new DataResponse(response.SubArray(12, 55));
+ FinalTransactionAmount = _respField.FinalAmount;
+ DccAmount = _respField.DccAmount;
+ DccCurrency = _respField.DccCode;
+ DccStatus = _respField.DccStatus;
+ }
+ }
+ }
+
+ public override string ToString() {
+ DeviceResponseText = Encoding.GetEncoding(28591).GetString(_buffer, 0, _buffer.Length);
+ return DeviceResponseText;
+ }
+
+ }
+
+ public class IngenicoTerminalResponse : IngenicoBaseResponse, ITerminalResponse {
+ internal IngenicoTerminalResponse(byte[] buffer, ParseFormat format = ParseFormat.Transaction) : base(buffer, format) { }
+
+ #region Properties
+ public decimal? TransactionAmount {
+ get { return Amount.ToAmount(); }
+ set { if (value.HasValue) { Amount = value.ToString(); } }
+ }
+ public decimal? BalanceAmount {
+ get { return _respField.AvailableAmount; }
+ set { if (value.HasValue) { _respField.AvailableAmount = value; } }
+ }
+ public string AuthorizationCode {
+ get { return _respField.AuthorizationCode; }
+ set { if (value.Length > 0) { value.ToString(); } }
+ }
+ public decimal? TipAmount {
+ get { return _respField.GratuityAmount; }
+ set { if (value.HasValue) { _respField.GratuityAmount = value; } }
+ }
+ public decimal? CashBackAmount {
+ get { return _respField.CashbackAmount; }
+ set { if (value.HasValue) { _respField.CashbackAmount = value; } }
+ }
+ public string PaymentType {
+ get { return _respField.PaymentMethod.ToString(); }
+ set { if (value.Length > 0) { value.ToString(); } }
+ }
+ public string TerminalRefNumber {
+ get { return ReferenceNumber; }
+ set { if (value.Length > 0) { ReferenceNumber = value.ToString(); } }
+ }
+
+ public string ResponseCode { get; set; }
+ public string TransactionId { get; set; }
+ public string Token { get; set; }
+ public string SignatureStatus { get; set; }
+ public byte[] SignatureData { get; set; }
+ public string TransactionType { get; set; }
+ public string MaskedCardNumber { get; set; }
+ public string EntryMethod { get; set; }
+ public string ApprovalCode { get; set; }
+ public decimal? AmountDue { get; set; }
+ public string CardHolderName { get; set; }
+ public string CardBIN { get; set; }
+ public bool CardPresent { get; set; }
+ public string ExpirationDate { get; set; }
+ public string AvsResponseCode { get; set; }
+ public string AvsResponseText { get; set; }
+ public string CvvResponseCode { get; set; }
+ public string CvvResponseText { get; set; }
+ public bool TaxExempt { get; set; }
+ public string TaxExemptId { get; set; }
+ public string TicketNumber { get; set; }
+ public ApplicationCryptogramType ApplicationCryptogramType { get; set; }
+ public string ApplicationCryptogram { get; set; }
+ public string CardHolderVerificationMethod { get; set; }
+ public string TerminalVerificationResults { get; set; }
+ public string ApplicationPreferredName { get; set; }
+ public string ApplicationLabel { get; set; }
+ public string ApplicationId { get; set; }
+ public decimal? MerchantFee { get; set; }
+ public string ResponseText { get; set; }
+ #endregion
+ }
+
+ public class IngenicoTerminalReportResponse : IngenicoBaseResponse, ITerminalReport {
+ internal IngenicoTerminalReportResponse(byte[] buffer) : base(buffer, ParseFormat.XML) {
+ _buffer = buffer;
+ Status = _buffer.Length > 0 ? "SUCCESS" : "FAILED";
+ }
+
+ public override string ToString() {
+ return Encoding.GetEncoding(28591).GetString(_buffer);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs
new file mode 100644
index 00000000..3dc4893b
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs
@@ -0,0 +1,18 @@
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class POSIdentifierResponse : IngenicoTerminalResponse, IInitializeResponse {
+ public string SerialNumber { get; set; }
+
+ public POSIdentifierResponse(byte[] buffer)
+ : base(buffer, ParseFormat.PID) {
+ }
+
+ public override void ParseResponse(byte[] response) {
+ base.ParseResponse(response);
+ SerialNumber = Encoding.GetEncoding(28591).GetString(response.SubArray(12, 55)).Trim();
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs
new file mode 100644
index 00000000..cd4f021d
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs
@@ -0,0 +1,11 @@
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico.Responses {
+ public class ReportResponse : IngenicoTerminalResponse, ITerminalReport {
+ internal ReportResponse(byte[] buffer) : base(buffer) {
+ ParseResponse(buffer);
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs
new file mode 100644
index 00000000..6c05ac13
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs
@@ -0,0 +1,18 @@
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class ReverseResponse : IngenicoTerminalResponse, IDeviceResponse{
+ public ReverseResponse(byte[] buffer) : base(buffer) {
+ ParseResponse(buffer);
+ }
+
+ public override void ParseResponse(byte[] response) {
+ base.ParseResponse(response);
+ Status = ((ReverseStatus)Encoding.GetEncoding(28591).GetString(response.SubArray(2, 1)).ToInt32()).ToString();
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs
new file mode 100644
index 00000000..db534c4e
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs
@@ -0,0 +1,55 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Utils;
+using System;
+
+namespace GlobalPayments.Api.Terminals.Ingenico {
+ public class StateResponse : IngenicoTerminalResponse, IDeviceResponse {
+
+ private TerminalStatus _terminalStatus;
+ private SalesMode _salesMode;
+ private string _terminalCapabilities;
+ private string _additionalTerminalCapabilities;
+ private string _appVersionNumber;
+ private string _handsetNumber;
+ private string _terminalId;
+
+ public StateResponse(byte[] buffer)
+ : base(buffer, ParseFormat.State) {
+ }
+
+ public TerminalStatus TerminalStatus { get { return _terminalStatus; } set { } }
+ public SalesMode SalesMode { get { return _salesMode; } set { } }
+ public string TerminalCapabilities { get { return _terminalCapabilities; } set { } }
+ public string AdditionalTerminalCapabilities { get { return _additionalTerminalCapabilities; } set { } }
+ public string AppVersionNumber { get { return _appVersionNumber; } set { } }
+ public string HandsetNumber { get { return _handsetNumber; } set { } }
+ public string TerminalId { get { return _terminalId; } set { } }
+
+ public override void ParseResponse(byte[] response) {
+ if (response == null) {
+ throw new ApiException("Response data is null");
+ }
+
+ if (response.Length < INGENICO_GLOBALS.RAW_RESPONSE_LENGTH) {
+ byte[] newResponse = new byte[INGENICO_GLOBALS.RAW_RESPONSE_LENGTH];
+ response.CopyTo(newResponse, 0);
+
+ response = newResponse;
+ }
+
+ base.ParseResponse(response);
+
+ var tlv = new TypeLengthValue(response.SubArray(12, 55));
+
+ string terminalStatusData = (string)tlv.GetValue((byte)StateResponseCode.Status, typeof(string), TLVFormat.State);
+ _terminalStatus = (TerminalStatus)Convert.ToByte(terminalStatusData.Substring(0, 1));
+ _salesMode = (SalesMode)Convert.ToByte(terminalStatusData.Substring(1, 1));
+ _terminalCapabilities = terminalStatusData.Substring(2, 6);
+ _additionalTerminalCapabilities = terminalStatusData.Substring(8, 10);
+ _appVersionNumber = (string)tlv.GetValue((byte)StateResponseCode.AppVersionNumber, typeof(string), TLVFormat.State);
+ _handsetNumber = (string)tlv.GetValue((byte)StateResponseCode.HandsetNumber, typeof(string), TLVFormat.State);
+ _terminalId = (string)tlv.GetValue((byte)StateResponseCode.TerminalId, typeof(string), TLVFormat.State);
+ }
+ }
+}
diff --git a/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs b/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs
index d7cdab72..14fb0ba6 100644
--- a/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs
+++ b/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs
@@ -1,3 +1,3 @@
namespace GlobalPayments.Api.Terminals.Messaging {
- public delegate void BroadcastMessageEventHandler();
+ public delegate void BroadcastMessageEventHandler(string code, string message);
}
diff --git a/src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs b/src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs
new file mode 100644
index 00000000..5cb60564
--- /dev/null
+++ b/src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs
@@ -0,0 +1,5 @@
+using GlobalPayments.Api.Terminals.Ingenico.Requests;
+
+namespace GlobalPayments.Api.Terminals.Messaging {
+ public delegate void PayAtTableRequestEventHandler(PATRequest request);
+}
diff --git a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs
index 5f8229ea..20de9ad1 100644
--- a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs
@@ -13,6 +13,8 @@ internal class PaxHttpInterface : IDeviceCommInterface {
WebRequest _client;
public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
public PaxHttpInterface(ITerminalConfiguration settings) {
_settings = settings;
diff --git a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs
index e152efcf..13335ae8 100644
--- a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs
@@ -14,6 +14,8 @@ internal class PaxTcpInterface : IDeviceCommInterface {
int _connectionCount = 0;
public event MessageSentEventHandler OnMessageSent;
+ public event BroadcastMessageEventHandler OnBroadcastMessage;
+ public event PayAtTableRequestEventHandler OnPayAtTableRequest;
public PaxTcpInterface(ITerminalConfiguration settings) {
_settings = settings;
@@ -59,11 +61,6 @@ public byte[] Send(IDeviceMessage message) {
return rvalue;
}
}
- else {
- // Reset the connection before the next attempt
- Disconnect();
- Connect();
- }
}
throw new MessageException("Terminal did not respond in the given timeout.");
}
diff --git a/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs b/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs
index d228ebe3..aa3cf629 100644
--- a/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs
+++ b/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs
@@ -27,7 +27,7 @@ internal override IDeviceCommInterface ConfigureConnector() {
}
}
- internal PaxController(ITerminalConfiguration settings) : base(settings) {
+ internal PaxController(ITerminalConfiguration settings) : base(settings) {
}
#region overrides
@@ -260,7 +260,7 @@ internal IDeviceMessage BuildReportTransaction(TerminalReportBuilder builder) {
request = TerminalUtilities.BuildRequest(
messageId,
- "00", // EDC TYPE SET TO ALL
+ "01", // EDC TYPE SET TO ALL
ControlCodes.FS,
criteria.TransactionType.HasValue ? ((int)criteria.TransactionType.Value).ToString().PadLeft(2, '0') : string.Empty,
ControlCodes.FS,
diff --git a/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs b/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs
index 29b52734..fd37cd56 100644
--- a/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs
+++ b/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs
@@ -24,18 +24,20 @@ public override ISignatureResponse GetSignatureFile() {
return new SignatureResponse(response, _controller.DeviceType.Value);
}
- public override void Cancel() {
+ public override IDeviceResponse Cancel() {
if (_controller.ConnectionMode == ConnectionModes.HTTP) {
throw new MessageException("The cancel command is not available in HTTP mode");
}
try {
_controller.Send(TerminalUtilities.BuildRequest(PAX_MSG_ID.A14_CANCEL));
+ return null;
}
catch (MessageException exc) {
if (!exc.Message.Equals("Terminal returned EOT for the current message.")) {
throw;
}
+ return null;
}
}
diff --git a/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs b/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs
index c2647ec6..f2059a2c 100644
--- a/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs
+++ b/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs
@@ -7,6 +7,7 @@
using System.IO;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
+using GlobalPayments.Api.Entities;
namespace GlobalPayments.Api.Terminals {
public class TerminalUtilities {
@@ -35,7 +36,7 @@ private static DeviceMessage BuildMessage(string messageId, string message) {
// Begin Message
buffer.Add((byte)ControlCodes.STX);
-
+
// Add Message ID
foreach (char c in messageId)
buffer.Add((byte)c);
@@ -61,6 +62,34 @@ private static DeviceMessage BuildMessage(string messageId, string message) {
return new DeviceMessage(buffer.ToArray());
}
+ public static DeviceMessage BuildRequest(string message, ConnectionModes settings) {
+ var buffer = new List();
+ byte[] lrc;
+
+ switch (settings) {
+ case ConnectionModes.SERIAL:
+ case ConnectionModes.PAY_AT_TABLE:
+ buffer.Add((byte)ControlCodes.STX);
+ foreach (char c in message)
+ buffer.Add((byte)c);
+ buffer.Add((byte)ControlCodes.ETX);
+ lrc = CalculateLRC(message);
+ buffer.Add(lrc[0]);
+ break;
+ case ConnectionModes.TCP_IP_SERVER:
+ var _msg = CalculateHeader(Encoding.UTF8.GetBytes(message)) + message;
+
+ foreach (char c in _msg)
+ buffer.Add((byte)c);
+
+ break;
+ default:
+ throw new BuilderException("Failed to build request message. Unknown Connection mode.");
+ }
+
+ return new DeviceMessage(buffer.ToArray());
+ }
+
public static DeviceMessage BuildRequest(string message, MessageFormat format) {
var buffer = new List();
@@ -142,5 +171,53 @@ public static byte[] BuildSignatureImage(string pathData, int width = 150) {
return ms.ToArray();
}
}
+
+ public static string CalculateHeader(byte[] buffer) {
+ //The Header contains the data length in hexadecimal format on two digits
+ var hex = buffer.Length.ToString("X4");
+ hex = hex.PadLeft(4, '0');
+
+ // Get total value per two char.
+ var fDigit = hex[0].ToString() + hex[1];
+ var sDigit = hex[2].ToString() + hex[3];
+
+ return string.Format("{0}{1}", Convert.ToChar(Convert.ToUInt32(fDigit, 16)),
+ Convert.ToChar(Convert.ToUInt32(sDigit, 16)));
+ }
+
+ public static int HeaderLength(byte[] buffer) {
+ // Conversion from decimal to hex value
+ var fHex = Convert.ToInt64(buffer[0]).ToString("X2");
+ var sHex = Convert.ToInt64(buffer[1]).ToString("X2");
+
+ // Concat two hex value
+ var _hex = fHex + sHex;
+
+ // Get decimal value of concatenated hex
+ return int.Parse(_hex, System.Globalization.NumberStyles.HexNumber);
+ }
+
+ public static byte[] CalculateLRC(string requestMessage) {
+ byte[] bytes = Encoding.ASCII.GetBytes((requestMessage + (char)ControlCodes.ETX));
+ byte lrc = 0;
+ for (int i = 0; i < bytes.Length; i++) {
+ lrc ^= bytes[i];
+ }
+ bytes = new byte[] { lrc };
+ return bytes;
+ }
+
+ public static string GetTextContent(string filePath) {
+ try {
+ if (!filePath.Contains(".xml")) {
+ throw new BuilderException("File must be in XML Document");
+ }
+
+ return File.ReadAllText(filePath);
+ }
+ catch (Exception ex) {
+ throw ex;
+ }
+ }
}
}
diff --git a/src/GlobalPayments.Api/Utils/CardUtils.cs b/src/GlobalPayments.Api/Utils/CardUtils.cs
index 0ff95041..0d5c0388 100644
--- a/src/GlobalPayments.Api/Utils/CardUtils.cs
+++ b/src/GlobalPayments.Api/Utils/CardUtils.cs
@@ -17,75 +17,62 @@ public class CardUtils {
private static readonly Regex StoredValueRegex = new Regex(@"^(?:600649|603261|603571|627600|639470)", RegexOptions.None);
private static readonly Regex ValueLinkRegex = new Regex(@"^(?:601056|603225)", RegexOptions.None);
private static readonly Regex HeartlandGiftRegex = new Regex(@"^(?:502244|627720|708355)", RegexOptions.None);
- private static readonly Regex WorldFuelRegex = new Regex(@"^7000009[5-8]", RegexOptions.None);
- private static readonly Regex FleetCorFleetwideRegex = new Regex(@"^70768598", RegexOptions.None);
- private static readonly Regex FleetCorFuelmanPlusRegex = new Regex(@"^707649", RegexOptions.None);
- private static readonly Regex FleetOneRegex = new Regex(@"^501486", RegexOptions.None);
- private static readonly Regex TrackOnePattern = new Regex(@"%?[B0]?([\d]+)\^[^\^]+\^([\d]{4})([^?]+)?", RegexOptions.None);
- private static readonly Regex TrackTwoPattern = new Regex(@";?([\d]+)[=|w](\d{4})([^?]+)?", RegexOptions.None);
+ private static readonly Regex TrackOnePattern = new Regex(@"%?[B0]?([\d]+)\^[^\^]+\^([\d]{4})([^?]+)\??", RegexOptions.None);
+ private static readonly Regex TrackTwoPattern = new Regex(@";?([\d]+)[=|w](\d{4})([^?]+)\??", RegexOptions.None);
private static Dictionary _regexMap;
private static Dictionary> _fleetBinMap;
- private static Dictionary> _purchaseBinMap;
static CardUtils() {
- _regexMap = new Dictionary { { "Amex", AmexRegex }, { "MC", MasterCardRegex }, { "Visa", VisaRegex }, { "DinersClub", DinersClubRegex }, { "EnRoute", RouteClubRegex }, { "Discover", DiscoverRegex }, { "Jcb", JcbRegex }, { "Voyager", VoyagerRegex }, { "Wex", WexRegex }, { "StoredValue", StoredValueRegex }, { "ValueLink", ValueLinkRegex }, { "HeartlandGift", HeartlandGiftRegex }, { "WorldFuels", WorldFuelRegex }, { "FleetCorFleetwide", FleetCorFleetwideRegex }, { "FleetCorFuelmanPlus", FleetCorFuelmanPlusRegex }, { "FleetOne", FleetOneRegex }
+ _regexMap = new Dictionary {
+ { "Amex", AmexRegex },
+ { "MC", MasterCardRegex },
+ { "Visa", VisaRegex },
+ { "DinersClub", DinersClubRegex },
+ { "EnRoute", RouteClubRegex },
+ { "Discover", DiscoverRegex },
+ { "Jcb", JcbRegex },
+ { "Voyager", VoyagerRegex },
+ { "Wex", WexRegex },
+ { "StoredValue", StoredValueRegex },
+ { "ValueLink", ValueLinkRegex },
+ { "HeartlandGift", HeartlandGiftRegex }
};
// fleet bin ranges
- _fleetBinMap = new Dictionary>();
+ _fleetBinMap = new Dictionary>();
// visa fleet mappings
- var visaFleetMap = new Dictionary { { "448460", "448460" }, { "448462", "448468" }, { "448470", "448516" }, { "448518", "448589" }, { "448591", "448591" }, { "448593", "448611" }, { "448613", "448615" }, { "448617", "448674" }, { "448676", "448686" }, { "448688", "448699" }, { "461400", "461421" }, { "480701", "480899" }
- };
+ var visaFleetMap = new Dictionary();
+ visaFleetMap.Add("448460", "448611");
+ visaFleetMap.Add("448613", "448615");
+ visaFleetMap.Add("448617", "448674");
+ visaFleetMap.Add("448676", "448686");
+ visaFleetMap.Add("448688", "448699");
+ visaFleetMap.Add("461400", "461421");
+ visaFleetMap.Add("461423", "461499");
+ visaFleetMap.Add("480700", "480899");
_fleetBinMap.Add("Visa", visaFleetMap);
// mastercard fleet mappings
- var mcFleetMap = new Dictionary { { "553231", "553380" }, { "556083", "556099" }, { "556100", "556599" }, { "556700", "556999" }
- };
+ var mcFleetMap = new Dictionary();
+ mcFleetMap.Add("553231", "553380");
+ mcFleetMap.Add("556083", "556099");
+ mcFleetMap.Add("556100", "556599");
+ mcFleetMap.Add("556700", "556999");
_fleetBinMap.Add("MC", mcFleetMap);
// wright express fleet mappings
- var wexFleetMap = new Dictionary { { "690046", "690046" }, { "707138", "707138" }
- };
+ var wexFleetMap = new Dictionary();
+ wexFleetMap.Add("690046", "690046");
+ wexFleetMap.Add("707138", "707138");
_fleetBinMap.Add("Wex", wexFleetMap);
// voyager fleet
- var voyagerFleetMap = new Dictionary { { "708885", "708889" }
- };
+ var voyagerFleetMap = new Dictionary();
+ voyagerFleetMap.Add("708885", "708889");
_fleetBinMap.Add("Voyager", voyagerFleetMap);
-
- //WorldFuel fleet
- var worldFuelFleetMap = new Dictionary { { "70000095", "70000095" }, { "70000096", "70000096" }, { "70000097", "70000097" }, { "70000098", "70000098" }
- };
- _fleetBinMap.Add("WorldFuel", worldFuelFleetMap);
-
- //FleetCorFleetwide mappings
- var fleetCorFleetwideMap = new Dictionary { { "70768598", "70768598" }
- };
- _fleetBinMap.Add("FleetCorFleetwide", fleetCorFleetwideMap);
-
- //FleetCorFuelmanPlus mappings
- var fleetCorFuelmanPlusMap = new Dictionary { { "707649", "707649" }
- };
- _fleetBinMap.Add("FleetCorFuelmanPlus", fleetCorFuelmanPlusMap);
-
- //FleetOne mappings
- var fleetOneMap = new Dictionary { { "501486", "501486" }
- };
- _fleetBinMap.Add("FleetOne", fleetOneMap);
-
- // PurchaseBin ranges
- _purchaseBinMap = new Dictionary>();
-
- var visaPurchasingMap = new Dictionary { { "405607","405607" }, { "415928","415928" }, { "418308","418308" }, { "424604","424604" }, { "427533","427533" }, { "430736","430736" }, { "433085","433085" }, { "443085","443085" }, { "434868","434873" }, { "448410","448410" }, { "448419","448419" }, { "448421","448421" }, { "448452","448452" }, { "448461","448462" }, { "448469","448469" }, { "448485","448486" }, { "448483","448483" }, { "448489","448489" }, { "448491","448491" }, { "448515","448515" }, { "448517","448517" }, { "448524","448524" }, { "448535","448535" }, { "448546","448546" }, { "448548","448548" }, { "448557","448557" }, { "448562","448562" }, { "448569","448569" }, { "448598","448598" }, { "448609","448609" }, { "448626","448626" }, { "452072","452072" }, { "461422","461422" }, { "461431","461431" }, { "461437","461437" }, { "461481","461481" }, { "461490","461490" }, { "471500","471500" }, { "471503","471503" }, { "471508","471508" }, { "471511","471511" }, { "471522","471522" }, { "471529","471529" }, { "471539","471539" }, { "471556","471556" }, { "471569","471569" }, { "471573","471573" }, { "471575","471575" }, { "471578","471578" }, { "471586","471586" }, { "471592","471592" }, { "471596","471596" }, { "471630","471630" }, { "471640","471640" }, { "480439","480439" }, { "480452","480452" }, { "480455","480455" }, { "480458","480458" }, { "480470","480470" }, { "480725","480725" }, { "480824","480824" }, { "485901","485901" }, { "485910","485910" }, { "485915","485915" }, { "485948","485948" }, { "485983","485983" }, { "485986","485986" }, { "485997","485997" }, { "485999","485999" }, { "486509","486509" }, { "486535","486535" }, { "486560","486560" }, { "486576","486576" }, { "486580","486580" }, { "486583","486583" }, { "486640","486640" }, { "486670","486670" }, { "486690","486690" }, { "489629","489629" }, { "448499","448501" }, { "448506","448507" }, { "448559","448560" }, { "448564","448565" }, { "448600","448604" }, { "448606","448607" }, { "448620","448622" }, { "448672","448673" }, { "448676","448679" }, { "448692","448693" }, { "461426","461429" }, { "461470","461471" }, { "461487","461488" }, { "471515","471516" }, { "471524","471526" }, { "471545","471546" }, { "471552","471553" }, { "471563","471564" }, { "480406","480408" }, { "480411","480413" }, { "480420","480421" }, { "480423","480424" }, { "480722","480723" }, { "486511","486512" }, { "486516","486517" }, { "486521","486523" }, { "486524","486528" }, { "486550","486552" }, { "486554","486555" }, { "486588","486591" }
- };
- _purchaseBinMap.Add("Visa", visaPurchasingMap);
-
- var MasterCardPurchasingMap = new Dictionary { { "513359", "513360" }, { "513721", "513722" }, { "513764", "513764" }, { "530249", "530249" }, { "540500", "540501" }, { "540505", "540511" }, { "540514", "540515" }, { "540517", "540517" }, { "540520", "540524" }, { "540526", "540529" }, { "540531", "540539" }, { "540542", "540543" }, { "540546", "540549" }, { "540554", "540554" }, { "540556", "540556" }, { "540561", "540562" }, { "540568", "540580" }, { "540582", "540583" }, { "540586", "540590" }, { "540592", "540596" }, { "540598", "540598" }, { "549297", "549297" }, { "552039", "552039" }, { "552587", "552587" }, { "552807", "552807" }, { "552902", "552906" }, { "552908", "552910" }, { "552913", "552914" }, { "552916", "552917" }, { "552924", "552927" }, { "552929", "552931" }, { "552934", "552934" }, { "552936", "552937" }, { "552941", "552942" }, { "552950", "552950" }, { "553424", "553424" }, { "553447", "553447" }, { "555000", "555001" }, { "555003", "555003" }, { "555005", "555006" }, { "555008", "555011" }, { "555013", "555014" }, { "555016", "555016" }, { "555018", "555021" }, { "555024", "555025" }, { "555027", "555027" }, { "555029", "555029" }, { "555033", "555033" }, { "555039", "555042" }, { "555078", "555078" }, { "555109", "555109" }, { "555225", "555225" }, { "555951", "555953" }, { "555957", "555958" }, { "555962", "555962" }, { "556024", "556024" }, { "558301", "558301" }
- };
- _purchaseBinMap.Add("MC", MasterCardPurchasingMap);
}
public static bool IsFleet(string cardType, string pan) {
@@ -124,37 +111,13 @@ public static string MapCardType(string pan) {
if (IsFleet(rvalue, pan)) {
rvalue += "Fleet";
}
- if (IsPurchase(rvalue, pan)) {
- rvalue += "Purchasing";
- }
}
}
return rvalue;
}
- public static bool IsPurchase(string cardType, string pan) {
- if (!string.IsNullOrEmpty(pan)) {
- int compareValue = int.Parse(pan.Substring(0, 6));
- string baseCardType = cardType.TrimEnd("Purchasing");
-
- if (_purchaseBinMap.ContainsKey(baseCardType)) {
- var binRanges = _purchaseBinMap[baseCardType];
- foreach (string key in binRanges.Keys) {
- int lowerRange = int.Parse(key);
- int upperRange = int.Parse(binRanges[key]);
-
- if (compareValue >= lowerRange && compareValue <= upperRange) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
public static T ParseTrackData(T paymentMethod) where T : ITrackData {
- string trackData = Regex.Replace(paymentMethod.Value, @"(?<=\d)\p{Zs}(?=\d)", "");
- //string trackData = paymentMethod.Value;
+ string trackData = paymentMethod.Value;
Match matcher = TrackTwoPattern.Match(trackData);
if (matcher.Success) {
string pan = matcher.Groups[1].Value;
@@ -176,7 +139,7 @@ public static T ParseTrackData(T paymentMethod) where T : ITrackData {
else {
matcher = TrackOnePattern.Match(trackData);
if (matcher.Success) {
- paymentMethod.TrackNumber = TrackNumber.TrackOne;
+ paymentMethod.TrackNumber = TrackNumber.TrackTwo;
paymentMethod.Pan = matcher.Groups[1].Value;
paymentMethod.Expiry = matcher.Groups[2].Value;
paymentMethod.DiscretionaryData = matcher.Groups[3].Value;
@@ -184,27 +147,6 @@ public static T ParseTrackData(T paymentMethod) where T : ITrackData {
}
}
- return paymentMethod;
- }
- public static GiftCard ParseTrackData(GiftCard paymentMethod) {
- string trackData = paymentMethod.Value;
- Match matcher = TrackTwoPattern.Match(trackData);
- if (matcher.Success) {
- paymentMethod.TrackNumber = TrackNumber.TrackTwo;
- paymentMethod.Pan = matcher.Groups[1].Value;
- paymentMethod.Expiry = matcher.Groups[2].Value;
- paymentMethod.TrackData = matcher.Value.TrimStart(';');
- }
- else {
- matcher = TrackOnePattern.Match(trackData);
- if (matcher.Success) {
- paymentMethod.TrackNumber = TrackNumber.TrackOne;
- paymentMethod.Pan = matcher.Groups[1].Value;
- paymentMethod.Expiry = matcher.Groups[2].Value;
- paymentMethod.TrackData = matcher.Value.TrimStart('%');
- }
- }
-
return paymentMethod;
}
}
diff --git a/src/GlobalPayments.Api/Utils/EnumUtils.cs b/src/GlobalPayments.Api/Utils/EnumUtils.cs
index 413395d3..42ecacd4 100644
--- a/src/GlobalPayments.Api/Utils/EnumUtils.cs
+++ b/src/GlobalPayments.Api/Utils/EnumUtils.cs
@@ -71,35 +71,5 @@ public static string GetMapping(Target target, object value) {
}
return null;
}
- public static T FromMapping(Target target, object value) {
- var fields = typeof(T).GetRuntimeFields();
- foreach (var field in fields) {
- var attr = field.GetCustomAttribute();
- if (attr != null && attr.Value.Equals(value) && attr.Target.Equals(target)) {
- var rvalue = (T)Enum.Parse(typeof(T), field.Name);
- return rvalue;
- }
- }
- return default(T);
-
- }
}
-
- //public class EnumUtils {
- //public static bool IsDefined(byte value) where V : System.Enum {
- // return Parse(value) != null;
- //}
- //public static V Parse(byte value) where V : System.Enum {
- // ReverseByteEnumMap map = new ReverseByteEnumMap();
- // return map.Get(value);
- //}
- //public static V Parse(string value) where V : System.Enum {
- // ReverseStringEnumMap map = new ReverseStringEnumMap();
- // return map.Get(value);
- //}
- //public static V Parse(int value) where V : System.Enum {
- // ReverseIntEnumMap map = new ReverseIntEnumMap();
- // return map.Get(value);
- //}
- //}
}
diff --git a/src/GlobalPayments.Api/Utils/Extensions.cs b/src/GlobalPayments.Api/Utils/Extensions.cs
index be53c37b..0fe31d04 100644
--- a/src/GlobalPayments.Api/Utils/Extensions.cs
+++ b/src/GlobalPayments.Api/Utils/Extensions.cs
@@ -1,11 +1,12 @@
-using System;
-using System.Collections.Generic;
-using System.Net.Sockets;
-using System.Text.RegularExpressions;
-using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Entities;
using GlobalPayments.Api.Terminals;
+using System;
+using System.Collections.Generic;
using System.Globalization;
+using System.Net.Sockets;
using System.Security.Cryptography;
+using System.Text;
+using System.Text.RegularExpressions;
namespace GlobalPayments.Api.Utils {
public static class Extensions {
@@ -24,7 +25,7 @@ public static string ToNumericString(this decimal dec) {
public static string ToNumericCurrencyString(this decimal? dec) {
if (dec != null) {
return Regex.Replace(string.Format("{0:c}", dec), "[^0-9]", "");
- }
+ }
return null;
}
@@ -69,8 +70,7 @@ public static byte[] GetTerminalResponse(this NetworkStream stream) {
throw new MessageException("Terminal returned EOT for the current message.");
else if (code == ControlCodes.ACK) {
return stream.GetTerminalResponse();
- }
- else if (code == ControlCodes.STX) {
+ } else if (code == ControlCodes.STX) {
var queue = new Queue(readBuffer);
// break off only one message
@@ -87,8 +87,7 @@ public static byte[] GetTerminalResponse(this NetworkStream stream) {
rec_buffer.Add(queue.Dequeue());
}
return rec_buffer.ToArray();
- }
- else throw new MessageException(string.Format("Unknown message received: {0}", code));
+ } else throw new MessageException(string.Format("Unknown message received: {0}", code));
}
return null;
}
@@ -96,7 +95,7 @@ public static byte[] GetTerminalResponse(this NetworkStream stream) {
public static byte[] GetTerminalResponseAsync(this NetworkStream stream) {
var buffer = new byte[4096];
int bytesReceived = stream.ReadAsync(buffer, 0, buffer.Length).Result;
-
+
if (bytesReceived > 0) {
byte[] readBuffer = new byte[bytesReceived];
Array.Copy(buffer, readBuffer, bytesReceived);
@@ -104,14 +103,11 @@ public static byte[] GetTerminalResponseAsync(this NetworkStream stream) {
var code = (ControlCodes)readBuffer[0];
if (code == ControlCodes.NAK) {
return null;
- }
- else if (code == ControlCodes.EOT) {
+ } else if (code == ControlCodes.EOT) {
throw new MessageException("Terminal returned EOT for the current message.");
- }
- else if (code == ControlCodes.ACK) {
+ } else if (code == ControlCodes.ACK) {
return stream.GetTerminalResponse();
- }
- else if (code == ControlCodes.STX) {
+ } else if (code == ControlCodes.STX) {
var queue = new Queue(readBuffer);
// break off only one message
@@ -128,8 +124,7 @@ public static byte[] GetTerminalResponseAsync(this NetworkStream stream) {
rec_buffer.Add(queue.Dequeue());
}
return rec_buffer.ToArray();
- }
- else throw new MessageException(string.Format("Unknown message received: {0}", code));
+ } else throw new MessageException(string.Format("Unknown message received: {0}", code));
}
return null;
}
@@ -165,16 +160,14 @@ public static byte[] GetVector(this Rfc2898DeriveBytes bytes) {
public static T GetValue(this Dictionary dict, string key) {
try {
return (T)Convert.ChangeType(dict[key], typeof(T));
- }
- catch (KeyNotFoundException) {
+ } catch (KeyNotFoundException) {
return default(T);
}
}
public static decimal? GetAmount(this Dictionary dict, string key) {
try {
return dict[key].ToAmount();
- }
- catch (KeyNotFoundException) {
+ } catch (KeyNotFoundException) {
return null;
}
}
@@ -182,8 +175,7 @@ public static T GetValue(this Dictionary dict, string key) {
public static bool? GetBoolean(this Dictionary dict, string key) {
try {
return bool.TryParse(dict[key], out bool result);
- }
- catch (KeyNotFoundException) {
+ } catch (KeyNotFoundException) {
return null;
}
}
@@ -206,5 +198,15 @@ public static string TrimEnd(this string str, string trimString) {
}
return rvalue;
}
+ public static T[] SubArray(this T[] data, int index, int length) {
+ T[] result = new T[length];
+ Array.Copy(data, index, result, 0, length);
+ return result;
+ }
+
+ public static string ToHexString(this string value) {
+ byte[] bA = Encoding.ASCII.GetBytes(value);
+ return BitConverter.ToString(bA);
+ }
}
}
diff --git a/src/GlobalPayments.Api/Utils/TypeLengthValue.cs b/src/GlobalPayments.Api/Utils/TypeLengthValue.cs
new file mode 100644
index 00000000..dba257de
--- /dev/null
+++ b/src/GlobalPayments.Api/Utils/TypeLengthValue.cs
@@ -0,0 +1,68 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Terminals.Ingenico;
+using System;
+using System.Linq;
+using System.Text;
+
+namespace GlobalPayments.Api.Utils {
+ internal class TypeLengthValue {
+
+ private byte[] _data = new byte[0];
+
+ public TypeLengthValue() {
+
+ }
+
+ public TypeLengthValue(byte[] data) {
+ _data = data;
+ }
+
+ // Add TLV Format since Ingenico has different format of length when it comes to TLV Standard.
+ public TLVFormat TLVFormat { get; private set; }
+
+ public object GetValue(byte type, Type returnType, TLVFormat format = TLVFormat.Standard) {
+ if (_data.Length == 0) {
+ throw new Exception("No data to parse.");
+ }
+
+ TLVFormat = format;
+ int typeIndexLocation = Array.FindIndex(_data, e => e == type);
+ if (typeIndexLocation >= 0) {
+ // Get the length based on Documentation (TLV).
+ byte[] lengthBuffer = { _data[typeIndexLocation + 1], _data[typeIndexLocation + 2] };
+ int length = 0;
+
+ if (TLVFormat == TLVFormat.Standard) {
+ length = Convert.ToInt32(Encoding.GetEncoding(28591).GetString(lengthBuffer, 0, lengthBuffer.Length), 16);
+ } else if (TLVFormat == TLVFormat.State || TLVFormat == TLVFormat.PayAtTable) {
+ length = Convert.ToInt32(Encoding.GetEncoding(28591).GetString(lengthBuffer, 0, lengthBuffer.Length));
+ } else {
+ throw new ApiException("Unsupported TLV format.");
+ }
+
+ // Get the value of type according to length limit.
+ byte[] value = _data.SubArray(typeIndexLocation + 3, length);
+
+ int endLength = typeIndexLocation + length + 3;
+
+ // Remove field that have been parsed and successfully get the value.
+ _data = _data.SubArray(0, typeIndexLocation).Concat(_data.SubArray(endLength, _data.Length - endLength)).ToArray();
+ string strValue = Encoding.GetEncoding(28591).GetString(value, 0, value.Length);
+
+
+ if (returnType == typeof(decimal?)) {
+ return decimal.Parse(strValue);
+ } else if (returnType == typeof(string)) {
+ return strValue;
+ } else if (returnType == typeof(DynamicCurrencyStatus?)) {
+ return (DynamicCurrencyStatus)int.Parse(strValue);
+ } else if (returnType == typeof(PaymentMethod?)) {
+ return (PaymentMethod)int.Parse(strValue);
+ } else {
+ throw new Exception("Data type not supported in parsing of TLV data.");
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs
new file mode 100644
index 00000000..5dcf6d64
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs
@@ -0,0 +1,721 @@
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Tests.TestData;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class AutoSubCertification {
+ public AutoSubCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw"
+ }, "retail");
+
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
+ }, "ecomm");
+ }
+
+ [TestMethod]
+ public void Retail_000_CloseBatch() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw"
+ });
+
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ // Address Verification
+
+ [TestMethod]
+ public void Retail_003_CardVerifyAmex() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+ var manual_amex = TestCards.AmexManual(true, false);
+
+ var response = manual_amex.Verify()
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_007_CardVerifyVisa() {
+ var visa_enc = TestCards.VisaSwipeEncrypted();
+
+ var response = visa_enc.Verify()
+ .WithRequestMultiUseToken(true)
+ .Execute("retail");
+ Assert.IsNotNull(response, "response is null");
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(25m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute("retail");
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_008a_CardVerifyMastercardSwipe() {
+ var card_enc = TestCards.MasterCardSwipeEncrypted();
+
+ var response = card_enc.Verify()
+ .WithRequestMultiUseToken(true)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(26m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute("retail");
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_008b_CardVerifyMastercardSwipe() {
+ var card_enc = TestCards.MasterCard24Swipe();
+ var response = card_enc.Verify()
+ .WithRequestMultiUseToken(true)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(26m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute("retail");
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+
+ // Manually Entered - Card Present
+
+ [TestMethod]
+ public void Retail_009_ChargeVisaManualCardPresent() {
+ var address = new Address {
+ PostalCode = "750241234",
+ StreetAddress1 = "6860 Dallas Pkwy",
+ };
+ var manual_card = TestCards.VisaManual(true, true);
+
+ var response = manual_card.Charge(27m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_010_ChargeMasterCardManualCardPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+ var manual_card = TestCards.MasterCardManual(true, true);
+
+ var response = manual_card.Charge(28m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // CREDIT SALE Swiped Transactions
+
+ [TestMethod]
+ public void Retail_011_ChargeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 29
+ };
+
+ var response = card.Charge(29m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_012_ChargeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+ var autoSub = new AutoSubstantiation {
+ VisionSubTotal = 21
+ };
+
+ var response = card.Charge(21m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_013_ChargeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+ var autoSub = new AutoSubstantiation {
+ ClinicSubTotal = 21,
+ DentalSubTotal = 10
+ };
+
+ var response = card.Charge(31m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_014_ChargeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 22,
+ VisionSubTotal = 10
+ };
+
+ var response = card.Charge(32m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_015_ChargeMastercardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 33
+ };
+
+ var response = card.Charge(33m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test 27
+ var reversal = card.Reverse(33.00m).Execute("retail");
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_016_ChargeMastercardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+ var autoSub = new AutoSubstantiation {
+ VisionSubTotal = 24
+ };
+
+ var response = card.Charge(24m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_017_ChargeMastercardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+ var autoSub = new AutoSubstantiation {
+ ClinicSubTotal = 32,
+ DentalSubTotal = 10
+ };
+
+ var response = card.Charge(42m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_018_ChargeMastercardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 26,
+ VisionSubTotal = 10
+ };
+
+ var response = card.Charge(36m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_018b_ChargeMastercardSwipe() {
+ var card = TestCards.MasterCard25Swipe();
+
+ var response = card.Charge(11.50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ //Partially Approved
+
+ [TestMethod]
+ public void Retail_022_ChargeDiscoverSwipePartialApproval() {
+ var card = TestCards.DiscoverSwipe();
+
+ var response = card.Charge(130.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110.00m, response.AuthorizedAmount);
+
+ // test case 28
+ var reversal = response.Reverse(110.00m).Execute("retail");
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Retail_023_ChargeMasterManualPartialApproval() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+ var card = TestCards.MasterCardManual(true, true);
+
+ var response = card.Charge(155.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .WithAddress(address)
+ .Execute("retail");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(100.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void Retail_001_CloseBatch() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw",
+ ServiceUrl = "https://cert.api2.heartlandportico.com"
+ });
+
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ [TestMethod]
+ public void Ecom_000_CloseBatch() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A",
+ ServiceUrl = "https://cert.api2.heartlandportico.com"
+ });
+
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ // StreetAddress Verification
+
+ [TestMethod]
+ public void Ecomm_003_Verify_Amex() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+ var card = TestCards.AmexManual();
+
+ var response = card.Verify()
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_007_Verify_Visa() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var manual_card = TestCards.VisaManual();
+
+ var response = manual_card.Verify()
+ .WithRequestMultiUseToken(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(25m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_08a_Verify_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var manual_card = TestCards.MasterCardManual();
+
+ var response = manual_card.Verify()
+ .WithRequestMultiUseToken(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var chargeResponse = token.Charge(26m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_08b_Verify_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var manual_card = TestCards.MasterCardSeries2Manual();
+
+ var response = manual_card.Verify()
+ .WithRequestMultiUseToken(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var chargeResponse = token.Charge(26m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_009_Charge_Visa() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = TestCards.VisaManual();
+
+ var response = card.Charge(27m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_010_Charge_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = TestCards.MasterCardManual();
+
+ var response = card.Charge(28m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_010b_Charge_Master_Card_2Manual() {
+ var card = TestCards.MasterCardSeries2Manual();
+
+ var response = card.Charge(28m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Keyed transactions
+
+ [TestMethod]
+ public void Ecomm_011_Charge_Visa() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 29
+ };
+ var card = TestCards.VisaManual();
+
+ var response = card.Charge(29m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_012_Charge_Visa() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ VisionSubTotal = 21
+ };
+ var card = TestCards.VisaManual();
+
+ var response = card.Charge(21m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_013_Charge_Visa() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ ClinicSubTotal = 21,
+ DentalSubTotal = 10
+ };
+ var card = TestCards.VisaManual();
+
+ var response = card.Charge(31m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_014_Charge_Visa() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 22,
+ VisionSubTotal = 10
+ };
+ var card = TestCards.VisaManual();
+
+ var response = card.Charge(32m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_015_Charge_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 33
+ };
+ var card = TestCards.MasterCardManual();
+
+ var response = card.Charge(33m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 27
+ var voidResponse = response.Void().Execute("ecomm");
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_016_Charge_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ VisionSubTotal = 24
+ };
+ var card = TestCards.MasterCardManual();
+
+ var response = card.Charge(24m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_017_Charge_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ ClinicSubTotal = 32,
+ DentalSubTotal = 10
+ };
+ var card = TestCards.MasterCardManual();
+
+ var response = card.Charge(42m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_018_Charge_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var autoSub = new AutoSubstantiation {
+ PrescriptionSubTotal = 26,
+ VisionSubTotal = 10
+ };
+ var card = TestCards.MasterCardManual();
+
+ var response = card.Charge(36m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithAutoSubstantiation(autoSub)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Partially Approved Sale
+
+ [TestMethod]
+ public void Ecomm_022_Partial_Approval_Discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = TestCards.DiscoverManual();
+
+ var response = card.Charge(130m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowPartialAuth(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110m, response.AuthorizedAmount);
+
+ // test case 28
+ var reverseResponse = response.Reverse(110m).Execute("ecomm");
+ Assert.IsNotNull(reverseResponse);
+ Assert.AreEqual("00", reverseResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Ecomm_023_Partial_Approval_Master_Card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = TestCards.MasterCardManual();
+
+ var chargeResponse = card.Charge(145m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithAllowPartialAuth(true)
+ .Execute("ecomm");
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("10", chargeResponse.ResponseCode);
+ Assert.AreEqual(65.00m, chargeResponse.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void Ecom_001_CloseBatch() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
+ });
+
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs
new file mode 100644
index 00000000..f4ceb058
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs
@@ -0,0 +1,345 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Tests.TestData;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class CheckCertification {
+ Address address;
+
+ public CheckCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
+ });
+
+ address = new Address {
+ StreetAddress1 = "123 Main St.",
+ City = "Downtown",
+ State = "NJ",
+ PostalCode = "12345"
+ };
+ }
+
+ #region ACH Debit - Consumer
+
+ [TestMethod]
+ public void checks_001ConsumerPersonalChecking() {
+ var check = TestChecks.Certification(SecCode.PPD, CheckType.PERSONAL, AccountType.CHECKING);
+
+ var response = check.Charge(11.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 25
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_002ConsumerBusinessChecking() {
+ var check = TestChecks.Certification(SecCode.PPD, CheckType.BUSINESS, AccountType.CHECKING);
+ var response = check.Charge(12.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_003ConsumerPersonalSavings() {
+ var check = TestChecks.Certification(SecCode.PPD, CheckType.PERSONAL, AccountType.SAVINGS);
+ var response = check.Charge(13.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_004ConsumerBusinessSavings() {
+ var check = TestChecks.Certification(SecCode.PPD, CheckType.BUSINESS, AccountType.SAVINGS);
+ var response = check.Charge(14.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_005CorporatePersonalChecking() {
+ var check = TestChecks.Certification(SecCode.CCD, CheckType.PERSONAL, AccountType.CHECKING, "Heartland Pays");
+ var response = check.Charge(15.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 26
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ #endregion
+
+ #region ACH Debit - Corporate
+
+ [TestMethod]
+ public void checks_006CorporateBuisnessChecking() {
+ var check = TestChecks.Certification(SecCode.CCD, CheckType.BUSINESS, AccountType.CHECKING, "Heartland Pays");
+ var response = check.Charge(16.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_007CorporatePersonalSavings() {
+ var check = TestChecks.Certification(SecCode.CCD, CheckType.PERSONAL, AccountType.SAVINGS, "Heartland Pays");
+ var response = check.Charge(17.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_008CorporateBuisnessSavings() {
+ var check = TestChecks.Certification(SecCode.CCD, CheckType.BUSINESS, AccountType.SAVINGS, "Heartland Pays");
+ var response = check.Charge(18.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ #endregion
+
+ #region eGold Checking Tests
+
+ [TestMethod]
+ public void checks_009EgoldPersonalChecking() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.CHECKING);
+ var response = check.Charge(11.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_010EgoldBuisnessChecking() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.CHECKING);
+ var response = check.Charge(12.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 27
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_011EgoldPersonalSavings() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.SAVINGS);
+ var response = check.Charge(13.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_012EgoldBusinessSavings() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.SAVINGS);
+ var response = check.Charge(14.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ #endregion
+
+ #region eSilver
+
+ [TestMethod]
+ public void checks_013EsilverPersonalChecking() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.CHECKING);
+ var response = check.Charge(15.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_014EsilverBuisnessChecking() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.CHECKING);
+ var response = check.Charge(16.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 28
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_015EsilverPersonalSavings() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.SAVINGS);
+ var response = check.Charge(17.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_016EsilverBuisnessSavings() {
+ var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.SAVINGS);
+ var response = check.Charge(18.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ #endregion
+
+ #region Bronze
+
+ [TestMethod, Ignore]
+ public void checks_017EbronzePersonalChecking() {
+ var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.PERSONAL, AccountType.CHECKING);
+ check.CheckVerify = true;
+ var response = check.Charge(19.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod, Ignore]
+ public void checks_018EbronzePersonalChecking() {
+ var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.PERSONAL, AccountType.CHECKING);
+ check.CheckVerify = true;
+ var response = check.Charge(20.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod, Ignore]
+ public void checks_019EbronzePersonalChecking() {
+ var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.PERSONAL, AccountType.SAVINGS);
+ check.CheckVerify = true;
+ var response = check.Charge(21.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod, Ignore]
+ public void checks_020EbronzeBusinessSavings() {
+ var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.BUSINESS, AccountType.SAVINGS);
+ check.CheckVerify = true;
+ var response = check.Charge(22.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ #endregion
+
+ #region Checks-by-Web
+
+ [TestMethod]
+ public void checks_021WebPersonalChecking() {
+ var check = TestChecks.Certification(SecCode.WEB, CheckType.PERSONAL, AccountType.CHECKING);
+ var response = check.Charge(23.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_022WebBuisnessChecking() {
+ var check = TestChecks.Certification(SecCode.WEB, CheckType.BUSINESS, AccountType.CHECKING);
+ var response = check.Charge(24.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_023WebPersonalSavings() {
+ var check = TestChecks.Certification(SecCode.WEB, CheckType.PERSONAL, AccountType.SAVINGS);
+ var response = check.Charge(25.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 29
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void checks_024WebBusinessSavings() {
+ var check = TestChecks.Certification(SecCode.WEB, CheckType.BUSINESS, AccountType.SAVINGS);
+ var response = check.Charge(5.00m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ #endregion
+
+ #region Check Void
+ // this is done inline
+ #endregion
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs
new file mode 100644
index 00000000..9713a100
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs
@@ -0,0 +1,1499 @@
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Tests.TestData;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class EcomCertification {
+ bool useTokens = false;
+
+ string visa_token;
+ string mastercard_token;
+ string discover_token;
+ string amex_token;
+
+ EcommerceInfo ecom = new EcommerceInfo {
+ Channel = EcommerceChannel.ECOM
+ };
+
+ public EcomCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
+ });
+ }
+
+ [TestMethod]
+ public void ecomm_000_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ [TestMethod]
+ public void ecomm_001_verify_visa() {
+ var card = new CreditCardData {
+ Number = "4484958240202792",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_002_verify_master_card() {
+ var card = new CreditCardData {
+ Number = "5356083898949891",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_003_verify_discover() {
+ var card = new CreditCardData {
+ Number = "6223971100014620",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithAddress(new Address { PostalCode = "75024" })
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // StreetAddress Verification
+
+ [TestMethod]
+ public void ecomm_004_verify_amex() {
+ var card = new CreditCardData {
+ Number = "345039962663847",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithAddress(new Address { PostalCode = "75024" })
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Balance Inquiry (for Prepaid Card)
+
+ [TestMethod]
+ public void ecomm_005_balance_inquiry_visa() {
+ var card = new CreditCardData {
+ Number = "4664383951958601",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ // CREDIT SALE (For Multi-Use Token Only)
+
+ [TestMethod, Ignore]
+ public void ecomm_006_charge_visa_token() {
+ var address = new Address {
+ StreetAddress1 = "6860 Dallas Pkwy",
+ PostalCode = "75024"
+ };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Charge(13.01m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ visa_token = response.Token;
+ }
+
+ [TestMethod, Ignore]
+ public void ecomm_007_charge_master_card_token() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(13.02m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ mastercard_token = response.Token;
+ }
+
+ [TestMethod, Ignore]
+ public void ecomm_008_charge_discover_token() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "6011000990156527",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(13.03m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ discover_token = response.Token;
+ }
+
+ [TestMethod, Ignore]
+ public void ecomm_009_charge_amex_token() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var response = card.Charge(13.04m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ amex_token = response.Token;
+ }
+
+ // CREDIT SALE
+
+ [TestMethod]
+ public void ecomm_010_charge_visa() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual();
+
+ var response = card.Charge(17.01m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 35
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_011_charge_master_card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual();
+
+ var chargeResponse = card.Charge(17.02m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_012_charge_discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+ var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual();
+
+ var chargeResponse = card.Charge(17.03m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_013_charge_amex() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual();
+
+ var chargeResponse = card.Charge(17.04m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_014_charge_jcb() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "3566007770007321",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(17.05m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_011b_charge_master_card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = TestCards.MasterCardSeries2Manual();
+
+ var chargeResponse = card.Charge(17.02m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ // AUTHORIZATION
+
+ [TestMethod]
+ public void ecomm_015_authorization_visa() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var authResponse = card.Authorize(17.06m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+
+ // test 015b Capture/AddToBatch
+ var captureResponse = authResponse.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_016_authorization_master_card() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var authResponse = card.Authorize(17.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+
+ // test 016b Capture/AddToBatch
+ var captureResponse = authResponse.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_017_authorization_discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "6011000990156527",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var authResponse = card.Authorize(17.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .Execute();
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_016b_authorization_master_card() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "2223000010005780",
+ ExpMonth = 12,
+ ExpYear = 2019,
+ Cvn = "900"
+ };
+
+ var authResponse = card.Authorize(17.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+
+ // test 016b Capture/AddToBatch
+ var captureResponse = authResponse.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ // PARTIALLY - APPROVED SALE
+
+ [TestMethod]
+ public void ecomm_018_partial_approval_visa() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(130m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowPartialAuth(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_019_partial_approval_discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "6011000990156527",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(145m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowPartialAuth(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(65.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_020_partial_approval_master_card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(155m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowPartialAuth(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("10", chargeResponse.ResponseCode);
+ Assert.AreEqual(100.00m, chargeResponse.AuthorizedAmount);
+
+ // test case 36
+ var voidResponse = chargeResponse.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ // LEVEL II CORPORATE PURCHASE CARD
+
+ [TestMethod]
+ public void ecomm_021_level_ii_response_b() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("B", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_022_level_ii_response_b() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("B", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_023_level_ii_response_r() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(123.45m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("R", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT);
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_024_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(134.56m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_025_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.06m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_026_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_027_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.08m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_028_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.09m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_029_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.10m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_030_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.11m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_031_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.12m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_032_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.13m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ // PRIOR / VOICE AUTHORIZATION
+
+ [TestMethod]
+ public void ecomm_033_offline_sale() {
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(17.10m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithOfflineAuthCode("654321")
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_033_offline_authorization() {
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Authorize(17.10m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithOfflineAuthCode("654321")
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RETURN
+
+ [TestMethod]
+ public void ecomm_034_offline_credit_return() {
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Refund(15.15m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_034b_offline_credit_return() {
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Refund(15.16m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // ONLINE VOID / REVERSAL
+
+ [TestMethod]
+ public void ecomm_035_void_ecomm_10() {
+ // see test case 10
+ }
+
+ [TestMethod]
+ public void ecomm_036_void_ecomm_20() {
+ // see test case 20
+ }
+
+ // Time Out Reversal
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void ecomm_036b_timeout_reversal() {
+ var sale = TestCards.VisaManual().Charge(911m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithClientTransactionId("987321654")
+ .Execute();
+ Assert.IsNotNull(sale);
+ Assert.AreEqual("91", sale.ResponseCode);
+
+ var response = Transaction.FromId(null, PaymentMethodType.Credit);
+ response.ClientTransactionId = "987321654";
+
+ var reversalResponse = response.Reverse(911m).Execute();
+ }
+
+ // One time bill payment
+
+ [TestMethod]
+ public void ecomm_010_charge_visa_onetime() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual();
+
+ var response = card.Charge(13.11m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 35
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_011_charge_mastercard_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+ var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual();
+
+ var chargeResponse = card.Charge(13.12m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_012_charge_discover_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual();
+
+ var chargeResponse = card.Charge(13.13m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_013_charge_amex_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual();
+
+ var chargeResponse = card.Charge(13.14m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_014_charge_jcb_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "3566007770007321",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(13.15m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ // HMS GIFT - REWARDS
+
+ // ACTIVATE
+
+ [TestMethod]
+ public void ecomm_042_activate_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.Activate(6.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_043_activate_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.Activate(7.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // LOAD / ADD VALUE
+
+ [TestMethod]
+ public void ecomm_044_add_value_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.Activate(8.00m).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_045_add_value_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.Activate(8.00m).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // BALANCE INQUIRY
+
+ [TestMethod]
+ public void ecomm_046_balance_inquiry_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_047_balance_inquiry_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ // REPLACE / TRANSFER
+
+ [TestMethod]
+ public void ecomm_048_replace_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard1.ReplaceWith(giftCard2).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_049_replace_gift_2() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.ReplaceWith(giftCard1).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ // SALE / REDEEM
+
+ [TestMethod]
+ public void ecomm_050_sale_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.Charge(1.0m)
+ .WithCurrency("USD")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_051_sale_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.Charge(2.0m)
+ .WithCurrency("USD")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_052_sale_gift_1_void() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var saleResponse = giftCard1.Charge(3.0m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+
+ // test case 54
+ var voidResponse = saleResponse.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_053_sale_gift_2_reversal() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var saleResponse = giftCard2.Charge(4.0m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+
+ // test case 55
+ var reverseResponse = saleResponse.Reverse(4.0m).Execute();
+ Assert.IsNotNull(reverseResponse);
+ Assert.AreEqual("00", reverseResponse.ResponseCode);
+ }
+
+ // VOID
+
+ [TestMethod]
+ public void ecomm_054_void_gift() {
+ // see test case 52
+ }
+
+ // REVERSAL
+
+ [TestMethod]
+ public void ecomm_055_reversal_gift() {
+ // see test case 53
+ }
+
+ [TestMethod]
+ public void ecomm_056_reversal_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Reverse(2.0m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // DEACTIVATE
+
+ [TestMethod]
+ public void ecomm_057_deactivate_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RECEIPTS MESSAGING
+
+ // ecomm_058_receipts_messaging: print and scan receipt for test 51
+
+ // BALANCE INQUIRY
+
+ [TestMethod]
+ public void ecomm_059_balance_inquiry_rewards_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(0.00m, response.PointsBalanceAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_060_balance_inquiry_rewards_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(0.00m, response.PointsBalanceAmount);
+ }
+
+ // ALIAS
+
+ [TestMethod]
+ public void ecomm_061_create_alias_gift_1() {
+ var card = GiftCard.Create("9725550100");
+ Assert.IsNotNull(card);
+ }
+
+ [TestMethod]
+ public void ecomm_062_create_alias_gift_2() {
+ var card = GiftCard.Create("9725550100");
+ Assert.IsNotNull(card);
+ }
+
+ [TestMethod]
+ public void ecomm_063_add_alias_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.AddAlias("2145550199").Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_064_add_alias_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.AddAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_065_delete_alias_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.RemoveAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ // SALE / REDEEM
+
+ [TestMethod]
+ public void ecomm_066_redeem_points_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Charge(100m)
+ .WithCurrency("POINTS")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ [TestMethod]
+ public void ecomm_067_redeem_points_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Charge(200m)
+ .WithCurrency("POINTS")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ [TestMethod]
+ public void ecomm_068_redeem_points_gift_2() {
+ var giftCard = new GiftCard { Alias = "9725550100" };
+
+ var response = giftCard.Charge(300.00m)
+ .WithCurrency("POINTS")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ // REWARDS
+
+ [TestMethod]
+ public void ecomm_069_rewards_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Rewards(10.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_070_rewards_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Rewards(11.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // REPLACE / TRANSFER
+
+ [TestMethod]
+ public void ecomm_071_replace_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard1.ReplaceWith(giftCard2).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_072_replace_gift_2() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.ReplaceWith(giftCard1).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // DEACTIVATE
+
+ [TestMethod]
+ public void ecomm_073_deactivate_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_074_deactivate_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RECEIPTS MESSAGING
+
+ // ecomm_075_receipts_messaging: print and scan receipt for test 51
+
+ // CLOSE BATCH
+
+ [TestMethod]
+ public void ecomm_999_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs
new file mode 100644
index 00000000..0cf25a2a
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class EcomCheckCertification {
+ Address address;
+
+ public EcomCheckCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
+ });
+
+ address = new Address {
+ StreetAddress1 = "6860 Dallas Pkwy",
+ City = "Dallas",
+ State = "TX",
+ PostalCode = "75024"
+ };
+ }
+
+ [TestMethod]
+ public void ecomm_001_PersonalChecking() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.PERSONAL,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "John Doe",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(19m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 1: " + response.TransactionId);
+ }
+
+ [TestMethod]
+ public void ecomm_002_BusinessChecking() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.BUSINESS,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "Acme Unlimited",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(20m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 2: " + response.TransactionId);
+ }
+
+ [TestMethod]
+ public void ecomm_003_PersonalSavings() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.SAVINGS,
+ CheckType = CheckType.PERSONAL,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "John Doe",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(21m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 3: " + response.TransactionId);
+
+ Transaction voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ Debug.WriteLine("Test 5: " + voidResponse.TransactionId);
+ }
+
+ [TestMethod]
+ public void ecomm_004_BusinessSavings() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.SAVINGS,
+ CheckType = CheckType.BUSINESS,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "Acme Unlimited",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(22m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 4: " + response.TransactionId);
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs
new file mode 100644
index 00000000..5486294a
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs
@@ -0,0 +1,2392 @@
+using System;
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Tests.TestData;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class LodgingCertification {
+ private CreditCardData card;
+ private CreditTrackData track;
+
+ public LodgingCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SiteId = 144101,
+ LicenseId = 144012,
+ DeviceId = 6402470,
+ Username = "701395572",
+ Password = "$Test1234",
+ ServiceUrl = "https://cert.api2-c.heartlandportico.com",
+ DeveloperId = "002914",
+ VersionNumber = "4268"
+ });
+ }
+
+ [TestMethod]
+ public void Lodging_000_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ /*
+ Check In/Check Out (Single Stay) - SALE : SWIPED
+ */
+ [TestMethod]
+ public void Lodging_001_SaleVisaSwiped_SingleStay() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Charge(10m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_002a_SaleMasterSwiped_SingleStay() {
+ track = TestCards.MasterCardSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Charge(11m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_002b_SaleMaster24Swiped_SingleStay() {
+ track = TestCards.MasterCard24Swipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Charge(11.50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_003_SaleDiscoverSwiped_SingleStay() {
+ track = TestCards.DiscoverSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Charge(12m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_004_SaleAmexSwiped_SingleStay() {
+ track = TestCards.AmexSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Charge(13m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_005_SaleJcbSwiped_SingleStay() {
+ track = TestCards.JcbSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Charge(14m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ Check In/Check Out (Single Stay) - SALE : KEYED, CARD PRESENT
+ */
+ [TestMethod]
+ public void Lodging_006_SaleVisaKeyed_CardPresent_SingleStay() {
+ card = TestCards.VisaManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(15m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_007a_SaleMasterKeyed_CardPresent_SingleStay() {
+ card = TestCards.MasterCardManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(16m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_007b_SaleMaster2SeriesKeyed_CardPresent_SingleStay() {
+ card = TestCards.MasterCardSeries2Manual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(16.50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_008_SaleDiscoverManualKeyed_CardPresent_SingleStay() {
+ card = TestCards.DiscoverManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(17m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_009_SaleAmexManualKeyed_CardPresent_SingleStay() {
+ card = TestCards.AmexManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(18m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_010_SaleJcbManualKeyed_CardPresent_SingleStay() {
+ card = TestCards.JcbManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(19m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ Check In/Check Out (Single Stay) - SALE : KEYED, CARD NOT PRESENT
+ */
+ [TestMethod]
+ public void Lodging_011_SaleVisaManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.VisaManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(20m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_012a_SaleMasterManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.MasterCardManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(21m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_012b_SaleMaster2SeriesManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.MasterCardSeries2Manual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(21.50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_013_SaleDiscoverManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.DiscoverManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(22m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_014_SaleAmexManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.AmexManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(23m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_015_SaleJcbManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.JcbManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Charge(24m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ Contactless
+ Check In/Check Out - AUTHORIZATIONS : SWIPED
+ */
+ [TestMethod]
+ public void Lodging_016_AuthVisaSwiped_SingleStay() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Authorize(25m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // capture
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_017a_AuthMasterSwiped_SingleStay() {
+ track = TestCards.MasterCardSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Authorize(26m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_017b_AuthMaster24Swiped_SingleStay() {
+ track = TestCards.MasterCard24Swipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Authorize(26.50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_018_AuthDiscoverSwiped_SingleStay() {
+ track = TestCards.DiscoverSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Authorize(27m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_019_AuthAmexSwiped_SingleStay() {
+ track = TestCards.AmexSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Authorize(28m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_020_AuthJcbSwiped_SingleStay() {
+ track = TestCards.JcbSwipe();
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = track.Authorize(29m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ Check In/Check Out - AUTHORIZATIONS : KEYED, CARD PRESENT
+ */
+ [TestMethod]
+ public void Lodging_021_AuthVisaKeyed_CardPresent_SingleStay() {
+ card = TestCards.VisaManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(30m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_022_AuthMasterKeyed_CardPresent_SingleStay() {
+ card = TestCards.MasterCardManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(31m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_023_AuthDiscoverKeyed_CardPresent_SingleStay() {
+ card = TestCards.DiscoverManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(32m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_024_AuthAmexKeyed_CardPresent_SingleStay() {
+ card = TestCards.AmexManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(33m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_025_AuthJcbKeyed_CardPresent_SingleStay() {
+ card = TestCards.JcbManual(true, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(34m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ Check In/Check Out - AUTHORIZATIONS : KEYED, CARD NOT PRESENT
+ */
+ [TestMethod]
+ public void Lodging_026_AuthVisaManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.VisaManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(35m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_027_AuthMasterManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.MasterCardManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(36m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_028_AuthDiscoverManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.DiscoverManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(37m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_029_AuthAmexManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.AmexManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(38m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_030_AuthJcbManualKeyed_CardNotPresent_SingleStay() {
+ card = TestCards.JcbManual(false, true);
+
+ var lodgingData = new LodgingData { StayDuration = 1 };
+
+ Transaction response = card.Authorize(39m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ Advanced Deposit - SALES
+ */
+ [TestMethod]
+ public void Lodging_031_SaleVisaManualKeyed_AdvancedDeposit() {
+ card = TestCards.VisaManual(false, true);
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ AdvancedDepositType = AdvancedDepositType.CARD_DEPOSIT
+ };
+
+ Transaction response = card.Charge(41m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_032_SaleAmexManualKeyed_AdvancedDeposit() {
+ card = TestCards.AmexManual(false, true);
+
+ var lodgingData = new LodgingData {
+ StayDuration = 2,
+ AdvancedDepositType = AdvancedDepositType.CARD_DEPOSIT
+ };
+
+ Transaction response = card.Charge(80m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ No Show - SALES
+ */
+ [TestMethod]
+ public void Lodging_033_SaleMasterManualKeyed_NoShow() {
+ card = TestCards.MasterCardManual(false, true);
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ NoShow = true
+ };
+
+ Transaction response = card.Charge(42m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_034_SaleAmexManualKeyed_NoShow() {
+ card = TestCards.AmexManual(false, true);
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ AdvancedDepositType = AdvancedDepositType.ASSURED_RESERVATION,
+ NoShow = true
+ };
+
+ Transaction response = card.Charge(43m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ Visa Prestigious Property - SALES
+ */
+ [TestMethod]
+ public void Lodging_035_SaleVisaSwiped_PrestigiousProperty() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_500
+ };
+
+ Transaction response = track.Charge(44m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_036_SaleVisaSwiped_PrestigiousProperty() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1000
+ };
+
+ Transaction response = track.Charge(45m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_037_SaleVisaSwiped_PrestigiousProperty() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1500
+ };
+
+ Transaction response = track.Charge(46m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ Visa Prestigious Property - AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_038_AuthVisaSwiped_PrestigiousProperty() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_500
+ };
+
+ Transaction response = track.Authorize(44m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_039_AuthVisaSwiped_PrestigiousProperty() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1000
+ };
+
+ Transaction response = track.Authorize(45m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_040_AuthVisaSwiped_PrestigiousProperty() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1500
+ };
+
+ Transaction response = track.Authorize(46m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ MasterCard Preferred Customer - SALES
+ */
+ [TestMethod]
+ public void Lodging_041_SaleMasterSwiped_PreferredCustomer() {
+ track = TestCards.MasterCardSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PreferredCustomer = true
+ };
+
+ Transaction response = track.Charge(47m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_042_SaleMasterManualKeyed_PreferredCustomer() {
+ card = TestCards.MasterCardManual(false, true);
+
+ var lodgingData = new LodgingData {
+ StayDuration = 2,
+ PreferredCustomer = true
+ };
+
+ Transaction response = card.Charge(48m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ MasterCard Preferred Customer - AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_043_AuthMasterSwiped_PreferredCustomer() {
+ track = TestCards.MasterCardSwipe();
+
+ var lodgingData = new LodgingData {
+ StayDuration = 1,
+ PreferredCustomer = true
+ };
+
+ Transaction response = track.Authorize(47m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_044_AuthMasterManualKeyed_PreferredCustomer() {
+ card = TestCards.MasterCardManual(false, true);
+
+ var lodgingData = new LodgingData {
+ StayDuration = 2,
+ PreferredCustomer = true
+ };
+
+ Transaction response = card.Authorize(48m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ Additional / Extra Charges - SALES
+ */
+ [TestMethod]
+ public void Lodging_045_SaleVisaSwiped_ExtraCharges() {
+ track = TestCards.VisaSwipe();
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.Restaurant);
+
+ Transaction response = track.Charge(49m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_045a_SaleVisaSwiped_ExtraChargesEdit() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(49m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.Restaurant);
+
+ Transaction editResponse = response.Edit()
+ .WithAmount(49m)
+ .WithCurrency("USD")
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(editResponse);
+ Assert.AreEqual("00", editResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_046_SaleMasterSwiped_ExtraCharges() {
+ track = TestCards.MasterCardSwipe();
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.GiftShop)
+ .AddExtraCharge(ExtraChargeType.MiniBar)
+ .AddExtraCharge(ExtraChargeType.Telephone);
+
+ Transaction response = track.Charge(50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_046a_SaleMasterSwiped_ExtraChargesEdit() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Charge(50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.GiftShop)
+ .AddExtraCharge(ExtraChargeType.MiniBar)
+ .AddExtraCharge(ExtraChargeType.Telephone);
+
+ Transaction editResponse = response.Edit()
+ .WithAmount(50m)
+ .WithCurrency("USD")
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(editResponse);
+ Assert.AreEqual("00", editResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_047_SaleDiscoverSwiped_ExtraCharges() {
+ track = TestCards.DiscoverSwipe();
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.Laundry);
+
+ Transaction response = track.Charge(51m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_047a_SaleDiscoverSwiped_ExtraChargesEdit() {
+ track = TestCards.DiscoverSwipe();
+
+ Transaction response = track.Charge(51m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.Laundry);
+
+ Transaction editResponse = response.Edit()
+ .WithAmount(50m)
+ .WithCurrency("USD")
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(editResponse);
+ Assert.AreEqual("00", editResponse.ResponseCode);
+ }
+
+ /*
+ Additional / Extra Charges - AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_048_AuthVisaSwiped_ExtraCharges() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Authorize(49m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.Restaurant);
+
+ Transaction captureResponse = response.Capture()
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_049_AuthMasterSwiped_ExtraCharges() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Authorize(50m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.GiftShop)
+ .AddExtraCharge(ExtraChargeType.MiniBar)
+ .AddExtraCharge(ExtraChargeType.Telephone);
+
+ Transaction captureResponse = response.Capture()
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_050_AuthDiscoverSwiped_ExtraCharges() {
+ track = TestCards.DiscoverSwipe();
+
+ Transaction response = track.Authorize(51m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var lodgingData = new LodgingData()
+ .AddExtraCharge(ExtraChargeType.Laundry);
+
+ Transaction captureResponse = response.Capture()
+ .WithLodgingData(lodgingData)
+ .Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ /*
+ Partial Approvals - SALES
+ */
+ [TestMethod]
+ public void Lodging_051_SaleMasterSwiped_PartialApproval() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Charge(130m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void Lodging_052_SaleDiscoverManualKeyed_PartialApproval() {
+ card = TestCards.DiscoverManual(true, true);
+
+ Transaction response = card.Charge(145m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(65m, response.AuthorizedAmount);
+ }
+
+ /*
+ Partial Approvals - AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_053_AuthMasterSwiped_PartialApproval() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Authorize(130m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110m, response.AuthorizedAmount);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_054_AuthDiscoverManualKeyed_PartialApproval() {
+ card = TestCards.DiscoverManual(true, true);
+
+ Transaction response = card.Authorize(145m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(65m, response.AuthorizedAmount);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ CARD VERIFY
+ */
+ [TestMethod]
+ public void Lodging_055_VerifyVisaSwiped() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Verify()
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_056_VerifyMasterManualKeyed() {
+ card = TestCards.MasterCardManual(false, true);
+
+ Transaction response = card.Verify()
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_057_VerifyDiscoverSwiped() {
+ track = TestCards.DiscoverSwipe();
+
+ Transaction response = track.Verify()
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ FORCE / VOICE AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_058_OfflineAuth() {
+ card = TestCards.VisaManual(true, true);
+
+ Transaction response = card.Authorize(52m)
+ .WithCurrency("USD")
+ .WithOfflineAuthCode("654321")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ RETURN
+ */
+ [TestMethod]
+ public void Lodging_059_ReturnByCard() {
+ card = TestCards.DiscoverManual(false, true);
+
+ Transaction response = card.Refund(53m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ RETURN by TxnID
+ */
+ [TestMethod]
+ public void Lodging_059a_ReturnByTxnId_Visa() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(53m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction refund = response.Refund(53m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(refund);
+ Assert.AreEqual("00", refund.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_059b_ReturnByTxnId_MasterCard() {
+ card = TestCards.MasterCardManual(true, true);
+
+ Transaction response = card.Charge(54m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction refund = response.Refund(54m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(refund);
+ Assert.AreEqual("00", refund.ResponseCode);
+ }
+
+ /*
+ LEVEL II Corporate Purchase Card - SALES
+ */
+ [TestMethod]
+ public void Lodging_060_LevelII_Sale_Visa_TaxNotUsed() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("B", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_061_LevelII_Sale_Visa_SalesTax() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("R", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_062_LevelII_Sale_Visa_TaxExempt() {
+ card = TestCards.VisaManual(true, true);
+
+ Transaction response = card.Charge(123.45m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("R", response.CommercialIndicator);
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT))
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_063_LevelII_Sale_VisaManual_SalesTax() {
+ card = TestCards.VisaManual(true, true);
+
+ Transaction response = card.Charge(134.56m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_064_LevelII_Sale_Master_TaxNotUsed() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Charge(111.06m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_065_LevelII_Sale_Master_SalesTax() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Charge(111.07m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_066_LevelII_Sale_MasterManual_SalesTax() {
+ card = TestCards.MasterCardManual(true, true);
+
+ Transaction response = card.Charge(111.08m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_067_LevelII_Sale_MasterManual_TaxExempt() {
+ card = TestCards.MasterCardManual(true, true);
+
+ Transaction response = card.Charge(111.09m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_068_LevelII_Sale_Amex_SalesTax() {
+ track = TestCards.AmexSwipe();
+
+ Transaction response = track.Charge(111.10m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_069_LevelII_Sale() {
+ track = TestCards.AmexSwipe();
+
+ Transaction response = track.Charge(111.11m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_070_LevelII_Sale_Amex_TaxNotUsed() {
+ card = TestCards.AmexManual(true, true);
+
+ Transaction response = card.Charge(111.12m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_071_LevelII_Sale_AmexManual_TaxExempt() {
+ card = TestCards.AmexManual(true, true);
+
+ Transaction response = card.Charge(111.13m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+ }
+
+ /*
+ LEVEL II Corporate Purchase Card - AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_072_LevelII_Authorization_Visa_TaxNotUsed() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Authorize(112.34m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("B", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_073_LevelII_Authorization_Visa_SalesTax() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Authorize(112.34m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("B", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_074_LevelII_Authorization_VisaManual_TaxExempt() {
+ card = TestCards.VisaManual(true, true);
+
+ Transaction response = card.Authorize(123.45m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("R", response.CommercialIndicator);
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT))
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_075_LevelII_Authorization_VisaManual_SalesTax() {
+ card = TestCards.VisaManual(true, true);
+
+ Transaction response = card.Authorize(134.56m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_076_LevelII_Authorization_Master_TaxNotUsed() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Authorize(111.06m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_077_LevelII_Authorization_Master_SalesTax() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Authorize(111.07m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_078_LevelII_Authorization_MasterManual_SalesTax() {
+ card = TestCards.MasterCardManual(true, true);
+
+ Transaction response = card.Authorize(111.08m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_079_LevelII_Authorization_MasterManual_TaxExempt() {
+ card = TestCards.MasterCardManual(true, true);
+
+ Transaction response = card.Authorize(111.09m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_080_LevelII_Authorization_Amex_SalesTax() {
+ track = TestCards.AmexSwipe();
+
+ Transaction response = track.Authorize(111.10m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m,
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_081_LevelII_Authorization() {
+ track = TestCards.AmexSwipe();
+
+ Transaction response = track.Authorize(111.11m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_082_LevelII_Authorization_AmexManual_TaxNotUsed() {
+ card = TestCards.AmexManual(true, true);
+
+ Transaction response = card.Authorize(111.12m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_083_LevelII_Authorization_AmexManual_TaxExempt() {
+ card = TestCards.AmexManual(true, true);
+
+ Transaction response = card.Authorize(111.13m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ Transaction edit = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(edit);
+ Assert.AreEqual("00", edit.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ Incremental Authorizations - SALES
+ */
+ [TestMethod]
+ public void Lodging_084_IncrementalAuth_VisaSale() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(115m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction incremental = response.Increment(23m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(incremental);
+ Assert.AreEqual("00", incremental.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_085_IncrementalAuth_MasterSale() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Charge(116m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction incremental = response.Increment(24m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(incremental);
+ Assert.AreEqual("00", incremental.ResponseCode);
+ }
+
+ /*
+ Incremental Authorizations - AUTHORIZATIONS
+ */
+ [TestMethod]
+ public void Lodging_086_IncrementalAuth_VisaAuth() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Authorize(115m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction incremental = response.Increment(23m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(incremental);
+ Assert.AreEqual("00", incremental.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_087_IncrementalAuth_MasterAuth() {
+ track = TestCards.MasterCardSwipe();
+
+ Transaction response = track.Authorize(116m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction incremental = response.Increment(24m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(incremental);
+ Assert.AreEqual("00", incremental.ResponseCode);
+
+ Transaction capture = response.Capture().Execute();
+ Assert.IsNotNull(capture);
+ Assert.AreEqual("00", capture.ResponseCode);
+ }
+
+ /*
+ ONLINE VOID / REVERSAL (Required)
+ */
+ [TestMethod]
+ public void Lodging_088_OnlineVoid_Visa() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(122m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction reversal = response.Void().Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_089_OnlineVoid_Master() {
+ card = TestCards.MasterCardManual(true, true);
+
+ Transaction response = card.Charge(124m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction reversal = response.Void().Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_090_OnlineVoid_DiscoverManual() {
+ card = TestCards.DiscoverManual(false, true);
+
+ Transaction response = card.Charge(125m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction reversal = response.Void().Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_091_OnlineVoid_Discover() {
+ track = TestCards.DiscoverSwipe();
+
+ Transaction response = track.Charge(155m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(100m, response.AuthorizedAmount);
+
+ Transaction reversal = response.Reverse(100m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ /*
+ ONLINE VOID / REVERSAL FOR INCREMENTALS
+ */
+ [TestMethod]
+ public void Lodging_092_IncrementalReversal_Visa() {
+ track = TestCards.VisaSwipe();
+
+ Transaction response = track.Charge(126m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction firstIncrement = response.Increment(26m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(firstIncrement);
+ Assert.AreEqual("00", firstIncrement.ResponseCode);
+
+ Transaction secondIncrement = response.Increment(31m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(secondIncrement);
+ Assert.AreEqual("00", secondIncrement.ResponseCode);
+
+ Transaction reversal = response.Reverse(126m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_093_IncrementalReversal_Discover() {
+ track = TestCards.DiscoverSwipe();
+
+ Transaction response = track.Charge(127m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction firstIncrement = response.Increment(27m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(firstIncrement);
+ Assert.AreEqual("00", firstIncrement.ResponseCode);
+
+ Transaction secondIncrement = response.Increment(32m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(secondIncrement);
+ Assert.AreEqual("00", secondIncrement.ResponseCode);
+
+ Transaction reversal = response.Reverse(127m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ /*
+ PIN DEBIT CARD FUNCTIONS - SALE
+ */
+ [TestMethod]
+ public void Lodging_094_DebitSale_Visa() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA");
+
+ Transaction response = track.Charge(139m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_095_DebitSale_Master() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB");
+
+ Transaction response = track.Charge(135m)
+ .WithCurrency("USD")
+ .WithCashBack(5m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ PARTIALLY - APPROVED PURCHASE
+ */
+ [TestMethod]
+ public void Lodging_096_DebitPartialApproval() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB");
+
+ Transaction response = track.Charge(33m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(22m, response.AuthorizedAmount); ;
+ }
+
+ [TestMethod]
+ public void Lodging_096a_DebitPartialApproval() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA");
+
+ Transaction response = track.Charge(44m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(33m, response.AuthorizedAmount);
+ }
+ /*
+ RETURN
+ */
+ [TestMethod]
+ public void Lodging_097_DebitReturn() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA");
+
+ Transaction response = track.Refund(40m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ ONLINE VOID / REVERSAL (Required)
+ */
+ [TestMethod]
+ public void Lodging_098_DebitReversal_Visa() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA");
+
+ Transaction response = track.Charge(142m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction reversal = track.Reverse(142m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_099_DebitReversal_Master() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB");
+
+ Transaction response = track.Charge(44m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+
+ Transaction reversal = track.Reverse(33m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ /*
+ CONTACTLESS - Sales
+ */
+ [TestMethod]
+ public void Lodging_100_ContactlessSale_Visa() {
+ track = TestCards.VisaSwipe(EntryMethod.Proximity);
+
+ Transaction response = track.Charge(6m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_101_ContactlessSale_Master() {
+ track = TestCards.MasterCardSwipe(EntryMethod.Proximity);
+
+ Transaction response = track.Charge(6m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_102_ContactlessSale_Discover()
+ {
+ track = TestCards.DiscoverSwipe(EntryMethod.Proximity);
+
+ Transaction response = track.Charge(6m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_103_ContactlessSale_Amex() {
+ track = TestCards.AmexSwipe(EntryMethod.Proximity);
+
+ Transaction response = track.Charge(9m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ TIME OUT REVERSAL (TOR)
+ */
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void Lodging_104_TimeOutReversal_Discover() {
+ track = TestCards.DiscoverSwipe();
+
+ string clientTransactionId = new Random().Next(10000000, 90000000).ToString();
+
+ track.Charge(10.33m)
+ .WithCurrency("USD")
+ .WithClientTransactionId(clientTransactionId)
+ .Execute();
+
+ var response = Transaction.FromId(null, PaymentMethodType.Credit);
+ response.ClientTransactionId = clientTransactionId;
+
+ var reversalResponse = response.Reverse(10.33m).Execute();
+ Assert.IsNotNull(reversalResponse);
+ Assert.AreEqual("00", reversalResponse.ResponseCode);
+ }
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void Lodging_105_TimeOutReversal_Master() {
+ track = TestCards.MasterCardSwipe();
+
+ string clientTransactionId = new Random().Next(10000000, 90000000).ToString();
+
+ track.Charge(10.33m)
+ .WithCurrency("USD")
+ .WithClientTransactionId(clientTransactionId)
+ .Execute();
+
+ var response = Transaction.FromId(null, PaymentMethodType.Credit);
+ response.ClientTransactionId = clientTransactionId;
+
+ var reversalResponse = response.Reverse(10.33m).Execute();
+ Assert.IsNotNull(reversalResponse);
+ Assert.AreEqual("00", reversalResponse.ResponseCode);
+ }
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void Lodging_106_TimeOutReversal_Jcb() {
+ track = TestCards.JcbSwipe();
+
+ string clientTransactionId = new Random().Next(10000000, 90000000).ToString();
+
+ track.Charge(10.33m)
+ .WithCurrency("USD")
+ .WithClientTransactionId(clientTransactionId)
+ .Execute();
+
+ var response = Transaction.FromId(null, PaymentMethodType.Credit);
+ response.ClientTransactionId = clientTransactionId;
+
+ var reversalResponse = response.Reverse(10.33m).Execute();
+ Assert.IsNotNull(reversalResponse);
+ Assert.AreEqual("00", reversalResponse.ResponseCode);
+ }
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void Lodging_107_TimeOutReversal_Visa() {
+ track = TestCards.VisaSwipe();
+
+ string clientTransactionId = new Random().Next(10000000, 90000000).ToString();
+
+ track.Charge(10.33m)
+ .WithCurrency("USD")
+ .WithClientTransactionId(clientTransactionId)
+ .Execute();
+
+ var response = Transaction.FromId(null, PaymentMethodType.Credit);
+ response.ClientTransactionId = clientTransactionId;
+
+ var reversalResponse = response.Reverse(10.33m).Execute();
+ Assert.IsNotNull(reversalResponse);
+ Assert.AreEqual("00", reversalResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_999_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ /*
+ Per GSTP ISO Lodging MSRDebit Purchase with Cash Back
+ */
+
+ [TestMethod]
+ public void Lodging_246_DebitSale_Master() {
+ DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB");
+
+ Transaction response = track.Charge(3.73m)
+ .WithCurrency("USD")
+ .WithCashBack(0.40m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void Lodging_247_DebitSaleVisaKeyed_CardPresent() {
+ card = TestCards.VisaManual(true, true);
+
+ Transaction response = card.Charge(3.70m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ Transaction duplicateResponse = card.Charge(3.70m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", duplicateResponse.ResponseCode);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs
new file mode 100644
index 00000000..dcc6de75
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs
@@ -0,0 +1,1496 @@
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Tests.TestData;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class MotoCertification {
+ bool useTokens = false;
+
+ string visa_token;
+ string mastercard_token;
+ string discover_token;
+ string amex_token;
+
+ EcommerceInfo ecom = new EcommerceInfo {
+ Channel = EcommerceChannel.ECOM
+ };
+
+ public MotoCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ"
+ });
+ }
+
+ [TestMethod]
+ public void ecomm_000_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ [TestMethod]
+ public void ecomm_001_verify_visa() {
+ var card = new CreditCardData {
+ Number = "4484958240202792",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_002_verify_master_card() {
+ var card = new CreditCardData {
+ Number = "5356083898949891",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_003_verify_discover() {
+ var card = new CreditCardData {
+ Number = "6223971100014620",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithAddress(new Address { PostalCode = "75024" })
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // StreetAddress Verification
+
+ [TestMethod]
+ public void ecomm_004_verify_amex() {
+ var card = new CreditCardData {
+ Number = "345039962663847",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Verify()
+ .WithAddress(new Address { PostalCode = "75024" })
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Balance Inquiry (for Prepaid Card)
+
+ [TestMethod]
+ public void ecomm_005_balance_inquiry_visa() {
+ var card = new CreditCardData {
+ Number = "4664383951958601",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ // CREDIT SALE (For Multi-Use Token Only)
+
+ [TestMethod, Ignore]
+ public void ecomm_006_charge_visa_token() {
+ var address = new Address {
+ StreetAddress1 = "6860 Dallas Pkwy",
+ PostalCode = "75024"
+ };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025
+ };
+
+ var response = card.Charge(13.01m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ visa_token = response.Token;
+ }
+
+ [TestMethod, Ignore]
+ public void ecomm_007_charge_master_card_token() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(13.02m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ mastercard_token = response.Token;
+ }
+
+ [TestMethod, Ignore]
+ public void ecomm_008_charge_discover_token() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "6011000990156527",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(13.03m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ discover_token = response.Token;
+ }
+
+ [TestMethod, Ignore]
+ public void ecomm_009_charge_amex_token() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var response = card.Charge(13.04m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ amex_token = response.Token;
+ }
+
+ // CREDIT SALE
+
+ [TestMethod]
+ public void ecomm_010_charge_visa() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual();
+
+ var response = card.Charge(17.01m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 35
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_011_charge_master_card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual();
+
+ var chargeResponse = card.Charge(17.02m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_012_charge_discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+ var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual();
+
+ var chargeResponse = card.Charge(17.03m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_013_charge_amex() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual();
+
+ var chargeResponse = card.Charge(17.04m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_014_charge_jcb() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "3566007770007321",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(17.05m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_011b_charge_master_card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = TestCards.MasterCardSeries2Manual();
+
+ var chargeResponse = card.Charge(17.02m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ // AUTHORIZATION
+
+ [TestMethod]
+ public void ecomm_015_authorization_visa() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var authResponse = card.Authorize(17.06m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+
+ // test 015b Capture/AddToBatch
+ var captureResponse = authResponse.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_016_authorization_master_card() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var authResponse = card.Authorize(17.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+
+ // test 016b Capture/AddToBatch
+ var captureResponse = authResponse.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_017_authorization_discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "6011000990156527",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var authResponse = card.Authorize(17.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .Execute();
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_016b_authorization_master_card() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "2223000010005780",
+ ExpMonth = 12,
+ ExpYear = 2019,
+ Cvn = "900"
+ };
+
+ var authResponse = card.Authorize(17.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(authResponse);
+ Assert.AreEqual("00", authResponse.ResponseCode);
+
+ // test 016b Capture/AddToBatch
+ var captureResponse = authResponse.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ // PARTIALLY - APPROVED SALE
+
+ [TestMethod]
+ public void ecomm_018_partial_approval_visa() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(130m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowPartialAuth(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_019_partial_approval_discover() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "6011000990156527",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(145m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowPartialAuth(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(65.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_020_partial_approval_master_card() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(155m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithAllowPartialAuth(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("10", chargeResponse.ResponseCode);
+ Assert.AreEqual(100.00m, chargeResponse.AuthorizedAmount);
+
+ // test case 36
+ var voidResponse = chargeResponse.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ // LEVEL II CORPORATE PURCHASE CARD
+
+ [TestMethod]
+ public void ecomm_021_level_ii_response_b() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("B", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_022_level_ii_response_b() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithAllowDuplicates(true)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("B", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_023_level_ii_response_r() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(123.45m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("R", chargeResponse.CommercialIndicator);
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT))
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_024_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(134.56m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_025_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.06m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_026_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.07m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_027_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.08m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_028_level_ii_response_s() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(111.09m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("S", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_029_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.10m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_030_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.11m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_031_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.12m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_032_level_ii_no_response() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "372700699251018",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "1234"
+ };
+
+ var chargeResponse = card.Charge(111.13m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ Assert.AreEqual("0", chargeResponse.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = chargeResponse.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ // PRIOR / VOICE AUTHORIZATION
+
+ [TestMethod]
+ public void ecomm_033_offline_sale() {
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Charge(17.10m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithOfflineAuthCode("654321")
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_033_offline_authorization() {
+ var card = new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Authorize(17.10m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithOfflineAuthCode("654321")
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RETURN
+
+ [TestMethod]
+ public void ecomm_034_offline_credit_return() {
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Refund(15.15m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_034b_offline_credit_return() {
+ var card = new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var response = card.Refund(15.16m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithInvoiceNumber("123456")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // ONLINE VOID / REVERSAL
+
+ [TestMethod]
+ public void ecomm_035_void_ecomm_10() {
+ // see test case 10
+ }
+
+ [TestMethod]
+ public void ecomm_036_void_ecomm_20() {
+ // see test case 20
+ }
+
+ // Time Out Reversal
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void ecomm_036b_timeout_reversal() {
+ var sale = TestCards.VisaManual().Charge(911m)
+ .WithCurrency("USD")
+ .WithEcommerceInfo(ecom)
+ .WithClientTransactionId("987321654")
+ .Execute();
+ Assert.IsNotNull(sale);
+ Assert.AreEqual("91", sale.ResponseCode);
+
+ var response = Transaction.FromId(null, PaymentMethodType.Credit);
+ response.ClientTransactionId = "987321654";
+
+ var reversalResponse = response.Reverse(911m).Execute();
+ }
+
+ // One time bill payment
+
+ [TestMethod]
+ public void ecomm_010_charge_visa_onetime() {
+ var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual();
+
+ var response = card.Charge(13.11m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 35
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_011_charge_mastercard_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" };
+ var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual();
+
+ var chargeResponse = card.Charge(13.12m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_012_charge_discover_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual();
+
+ var chargeResponse = card.Charge(13.13m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_013_charge_amex_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+ var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual();
+
+ var chargeResponse = card.Charge(13.14m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_014_charge_jcb_onetime() {
+ var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" };
+
+ var card = new CreditCardData {
+ Number = "3566007770007321",
+ ExpMonth = 12,
+ ExpYear = 2025,
+ Cvn = "123"
+ };
+
+ var chargeResponse = card.Charge(13.15m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithInvoiceNumber("123456")
+ .WithOneTimePayment(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+
+ Assert.IsNotNull(chargeResponse);
+ Assert.AreEqual("00", chargeResponse.ResponseCode);
+ }
+
+ // HMS GIFT - REWARDS
+
+ // ACTIVATE
+
+ [TestMethod]
+ public void ecomm_042_activate_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.Activate(6.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_043_activate_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.Activate(7.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // LOAD / ADD VALUE
+
+ [TestMethod]
+ public void ecomm_044_add_value_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.Activate(8.00m).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_045_add_value_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.Activate(8.00m).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // BALANCE INQUIRY
+
+ [TestMethod]
+ public void ecomm_046_balance_inquiry_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_047_balance_inquiry_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ // REPLACE / TRANSFER
+
+ [TestMethod]
+ public void ecomm_048_replace_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard1.ReplaceWith(giftCard2).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_049_replace_gift_2() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.ReplaceWith(giftCard1).Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10m, response.BalanceAmount);
+ }
+
+ // SALE / REDEEM
+
+ [TestMethod]
+ public void ecomm_050_sale_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.Charge(1.0m)
+ .WithCurrency("USD")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_051_sale_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.Charge(2.0m)
+ .WithCurrency("USD")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_052_sale_gift_1_void() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var saleResponse = giftCard1.Charge(3.0m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+
+ // test case 54
+ var voidResponse = saleResponse.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_053_sale_gift_2_reversal() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var saleResponse = giftCard2.Charge(4.0m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+
+ // test case 55
+ var reverseResponse = saleResponse.Reverse(4.0m).Execute();
+ Assert.IsNotNull(reverseResponse);
+ Assert.AreEqual("00", reverseResponse.ResponseCode);
+ }
+
+ // VOID
+
+ [TestMethod]
+ public void ecomm_054_void_gift() {
+ // see test case 52
+ }
+
+ // REVERSAL
+
+ [TestMethod]
+ public void ecomm_055_reversal_gift() {
+ // see test case 53
+ }
+
+ [TestMethod]
+ public void ecomm_056_reversal_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Reverse(2.0m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // DEACTIVATE
+
+ [TestMethod]
+ public void ecomm_057_deactivate_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RECEIPTS MESSAGING
+
+ // ecomm_058_receipts_messaging: print and scan receipt for test 51
+
+ // BALANCE INQUIRY
+
+ [TestMethod]
+ public void ecomm_059_balance_inquiry_rewards_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(0.00m, response.PointsBalanceAmount);
+ }
+
+ [TestMethod]
+ public void ecomm_060_balance_inquiry_rewards_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+ var response = giftCard2.BalanceInquiry().Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(0.00m, response.PointsBalanceAmount);
+ }
+
+ // ALIAS
+
+ [TestMethod]
+ public void ecomm_061_create_alias_gift_1() {
+ var card = GiftCard.Create("9725550100");
+ Assert.IsNotNull(card);
+ }
+
+ [TestMethod]
+ public void ecomm_062_create_alias_gift_2() {
+ var card = GiftCard.Create("9725550100");
+ Assert.IsNotNull(card);
+ }
+
+ [TestMethod]
+ public void ecomm_063_add_alias_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var response = giftCard1.AddAlias("2145550199").Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_064_add_alias_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.AddAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_065_delete_alias_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.RemoveAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ // SALE / REDEEM
+
+ [TestMethod]
+ public void ecomm_066_redeem_points_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Charge(100m)
+ .WithCurrency("POINTS")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ [TestMethod]
+ public void ecomm_067_redeem_points_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Charge(200m)
+ .WithCurrency("POINTS")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ [TestMethod]
+ public void ecomm_068_redeem_points_gift_2() {
+ var giftCard = new GiftCard { Alias = "9725550100" };
+
+ var response = giftCard.Charge(300.00m)
+ .WithCurrency("POINTS")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ }
+
+ // REWARDS
+
+ [TestMethod]
+ public void ecomm_069_rewards_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Rewards(10.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_070_rewards_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Rewards(11.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // REPLACE / TRANSFER
+
+ [TestMethod]
+ public void ecomm_071_replace_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard1.ReplaceWith(giftCard2).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_072_replace_gift_2() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.ReplaceWith(giftCard1).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // DEACTIVATE
+
+ [TestMethod]
+ public void ecomm_073_deactivate_gift_1() {
+ var giftCard1 = new GiftCard { Number = "5022440000000000098" };
+
+ var response = giftCard1.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void ecomm_074_deactivate_gift_2() {
+ var giftCard2 = new GiftCard { Number = "5022440000000000007" };
+
+ var response = giftCard2.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RECEIPTS MESSAGING
+
+ // ecomm_075_receipts_messaging: print and scan receipt for test 51
+
+ // CLOSE BATCH
+
+ [TestMethod]
+ public void ecomm_999_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs
new file mode 100644
index 00000000..e0fc483a
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs
@@ -0,0 +1,121 @@
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class MotoCheckCertification {
+ Address address;
+
+ public MotoCheckCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ"
+ });
+
+ address = new Address {
+ StreetAddress1 = "6860 Dallas Pkwy",
+ City = "Dallas",
+ State = "TX",
+ PostalCode = "75024"
+ };
+ }
+
+ [TestMethod]
+ public void ecomm_001_PersonalChecking() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.PERSONAL,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "John Doe",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(19m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 1: " + response.TransactionId);
+ }
+
+ [TestMethod]
+ public void ecomm_002_BusinessChecking() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.BUSINESS,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "Acme Unlimited",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(20m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 2: " + response.TransactionId);
+ }
+
+ [TestMethod]
+ public void ecomm_003_PersonalSavings() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.SAVINGS,
+ CheckType = CheckType.PERSONAL,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "John Doe",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(21m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 3: " + response.TransactionId);
+
+ Transaction voidResponse = response.Void().Execute();
+ Assert.IsNotNull(voidResponse);
+ Assert.AreEqual("00", voidResponse.ResponseCode);
+ Debug.WriteLine("Test 5: " + voidResponse.TransactionId);
+ }
+
+ [TestMethod]
+ public void ecomm_004_BusinessSavings() {
+ eCheck check = new eCheck {
+ RoutingNumber = "490000018",
+ AccountNumber = "24413815",
+ AccountType = AccountType.SAVINGS,
+ CheckType = CheckType.BUSINESS,
+ SecCode = SecCode.WEB,
+ DriversLicenseNumber = "09876543210",
+ DriversLicenseState = "NJ",
+ CheckHolderName = "Acme Unlimited",
+ PhoneNumber = "5558675309"
+ };
+
+ Transaction response = check.Charge(22m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+ Debug.WriteLine("Test 4: " + response.TransactionId);
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs
new file mode 100644
index 00000000..723fe84c
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs
@@ -0,0 +1,480 @@
+using System;
+using GlobalPayments.Api;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Services;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class RecurringCertification {
+ private static Customer _customerPerson;
+ private static Customer _customerBusiness;
+ private static RecurringPaymentMethod _paymentMethodVisa;
+ private static RecurringPaymentMethod _paymentMethodMasterCard;
+ private static RecurringPaymentMethod _paymentMethodCheckPpd;
+ private static RecurringPaymentMethod _paymentMethodCheckCcd;
+ private static Schedule _scheduleVisa;
+ private static Schedule _scheduleMasterCard;
+ private static Schedule _scheduleCheckPpd;
+ private static Schedule _scheduleCheckCcd;
+
+ private static readonly string TodayDate = DateTime.Today.ToString("yyyyMMdd");
+ private static readonly string IdentifierBase = "{0}-{1}" + Guid.NewGuid().ToString().Substring(0, 10);
+
+ private static string GetIdentifier(string identifier) {
+ return string.Format(IdentifierBase, TodayDate, identifier);
+ }
+
+ public RecurringCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
+ });
+ }
+
+ [TestMethod, Ignore]
+ public void recurring_000_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ //Console.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ //Console.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ [TestMethod]
+ public void recurring_000_CleanUp() {
+ // Remove Schedules
+ try {
+ var schResults = Schedule.FindAll();
+ foreach (var schedule in schResults) {
+ schedule.Delete(true);
+ }
+ }
+ catch (ApiException exc) {
+ Assert.IsNotNull(exc);
+ }
+
+ // Remove Payment Methods
+ try {
+ var pmResults = RecurringPaymentMethod.FindAll();
+ foreach (var pm in pmResults) {
+ pm.Delete(true);
+ }
+ }
+ catch (ApiException exc) {
+ Assert.IsNotNull(exc);
+ }
+
+ // Remove Customers
+ try {
+ var custResults = Customer.FindAll();
+ foreach (var c in custResults) {
+ c.Delete(true);
+ }
+ }
+ catch (ApiException exc) {
+ Assert.IsNotNull(exc);
+ }
+ }
+
+ // CUSTOMER SETUP
+
+ [TestMethod]
+ public void recurring_001_AddCustomerPerson() {
+ var customer = new Customer {
+ Id = GetIdentifier("Person"),
+ FirstName = "John",
+ LastName = "Doe",
+ Status = "Active",
+ Email = "john.doe@email.com",
+ Address = new Address {
+ StreetAddress1 = "123 Main St",
+ City = "Dallas",
+ State = "TX",
+ PostalCode = "98765",
+ Country = "USA"
+ },
+ WorkPhone = "5551112222"
+ }.Create();
+ Assert.IsNotNull(customer);
+ Assert.IsNotNull(customer.Key);
+ _customerPerson = customer;
+ }
+
+ [TestMethod]
+ public void recurring_002_AddCustomerBusiness() {
+ var customer = new Customer {
+ Id = GetIdentifier("Business"),
+ Company = "AcmeCo",
+ Status = "Active",
+ Email = "acme@email.com",
+ Address = new Address {
+ StreetAddress1 = "987 Elm St",
+ City = "Princeton",
+ State = "NJ",
+ PostalCode = "12345",
+ Country = "USA"
+ },
+ WorkPhone = "5551112222"
+ }.Create();
+ Assert.IsNotNull(customer);
+ Assert.IsNotNull(customer.Key);
+ _customerBusiness = customer;
+ }
+
+ // PAYMENT METHOD SETUP
+
+ [TestMethod]
+ public void recurring_003_AddPaymentCreditVisa() {
+ if (_customerPerson == null)
+ Assert.Inconclusive();
+
+ var paymentMethod = _customerPerson.AddPaymentMethod(GetIdentifier("CreditV"), new CreditCardData {
+ Number = "4012002000060016",
+ ExpMonth = 12,
+ ExpYear = 2025
+ }).Create();
+ Assert.IsNotNull(paymentMethod);
+ Assert.IsNotNull(paymentMethod.Key);
+ _paymentMethodVisa = paymentMethod;
+ }
+
+ [TestMethod]
+ public void recurring_004_AddPaymentCreditMasterCard() {
+ if (_customerPerson == null)
+ Assert.Inconclusive();
+
+ var paymentMethod = _customerPerson.AddPaymentMethod(
+ GetIdentifier("CreditMC"),
+ new CreditCardData {
+ Number = "5473500000000014",
+ ExpMonth = 12,
+ ExpYear = 2025
+ }).Create();
+ Assert.IsNotNull(paymentMethod);
+ Assert.IsNotNull(paymentMethod.Key);
+ _paymentMethodMasterCard = paymentMethod;
+ }
+
+ [TestMethod]
+ public void recurring_005_AddPaymentCheckPPD() {
+ if (_customerPerson == null)
+ Assert.Inconclusive();
+
+ var paymentMethod = _customerPerson.AddPaymentMethod(
+ GetIdentifier("CheckPPD"),
+ new eCheck {
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.PERSONAL,
+ SecCode = SecCode.PPD,
+ RoutingNumber = "490000018",
+ DriversLicenseNumber = "7418529630",
+ DriversLicenseState = "TX",
+ AccountNumber = "24413815",
+ BirthYear = 1989
+ }).Create();
+ Assert.IsNotNull(paymentMethod);
+ Assert.IsNotNull(paymentMethod.Key);
+ _paymentMethodCheckPpd = paymentMethod;
+ }
+
+ [TestMethod]
+ public void recurring_006_AddPaymentCheckCCD() {
+ if (_customerBusiness == null)
+ Assert.Inconclusive();
+
+ var paymentMethod = _customerBusiness.AddPaymentMethod(
+ GetIdentifier("CheckCCD"),
+ new eCheck {
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.BUSINESS,
+ SecCode = SecCode.CCD,
+ RoutingNumber = "490000018",
+ DriversLicenseNumber = "3692581470",
+ DriversLicenseState = "TX",
+ AccountNumber = "24413815",
+ BirthYear = 1989
+ }
+ ).Create();
+ Assert.IsNotNull(paymentMethod);
+ Assert.IsNotNull(paymentMethod.Key);
+ _paymentMethodCheckCcd = paymentMethod;
+ }
+
+ // PAYMENT SETUP - DECLINED
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void recurring_007_AddPaymentCheckPPD() {
+ if (_customerPerson == null)
+ Assert.Inconclusive();
+
+ var paymentMethod = _customerPerson.AddPaymentMethod(
+ GetIdentifier("CheckPPD"),
+ new eCheck {
+ AccountType = AccountType.CHECKING,
+ CheckType = CheckType.PERSONAL,
+ SecCode = SecCode.PPD,
+ RoutingNumber = "490000018",
+ DriversLicenseNumber = "7418529630",
+ DriversLicenseState = "TX",
+ AccountNumber = "24413815",
+ BirthYear = 1989
+ }
+ ).Create();
+ }
+
+ // Recurring Billing using PayPlan - Managed Schedule
+
+ [TestMethod]
+ public void recurring_008_AddScheduleCreditVisa() {
+ if (_paymentMethodVisa == null)
+ Assert.Inconclusive();
+
+ var schedule = _paymentMethodVisa.AddSchedule(GetIdentifier("CreditV"))
+ .WithStartDate(DateTime.Parse("02/01/2027"))
+ .WithAmount(30.01m)
+ .WithFrequency(ScheduleFrequency.WEEKLY)
+ .WithReprocessingCount(1)
+ .WithStatus("Active")
+ .Create();
+ Assert.IsNotNull(schedule);
+ Assert.IsNotNull(schedule.Key);
+ _scheduleVisa = schedule;
+ }
+
+ [TestMethod]
+ public void recurring_009_AddScheduleCreditMasterCard() {
+ if (_paymentMethodMasterCard == null)
+ Assert.Inconclusive();
+
+ var schedule = _paymentMethodMasterCard.AddSchedule(GetIdentifier("CreditMC"))
+ .WithStatus("Active")
+ .WithAmount(30.02m)
+ .WithStartDate(DateTime.Parse("02/01/2027"))
+ .WithFrequency(ScheduleFrequency.WEEKLY)
+ .WithEndDate(DateTime.Parse("04/01/2027"))
+ .WithReprocessingCount(2)
+ .Create();
+ Assert.IsNotNull(schedule);
+ Assert.IsNotNull(schedule.Key);
+ _scheduleMasterCard = schedule;
+ }
+
+ [TestMethod]
+ public void recurring_010_AddScheduleCheckPPD() {
+ if (_paymentMethodCheckPpd == null)
+ Assert.Inconclusive();
+
+ var schedule = _paymentMethodCheckPpd.AddSchedule(GetIdentifier("CheckPPD"))
+ .WithStatus("Active")
+ .WithAmount(30.03m)
+ .WithStartDate(DateTime.Parse("02/01/2027"))
+ .WithFrequency(ScheduleFrequency.MONTHLY)
+ .WithReprocessingCount(1)
+ .WithNumberOfPayments(2)
+ .Create();
+ Assert.IsNotNull(schedule);
+ Assert.IsNotNull(schedule.Key);
+ _scheduleCheckPpd = schedule;
+ }
+
+ [TestMethod]
+ public void recurring_011_AddScheduleCheckCCD() {
+ if (_paymentMethodCheckCcd == null)
+ Assert.Inconclusive();
+
+ var schedule = _paymentMethodCheckCcd.AddSchedule(GetIdentifier("CheckCCD"))
+ .WithStatus("Active")
+ .WithAmount(30.04m)
+ .WithStartDate(DateTime.Parse("02/01/2027"))
+ .WithFrequency(ScheduleFrequency.BI_WEEKLY)
+ .WithReprocessingCount(1)
+ .Create();
+ Assert.IsNotNull(schedule);
+ Assert.IsNotNull(schedule.Key);
+ _scheduleCheckCcd = schedule;
+ }
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void recurring_012_AddScheduleCreditVisa() {
+ if (_paymentMethodVisa == null)
+ Assert.Inconclusive();
+
+ var schedule = _paymentMethodVisa.AddSchedule(GetIdentifier("CreditV"))
+ .WithStartDate(DateTime.Parse("02/01/2027"))
+ .WithAmount(30.01m)
+ .WithFrequency(ScheduleFrequency.WEEKLY)
+ .WithReprocessingCount(1)
+ .WithStatus("Active")
+ .Create();
+ }
+
+ [TestMethod, ExpectedException(typeof(GatewayException))]
+ public void recurring_013_AddScheduleCCheckPPD() {
+ if (_paymentMethodCheckPpd == null)
+ Assert.Inconclusive();
+
+ var schedule = _paymentMethodCheckPpd.AddSchedule(GetIdentifier("CheckPPD"))
+ .WithStatus("Active")
+ .WithAmount(30.03m)
+ .WithStartDate(DateTime.Parse("02/01/2027"))
+ .WithFrequency(ScheduleFrequency.MONTHLY)
+ .WithReprocessingCount(1)
+ .WithNumberOfPayments(2)
+ .Create();
+ }
+
+ // Recurring Billing using PayPlan - Managed Schedule
+
+ [TestMethod]
+ public void recurring_014_RecurringBillingVisa() {
+ if (_paymentMethodVisa == null || _scheduleVisa == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodVisa.Charge(20.01m)
+ .WithCurrency("USD")
+ .WithScheduleId(_scheduleVisa.Key)
+ .WithOneTimePayment(false)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod, Ignore]
+ public void recurring_015_RecurringBillingMasterCard() {
+ if (_paymentMethodMasterCard == null || _scheduleMasterCard == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodMasterCard.Charge(20.02m)
+ .WithCurrency("USD")
+ .WithScheduleId(_scheduleVisa.Key)
+ .WithOneTimePayment(false)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void recurring_016_RecurringBillingCheckPPD() {
+ if (_paymentMethodCheckPpd == null || _scheduleCheckPpd == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodCheckPpd.Charge(20.03m)
+ .WithCurrency("USD")
+ .WithScheduleId(_scheduleVisa.Key)
+ .WithOneTimePayment(false)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void recurring_017_RecurringBillingCheckCCD() {
+ if (_paymentMethodCheckCcd == null || _scheduleCheckCcd == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodCheckCcd.Charge(20.04m)
+ .WithCurrency("USD")
+ .WithScheduleId(_scheduleVisa.Key)
+ .WithOneTimePayment(false)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // One time bill payment
+
+ [TestMethod]
+ public void recurring_018_RecurringBillingVisa() {
+ if (_paymentMethodVisa == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodVisa.Charge(20.06m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void recurring_019_RecurringBillingMasterCard() {
+ if (_paymentMethodMasterCard == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodMasterCard.Charge(20.07m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void recurring_020_RecurringBillingCheckPPD() {
+ if (_paymentMethodCheckPpd == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodCheckPpd.Charge(20.08m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void recurring_021_RecurringBillingCheckCCD() {
+ if (_paymentMethodCheckCcd == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodCheckCcd.Charge(20.09m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Onetime bill payment - declined
+
+ [TestMethod]
+ public void recurring_022_RecurringBillingVisa_Decline() {
+ if (_paymentMethodVisa == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodVisa.Charge(10.08m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("51", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void recurring_023_RecurringBillingCheckPPD_Decline() {
+ if (_paymentMethodCheckPpd == null)
+ Assert.Inconclusive();
+
+ var response = _paymentMethodCheckPpd.Charge(25.02m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("1", response.ResponseCode);
+ }
+
+ [TestMethod, Ignore]
+ public void recurring_999_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ //Console.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ //Console.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs
new file mode 100644
index 00000000..ad48f13c
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs
@@ -0,0 +1,1835 @@
+using System;
+using System.Diagnostics;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.PaymentMethods;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Tests.TestData;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Certifications {
+ [TestClass]
+ public class RetailCertification {
+ bool useTokens = false;
+
+ string visa_token;
+ string mastercard_token;
+ string discover_token;
+ string amex_token;
+
+ public RetailCertification() {
+ ServicesContainer.ConfigureService(new PorticoConfig {
+ SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw"
+ });
+ }
+
+ [TestMethod]
+ public void retail_000_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+
+ /*
+ CREDIT CARD FUNCTIONS
+ CARD VERIFY
+ ACCOUNT VERIFICATION
+ */
+
+ [TestMethod]
+ public void retail_001_CardVerifyVisa() {
+ var visa_enc = TestCards.VisaSwipeEncrypted();
+
+ var response = visa_enc.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+ Assert.IsNotNull(response, "response is null");
+ Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
+
+ if (useTokens) {
+ Assert.IsNotNull(response.Token, "token is null");
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(15.01m)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+ }
+
+ [TestMethod]
+ public void retail_002_CardVerifyMastercardSwipe() {
+ var card_enc = TestCards.MasterCardSwipeEncrypted();
+
+ var response = card_enc.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ if (useTokens) {
+ Assert.IsNotNull(response.Token);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(15.02m)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+ }
+
+ [TestMethod]
+ public void retail_003_CardVerifyDiscover() {
+ var discover_enc = TestCards.DiscoverSwipeEncrypted();
+ var response = discover_enc.Verify()
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ if (useTokens) {
+ Assert.IsNotNull(response.Token);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(15.03m)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+ }
+
+ // Address Verification
+
+ [TestMethod]
+ public void retail_004_CardVerifyAmex() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var manual_amex = TestCards.AmexManual(false, true);
+
+ var response = manual_amex.Verify()
+ .WithAddress(address)
+ .WithRequestMultiUseToken(useTokens)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ if (useTokens) {
+ Assert.IsNotNull(response.Token);
+
+ var token = new CreditCardData {
+ Token = response.Token
+ };
+
+ var saleResponse = token.Charge(15.04m)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(saleResponse);
+ Assert.AreEqual("00", saleResponse.ResponseCode);
+ }
+ }
+
+ // Balance Inquiry (for Prepaid)
+
+ [TestMethod]
+ public void retail_005_BalanceInquiryVisa() {
+ var visa_enc = TestCards.VisaSwipeEncrypted();
+
+ var response = visa_enc.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // CREDIT SALE (For multi-use token only)
+
+ [TestMethod]
+ public void retail_006_ChargeVisaSwipeToken() {
+ var card = TestCards.VisaSwipe();
+ var response = card.Charge(15.01m)
+ .WithCurrency("USD")
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ visa_token = response.Token;
+ }
+
+ [TestMethod]
+ public void retail_007_ChargeMastercardSwipeToken() {
+ var card = TestCards.MasterCardSwipe();
+ var response = card.Charge(15.02m)
+ .WithCurrency("USD")
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ mastercard_token = response.Token;
+ }
+
+ [TestMethod]
+ public void retail_008_ChargeDiscoverSwipeToken() {
+ var card = TestCards.DiscoverSwipe();
+ var response = card.Charge(15.03m)
+ .WithCurrency("USD")
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ discover_token = response.Token;
+ }
+
+ [TestMethod]
+ public void retail_009_ChargeAmexSwipeToken() {
+ var card = TestCards.AmexSwipe();
+ var response = card.Charge(15.04m)
+ .WithCurrency("USD")
+ .WithRequestMultiUseToken(true)
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ amex_token = response.Token;
+ }
+
+ /*
+ CREDIT SALE
+ SWIPED
+ */
+
+ [TestMethod]
+ public void retail_010_ChargeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+ var response = card.Charge(15.01m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test 59
+ var reverse = response.Reverse(15.01m).Execute();
+ Assert.IsNotNull(reverse);
+ Assert.AreEqual("00", reverse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_011_ChargeMastercardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+ var response = card.Charge(15.02m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_012_ChargeDiscoverSwipe() {
+ var card = TestCards.DiscoverSwipe();
+ var response = card.Charge(15.03m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_013_ChargeAmexSwipe() {
+ var card = TestCards.AmexSwipe();
+ var response = card.Charge(15.04m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_014_ChargeJbcSwipe() {
+ var card = TestCards.JcbSwipe();
+ var response = card.Charge(15.05m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 58
+ var refund = response.Refund(15.05m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(refund);
+ Assert.AreEqual("00", refund.ResponseCode);
+ }
+
+ #region Retail card
+ [TestMethod]
+ public void retail_014a_ChargeRetailMastercard24() {
+ var card = TestCards.MasterCard24Swipe();
+ var response = card.Charge(15.34m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_014b_ChargeRetailMastercard25() {
+ var card = TestCards.MasterCard25Swipe();
+ var response = card.Charge(15.34m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+ #endregion
+
+ [TestMethod]
+ public void retail_015_ChargeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+ var response = card.Charge(15.06m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 63
+ var reversal = response.Reverse(15.06m).WithAuthAmount(5.06m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Manually Entered - Card Present
+
+ [TestMethod]
+ public void retail_016_ChargeVisaManualCardPresent() {
+ var address = new Address {
+ PostalCode = "750241234",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var manual_card = TestCards.VisaManual(true, true);
+ var response = manual_card.Charge(16.01m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_017_ChargeMasterCardManualCardPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var manual_card = TestCards.MasterCardManual(true, true);
+ var response = manual_card.Charge(16.02m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 60
+ var reverse = response.Reverse(16.02m).Execute();
+ Assert.IsNotNull(reverse);
+ Assert.AreEqual("00", reverse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_018_ChargeDiscoverManualCardPresent() {
+ var address = new Address {
+ PostalCode = "750241234"
+ };
+
+ var manual_card = TestCards.DiscoverManual(true, true);
+ var response = manual_card.Charge(16.03m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_019_ChargeAmexManualCardPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860"
+ };
+
+ var manual_card = TestCards.AmexManual(true, true);
+ var response = manual_card.Charge(16.04m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_020_ChargeJcbManualCardPresent() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var manual_card = TestCards.JcbManual(true, true);
+ var response = manual_card.Charge(16.05m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_021_ChargeDiscoverManualCardPresent() {
+ var address = new Address {
+ PostalCode = "750241234",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var manual_card = TestCards.DiscoverManual(true, true);
+ var response = manual_card.Charge(16.07m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 64
+ var reversal = response.Reverse(16.07m)
+ .WithAuthAmount(6.07m)
+ .Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ // Manually Entered - Card Not Present
+
+ [TestMethod]
+ public void retail_022_ChargeVisaManualCardNotPresent() {
+ var address = new Address {
+ PostalCode = "750241234",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var manual_card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual(false, true);
+
+ var response = manual_card.Charge(17.01m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_023_ChargeMasterCardManualCardNotPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var manual_card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual(false, true);
+
+ var response = manual_card.Charge(17.02m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 61
+ var reversal = response.Reverse(17.02m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_024_ChargeDiscoverManualCardNotPresent() {
+ var address = new Address {
+ PostalCode = "750241234"
+ };
+
+ var manual_card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.DiscoverManual(false, true);
+
+ var response = manual_card.Charge(17.03m)
+ .WithCurrency("USD").WithAddress(address).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_025_ChargeAmexManualCardNotPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860"
+ };
+
+ var manual_card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual(false, true);
+
+ var response = manual_card.Charge(17.04m)
+ .WithCurrency("USD").WithAddress(address).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_026_ChargeJcbManualCardNotPresent() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var manual_card = TestCards.JcbManual(false, true);
+ var response = manual_card.Charge(17.05m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Contactless
+
+ [TestMethod]
+ public void retail_027_ChargeVisaContactless() {
+ var card = TestCards.VisaSwipe(EntryMethod.Proximity);
+ var response = card.Charge(18.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_028_ChargeMastercardContactless() {
+ var card = TestCards.MasterCardSwipe(EntryMethod.Proximity);
+
+ var response = card.Charge(18.02m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_029_ChargeDiscoverContactless() {
+ var card = TestCards.DiscoverSwipe(EntryMethod.Proximity);
+
+ var response = card.Charge(18.03m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_030_ChargeAmexContactless() {
+ var card = TestCards.AmexSwipe(EntryMethod.Proximity);
+
+ var response = card.Charge(18.04m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // AUTHORIZATION
+
+ [TestMethod]
+ public void retail_031_AuthorizeVisaSwipe() {
+ var card = TestCards.VisaSwipe();
+
+ // 031a authorize
+ var response = card.Authorize(15.08m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 031b capture
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_032_AuthorizeVisaSwipeAdditionalAuth() {
+ var card = TestCards.VisaSwipe();
+
+ // 032a authorize
+ var response = card.Authorize(15.09m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 032b Additional Auth (restaurant only)
+
+ // 032c Add to batch
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_033_AuthorizeMasterCardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+
+ // 033a authorize
+ var response = card.Authorize(15.10m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 033b capture
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_033a_AuthorizeDiscoverSwipe() {
+ var card = TestCards.DiscoverSwipe();
+
+ var response = card.Authorize(15.10m)
+ .WithCurrency("USD")
+ .WithAllowDuplicates(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // AUTHORIZATION - Manually Entered, Card Present
+
+ [TestMethod]
+ public void retail_034_AuthorizeVisaManualCardPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var card = TestCards.VisaManual(true, true);
+
+ // 034a authorize
+ var response = card.Authorize(16.08m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 034b capture
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_035_AuthorizeVisaManualCardPresentAdditionalAuth() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var card = TestCards.VisaManual(true, true);
+
+ // 035a authorize
+ var response = card.Authorize(16.09m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 035b Additional Auth (restaurant only)
+
+ // 035c Add to batch
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_036_AuthorizeMasterCardManualCardPresent() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var card = TestCards.MasterCardManual(true, true);
+
+ // 036a authorize
+ var response = card.Authorize(16.10m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 036b capture
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_036a_AuthorizeDiscoverManualCardPresent() {
+ var address = new Address {
+ PostalCode = "750241234"
+ };
+
+ var card = TestCards.DiscoverManual(true, true);
+ var response = card.Authorize(16.10m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // AUTHORIZATION - Manually Entered, Card Not Present
+
+ [TestMethod]
+ public void retail_037_AuthorizeVisaManual() {
+ var address = new Address {
+ PostalCode = "750241234",
+ StreetAddress1 = "6860 Dallas Pkwy"
+ };
+
+ var card = TestCards.VisaManual(false, true);
+
+ // 034a authorize
+ var response = card.Authorize(17.08m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 034b capture
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_038_AuthorizeMasterCardManual() {
+ var address = new Address {
+ PostalCode = "75024",
+ StreetAddress1 = "6860"
+ };
+
+ var card = TestCards.MasterCardManual(false, true);
+
+ // 036a authorize
+ var response = card.Authorize(17.09m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // 036b capture
+ var captureResponse = response.Capture().Execute();
+ Assert.IsNotNull(captureResponse);
+ Assert.AreEqual("00", captureResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_038a_AuthorizeDiscoverManual() {
+ var address = new Address {
+ PostalCode = "750241234"
+ };
+
+ var card = TestCards.DiscoverManual(false, true);
+
+ var response = card.Authorize(17.10m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // PARTIALLY APPROVED SALE (Required)
+
+ [TestMethod]
+ public void retail_039_ChargeDiscoverSwipePartialApproval() {
+ var card = TestCards.DiscoverSwipe();
+
+ var response = card.Charge(40.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(40.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void retail_040_ChargeVisaSwipePartialApproval() {
+ var card = TestCards.VisaSwipe();
+ var response = card.Charge(130.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(110.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void retail_041_ChargeDiscoverManualPartialApproval() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+ var card = TestCards.DiscoverManual(true, true);
+
+ var response = card.Charge(145.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(65.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod, Ignore]
+ public void retail_042_ChargeMasterCardSwipePartialApproval() {
+ var card = TestCards.MasterCardSwipe();
+ var response = card.Charge(155.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(100.00m, response.AuthorizedAmount);
+
+ // test case 62
+ var reversal = response.Reverse(100.00m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ /*
+ SALE WITH GRATUITY
+ Tip Edit (Tip at Settlement)
+ */
+
+ [TestMethod]
+ public void retail_043_ChargeVisaSwipeEditGratuity() {
+ var card = TestCards.VisaSwipe();
+ var response = card.Charge(15.12m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var editResponse = response.Edit()
+ .WithAmount(18.12m)
+ .WithGratuity(3.00m)
+ .Execute();
+ Assert.IsNotNull(editResponse);
+ Assert.AreEqual("00", editResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_044_ChargeMasterCardManualEditGratuity() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.MasterCardManual(true, true);
+ var response = card.Charge(15.13m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var editResponse = response.Edit()
+ .WithAmount(18.13m)
+ .WithGratuity(3.00m)
+ .Execute();
+ Assert.IsNotNull(editResponse);
+ Assert.AreEqual("00", editResponse.ResponseCode);
+ }
+
+ // Tip on Purchase
+
+ [TestMethod]
+ public void retail_045_ChargeVisaManualGratuity() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.VisaManual(true, true);
+
+ var response = card.Charge(18.61m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithGratuity(3.50m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_046_ChargeMasterCardSwipeGratuity() {
+ var card = TestCards.MasterCardSwipe();
+
+ var response = card.Charge(18.62m)
+ .WithCurrency("USD")
+ .WithGratuity(3.50m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var editResponse = response.Edit()
+ .WithAmount(18.12m)
+ .WithGratuity(3.00m)
+ .Execute();
+ Assert.IsNotNull(editResponse);
+ Assert.AreEqual("00", editResponse.ResponseCode);
+ }
+
+ // LEVEL II CORPORATE PURCHASE CARD
+
+ [TestMethod]
+ public void retail_047_LevelIIVisaSwipeResponseB() {
+ var card = TestCards.VisaSwipe();
+
+ var response = card.Charge(112.34m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("B", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod, Ignore]
+ public void retail_047a_LevelIIVisaSwipeResonseB() {
+ var card = TestCards.VisaSwipe();
+
+ var response = card.Charge(112.35m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("B", response.CommercialIndicator);
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(new CommercialData(TaxType.NOTUSED))
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_048_LevelIIVisaSwipeResponseR() {
+ var card = TestCards.VisaSwipe();
+
+ var response = card.Charge(123.45m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("R", response.CommercialIndicator);
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT))
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_049_LevelIIVisaManualResponseS() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.VisaManual(true, true);
+
+ var response = card.Charge(134.56m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_050_LevelIIMasterCardSwipeResponseS() {
+ var card = TestCards.MasterCardSwipe();
+
+ var response = card.Charge(111.06m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_051_LevelIIMasterCardManualResponseS() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.MasterCardManual(true, true);
+
+ var response = card.Charge(111.07m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_051a_LevelIIMasterCardManualResponseS() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.MasterCardManual(true, true);
+ var response = card.Charge(111.08m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ PoNumber = "9876543210",
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_052_LevelIIMasterCardManualResponseS() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.MasterCardManual(true, true);
+ var response = card.Charge(111.09m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("S", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_053_LevelIIAmexSwipeNoResponse() {
+ var card = TestCards.AmexSwipe();
+ var response = card.Charge(111.10m)
+ .WithCurrency("USD")
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.SALESTAX) {
+ TaxAmount = 1m
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_054_LevelIIAmexManualNoResponse() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.AmexManual(true, true);
+
+ var response = card.Charge(111.11m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_055_LevelIIAmexManualNoResponse() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.AmexManual(true, true);
+ var response = card.Charge(111.12m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.NOTUSED) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_055a_LevelIIAmexManualNoResponse() {
+ var address = new Address {
+ PostalCode = "75024"
+ };
+
+ var card = TestCards.AmexManual(true, true);
+ var response = card.Charge(111.13m)
+ .WithCurrency("USD")
+ .WithAddress(address)
+ .WithCommercialRequest(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual("0", response.CommercialIndicator);
+
+ var commercialData = new CommercialData(TaxType.TAXEXEMPT) {
+ PoNumber = "9876543210"
+ };
+
+ var cpcResponse = response.Edit()
+ .WithCommercialData(commercialData)
+ .Execute();
+ Assert.IsNotNull(cpcResponse);
+ Assert.AreEqual("00", cpcResponse.ResponseCode);
+ }
+
+ // OFFLINE SALE / AUTHORIZATION
+
+ [TestMethod]
+ public void retail_056_OfflineChargeVisaManual() {
+ var card = TestCards.VisaManual(false, true);
+
+ var response = card.Charge(15.12m)
+ .WithCurrency("USD")
+ .WithOfflineAuthCode("654321")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_056_OfflineAuthVisaManual() {
+ var card = TestCards.VisaManual(false, true);
+
+ var response = card.Authorize(15.11m)
+ .WithCurrency("USD")
+ .WithOfflineAuthCode("654321")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RETURN
+
+ [TestMethod]
+ public void retail_057_ReturnMasterCard() {
+ var card = TestCards.MasterCardManual(false, true);
+
+ var response = card.Refund(15.11m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_057a_ReturnMasterCardSwipe() {
+ var card = TestCards.MasterCardSwipe();
+ var response = card.Refund(15.15m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // ONLINE VOID / REVERSAL (Required)
+
+ // PIN DEBIT CARD FUNCTIONS
+
+ [TestMethod]
+ public void retail_065_DebitSaleVisaSwipe() {
+ var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(14.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_066_DebitSaleMasterCardSwipe() {
+ var card = TestCards.MasterCardSwipe().AsDebit("F505AD81659AA42A3D123412324000AB");
+
+ var response = card.Charge(14.02m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 71
+ var reversal = card.Reverse(14.02m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_067_DebitSaleVisaSwipeCashBack() {
+ var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(14.03m)
+ .WithCurrency("USD")
+ .WithCashBack(5.00m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_067a_DebitSaleMasterCard() {
+ var card = TestCards.MasterCardSwipe().AsDebit("F505AD81659AA42A3D123412324000AB");
+
+ var response = card.Charge(14.04m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // PARTIALLY APPROVED PURCHASE
+
+ [TestMethod]
+ public void retail_068_DebitSaleMasterCardPartialApproval() {
+ var card = TestCards.MasterCardSwipe().AsDebit("F505AD81659AA42A3D123412324000AB");
+
+ var response = card.Charge(33.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(22.00m, response.AuthorizedAmount);
+ }
+
+ [TestMethod]
+ public void retail_069_DebitSaleVisaPartialApproval() {
+ var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(44.00m)
+ .WithCurrency("USD")
+ .WithAllowPartialAuth(true)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("10", response.ResponseCode);
+ Assert.AreEqual(33.00m, response.AuthorizedAmount);
+
+ // test case 72
+ var reversal = card.Reverse(33.00m).Execute();
+ Assert.IsNotNull(reversal);
+ Assert.AreEqual("00", reversal.ResponseCode);
+ }
+
+ // RETURN
+
+ [TestMethod]
+ public void retail_070_DebitReturnVisaSwipe() {
+ var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Refund(14.07m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_070a_DebitReturnVisaSwipe() {
+ var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Refund(14.08m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ var reversalResponse = card.Reverse(14.08m).Execute();
+ Assert.IsNotNull(reversalResponse);
+ Assert.AreEqual("00", reversalResponse.ResponseCode);
+ }
+
+ // REVERSAL
+
+ /*
+ EBT FUNCTIONS
+ Food Stamp Purchase
+ */
+
+ [TestMethod]
+ public void retail_080_EbtfsPurchaseVisaSwipe() {
+ var card = TestCards.VisaSwipe().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(101.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_081_EbtfsPurchaseVisaManual() {
+ var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(102.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Food Stamp Electronic Voucher (Manual Entry Only)
+
+ [TestMethod]
+ public void retail_082_EbtVoucherPurchaseVisa() {
+ var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA");
+ card.SerialNumber = "123456789012345";
+ card.ApprovalCode = "123456";
+
+ var response = card.Charge(103.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Food Stamp Balance Inquiry
+
+ [TestMethod]
+ public void retail_083_EbtfsReturnVisaSwipe() {
+ var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Refund(104.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_084_EbtfsReturnVisaManual() {
+ var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Refund(105.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Food Stamp Balance Inquiry
+
+ [TestMethod]
+ public void retail_085_EbtBalanceInquiryVisaSwipe() {
+ var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_086_EbtBalanceInquiryVisaManual() {
+ var card = TestCards.VisaManual(true, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ Assert.AreEqual("00", response.ResponseCode);
+ EBT CASH BENEFITS
+ Cash Back Purchase
+ */
+
+ [TestMethod]
+ public void retail_087_EbtCashBackPurchaseVisaSwipe() {
+ var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(106.01m)
+ .WithCurrency("USD")
+ .WithCashBack(5.00m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_088_EbtCashBackPurchaseVisaManual() {
+ var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(107.01m)
+ .WithCurrency("USD")
+ .WithCashBack(5.00m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // No Cash Back Purchase
+
+ [TestMethod]
+ public void retail_089_EbtCashBackPurchaseVisaSwipeNoCashBack() {
+ var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(108.01m)
+ .WithCurrency("USD")
+ .WithCashBack(0m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_090_EbtCashBackPurchaseVisaManualNoCashBack() {
+ var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(109.01m)
+ .WithCurrency("USD")
+ .WithCashBack(0m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Cash Back Balance Inquiry
+
+ [TestMethod]
+ public void retail_091_EbtBalanceInquiryVisaSwipeCash() {
+ var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.BalanceInquiry(InquiryType.CASH).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_092_EbtBalanceInquiryVisaManualCash() {
+ var card = TestCards.VisaManual(true, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.BalanceInquiry(InquiryType.CASH).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // Bash Benefits Withdrawal
+
+ [TestMethod]
+ public void retail_093_EbtBenefitWithDrawalVisaSwipe() {
+ var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(110.01m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_094_EbtBenefitWithDrawalVisaManual() {
+ var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA");
+
+ var response = card.Charge(111.01m)
+ .WithCurrency("USD")
+ .WithCashBack(0m)
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ /*
+ HMS GIFT - REWARDS
+ GIFT
+ ACTIVATE
+ */
+
+ [TestMethod]
+ public void retail_095_ActivateGift1Swipe() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.Activate(6.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_096_ActivateGift2Manual() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.Activate(7.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // ADD VALUE
+
+ [TestMethod]
+ public void retail_097_AddValueGift1Swipe() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.AddValue(8.00m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_098_AddValueGift2Manual() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.Activate(9.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // BALANCE INQUIRY
+
+ [TestMethod]
+ public void retail_099_BalanceInquiryGift1Swipe() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10.00m, response.BalanceAmount);
+ }
+
+ [TestMethod]
+ public void retail_100_BalanceInquiryGift2Manual() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(10.00m, response.BalanceAmount);
+ }
+
+ // REPLACE / TRANSFER
+
+ [TestMethod]
+ public void retail_101_ReplaceGift1Swipe() {
+ var oldCard = TestCards.GiftCard1Swipe();
+ var newCard = TestCards.GiftCard2Manual();
+
+ var response = oldCard.ReplaceWith(newCard).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_102_ReplaceGift2Manual() {
+ var newCard = TestCards.GiftCard1Swipe();
+ var oldCard = TestCards.GiftCard2Manual();
+
+ var response = oldCard.ReplaceWith(newCard).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // SALE / REDEEM
+
+ [TestMethod]
+ public void retail_103_SaleGift1Swipe() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.Charge(1.00m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_104_SaleGift2Manual() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.Charge(2.00m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_105_SaleGift1VoidSwipe() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.Charge(3.00m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ // test case 107
+ var voidResponse = response.Void().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_106_SaleGift2ReversalManual() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.Charge(4.00m)
+ .WithCurrency("USD")
+ .Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+
+ //test case 108
+ var voidResponse = response.Reverse(4.00m).Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // VOID
+
+ // REVERSAL
+
+ // DEACTIVATE
+
+ [TestMethod]
+ public void retail_109_DeactivateGift1() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.Deactivate().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ // RECEIPTS MESSAGING
+
+ [TestMethod]
+ public void retail_110_ReceiptsMessaging() {
+ // PRINT AND SCAN RECEIPT FOR TEST 107
+ }
+
+ /*
+ REWARDS
+ BALANCE INQUIRY
+ */
+
+ [TestMethod]
+ public void retail_111_BalanceInquiryRewards1() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(0m, response.PointsBalanceAmount);
+ }
+
+ [TestMethod]
+ public void retail_112_BalanceInquiryRewards2() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.BalanceInquiry().Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ Assert.AreEqual(0m, response.PointsBalanceAmount);
+ }
+
+ // ALIAS
+
+ [TestMethod]
+ public void retail_113_CreateAliasGift1() {
+ var card = GiftCard.Create("9725550100");
+ Assert.IsNotNull(card);
+ }
+
+ [TestMethod]
+ public void retail_114_CreateAliasGift2() {
+ var card = GiftCard.Create("9725550100");
+ Assert.IsNotNull(card);
+ }
+
+ [TestMethod]
+ public void retail_115_AddAliasGift1() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.AddAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_116_AddAliasGift2() {
+ var card = TestCards.GiftCard2Manual();
+
+ var response = card.AddAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_117_DeleteAliasGift1() {
+ var card = TestCards.GiftCard1Swipe();
+
+ var response = card.RemoveAlias("2145550199").Execute();
+ Assert.IsNotNull(response);
+ Assert.AreEqual("00", response.ResponseCode);
+ }
+
+ [TestMethod]
+ public void retail_999_CloseBatch() {
+ try {
+ var response = BatchService.CloseBatch();
+ Assert.IsNotNull(response);
+ Debug.WriteLine(string.Format("Batch ID: {0}", response.Id));
+ Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber));
+ }
+ catch (GatewayException exc) {
+ if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.")
+ Assert.Fail(exc.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs b/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs
index de20c4a5..24d8f019 100644
--- a/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs
@@ -449,7 +449,7 @@ public void Sale_Level3() {
Quantity = 5.1m,
UnitOfMeasure = "lbs",
UnitCost = 0.6m,
- //DiscountAmount = 0.61m,
+ DiscountAmount = 0.61m,
TotalAmount = 0.62m,
TaxAmount = 0.63m,
ExtendedAmount = 0.64m,
@@ -463,7 +463,7 @@ public void Sale_Level3() {
Quantity = 5.1m,
UnitOfMeasure = "lbs",
UnitCost = 0.6m,
- //DiscountAmount = 0.61m,
+ DiscountAmount = 0.61m,
TotalAmount = 0.62m,
TaxAmount = 0.63m,
ExtendedAmount = 0.64m,
diff --git a/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs b/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs
index 32859b48..32b6ed84 100644
--- a/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs
@@ -1,6 +1,5 @@
using GlobalPayments.Api.Entities;
using GlobalPayments.Api.PaymentMethods;
-using GlobalPayments.Api.Tests.Logging;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace GlobalPayments.Api.Tests {
@@ -39,30 +38,6 @@ public void Init() {
};
}
- [TestMethod, Ignore]
- public void CheckSaleWithSingleUseToken() {
- var check = new eCheck {
- Token = "supt_bUNE7MtGwN0hdDcElNijZ83A",
- CheckType = CheckType.PERSONAL,
- SecCode = SecCode.PPD,
- AccountType = AccountType.CHECKING,
- EntryMode = EntryMethod.Manual,
- CheckHolderName = "John Doe",
- DriversLicenseNumber = "09876543210",
- DriversLicenseState = "TX",
- PhoneNumber = "8003214567",
- BirthYear = 1997,
- SsnLast4 = "4321"
- };
-
- var response = check.Charge(11m)
- .WithCurrency("USD")
- .WithAddress(address)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage);
- }
-
[TestMethod]
public void CheckSale() {
var response = check.Charge(11m)
@@ -91,11 +66,10 @@ public void CheckVoidFromTransactionId() {
}
[TestMethod]
- public void CheckNewCryptoUrl() {
+ public void checkNewCryptoUrl() {
ServicesContainer.ConfigureService(new PorticoConfig {
SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
});
-
var response = check.Charge(10.00m)
.WithCurrency("USD")
.WithAddress(address)
@@ -103,40 +77,7 @@ public void CheckNewCryptoUrl() {
.Execute();
Assert.IsNotNull(response);
Assert.AreEqual("00", response.ResponseCode);
- }
-
- [TestMethod]
- public void SupportTestCase() {
- ServicesContainer.ConfigureService(new PorticoConfig {
- SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A",
- Environment = Environment.TEST,
- RequestLogger = new RequestFileLogger(@"C:\temp\portico\requestlog.txt")
- }
- );
- var check = new eCheck {
- AccountNumber = "24413815",
- RoutingNumber = "490000018",
- AccountType = AccountType.CHECKING,
- CheckType = CheckType.PERSONAL,
- EntryMode = EntryMethod.Manual,
- SecCode = SecCode.PPD,
- CheckHolderName = "John Doe"
- };
-
- var address = new Address {
- StreetAddress1 = "123 Main St.",
- City = "Downtown",
- State = "NJ",
- PostalCode = "12345"
- };
-
- var response = check.Charge(10.00m)
- .WithCurrency("USD")
- .WithAddress(address)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode);
}
}
}
diff --git a/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs b/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs
index 0e998c83..04ee9a0a 100644
--- a/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs
@@ -73,33 +73,6 @@ public void CreditAuthWithShippingAmt() {
Assert.AreEqual(2m, report.ShippingAmount);
}
- [TestMethod]
- public void CreditAuthorizationWithCOF()
- {
- Transaction response = card.Authorize(14m)
- .WithCurrency("USD")
- .WithAllowDuplicates(true)
- .WithCardBrandStorage(StoredCredentialInitiator.Merchant)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode);
- Assert.IsNotNull(response.CardBrandTransactionId);
-
- Transaction cofResponse = card.Authorize(14m)
- .WithCurrency("USD")
- .WithAllowDuplicates(true)
- .WithCardBrandStorage(StoredCredentialInitiator.CardHolder, response.CardBrandTransactionId)
- .Execute();
- Assert.IsNotNull(cofResponse);
- Assert.AreEqual("00", cofResponse.ResponseCode);
-
- Transaction capture = cofResponse.Capture(16m)
- .WithGratuity(2m)
- .Execute();
- Assert.IsNotNull(capture);
- Assert.AreEqual("00", capture.ResponseCode);
- }
-
[TestMethod]
public void CreditSale() {
var response = card.Charge(15m)
@@ -110,62 +83,6 @@ public void CreditSale() {
Assert.AreEqual("00", response.ResponseCode);
}
- [TestMethod]
- public void CreditSaleWithRefund() {
- var response = card.Charge(15m)
- .WithCurrency("USD")
- .WithAllowDuplicates(true)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode);
-
- var trans = Transaction.FromId(response.TransactionId)
- .Refund(15m)
- .WithCurrency("USD")
- .WithAllowDuplicates(true)
- .Execute();
- Assert.IsNotNull(trans);
- Assert.AreEqual("00", trans.ResponseCode);
- }
-
- [TestMethod]
- public void CreditSaleWithCOF() {
- var response = card.Charge(15m)
- .WithCurrency("USD")
- .WithCardBrandStorage(StoredCredentialInitiator.CardHolder)
- .WithAllowDuplicates(true)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode);
- Assert.IsNotNull(response.CardBrandTransactionId);
-
- Transaction cofResponse = card.Charge(15m)
- .WithCurrency("USD")
- .WithCardBrandStorage(StoredCredentialInitiator.Merchant, response.CardBrandTransactionId)
- .WithAllowDuplicates(true)
- .Execute();
- Assert.IsNotNull(cofResponse);
- Assert.AreEqual("00", cofResponse.ResponseCode);
- }
-
- [TestMethod]
- public void CreditVerifyWithCOF() {
- Transaction response = card.Verify()
- .WithAllowDuplicates(true)
- .WithCardBrandStorage(StoredCredentialInitiator.CardHolder)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode);
- Assert.IsNotNull(response.CardBrandTransactionId);
-
- Transaction cofResponse = card.Verify()
- .WithAllowDuplicates(true)
- .WithCardBrandStorage(StoredCredentialInitiator.Merchant, response.CardBrandTransactionId)
- .Execute();
- Assert.IsNotNull(cofResponse);
- Assert.AreEqual("00", cofResponse.ResponseCode);
- }
-
[TestMethod]
public void CreditSaleWithConvenienceAmt() {
var response = card.Charge(15m)
@@ -449,15 +366,5 @@ public void CreditTestWithClientTransactionId() {
Assert.IsNotNull(response);
Assert.AreEqual("00", response.ResponseCode);
}
-
- [TestMethod]
- public void CreditTokenize() {
- ServicesContainer.ConfigureService(new PorticoConfig {
- SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A"
- }, "tokenize");
-
- var token = card.Tokenize("tokenize");
- Assert.IsNotNull(token);
- }
}
}
diff --git a/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs b/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs
index d696c14b..1a8bd04c 100644
--- a/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs
@@ -385,36 +385,6 @@ public void Test_007b_CreditCharge_ScheduleId() {
Assert.AreEqual("00", response.ResponseCode);
}
- [TestMethod]
- public void Test_007b_CreditCharge_ScheduleIdWithCOF() {
- RecurringPaymentMethod paymentMethod = RecurringPaymentMethod.Find(PaymentId("Credit"));
- Assert.IsNotNull(paymentMethod);
-
- Schedule schedule = Schedule.Find(PaymentId("Credit"));
- Assert.IsNotNull(schedule);
-
- Transaction response = paymentMethod.Charge(19m)
- .WithCurrency("USD")
- .WithScheduleId(schedule.Key)
- .WithAllowDuplicates(true)
- .WithOneTimePayment(false)
- .WithCardBrandStorage(StoredCredentialInitiator.CardHolder)
- .Execute();
- Assert.IsNotNull(response);
- Assert.AreEqual("00", response.ResponseCode);
- Assert.IsNotNull(response.CardBrandTransactionId);
-
- Transaction nextResponse = paymentMethod.Charge(15m)
- .WithCurrency("USD")
- .WithScheduleId(schedule.Key)
- .WithAllowDuplicates(true)
- .WithOneTimePayment(false)
- .WithCardBrandStorage(StoredCredentialInitiator.Merchant, response.CardBrandTransactionId)
- .Execute();
- Assert.IsNotNull(nextResponse);
- Assert.AreEqual("00", nextResponse.ResponseCode);
- }
-
[TestMethod]
public void Test_007c_ACHCharge_OneTime() {
var paymentMethod = RecurringPaymentMethod.Find(PaymentId("ACH"));
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs
new file mode 100644
index 00000000..f5e95feb
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs
@@ -0,0 +1,191 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Terminals;
+using GlobalPayments.Api.Terminals.Ingenico;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using System.Threading;
+
+namespace GlobalPayments.Api.Tests.Terminals.Ingenico {
+ [TestClass]
+ public class IngenicoTransactionTests {
+ IDeviceInterface _device;
+
+ public IngenicoTransactionTests() {
+ _device = DeviceService.Create(new ConnectionConfig() {
+ DeviceType = DeviceType.Ingenico_EPOS_Desk5000,
+ ConnectionMode = ConnectionModes.SERIAL,
+ Port = "1",
+ BaudRate = BaudRate.r9600,
+ Parity = System.IO.Ports.Parity.Even,
+ DataBits = DataBits.Seven,
+ Handshake = System.IO.Ports.Handshake.None,
+ StopBits = System.IO.Ports.StopBits.One,
+ Timeout = 1 * 1000
+ });
+ Assert.IsNotNull(_device);
+ }
+
+ [TestMethod]
+ public void Test() {
+ SaleTest();
+ RefundTest();
+ PreAuthTest();
+ CompletionTest();
+ }
+
+ [TestMethod]
+ public void Ticket() {
+ try {
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ var ticket = _device.GetLastReceipt(ReceiptType.REPORT)
+ .Execute();
+
+ Assert.IsNotNull(ticket);
+ } catch (Exception e) {
+ Thread.Sleep(5000);
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ var ticket = _device.GetLastReceipt(ReceiptType.REPORT)
+ .Execute();
+
+ Assert.IsNotNull(ticket);
+ }
+ }
+
+ [TestMethod]
+ public void SaleTest() {
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ var resp = _device.Sale(6.18m)
+ .WithReferenceNumber(1)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(resp);
+
+ Thread.Sleep(5000);
+ }
+
+ public void RefundTest() {
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ var resp = _device.Refund(6.18m)
+ .WithReferenceNumber(1)
+ .WithCurrencyCode("826")
+ .WithCashBack(3m)
+ .Execute();
+
+ Assert.IsNotNull(resp);
+
+ Thread.Sleep(5000);
+ }
+
+ public void PreAuthTest() {
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ var resp = _device.Authorize(6.18m)
+ .WithReferenceNumber(1)
+ .WithCurrencyCode("826")
+ .WithCashBack(3m)
+ .Execute();
+
+ Assert.IsNotNull(resp);
+
+ Thread.Sleep(5000);
+ }
+
+ [TestMethod]
+ public void CompletionTest() {
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ var resp = _device.Capture(6.18m)
+ .WithAuthCode("025433")
+ .WithReferenceNumber(1)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(resp);
+
+ Thread.Sleep(5000);
+ }
+
+ [TestMethod]
+ public void AsyncCancelTest() {
+
+ Thread thSale = new Thread(new ThreadStart(() => {
+ var resp = _device.Sale(6.18m)
+ .WithReferenceNumber(1)
+ .WithCurrencyCode("826")
+ .WithTaxFree(TaxFreeType.CASH)
+ .WithCashBack(3m)
+ .Execute();
+
+
+ Assert.IsNotNull(resp, "Sale Assert");
+ }));
+
+
+ Thread thCancel = new Thread(new ThreadStart(() => {
+ var resp = _device.Cancel();
+
+ Assert.IsNotNull(resp, "Cancel assert");
+ }));
+
+ thSale.Start();
+ Thread.Sleep(2000);
+ thCancel.Start();
+ }
+
+ [TestMethod]
+ public void CancelTest() {
+ var resp = _device.Cancel();
+
+ Assert.IsNotNull(resp);
+ }
+
+ [TestMethod]
+ public void TaxFreeCreditCardRefundTest() {
+ try {
+ var respone = _device.Refund(5m)
+ .WithTaxFree(TaxFreeType.CREDIT)
+ .Execute();
+
+ Assert.IsNotNull(respone);
+ } catch (ApiException e) {
+ Assert.Fail(e.Message);
+ //throw e;
+ } catch (Exception e) {
+ Assert.Fail(e.Message);
+ //throw e;
+ }
+ }
+
+ [TestMethod]
+ public void TaxFreeCashRefundTest() {
+ try {
+ var respone = _device.Refund(5m)
+ .WithReferenceNumber(1)
+ .WithTaxFree(TaxFreeType.CASH)
+ .Execute();
+
+ Assert.IsNotNull(respone);
+ } catch (Exception e) {
+ Assert.Fail(e.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs
new file mode 100644
index 00000000..f333397f
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs
@@ -0,0 +1,73 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Terminals;
+using GlobalPayments.Api.Terminals.Ingenico;
+using GlobalPayments.Api.Terminals.Ingenico.Requests;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System.Threading;
+
+namespace GlobalPayments.Api.Tests.Terminals.Ingenico {
+ [TestClass]
+ public class PayAtTableRequestTests {
+
+ private IDeviceInterface _device;
+
+ public PayAtTableRequestTests() {
+ _device = DeviceService.Create(new ConnectionConfig() {
+ DeviceType = DeviceType.Ingenico_EPOS_Desk5000,
+ ConnectionMode = ConnectionModes.PAY_AT_TABLE,
+ Port = "18101",
+ Timeout = 10 * 1000
+ });
+
+ Assert.IsNotNull(_device);
+
+ _device.OnPayAtTableRequest += _device_OnPayAtTableRequest;
+ }
+
+ private void _device_OnPayAtTableRequest(PATRequest request) {
+ // Success ConfirmaitonOK
+ //Thread.Sleep(8 * 1000);
+
+ if (request.RequestType == PATRequestType.TableList) {
+ var test = request.TableId;
+ _device.PayAtTableResponse()
+ .WithXMLPath("C:\\Users\\steven.tan\\Desktop\\PAY@TABLE SAMPLE RESPONSE\\tablelistsample.xml")
+ .Execute();
+ } else if (request.RequestType == PATRequestType.Ticket) {
+ _device.PayAtTableResponse()
+ .WithPayAtTableResponseType(PATResponseType.CONF_OK)
+ .WithAmount(123.45M)
+ .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL)
+ .Execute();
+ } else if (request.RequestType == PATRequestType.SplitSaleReport) {
+ _device.PayAtTableResponse()
+ .WithPayAtTableResponseType(PATResponseType.CONF_OK)
+ .WithAmount(123.45M)
+ .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL)
+ .Execute();
+ } else if (request.RequestType == PATRequestType.TableReceipt) {
+ _device.PayAtTableResponse()
+ .WithXMLPath("C:\\Users\\steven.tan\\Desktop\\PAY@TABLE SAMPLE RESPONSE\\receiptrequestsample.xml")
+ .Execute();
+ } else if (request.RequestType == PATRequestType.TransactionOutcome) {
+ _device.PayAtTableResponse()
+ .WithPayAtTableResponseType(PATResponseType.CONF_OK)
+ .WithAmount(123.45M)
+ .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL)
+ .Execute();
+ } else if (request.RequestType == PATRequestType.TableLock) {
+ _device.PayAtTableResponse()
+ .WithPayAtTableResponseType(PATResponseType.CONF_OK)
+ .WithAmount(123M)
+ .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL)
+ .Execute();
+ }
+ }
+
+ [TestMethod]
+ public void TableLock() {
+ Thread.Sleep(20 * 1000);
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs
new file mode 100644
index 00000000..b0943c36
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs
@@ -0,0 +1,141 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Terminals;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Ingenico;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Terminals.Ingenico {
+ [TestClass]
+ public class PaymentTransactionManagement {
+ IDeviceInterface _device;
+
+ public PaymentTransactionManagement() {
+
+ _device = DeviceService.Create(new ConnectionConfig() {
+ DeviceType = DeviceType.Ingenico_EPOS_Lane3000,
+ ConnectionMode = ConnectionModes.SERIAL,
+ Port = "7",
+ BaudRate = BaudRate.r9600,
+ Parity = System.IO.Ports.Parity.Even,
+ StopBits = System.IO.Ports.StopBits.One,
+ DataBits = DataBits.Seven,
+ Timeout = 65000
+ });
+
+ Assert.IsNotNull(_device);
+ }
+
+ [TestMethod]
+ public void SaleTest1() {
+ var response = _device.Sale(12m)
+ .WithReferenceNumber(15)
+ .WithCashBack(10m)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+
+ [TestMethod]
+ public void SaleTest() {
+ _device.OnMessageSent += (message) => {
+ Assert.IsNotNull(message);
+ };
+
+ ITerminalResponse response = _device.Sale(5.12m)
+ .WithPaymentMode(PaymentMode.MAILORDER)
+ .WithCashBack(7.569m)
+ .WithReferenceNumber(1)
+ .Execute();
+
+ var authCode = response.AuthorizationCode;
+
+ Assert.IsNotNull(response.AuthorizationCode);
+ }
+
+ [TestMethod]
+ public void RefundTest() {
+ var response = _device.Refund(1m)
+ .WithPaymentMethodType(PaymentMethodType.Credit)
+ .WithReferenceNumber(1)
+ .Execute();
+
+ Assert.IsNotNull(response.AuthorizationCode);
+ }
+
+
+ [TestMethod]
+ public void SaleNegativeTest() {
+ var response = _device.Sale(5.12m)
+ .WithCashBack(7.52m)
+ .WithReferenceNumber(1)
+ .Execute();
+
+ Assert.IsNull(response.AuthorizationCode);
+ }
+
+ [TestMethod]
+ public void SaleTWithOnMessageSentest() {
+ _device.OnBroadcastMessage += (code, message) => {
+ Assert.IsNull(code);
+ Assert.IsNull(message);
+ };
+
+
+ var response = _device.Refund(5.12m)
+ //.WithCashBack(7.5m)
+ .WithReferenceNumber(1)
+ .Execute();
+
+ Assert.IsNotNull(response.AuthorizationCode);
+ }
+
+ [TestMethod]
+ public void CancelTest() {
+ try {
+ _device.Cancel();
+ } catch (ApiException ex) {
+ Assert.Fail(ex.Message);
+ }
+ }
+
+ [TestMethod]
+ public void AsyncCancelTest() {
+ var Task1 = Task.Factory.StartNew(() => {
+ var response = _device.Sale(5.12m)
+ .WithCashBack(7.5m)
+ .WithReferenceNumber(1)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ });
+ var Task2 = Task.Factory.StartNew(() => {
+ try {
+ Thread.Sleep(5000);
+ _device.Cancel();
+ } catch (Exception ex) {
+ Assert.Fail(ex.Message);
+ }
+ });
+
+ Task.WaitAll(Task1, Task2);
+ }
+
+
+ [TestMethod]
+ public void GetLastReceiptTest() {
+ var response = _device
+ .GetLastReceipt()
+ .Execute();
+
+ string xmlData = response.ToString();
+
+ Assert.IsNotNull(response.ToString());
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs
new file mode 100644
index 00000000..f36b9b33
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs
@@ -0,0 +1,180 @@
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Terminals;
+using GlobalPayments.Api.Terminals.Abstractions;
+using GlobalPayments.Api.Terminals.Ingenico;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System.Threading;
+using System.Threading.Tasks;
+using ReportType = GlobalPayments.Api.Terminals.Ingenico.ReportType;
+
+namespace GlobalPayments.Api.Tests.Terminals.Ingenico {
+ [TestClass]
+ public class SerialPaymentTransactions {
+ IDeviceInterface _device;
+
+ public SerialPaymentTransactions() {
+ _device = DeviceService.Create(new ConnectionConfig() {
+ DeviceType = DeviceType.Ingenico_EPOS_Lane3000,
+ ConnectionMode = ConnectionModes.SERIAL,
+ Port = "5",
+ BaudRate = BaudRate.r9600,
+ DataBits = DataBits.Seven,
+ StopBits = System.IO.Ports.StopBits.One,
+ Parity = System.IO.Ports.Parity.Even,
+ Handshake = System.IO.Ports.Handshake.None,
+ Timeout = 65000
+ });
+
+ Assert.IsNotNull(_device);
+ }
+
+ [TestMethod]
+ public void CaptureTest() {
+ var response = _device.Capture(6.18m)
+ .WithReferenceNumber(1)
+ .WithCurrencyCode("826")
+ .WithTransactionId("011223")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void SaleTest() {
+ var response = _device.Sale(6.18m)
+ .WithReferenceNumber(1)
+ .WithPaymentMode(PaymentMode.APPLICATION)
+ .WithCurrencyCode("826")
+ .WithTableNumber("1")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void Reverse() {
+ var response = _device.Reverse(amount: 6.18m)
+ .WithReferenceNumber(12)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void SaleRefund() {
+ var response = _device.Refund(6.18m)
+ .WithReferenceNumber(1)
+ .WithPaymentMode(PaymentMode.APPLICATION)
+ .WithCurrencyCode("826")
+ .WithTableNumber("1")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void preAuth() {
+ var response = _device.Authorize(20.00m)
+ .WithReferenceNumber(1)
+ .WithPaymentMode(PaymentMode.APPLICATION)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void SaleCancel() {
+ var task1 = Task.Factory.StartNew(() => {
+ var response = _device.Sale(523m)
+ .WithReferenceNumber(1)
+ .WithPaymentMode(PaymentMode.APPLICATION)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ });
+
+ var task2 = Task.Factory.StartNew(() => {
+ Thread.Sleep(10000);
+ _device.Cancel();
+ });
+
+ Task.WaitAll(task1, task2);
+ }
+
+ [TestMethod]
+ public void TaxFree() {
+
+ var splitR = _device
+ .GetLastReceipt(ReceiptType.SPLITR)
+ .Execute();
+
+ string test = splitR.ToString();
+
+ if (splitR.ToString().Contains(""))
+ Assert.IsNotNull(splitR);
+ }
+
+ [TestMethod]
+ public void Ticket() {
+ ITerminalReport res = _device
+ .GetLastReceipt(ReceiptType.TICKET)
+ .Execute();
+
+ string test = res.ToString();
+
+ if (res.ToString().Contains(""))
+ Assert.IsNotNull(res);
+ }
+
+ [TestMethod]
+ public void EOD() {
+
+ /** This example doesn't return XML/Report Data but it intiate End of Day
+ Report and the terminal will return EODOK if success.
+ */
+ ITerminalReport res = _device
+ .GetReport(ReportType.EOD)
+ .Execute();
+
+ Assert.IsNotNull(res);
+ }
+
+ [TestMethod]
+ public void Cashback() {
+ var response = _device.Sale(20.00m)
+ .WithReferenceNumber(01)
+ .WithPaymentMode(PaymentMode.APPLICATION)
+ .WithCurrencyCode("826")
+ .WithCashBack(2.00m)
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void AccountVerification() {
+
+ var response = _device.Verify()
+ .WithReferenceNumber(01)
+ .WithPaymentMode(PaymentMode.MAILORDER)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void test123() {
+ var response = _device.Verify()
+ .WithReferenceNumber(01)
+ .WithPaymentMode(PaymentMode.APPLICATION)
+ .WithCurrencyCode("826")
+ .Execute();
+
+ Assert.IsNotNull(response);
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs
new file mode 100644
index 00000000..cc5c1270
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs
@@ -0,0 +1,87 @@
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Terminals;
+using GlobalPayments.Api.Terminals.Ingenico;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using System.Text;
+using System.Threading;
+
+namespace GlobalPayments.Api.Tests.Terminals.Ingenico {
+ [TestClass]
+ public class TerminalManagementTest {
+ IDeviceInterface _device;
+
+ public TerminalManagementTest() {
+ _device = DeviceService.Create(new ConnectionConfig() {
+ DeviceType = Entities.DeviceType.Ingenico_EPOS_Desk5000,
+ ConnectionMode = ConnectionModes.TCP_IP_SERVER,
+ Port = "18101",
+ Timeout = 5 * 1000
+ });
+ Assert.IsNotNull(_device);
+ }
+
+ [TestMethod]
+ public void StateCommandTest() {
+ try {
+ var resp = _device.GetTerminalStatus();
+
+ Assert.IsNotNull(resp);
+ }
+ catch (Exception e) {
+ Assert.Fail(e.Message);
+ }
+ }
+
+ [TestMethod]
+ public void PIDCommandTest() {
+ try {
+ var resp = _device.Initialize();
+
+ Assert.IsNotNull(resp);
+ }
+ catch (Exception e) {
+ Assert.Fail(e.Message);
+ }
+ }
+
+ [TestMethod]
+ public void CALLTMSCommandTest() {
+ try {
+ var resp = _device.GetTerminalConfiguration();
+
+ Assert.IsNotNull(resp);
+ Assert.IsNotNull((resp as IngenicoTerminalResponse).PrivateData);
+ }
+ catch (Exception e) {
+ Assert.Fail(e.Message);
+ }
+ }
+
+ [TestMethod]
+ public void LOGONCommandTest() {
+ try {
+ var resp = _device.TestConnection();
+
+ Assert.IsNotNull(resp);
+ Assert.IsNotNull((resp as IngenicoTerminalResponse).PrivateData);
+ }
+ catch (Exception e) {
+ Assert.Fail(e.Message);
+ }
+ }
+
+ [TestMethod]
+ public void RESETCommandTest() {
+ try {
+ var resp = _device.Reboot();
+
+ Assert.IsNotNull(resp);
+ Assert.IsNotNull((resp as IngenicoTerminalResponse).PrivateData);
+ }
+ catch (Exception e) {
+ Assert.Fail(e.Message);
+ }
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs
new file mode 100644
index 00000000..0483167a
--- /dev/null
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs
@@ -0,0 +1,86 @@
+using System.Threading;
+using System.Threading.Tasks;
+using GlobalPayments.Api.Entities;
+using GlobalPayments.Api.Services;
+using GlobalPayments.Api.Terminals;
+using GlobalPayments.Api.Terminals.Ingenico;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace GlobalPayments.Api.Tests.Terminals.Ingenico {
+ [TestClass]
+ public class TransactionTest {
+ IDeviceInterface _device;
+
+ public TransactionTest() {
+ _device = DeviceService.Create(new ConnectionConfig() {
+ DeviceType = DeviceType.Ingenico_EPOS_Lane3000,
+ ConnectionMode = ConnectionModes.TCP_IP_SERVER,
+ Port = "18101",
+ Timeout = 60000,
+ RequestIdProvider = new RandomIdProvider()
+ });
+ Assert.IsNotNull(_device);
+ }
+
+
+ [TestMethod]
+ public void AsyncCancelTest() {
+ var tsk1 = Task.Factory.StartNew(() => {
+ var respSale = _device.Sale(15.12m)
+ .WithCashBack(3m)
+ .WithReferenceNumber(02)
+ .Execute();
+
+ Assert.IsNotNull(respSale);
+ });
+
+ var tsk2 = Task.Factory.StartNew(() => {
+ Thread.Sleep(7000);
+
+ var respCancel = _device.Cancel();
+
+ Assert.IsNotNull(respCancel);
+ Assert.AreEqual(respCancel.Status, "CANCEL_DONE");
+ });
+
+ Thread.Sleep(10000);
+ _device.Dispose();
+
+ Task.WaitAll(tsk1, tsk2);
+ }
+
+ [TestMethod]
+ public void ReverseTest() {
+
+ Thread.Sleep(10000);
+
+ var resSale = _device.Sale(125.12m)
+ .WithReferenceNumber(55)
+ .Execute();
+
+ Thread.Sleep(10000);
+
+ if (resSale != null) {
+ var resp = _device.Reverse(amount: 6.18m)
+ .WithReferenceNumber(12)
+ .Execute();
+
+ var termId = resp.TerminalRefNumber;
+
+ Assert.IsNotNull(termId);
+ Assert.AreEqual(resp.Status, "REVERSAL_SUCCESS");
+ }
+ else Assert.IsNull(resSale);
+ }
+
+ [TestMethod]
+ public void DuplicTest() {
+
+ var duplicate = _device.Duplicate();
+
+ _device.Dispose();
+ Assert.IsNotNull(duplicate);
+ Assert.AreEqual(((IngenicoTerminalResponse)duplicate).PrivateData, "DUPLICDONE");
+ }
+ }
+}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs
index e45620f6..eced7fe7 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs
@@ -12,7 +12,7 @@ public class PaxBatchTests {
public PaxBatchTests() {
_device = DeviceService.Create(new ConnectionConfig {
DeviceType = DeviceType.PAX_S300,
- ConnectionMode = ConnectionModes.TCP_IP,
+ ConnectionMode = ConnectionModes.HTTP,
IpAddress = "10.12.220.172",
Port = "10009",
RequestIdProvider = new RandomIdProvider()
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs
index f50f6077..ac74f89f 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs
@@ -411,7 +411,6 @@ public void CreditDuplicateTransaction() {
.Execute();
Assert.IsNotNull(duplicate);
Assert.AreEqual("00", duplicate.ResponseCode);
- Assert.AreEqual(response.AuthorizationCode, duplicate.AuthorizationCode);
}
}
}
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs
index 045d3a6b..cb576e7d 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs
@@ -11,9 +11,8 @@ public class PaxDebitTests {
public PaxDebitTests() {
_device = DeviceService.Create(new ConnectionConfig {
DeviceType = DeviceType.PAX_S300,
- ConnectionMode = ConnectionModes.TCP_IP,
- IpAddress = "10.12.220.172",
- //IpAddress = "192.168.0.31",
+ ConnectionMode = ConnectionModes.HTTP,
+ IpAddress = "192.168.0.31",
Port = "10009",
RequestIdProvider = new RandomIdProvider()
});
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs
index 92212ddc..2fe022ab 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs
@@ -11,7 +11,7 @@ public class PaxEbtTests {
public PaxEbtTests() {
_device = DeviceService.Create(new ConnectionConfig {
DeviceType = DeviceType.PAX_S300,
- ConnectionMode = ConnectionModes.TCP_IP,
+ ConnectionMode = ConnectionModes.HTTP,
IpAddress = "10.12.220.172",
Port = "10009",
RequestIdProvider = new RandomIdProvider()
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs
index 28542acb..f10845c8 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs
@@ -13,7 +13,7 @@ public class PaxGiftTests {
public PaxGiftTests() {
_device = DeviceService.Create(new ConnectionConfig {
DeviceType = DeviceType.PAX_S300,
- ConnectionMode = ConnectionModes.TCP_IP,
+ ConnectionMode = ConnectionModes.HTTP,
IpAddress = "10.12.220.172",
Port = "10009",
RequestIdProvider = new RandomIdProvider()
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs
index f347d89e..529f0b50 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs
@@ -12,7 +12,7 @@ public class PaxLevel2Tests {
public PaxLevel2Tests() {
_device = DeviceService.Create(new ConnectionConfig {
DeviceType = DeviceType.PAX_S300,
- ConnectionMode = ConnectionModes.TCP_IP,
+ ConnectionMode = ConnectionModes.HTTP,
IpAddress = "10.12.220.172",
Port = "10009",
RequestIdProvider = new RandomIdProvider()
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs
index a57edbc9..05b7d228 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs
@@ -19,8 +19,7 @@ public static void Initialize(TestContext context) {
_device = DeviceService.Create(new ConnectionConfig {
DeviceType = DeviceType.PAX_S300,
ConnectionMode = ConnectionModes.TCP_IP,
- IpAddress = "10.12.220.172",
- //IpAddress = "192.168.0.31",
+ IpAddress = "192.168.0.31",
Port = "10009",
Timeout = 30000,
RequestIdProvider = new RandomIdProvider()
diff --git a/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs b/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs
index 946ecccc..399c192c 100644
--- a/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs
+++ b/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs
@@ -22,7 +22,7 @@ public class IncrementalNumberProvider : IRequestIdProvider {
private static IncrementalNumberProvider _instance;
public static IncrementalNumberProvider GetInstance() {
- if (_instance == null) {
+ if (_instance != null) {
_instance = new IncrementalNumberProvider();
}
return _instance;
diff --git a/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs b/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs
index 2f810996..4de42458 100644
--- a/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs
+++ b/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs
@@ -44,15 +44,10 @@ public static CreditCardData VisaManual(bool cardPresent = false, bool readerPre
}
public static CreditTrackData VisaSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData {
+ return new CreditTrackData {
Value = "%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?",
EntryMethod = entryMethod
};
- return rvalue;
- //return new CreditTrackData {
- // Value = "%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?",
- // EntryMethod = entryMethod
- //};
}
public static CreditTrackData VisaFallbackSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
@@ -95,15 +90,10 @@ public static CreditCardData MasterCardSeries2Manual(bool cardPresent = false, b
}
public static CreditTrackData MasterCardSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData {
- Value = "%B5506740000004316^MC TEST CARD^251210199998888777766665555444433332?;5506740000004316=25121019999888877776?",
+ return new CreditTrackData {
+ Value = "%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?",
EntryMethod = entryMethod
};
- return rvalue;
- //return new CreditTrackData {
- // Value = "%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?",
- // EntryMethod = entryMethod
- //};
}
public static CreditTrackData MasterCard24Swipe(EntryMethod entryMethod = EntryMethod.Swipe) {
@@ -142,15 +132,10 @@ public static CreditCardData DiscoverManual(bool cardPresent = false, bool reade
}
public static CreditTrackData DiscoverSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData creditTrackData = new CreditTrackData {
+ return new CreditTrackData {
Value = "%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?",
EntryMethod = entryMethod
};
- return creditTrackData;
- //return new CreditTrackData {
- // Value = "%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?",
- // EntryMethod = entryMethod
- //};
}
public static CreditTrackData DiscoverSwipeEncrypted(EntryMethod entryMethod = EntryMethod.Swipe) {
return new CreditTrackData {
@@ -174,16 +159,10 @@ public static CreditCardData AmexManual(bool cardPresent = false, bool readerPre
}
public static CreditTrackData AmexSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData {
- Value = "%B3739 531923 51004^STANDARD ANSI ^2008100812345?",
+ return new CreditTrackData {
+ Value = "%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?",
EntryMethod = entryMethod
};
- return rvalue;
- //return new CreditTrackData
- //{
- // Value = "%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?",
- // EntryMethod = entryMethod
- //};
}
public static CreditCardData JcbManual(bool cardPresent = false, bool readerPresent = false) {
@@ -214,175 +193,6 @@ public static GiftCard GiftCard2Manual() {
return new GiftCard {
Number = "5022440000000000007"
};
- }
- public static CreditCardData VisaFleetManual(bool cardPresent = false, bool readerPresent = false) {
- CreditCardData rvalue = new CreditCardData {
- Number = "4761360000000249",
- ExpMonth = 12,
- ExpYear = 2025,
- Cvn = "123",
- CardPresent = cardPresent,
- ReaderPresent = readerPresent
- };
- return rvalue;
- }
- public static CreditTrackData VisaFleetSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData {
- Value = "%B4485536666666663^VISA TEST CARD/GOOD^25121019206100000001?;4485536666666663=16111019206100000001?",
- EntryMethod = entryMethod
- };
- return rvalue;
- //CreditTrackData rvalue = new CreditTrackData();
- //rvalue.Value = "%B4484630000000126^VISA TEST CARD/GOOD^25121019206100000001?;4484630000000126=16111019206100000001?";
- //rvalue.EntryMethod = entryMethod;
- //return rvalue;
- }
- public static CreditCardData MasterCardFleetManual(bool cardPresent = false, bool readerPresent = false) {
- CreditCardData card = new CreditCardData {
- Number = "5567300000000016",
- ExpMonth = 12,
- ExpYear = 2025,
- Cvn = "123",
- CardPresent = cardPresent,
- ReaderPresent = readerPresent
- };
-
- return card;
- }
- public static CreditTrackData MasterCardFleetSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData {
- Value = "%B5567300000000016^MASTERCARD FLEET ^2512101777766665555444433332111?;5567300000000016=25121019999888877724?",
- EntryMethod = entryMethod
- };
- return rvalue;
- //CreditTrackData track = new CreditTrackData();
- //track.Value = "%B5567300000000016^MASTERCARD FLEET ^2512101777766665555444433332111?;5567300000000016=25121019999888877711?";
- //track.EntryMethod = entryMethod;
-
- //return track;
- }
- public static CreditCardData FleetOneManual(bool cardPresent = false, bool readerPresent = false) {
- CreditCardData rvalue = new CreditCardData {
- Number = "5014860000000000126",
- ExpMonth = 12,
- ExpYear = 2025,
- Cvn = "123",
- CardPresent = cardPresent,
- ReaderPresent = readerPresent
- };
- return rvalue;
- }
- public static CreditTrackData FleetOneSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData {
- Value = "%B5014860000000126^FLEETONE TEST CARD/GOOD^25121019206100000001?;5014860000000126=16111019206100000001?",
- EntryMethod = entryMethod
- };
- return rvalue;
- }
- public static GiftCard ValueLinkManual() {
- GiftCard rvalue = new GiftCard();
- rvalue.SetValue("6010561234567890123");
- return rvalue;
- }
- public static GiftCard ValueLinkSwipe() {
- GiftCard rvalue = new GiftCard();
- rvalue.SetValue("7083559999009209310=999900100000000");
- return rvalue;
- }
- public static CreditCardData AmexManualEncrypted(bool cardPresent=true) {
- CreditCardData rvalue = new CreditCardData();
- rvalue.Number = "372700790311018";
- rvalue.ExpMonth = 12;
- rvalue.ExpYear = 2020;
- rvalue.CardPresent = cardPresent;
- rvalue.ReaderPresent = true;
- rvalue.EncryptionData = EncryptionData.Version2("/wECAQEEAoFGAgEH4gwTTDT6jRZwb3NAc2VjdXJlZXhjaGFuZ2UubmV0yp142cX/wGCVF/gVBOFEiFbZxWq0ZQeADdyMNKbOOzxu2MsHhZ+MkDQrz1KJKJVOHQyV3/mnHBWsQPdlGpVkxK0GxFrxbtIxOwViiBZb2ySajpUat6o+MunOrz7ZsYeurOJHtrpYrLEmPgVwxL3dn3Br+XS5sF2pqtG4lq5MsmgAzzKH9/llZ+FDb1e0NJX/8Nso784bBAr3dmUqagCaWSVb4fcg", "1");
- return rvalue;
- }
- public static CreditTrackData AmexSwipeEncrypted(EntryMethod entryMethod=EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData();
- rvalue.Value = "B372700791018^AMEX TEST CARD^2512990ocSvC1w2YgC";
- rvalue.EntryMethod = entryMethod;
- rvalue.EncryptionData = EncryptionData.Version2("/wECAQEEAoFGAgEH4gwTTDT6jRZwb3NAc2VjdXJlZXhjaGFuZ2UubmV0yp142cX/wGCVF/gVBOFEiFbZxWq0ZQeADdyMNKbOOzxu2MsHhZ+MkDQrz1KJKJVOHQyV3/mnHBWsQPdlGpVkxK0GxFrxbtIxOwViiBZb2ySajpUat6o+MunOrz7ZsYeurOJHtrpYrLEmPgVwxL3dn3Br+XS5sF2pqtG4lq5MsmgAzzKH9/llZ+FDb1e0NJX/8Nso784bBAr3dmUqagCaWSVb4fcg", "1");
- return rvalue;
- }
- /*
- SVS
- ;7083559900007000792=99990018010300000?
- ;7083559900007000776=99990013849500000?
- ;7083559900007000818=99990012504400000?
- */
- public static GiftCard SvsManual() {
- GiftCard rvalue = new GiftCard();
- rvalue.SetValue("6394700000001113");
- rvalue.Pin = "1234";
- return rvalue;
- }
- public static GiftCard SvsSwipe() {
- GiftCard rvalue = new GiftCard();
- rvalue.SetValue(";7083559900007000818=99990012504400000?");
- return rvalue;
- }
-
- public static CreditCardData VisaCorporateManual(bool cardPresent = false, bool readerPresent = false) {
- CreditCardData rvalue = new CreditCardData();
- rvalue.Number = "4013872718148777";
- rvalue.ExpMonth = 12;
- rvalue.ExpYear = 2025;
- rvalue.Cvn = "123";
- rvalue.CardPresent = cardPresent;
- rvalue.ReaderPresent = readerPresent;
- return rvalue;
- }
-
- public static CreditTrackData VisaCorporateSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData();
- rvalue.Value = "%B4273594425847534^VISA TEST CARD/GOOD^2512101?;4273594425847534=1712101?";
- rvalue.EntryMethod = entryMethod;
- return rvalue;
- }
-
- public static CreditCardData VisaPurchasingManual(bool cardPresent = false, bool readerPresent = false) {
- CreditCardData rvalue = new CreditCardData();
- rvalue.Number = "4484104292153662";
- rvalue.ExpMonth = 12;
- rvalue.ExpYear = 2025;
- rvalue.Cvn = "123";
- rvalue.CardPresent = cardPresent;
- rvalue.ReaderPresent = readerPresent;
- return rvalue;
- }
-
- public static CreditTrackData VisaPurchasingSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData();
- rvalue.Value = "%B4484104292153662^POSINT TEST VISA P CARD^2512501032100321001000?;4484104292153662=18035010321?";
- rvalue.EntryMethod = entryMethod;
- return rvalue;
- }
-
- public static CreditCardData MasterCardPurchasingManual(bool cardPresent = false, bool readerPresent = false) {
- CreditCardData rvalue = new CreditCardData();
- rvalue.Number = "5302490000004066";
- rvalue.ExpMonth = 12;
- rvalue.ExpYear = 2025;
- rvalue.Cvn = "123";
- rvalue.CardPresent = cardPresent;
- rvalue.ReaderPresent = readerPresent;
- return rvalue;
- }
-
- public static CreditTrackData MasterCardPurchasingSwipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData();
- rvalue.Value = "%B5405059925478964^MASTERCARD TEST^25121011234567890123?;5405059925478964=18121011234567890123?";
- rvalue.EntryMethod = entryMethod;
- return rvalue;
- }
-
- public static CreditTrackData MasterCard2Swipe(EntryMethod entryMethod = EntryMethod.Swipe) {
- CreditTrackData rvalue = new CreditTrackData();
- rvalue.Value = "%B2223000010005780^TEST CARD/EMV BIN-2^25121010000000009210?;2223000010005780=25121010000000009210?";
- rvalue.EntryMethod = entryMethod;
- return rvalue;
}
}
}
diff --git a/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs b/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs
index 5834a093..5646e666 100644
--- a/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs
+++ b/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs
@@ -13,15 +13,15 @@ public TransitAuthenticationTests() {
//});
}
- [TestMethod]
+ [TestMethod, Ignore]
public void GenerateKey_Manual() {
// TODO: I have verified this works and am awaiting for guidance on how to handle the transaction keys before finalizing this piece
string transactionKey = TransitService.GenerateTransactionKey(
Environment.TEST,
- "887000003282",
- "TA5654114",
- "TransitCert2020!"
- //"3RDHBVQOYIGTC9WQ32CPBFMPGX5OTWN3"
+ "887000003226",
+ "TA5622118",
+ "f8mapGqWrE^rVaA9",
+ "3RDHBVQOYIGTC9WQ32CPBFMPGX5OTWN3"
);
Assert.IsNotNull(transactionKey);
}
diff --git a/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs b/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs
index 55592f57..fc225125 100644
--- a/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs
+++ b/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs
@@ -151,14 +151,14 @@ public void Auth_MultiCapture() {
var captureResponse = response.Capture(10m)
.WithCurrency("USD")
- .WithMultiCapture(1, 2)
+ .WithMultiCapture(true)
.Execute();
Assert.IsNotNull(captureResponse);
Assert.AreEqual("00", captureResponse.ResponseCode, captureResponse.ResponseMessage);
var captureResponse2 = response.Capture(10m)
.WithCurrency("USD")
- .WithMultiCapture(2, 2)
+ .WithMultiCapture(true)
.Execute();
Assert.IsNotNull(captureResponse2);
Assert.AreEqual("00", captureResponse2.ResponseCode, captureResponse2.ResponseMessage);
@@ -174,7 +174,7 @@ public void Auth_MultiCapture_Mixed() {
var captureResponse = response.Capture(12m)
.WithCurrency("USD")
- .WithMultiCapture(1, 2)
+ .WithMultiCapture(true)
.Execute();
Assert.IsNotNull(captureResponse);
Assert.AreEqual("00", captureResponse.ResponseCode, captureResponse.ResponseMessage);
@@ -196,15 +196,12 @@ public void Auth_MultiCapture_OverAuth() {
var captureResponse = response.Capture(21m)
.WithCurrency("USD")
- .WithMultiCapture(1, 2)
+ //.WithMultiCapture(true)
.Execute();
Assert.IsNotNull(captureResponse);
Assert.AreEqual("00", captureResponse.ResponseCode, captureResponse.ResponseMessage);
- response.Capture(10m)
- .WithCurrency("USD")
- .WithMultiCapture(2, 2)
- .Execute();
+ response.Capture(10m).WithCurrency("USD").WithMultiCapture(true).Execute();
}
[TestMethod, ExpectedException(typeof(GatewayException))]