Example #1
0
        /// <summary>
        /// A <b>Batch Close</b> transaction instructs the Heartland POS Gateway to close the current open
        /// batch and settle it. If a batch is not open, an error will be returned.
        /// </summary>
        /// <returns>The HPS batch.</returns>
        public HpsBatch CloseBatch()
        {
            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                ItemElementName = ItemChoiceType1.BatchClose,
                Item            = "BatchClose"
            };

            /* Submit the transaction. */
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.BatchClose);

            var batchClose = (PosBatchCloseRspType)rsp.Transaction.Item;

            return(new HpsBatch
            {
                Id = batchClose.BatchId,
                SequenceNumber = batchClose.BatchSeqNbr,
                TotalAmount = batchClose.TotalAmt,
                TransactionCount = batchClose.TxnCnt
            });
        }
Example #2
0
        public PosResponseVer10 SubmitTransaction(PosRequestVer10Transaction transaction, long?clientTransactionId = null)
        {
            var rsp = DoTransaction(transaction, clientTransactionId).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, (ItemChoiceType2)transaction.ItemElementName);

            string rspCode = string.Empty, rspText = string.Empty;

            if (rsp.Transaction != null)
            {
                var trans = rsp.Transaction.Item;

                var rspCodeField = trans.GetType().GetProperty("RspCode");
                if (rspCodeField != null)
                {
                    rspCode = rspCodeField.GetValue(trans).ToString();
                }

                var rspTextField = transaction.GetType().GetProperty("RspText");
                if (rspTextField != null)
                {
                    rspText = rspTextField.GetValue(trans).ToString();
                }
            }
            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId, rspCode, rspText);

            return(rsp);
        }
        /// <summary>Helper method for activate transactions (supporting multiple activation methods).</summary>
        /// <param name="transaction">The gateway response.</param>
        /// <returns>The <see cref="HpsGiftCardActivate"/>.</returns>
        private HpsGiftCardResponse SubmitActivation(PosRequestVer10Transaction transaction)
        {
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardActivate);

            var activationRsp = (PosGiftCardActivateRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      activationRsp.RspCode.ToString(CultureInfo.InvariantCulture), activationRsp.RspText, HpsCardType.Gift);

            /* Start to fill out a new transaction response (HpsGiftCardTransactionResponse). */
            var activation = new HpsGiftCardResponse
            {
                Header              = HydrateTransactionHeader(rsp.Header),
                TransactionId       = rsp.Header.GatewayTxnId,
                AuthorizationCode   = activationRsp.AuthCode,
                BalanceAmount       = activationRsp.BalanceAmt,
                PointsBalanceAmount = activationRsp.PointsBalanceAmt,
                Rewards             = activationRsp.Rewards,
                Notes        = activationRsp.Notes,
                ResponseCode = activationRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText = activationRsp.RspText
            };

            return(activation);
        }
Example #4
0
        /// <summary>
        /// A <b>Void</b> transaction is used to cancel a previously successful sale transaction. The original sale transaction
        /// can be identified by the GatewayTxnid of the original or by the ClientTxnId of the original if provided on the original
        /// Sale transaction.
        /// </summary>
        /// <param name="transactionId">The transaction ID of charge to void.</param>
        /// <param name="clientTransactionId">The client transaction ID of charge to void.</param>
        /// <returns>The <see cref="HpsGiftCardActivate"/>.</returns>
        public HpsCheckResponse Void(long?transactionId = null, long?clientTransactionId = null)
        {
            if ((!transactionId.HasValue && !clientTransactionId.HasValue) || (transactionId.HasValue && clientTransactionId.HasValue))
            {
                throw new ArgumentException(Resource.HpsCheckService_Invalid_Input_Id, "transactionId");
            }

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosCheckVoidReqType
                {
                    Block1 = new CheckVoidReqBlock1Type()
                },
                ItemElementName = ItemChoiceType1.CheckVoid
            };

            var block1 = ((PosCheckVoidReqType)transaction.Item).Block1;

            if (transactionId.HasValue)
            {
                block1.GatewayTxnId          = transactionId.Value;
                block1.GatewayTxnIdSpecified = true;
                block1.ClientTxnIdSpecified  = false;
            }
            else
            {
                block1.GatewayTxnIdSpecified = false;
                block1.ClientTxnId           = clientTransactionId.Value;
                block1.ClientTxnIdSpecified  = true;
            }

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.CheckVoid);

            var voidRsp = (PosCheckVoidRspType)rsp.Transaction.Item;

            if (voidRsp.RspCode != 0)
            {
                throw new HpsCheckException(rsp.Header.GatewayTxnId, GetResponseDetails(voidRsp.CheckRspInfo), voidRsp.RspCode, voidRsp.RspMessage);
            }

            /* Start to fill out a new transaction response (HpsCheckResponse). */
            var response = new HpsCheckResponse
            {
                Header            = HydrateTransactionHeader(rsp.Header),
                TransactionId     = rsp.Header.GatewayTxnId,
                AuthorizationCode = voidRsp.AuthCode,
                ResponseCode      = voidRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText      = voidRsp.RspMessage,
                Details           = GetResponseDetails(voidRsp.CheckRspInfo)
            };

            return(response);
        }
Example #5
0
        internal HpsEbtAuthorization SubmitTransaction(PosRequestVer10Transaction transaction, long?clientTransactionId = null)
        {
            var rsp = DoTransaction(transaction, clientTransactionId).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, (ItemChoiceType2)transaction.ItemElementName);

            var authResponse = (AuthRspStatusType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId, authResponse.RspCode, authResponse.RspText);

            return(new HpsEbtAuthorization().FromResponse(rsp));
        }
 private void ProcessChargeGatewayResponse(PosResponseVer10 rsp, ItemChoiceType2 expectedResponseType)
 {
     if (rsp.Header.GatewayRspCode == 0)
     {
         return;
     }
     if (rsp.Header.GatewayRspCode == 3)
     {
         return;
     }
     HpsGatewayResponseValidation.CheckResponse(rsp, expectedResponseType);
 }
        /// <summary>
        /// A <b>Alias</b> transaction is used to manage an account number alias, such as a phone number,
        /// for a stored value account. The transaction can be used to Add an alias to an existing account,
        /// Delete an alias from an existing account or Create a new stored value account and add an alias
        /// to the new account.
        /// </summary>
        /// <param name="action">Type of Alias action requested.</param>
        /// <param name="giftCard">The gift card information (leave null for CREATE action).</param>
        /// <param name="alias">Alternate identifier used to reference a stored value account.</param>
        /// <returns>The <see cref="HpsGiftCardAlias"/>.</returns>
        public HpsGiftCardAlias Alias(HpsGiftCardAliasAction action, HpsGiftCard giftCard, string alias)
        {
            var gatewayAction = GiftCardAliasReqBlock1TypeAction.ADD;

            switch (action)
            {
            case HpsGiftCardAliasAction.Create: gatewayAction = GiftCardAliasReqBlock1TypeAction.CREATE; break;

            case HpsGiftCardAliasAction.Delete: gatewayAction = GiftCardAliasReqBlock1TypeAction.DELETE; break;
            }

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosGiftCardAliasReqType
                {
                    Block1 = new GiftCardAliasReqBlock1Type
                    {
                        Action   = gatewayAction,
                        Alias    = alias,
                        CardData = HydrateGiftCardData(giftCard)
                    }
                },
                ItemElementName = ItemChoiceType1.GiftCardAlias
            };

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardAlias);

            var aliasRsp = (PosGiftCardAliasRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      aliasRsp.RspCode.ToString(CultureInfo.InvariantCulture), aliasRsp.RspText, HpsCardType.Gift);

            /* Start to fill out a new transaction response (HpsGiftCardAddValue). */
            var response = new HpsGiftCardAlias
            {
                Header        = HydrateTransactionHeader(rsp.Header),
                TransactionId = rsp.Header.GatewayTxnId,
                GiftCard      = new HpsGiftCard
                {
                    Value = aliasRsp.CardData.CardNbr
                },
                ResponseCode = aliasRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText = aliasRsp.RspText
            };

            return(response);
        }
Example #8
0
        /// <summary>
        /// A Debit Reversal transaction reverses a Debit Charge or Debit Return transaction.
        /// </summary>
        /// <param name="transactionId">The gateway transaciton ID of the charge to be reversed.</param>
        /// <param name="trackData">The data read from the card by the card reader.</param>
        /// <param name="amount">Authorization amount.</param>
        /// <param name="authorizedAmount">Settlement amount or New Authorization amount after reversal occures.</param>
        /// <param name="encryptionData">E3 encryption data group.</param>
        /// <param name="details">Group containing additional transaction fields to be included in detail reporting.</param>
        /// <param name="clientTransactionId">The client transaction ID.</param>
        /// <returns>The reversal result.</returns>
        public HpsTransaction Reverse(int transactionId, decimal amount, string trackData, decimal?authorizedAmount = null,
                                      HpsEncryptionData encryptionData = null, HpsTransactionDetails details = null, long?clientTransactionId = null)
        {
            HpsInputValidation.CheckAmount(amount);

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosDebitReversalReqType
                {
                    Block1 = new DebitReversalReqBlock1Type
                    {
                        GatewayTxnId          = transactionId,
                        GatewayTxnIdSpecified = true,
                        TrackData             = trackData,
                        Amt                 = amount,
                        EncryptionData      = HydrateEncryptionData(encryptionData),
                        AdditionalTxnFields = HydrateAdditionalTxnFields(details)
                    }
                },
                ItemElementName = ItemChoiceType1.DebitReversal
            };

            if (authorizedAmount.HasValue)
            {
                var block = ((PosDebitReversalReqType)transaction.Item).Block1;
                block.AuthAmt          = authorizedAmount.Value;
                block.AuthAmtSpecified = true;
            }

            var rsp = DoTransaction(transaction, clientTransactionId).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.DebitReversal);

            long?clientTxnId = null;

            if (rsp.Header.ClientTxnId != default(long))
            {
                clientTxnId = rsp.Header.ClientTxnId;
            }

            return(new HpsTransaction
            {
                Header = HydrateTransactionHeader(rsp.Header),
                TransactionId = rsp.Header.GatewayTxnId,
                ClientTransactionId = clientTxnId,
                ResponseCode = "00",
                ResponseText = string.Empty
            });
        }
Example #9
0
        internal HpsReportTransactionSummary[] FromResponse(PosResponseVer10 response, HpsTransactionType?filterBy = null)
        {
            var reportResponse = (PosReportActivityRspType)response.Transaction.Item;

            List <HpsReportTransactionSummary> transactions = new List <HpsReportTransactionSummary>();
            string serviceName = string.Empty;

            if (filterBy.HasValue)
            {
                serviceName = TransactionTypeToServiceName(filterBy.Value);
            }

            foreach (var charge in reportResponse.Details)
            {
                var trans = new HpsReportTransactionSummary();
                trans.FromResponse(response);

                trans.OriginalTransactionId = charge.OriginalGatewayTxnId;
                trans.MaskedCardNumber      = charge.MaskedCardNbr;
                trans.ResponseCode          = charge.IssuerRspCode;
                trans.ResponseText          = charge.IssuerRspText;
                trans.Amount             = charge.Amt;
                trans.SettlementAmount   = charge.SettlementAmt;
                trans.TransactionUtcDate = charge.TxnDT;
                trans.TransactionType    = ServiceNameToTransactionType(charge.ServiceName);
                trans.SiteTrace          = charge.SiteTrace;
                if (filterBy.HasValue)
                {
                    trans.TransactionType = filterBy.Value;
                }

                if (charge.GatewayRspCode != 0 || (!string.IsNullOrEmpty(charge.IssuerRspCode) && charge.IssuerRspCode != "00"))
                {
                    trans.Exceptions = new HpsChargeExceptions();
                    if (charge.GatewayRspCode != 0)
                    {
                        trans.Exceptions.GatewayException = HpsGatewayResponseValidation.GetException(charge.GatewayRspCode, charge.GatewayRspMsg);
                    }
                    if (charge.IssuerRspCode != "00")
                    {
                        trans.Exceptions.IssuerException = HpsIssuerResponseValidation.GetException(charge.GatewayRspCode, charge.IssuerRspCode, charge.IssuerRspText);
                    }
                }
                transactions.Add(trans);
            }

            return(transactions.ToArray());
        }
Example #10
0
        public HpsCheckResponse SubmitTransaction(PosRequestVer10Transaction transaction, long?clientTransactionId = null)
        {
            var rsp = DoTransaction(transaction, clientTransactionId).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, (ItemChoiceType2)transaction.ItemElementName);

            HpsCheckResponse response = new HpsCheckResponse().FromResponse(rsp);

            int    responseCode;
            string responseMsg = string.Empty;

            if (rsp.Transaction.Item is PosCheckSaleRspType)
            {
                var item = (PosCheckSaleRspType)rsp.Transaction.Item;
                responseCode = item.RspCode;
                responseMsg  = item.RspMessage;
            }
            else if (rsp.Transaction.Item is PosCheckVoidRspType)
            {
                var item = (PosCheckVoidRspType)rsp.Transaction.Item;
                responseCode = item.RspCode;
                responseMsg  = item.RspMessage;
            }
            else
            {
                var item = (AuthRspStatusType)rsp.Transaction.Item;
                responseCode = int.Parse(item.RspCode);
                responseMsg  = item.RspText;
            }

            if (responseCode == null || responseCode != 0)
            {
                throw new HpsCheckException(
                          rsp.Header.GatewayTxnId,
                          response.Details,
                          responseCode,
                          responseMsg
                          );
            }

            return(response);
        }
Example #11
0
        /// <summary>
        /// A Debit Charge transaction performs a sale purchased with a Debit Card. The Debit Charge is placed
        /// in the current open batch. If a batch is not open, this transaction creates an open batch.
        /// </summary>
        /// <param name="amount">Authorization amount.</param>
        /// <param name="currency">Currency type ("usd").</param>
        /// <param name="trackData">Track data read from the card by the card reader.</param>
        /// <param name="pinBlock">PIN block.</param>
        /// <param name="cashBackAmount">Contains the portion of the amount that is cash back.</param>
        /// <param name="allowDuplicates">Indicates whether to allow duplicate transactions.</param>
        /// <param name="allowPartialAuth">Indicate whether to allow partial authorization.</param>
        /// <param name="cardHolder">Card holder information.</param>
        /// <param name="encryptionData">E3 encryption data group.</param>
        /// <param name="details">Group containing additional transaction fields to be inclided in detail reporting.</param>
        /// <param name="clientTransactionId">The client transaction ID.</param>
        /// <returns>The Debit Charge result.</returns>
        public HpsAuthorization Charge(decimal amount, string currency, string trackData, string pinBlock,
                                       HpsEncryptionData encryptionData = null, bool allowDuplicates      = false, decimal?cashBackAmount       = null,
                                       bool allowPartialAuth            = false, HpsCardHolder cardHolder = null, HpsTransactionDetails details = null,
                                       long?clientTransactionId         = null)
        {
            HpsInputValidation.CheckAmount(amount);
            HpsInputValidation.CheckCurrency(currency);

            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosDebitSaleReqType
                {
                    Block1 = new DebitSaleReqBlock1Type
                    {
                        TrackData         = trackData,
                        AllowDup          = allowDuplicates ? booleanType.Y : booleanType.N,
                        AllowDupSpecified = true,
                        CardHolderData    = cardHolder == null ? null : HydrateCardHolderData(cardHolder),
                        Amt                       = amount,
                        CashbackAmtInfo           = cashBackAmount.HasValue ? cashBackAmount.Value : 0,
                        CashbackAmtInfoSpecified  = cashBackAmount.HasValue,
                        AllowPartialAuth          = allowPartialAuth ? booleanType.Y : booleanType.N,
                        AllowPartialAuthSpecified = true,
                        PinBlock                  = pinBlock,
                        EncryptionData            = HydrateEncryptionData(encryptionData),
                        AdditionalTxnFields       = HydrateAdditionalTxnFields(details)
                    }
                },
                ItemElementName = ItemChoiceType1.DebitSale
            };

            var rsp = DoTransaction(transaction, clientTransactionId).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.DebitSale);

            var chargeResponse = (AuthRspStatusType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId, chargeResponse.RspCode, chargeResponse.RspText);

            return(HydrateAuthorization <HpsAuthorization>(rsp));
        }
        /// <summary>
        /// A <b>Balance</b> transaction is used to check the balance of a gift card.
        /// </summary>
        /// <param name="giftCard">The gift card information.</param>
        /// <returns>The <see cref="HpsGiftCardBalance"/>.</returns>
        public HpsGiftCardResponse GetBalance(HpsGiftCard giftCard)
        {
            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosGiftCardBalanceReqType
                {
                    Block1 = new GiftCardBalanceReqBlock1Type
                    {
                        CardData = HydrateGiftCardData(giftCard)
                    }
                },
                ItemElementName = ItemChoiceType1.GiftCardBalance
            };

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardBalance);

            var balanceRsp = (PosGiftCardBalanceRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      balanceRsp.RspCode.ToString(CultureInfo.InvariantCulture), balanceRsp.RspText, HpsCardType.Gift);

            /* Start to fill out a new transaction response (HpsGiftCardAddValue). */
            var response = new HpsGiftCardResponse
            {
                Header              = HydrateTransactionHeader(rsp.Header),
                TransactionId       = rsp.Header.GatewayTxnId,
                AuthorizationCode   = balanceRsp.AuthCode,
                BalanceAmount       = balanceRsp.BalanceAmt,
                PointsBalanceAmount = balanceRsp.PointsBalanceAmt,
                Rewards             = balanceRsp.Rewards,
                Notes        = balanceRsp.Notes,
                ResponseCode = balanceRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText = balanceRsp.RspText
            };

            return(response);
        }
        private void ProcessGatewayResponse(PosResponseVer10 response, ItemChoiceType1 expectedResponseType, decimal?amount)
        {
            var responseCode  = response.Header.GatewayRspCode;
            var transactionId = response.Header.GatewayTxnId;

            if (responseCode == 0)
            {
                return;
            }

            if (responseCode == 30)
            {
                try {
                    //Reverse(amount).WithTransactionId(transactionId).Execute();
                }
                catch (HpsException e) {
                    throw new HpsGatewayException(HpsExceptionCodes.GatewayTimeoutReversalError, "Error occurred while reversing a charge due to a gateway timeout.", e);
                }
            }
            HpsGatewayResponseValidation.CheckResponse(response, (ItemChoiceType2)expectedResponseType);
        }
Example #14
0
        /// <summary>
        /// A <b>Void</b> transaction is used to cancel a previously approved Sale, Activate, Add Value, Deactivate, or Replace.
        /// If successful, the gift card is credited with the amount of the sale.
        /// </summary>
        /// <param name="transactionId">Transaction identifier assigned by Portico Gateway of the Sale transaction to void.</param>
        /// <returns>The <see cref="HpsGiftCardReward"/>.</returns>
        public HpsGiftCardResponse VoidTransaction(int transactionId)
        {
            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosGiftCardVoidReqType
                {
                    Block1 = new GiftCardVoidReqBlock1Type
                    {
                        GatewayTxnId = transactionId
                    }
                },
                ItemElementName = ItemChoiceType1.GiftCardVoid
            };

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardVoid);

            var voidRsp = (PosGiftCardVoidRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      voidRsp.RspCode.ToString(CultureInfo.InvariantCulture), voidRsp.RspText);

            /* Start to fill out a new transaction response. */
            var response = new HpsGiftCardResponse
            {
                Header              = HydrateTransactionHeader(rsp.Header),
                TransactionId       = rsp.Header.GatewayTxnId,
                AuthorizationCode   = voidRsp.AuthCode,
                BalanceAmount       = voidRsp.BalanceAmt,
                PointsBalanceAmount = voidRsp.PointsBalanceAmt,
                Notes        = voidRsp.Notes,
                ResponseCode = voidRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText = voidRsp.RspText
            };

            return(response);
        }
Example #15
0
        /// <summary>
        /// A Debit Return transaction returns funds to the cardholder. The transaction is generally used as a
        /// counterpart to a Debit Charge transaction that needs to be reversed. The Debit Return transaction is
        /// placed in the current open batch. If a batch is not open, this transaction create an open batch.
        /// </summary>
        /// <param name="transactionId">The gateway transaciton ID of the charge to be returned.</param>
        /// <param name="trackData">Track data read from the card by the card reader.</param>
        /// <param name="amount">Authorization amount.</param>
        /// <param name="pinBlock">PIN block.</param>
        /// <param name="allowDuplicates">Indicates whether to allow duplicate transacitons.</param>
        /// <param name="cardHolder">Card holder information.</param>
        /// <param name="encryptionData">E3 encryption data group.</param>
        /// <param name="details">Group containing additional transaction fields to be included in detail reporting.</param>
        /// <param name="clientTransactionId">Client transaction ID.</param>
        /// <returns>The Return (Authorization) results.</returns>
        public HpsAuthorization Return(int transactionId, decimal amount, string trackData, string pinBlock,
                                       bool allowDuplicates          = false, HpsCardHolder cardHolder = null, HpsEncryptionData encryptionData = null,
                                       HpsTransactionDetails details = null, long?clientTransactionId  = null)
        {
            HpsInputValidation.CheckAmount(amount);

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosDebitReturnReqType
                {
                    Block1 = new DebitReturnReqBlock1Type
                    {
                        TrackData         = trackData,
                        AllowDup          = allowDuplicates ? booleanType.Y : booleanType.N,
                        AllowDupSpecified = true,
                        CardHolderData    = cardHolder == null ? null : HydrateCardHolderData(cardHolder),
                        Amt                 = amount,
                        PinBlock            = pinBlock,
                        EncryptionData      = HydrateEncryptionData(encryptionData),
                        AdditionalTxnFields = HydrateAdditionalTxnFields(details)
                    }
                },
                ItemElementName = ItemChoiceType1.DebitReturn
            };

            var rsp = DoTransaction(transaction, clientTransactionId).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.DebitReturn);

            var returnRsp = (AuthRspStatusType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId, returnRsp.RspCode, returnRsp.RspText);

            return(HydrateAuthorization <HpsAuthorization>(rsp));
        }
        /// <summary>Helper method for reversal transactions (supporting multiple reversal methods).</summary>
        /// <param name="transaction">The gateway response.</param>
        /// <returns>The <see cref="HpsGiftCardActivate"/>.</returns>
        private HpsGiftCardResponse SubmitReversal(PosRequestVer10Transaction transaction)
        {
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardReversal);

            var reversalRsp = (PosGiftCardReversalRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      reversalRsp.RspCode.ToString(CultureInfo.InvariantCulture), reversalRsp.RspText, HpsCardType.Gift);

            /* Start to fill out a new transaction response. */
            var reversal = new HpsGiftCardResponse
            {
                Header            = HydrateTransactionHeader(rsp.Header),
                TransactionId     = rsp.Header.GatewayTxnId,
                AuthorizationCode = reversalRsp.AuthCode,
                BalanceAmount     = reversalRsp.BalanceAmt,
                ResponseCode      = reversalRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText      = reversalRsp.RspText
            };

            return(reversal);
        }
Example #17
0
        /// <summary>
        /// A <b>Sale</b> transaction is used to process transactions using bank account information as the payment method.
        /// The transaction service can be used to perform a Sale or Return transaction by indicating the Check Action.
        /// <br></br><br></br>
        /// <b>NOTE:</b> The Portico Gateway supports both GETI and HPS Colonnade for processing check transactions. While
        /// the available services are the same regardless of the check processor, the services may have different behaviors.
        /// For example, GETI-processed Check Sale transactions support the ability to override a Check Sale transaction
        /// already presented as well as the ability to verify a check.
        /// </summary>
        /// <param name="action">Type of Check Action (Sale, Return, Override).</param>
        /// <param name="check">The Check information.</param>
        /// <param name="amount">The amount of the sale.</param>
        /// <returns>The <see cref="HpsCheckResponse"/>.</returns>
        public HpsCheckResponse Sale(checkActionType action, HpsCheck check, decimal amount)
        {
            HpsInputValidation.CheckAmount(amount);

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosCheckSaleReqType
                {
                    Block1 = new CheckSaleReqBlock1Type
                    {
                        Amt         = amount,
                        AccountInfo = new AccountInfoType
                        {
                            AccountNumber = check.AccountNumber,
                            CheckNumber   = check.CheckNumber,
                            MICRData      = check.MicrNumber,
                            RoutingNumber = check.RoutingNumber
                        },
                        AmtSpecified = true,
                        CheckAction  = action,
                        SECCode      = check.SecCode,
                        VerifyInfo   = new VerifyInfoType
                        {
                            CheckVerify          = check.CheckVerify ? booleanType.Y : booleanType.N,
                            CheckVerifySpecified = true,
                            ACHVerify            = check.AchVerify ? booleanType.Y : booleanType.N,
                            ACHVerifySpecified   = true
                        }
                    }
                },
                ItemElementName = ItemChoiceType1.CheckSale
            };

            var block1 = ((PosCheckSaleReqType)transaction.Item).Block1;

            if (check.AccountType.HasValue)
            {
                block1.AccountInfo.AccountType          = check.AccountType.Value;
                block1.AccountInfo.AccountTypeSpecified = true;
            }
            else
            {
                block1.AccountInfo.AccountTypeSpecified = false;
            }

            if (check.CheckType.HasValue)
            {
                block1.CheckType          = check.CheckType.Value;
                block1.CheckTypeSpecified = true;
            }
            else
            {
                block1.CheckTypeSpecified = false;
            }

            if (check.DataEntryMode.HasValue)
            {
                block1.DataEntryMode          = check.DataEntryMode.Value;
                block1.DataEntryModeSpecified = true;
            }
            else
            {
                block1.DataEntryModeSpecified = false;
            }

            if (check.CheckHolder != null)
            {
                block1.ConsumerInfo = new ConsumerInfoType
                {
                    Address1     = check.CheckHolder.Address != null ? check.CheckHolder.Address.Address : null,
                    CheckName    = check.CheckHolder.CheckName,
                    City         = check.CheckHolder.Address != null ? check.CheckHolder.Address.City : null,
                    CourtesyCard = check.CheckHolder.CourtesyCard,
                    DLNumber     = check.CheckHolder.DlNumber,
                    DLState      = check.CheckHolder.DlState,
                    EmailAddress = check.CheckHolder.Email,
                    FirstName    = check.CheckHolder.FirstName,
                    LastName     = check.CheckHolder.LastName,
                    PhoneNumber  = check.CheckHolder.Phone,
                    State        = check.CheckHolder.Address != null ? check.CheckHolder.Address.State : null,
                    Zip          = check.CheckHolder.Address != null ? check.CheckHolder.Address.Zip : null,
                    IdentityInfo = new IdentityInfoType {
                        DOBYear = check.CheckHolder.DobYear != null?check.CheckHolder.DobYear.ToString() : null, SSNL4 = check.CheckHolder.Ssl4 != null ? check.CheckHolder.Ssl4 : null
                    }
                };
            }

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.CheckSale);

            var saleRsp = (PosCheckSaleRspType)rsp.Transaction.Item;

            if (saleRsp.RspCode != 0)
            {
                throw new HpsCheckException(rsp.Header.GatewayTxnId, GetResponseDetails(saleRsp.CheckRspInfo), saleRsp.RspCode, saleRsp.RspMessage);
            }

            /* Start to fill out a new transaction response (HpsCheckResponse). */
            var response = new HpsCheckResponse
            {
                Header            = HydrateTransactionHeader(rsp.Header),
                TransactionId     = rsp.Header.GatewayTxnId,
                AuthorizationCode = saleRsp.AuthCode,
                ResponseCode      = saleRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText      = saleRsp.RspMessage,
                Details           = GetResponseDetails(saleRsp.CheckRspInfo)
            };

            return(response);
        }
        /// <summary>
        /// A <b>Sale</b> transaction is used to record a sale against the gift card. If successful, the card
        /// amount is subtracted from the gift card amount.
        /// </summary>
        /// <param name="giftCard">The gift card information.</param>
        /// <param name="amount">The amount of purchase to be used in rewards calculation.</param>
        /// <param name="currency">Identifies the currency of a financial transaction ("usd" or "points")</param>
        /// <param name="gratuity">The portion of the purchase amount that is a gratuity</param>
        /// <param name="tax">The portion of the purchase amount that is tax</param>
        /// <returns>The <see cref="HpsGiftCardReward"/>.</returns>
        public HpsGiftCardSale Sale(HpsGiftCard giftCard, decimal amount, string currency = "usd",
                                    decimal?gratuity = null, decimal?tax = null)
        {
            currency = currency.ToLower();
            HpsInputValidation.CheckAmount(amount);

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosGiftCardSaleReqType
                {
                    Block1 = new GiftCardSaleReqBlock1Type
                    {
                        Amt      = amount,
                        CardData = HydrateGiftCardData(giftCard)
                    }
                },
                ItemElementName = ItemChoiceType1.GiftCardSale
            };

            var block = ((PosGiftCardSaleReqType)transaction.Item).Block1;

            if (currency == "usd" || currency == "points")
            {
                block.Currency          = currency == "usd" ? currencyType.USD : currencyType.POINTS;
                block.CurrencySpecified = true;
            }

            if (gratuity != null)
            {
                block.GratuityAmtInfo          = gratuity.Value;
                block.GratuityAmtInfoSpecified = true;
            }

            if (tax != null)
            {
                block.TaxAmtInfo          = tax.Value;
                block.TaxAmtInfoSpecified = true;
            }

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardSale);

            var saleRsp = (PosGiftCardSaleRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      saleRsp.RspCode.ToString(CultureInfo.InvariantCulture), saleRsp.RspText, HpsCardType.Gift);

            /* Start to fill out a new transaction response. */
            var response = new HpsGiftCardSale
            {
                Header                = HydrateTransactionHeader(rsp.Header),
                TransactionId         = rsp.Header.GatewayTxnId,
                AuthorizationCode     = saleRsp.AuthCode,
                BalanceAmount         = saleRsp.BalanceAmt,
                SplitTenderCardAmount = saleRsp.SplitTenderCardAmt,
                SplitTenderBalanceDue = saleRsp.SplitTenderBalanceDueAmt,
                PointsBalanceAmount   = saleRsp.PointsBalanceAmt,
                ResponseCode          = saleRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText          = saleRsp.RspText
            };

            return(response);
        }