Example #1
0
        public static DeviceMessage BuildUpaAdminRequest(int requestId, string ecrId, string txnType, string lineItemLeft = null, string lineItemRight = null, int?displayOption = null)
        {
            var doc = new JsonDoc();

            doc.Set("message", UpaMessageType.Msg);
            var data = doc.SubElement("data");

            data.Set("command", txnType);
            data.Set("EcrId", ecrId);
            data.Set("requestId", requestId);

            if ((!string.IsNullOrEmpty(lineItemLeft) || !string.IsNullOrEmpty(lineItemRight)) || displayOption.HasValue)
            {
                var request       = data.SubElement("data");
                var requestParams = request.SubElement("params");
                requestParams.Set("lineItemLeft", lineItemLeft);
                requestParams.Set("lineItemRight", lineItemRight);
                if (displayOption.HasValue)
                {
                    requestParams.Set("displayOption", displayOption);
                }
            }

            return(BuildUpaRequest(doc.ToString()));
        }
Example #2
0
        internal IDeviceMessage BuildReportTransaction(TerminalReportBuilder builder)
        {
            var requestId = builder.SearchBuilder.ReferenceNumber;

            if (requestId == default(string) && RequestIdProvider != null)
            {
                requestId = RequestIdProvider.GetRequestId().ToString();
            }

            var doc = new JsonDoc();

            doc.Set("message", "MSG");

            var baseRequest = doc.SubElement("data");

            baseRequest.Set("command", MapReportType(builder.ReportType));
            if (!(builder.SearchBuilder.EcrId == null))
            {
                baseRequest.Set("EcrId", builder.SearchBuilder.EcrId);
            }
            baseRequest.Set("requestId", requestId.ToString());

            if (builder.ReportType == TerminalReportType.GetOpenTabDetails)
            {
                return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
            }

            var txnData   = baseRequest.SubElement("data");
            var txnParams = txnData.SubElement("params");

            txnParams.Set("reportOutput", builder.SearchBuilder.ReportOutput);
            txnParams.Set("batch", builder.SearchBuilder.Batch);

            return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
        }
Example #3
0
        public T ProcessRecurring <T>(RecurringBuilder <T> builder) where T : class
        {
            var request = new JsonDoc();

            if (builder.TransactionType == TransactionType.Create || builder.TransactionType == TransactionType.Edit)
            {
                if (builder.Entity is Customer)
                {
                    BuildCustomer(request, builder.Entity as Customer);
                }
                else if (builder.Entity is RecurringPaymentMethod)
                {
                    BuildPaymentMethod(request, builder.Entity as RecurringPaymentMethod, builder.TransactionType);
                }
                else if (builder.Entity is Schedule)
                {
                    BuildSchedule(request, builder.Entity as Schedule, builder.TransactionType);
                }
            }
            else if (builder.TransactionType == TransactionType.Search)
            {
                foreach (var entry in builder.SearchCriteria)
                {
                    request.Set(entry.Key, entry.Value);
                }
            }

            var response = DoTransaction(MapMethod(builder.TransactionType), MapUrl(builder), request.ToString());

            return(MapResponse <T>(response));
        }
Example #4
0
 private JsonDoc BuildDate(JsonDoc request, string name, DateTime?date, bool force = false)
 {
     if (date.HasValue || force)
     {
         var value = (date.HasValue) ? date.Value.ToString("MMddyyyy") : null;
         request.Set(name, value, force);
     }
     return(request);
 }
        private void SendAckMessageToDevice()
        {
            var doc = new JsonDoc();

            doc.Set("message", UpaMessageType.Ack);

            var message   = TerminalUtilities.BuildUpaRequest(doc.ToString());
            var ackBuffer = message.GetSendBuffer();

            _stream.Write(ackBuffer, 0, ackBuffer.Length);
        }
Example #6
0
        internal static GpApiRequest BuildRequest(Secure3dBuilder builder, GpApiConnector gateway)
        {
            var merchantUrl = !string.IsNullOrEmpty(gateway.GpApiConfig.MerchantId) ? $"/merchants/{gateway.GpApiConfig.MerchantId}" : string.Empty;

            if (builder.TransactionType == TransactionType.VerifyEnrolled)
            {
                var storedCredential = new JsonDoc()
                                       .Set("model", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential?.Type))
                                       .Set("reason", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential?.Reason))
                                       .Set("sequence", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential?.Sequence));

                var paymentMethod = new JsonDoc();

                if (builder.PaymentMethod is ITokenizable tokenized && !string.IsNullOrEmpty(tokenized.Token))
                {
                    paymentMethod.Set("id", tokenized.Token);
                }
                else if (builder.PaymentMethod is ICardData cardData)
                {
                    var card = new JsonDoc()
                               .Set("number", cardData.Number)
                               .Set("expiry_month", cardData.ExpMonth?.ToString().PadLeft(2, '0'))
                               .Set("expiry_year", cardData.ExpYear?.ToString().PadLeft(4, '0').Substring(2, 2));

                    paymentMethod.Set("card", card);
                }

                var notifications = new JsonDoc()
                                    .Set("challenge_return_url", gateway.GpApiConfig.ChallengeNotificationUrl)
                                    .Set("three_ds_method_return_url", gateway.GpApiConfig.MethodNotificationUrl);

                var data = new JsonDoc()
                           .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TransactionProcessingAccountName)
                           .Set("reference", builder.ReferenceNumber ?? Guid.NewGuid().ToString())
                           .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.GpApiConfig.Channel))
                           .Set("amount", builder.Amount.ToNumericCurrencyString())
                           .Set("currency", builder.Currency)
                           .Set("country", gateway.GpApiConfig.Country)
                           .Set("preference", builder.ChallengeRequestIndicator?.ToString())
                           .Set("source", builder.AuthenticationSource.ToString())
                           .Set("initator", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential?.Initiator))
                           .Set("stored_credential", storedCredential.HasKeys() ? storedCredential : null)
                           .Set("payment_method", paymentMethod)
                           .Set("notifications", notifications.HasKeys() ? notifications : null);

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/authentications",
                    RequestBody = data.ToString(),
                });
            }
        private static JsonDoc SetPayerInformation(AuthorizationBuilder builder)
        {
            JsonDoc payer = new JsonDoc();

            payer.Set("reference", builder.CustomerId ?? builder.CustomerData?.Id);
            if (builder.PaymentMethod is eCheck)
            {
                JsonDoc billingAddress = new JsonDoc();

                billingAddress.Set("line_1", builder.BillingAddress?.StreetAddress1)
                .Set("line_2", builder.BillingAddress?.StreetAddress2)
                .Set("city", builder.BillingAddress?.City)
                .Set("postal_code", builder.BillingAddress?.PostalCode)
                .Set("state", builder.BillingAddress?.State)
                .Set("country", builder.BillingAddress.CountryCode);

                payer.Set("billing_address", billingAddress);

                if (builder.CustomerData != null)
                {
                    payer.Set("name", builder.CustomerData.FirstName + " " + builder.CustomerData.LastName);
                    payer.Set("date_of_birth", builder.CustomerData.DateOfBirth);
                }
                payer.Set("landline_phone", builder.CustomerData?.HomePhone?.ToNumeric() ?? builder.HomePhone?.ToString());
                payer.Set("mobile_phone", builder.CustomerData?.MobilePhone?.ToNumeric() ?? builder.MobilePhone?.ToString());
            }
            else if (builder.PaymentMethod is AlternativePaymentMethod)
            {
                JsonDoc homePhone = new JsonDoc();

                homePhone.Set("country_code", builder.HomePhone?.CountryCode)
                .Set("subscriber_number", builder.HomePhone?.Number);

                payer.Set("home_phone", homePhone);

                JsonDoc workPhone = new JsonDoc();

                workPhone.Set("country_code", builder.WorkPhone?.CountryCode)
                .Set("subscriber_number", builder.WorkPhone?.Number);

                payer.Set("work_phone", workPhone);
            }
            return(payer);
        }
Example #8
0
 private JsonDoc BuildAddress(JsonDoc request, Address address)
 {
     if (address != null)
     {
         request.Set("addressLine1", address.StreetAddress1);
         request.Set("addressLine2", address.StreetAddress2);
         request.Set("city", address.City);
         request.Set("country", address.Country);
         request.Set("stateProvince", address.State);
         request.Set("zipPostalCode", address.PostalCode);
     }
     return(request);
 }
Example #9
0
        internal IDeviceMessage BuildManageTransaction(TerminalManageBuilder builder)
        {
            var transType     = builder.TransactionType;
            var transModifier = builder.TransactionModifier;
            int requestId     = builder.ReferenceNumber;

            if (requestId == default(int) && RequestIdProvider != null)
            {
                requestId = RequestIdProvider.GetRequestId();
            }

            var doc = new JsonDoc();

            doc.Set("message", "MSG");

            var baseRequest = doc.SubElement("data");

            // Possibly update the requestToken parameter in the future if necessary
            baseRequest.Set("command", MapTransactionType(transType, transModifier, false, builder.Gratuity));
            baseRequest.Set("EcrId", builder.EcrId.ToString());
            baseRequest.Set("requestId", requestId.ToString());

            var txnData = baseRequest.SubElement("data");

            var transaction = txnData.SubElement("transaction");

            transaction.Set("referenceNumber", builder.TransactionId ?? StringUtils.PadLeft(builder.TerminalRefNumber, 4, '0'));
            transaction.Set("amount", ToCurrencyString(builder.Amount));
            transaction.Set("taxAmount", ToCurrencyString(builder.TaxAmount));
            transaction.Set("tipAmount", ToCurrencyString(builder.Gratuity));
            transaction.Set("taxIndicator", builder.TaxExempt);
            transaction.Set("invoiceNbr", builder.InvoiceNumber);
            transaction.Set("processCPC", builder.ProcessCPC);

            return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
        }
Example #10
0
        private JsonDoc BuildSchedule(JsonDoc request, Schedule schedule, TransactionType type)
        {
            Func <string> mapDuration = () => {
                if (schedule.NumberOfPayments != null)
                {
                    return("Limited Number");
                }
                else if (schedule.EndDate != null)
                {
                    return("End Date");
                }
                else
                {
                    return("Ongoing");
                }
            };

            Func <string> mapProcessingDate = () => {
                var frequencies = new List <string> {
                    "Monthly", "Bi-Monthly", "Quarterly", "Semi-Annually"
                };
                if (frequencies.Contains(schedule.Frequency))
                {
                    switch (schedule.PaymentSchedule)
                    {
                    case PaymentSchedule.FirstDayOfTheMonth:
                        return("First");

                    case PaymentSchedule.LastDayOfTheMonth:
                        return("Last");

                    default: {
                        var day = schedule.StartDate.Value.Day;
                        if (day > 28)
                        {
                            return("Last");
                        }
                        return(day.ToString());
                    }
                    }
                }
                else if (schedule.Frequency == "Semi-Monthly")
                {
                    if (schedule.PaymentSchedule == PaymentSchedule.LastDayOfTheMonth)
                    {
                        return("Last");
                    }
                    return("First");
                }
                return(null);
            };

            if (schedule != null)
            {
                request.Set("scheduleName", schedule.Name);
                request.Set("scheduleStatus", schedule.Status);
                request.Set("paymentMethodKey", schedule.PaymentKey);

                BuildAmount(request, "subtotalAmount", schedule.Amount, schedule.Currency, type);
                BuildAmount(request, "taxAmount", schedule.TaxAmount, schedule.Currency, type);

                request.Set("deviceId", schedule.DeviceId);
                request.Set("processingDateInfo", mapProcessingDate());
                BuildDate(request, "endDate", schedule.EndDate, (type == TransactionType.Edit));
                request.Set("reprocessingCount", schedule.ReprocessingCount ?? 3);
                request.Set("emailReceipt", schedule.EmailReceipt.ToString());
                request.Set("emailAdvanceNotice", schedule.EmailNotification ? "Yes" : "No");
                // debt repay ind
                request.Set("invoiceNbr", schedule.InvoiceNumber);
                request.Set("poNumber", schedule.PoNumber);
                request.Set("description", schedule.Description);
                request.Set("numberOfPayments", schedule.NumberOfPayments);

                if (type == TransactionType.Create)
                {
                    request.Set("scheduleIdentifier", schedule.Id);
                    request.Set("customerKey", schedule.CustomerKey);
                    BuildDate(request, "startDate", schedule.StartDate);
                    request.Set("frequency", schedule.Frequency);
                    request.Set("duration", mapDuration());
                }
                else   // Edit Fields
                {
                    if (!schedule.HasStarted)
                    {
                        request.Set("scheduleIdentifier", schedule.Id);
                        BuildDate(request, "startDate", schedule.StartDate);
                        request.Set("frequency", schedule.Frequency);
                        request.Set("duration", mapDuration());
                    }
                    else
                    {
                        BuildDate(request, "cancellationDate", schedule.CancellationDate);
                        BuildDate(request, "nextProcressingDate", schedule.NextProcessingDate);
                    }
                }
            }
            return(request);
        }
Example #11
0
        private JsonDoc BuildPaymentMethod(JsonDoc request, RecurringPaymentMethod payment, TransactionType type)
        {
            if (payment != null)
            {
                request.Set("preferredPayment", payment.PreferredPayment);
                request.Set("paymentMethodIdentifier", payment.Id);
                request.Set("customerKey", payment.CustomerKey);
                request.Set("nameOnAccount", payment.NameOnAccount);
                BuildAddress(request, payment.Address);

                if (type == TransactionType.Create)
                {
                    string  tokenValue  = null;
                    var     hasToken    = HasToken(payment.PaymentMethod, out tokenValue);
                    JsonDoc paymentInfo = null;
                    if (payment.PaymentMethod is ICardData)
                    {
                        var method = payment.PaymentMethod as ICardData;
                        paymentInfo = request.SubElement(hasToken ? "alternateIdentity" : "card")
                                      .Set("type", hasToken ? "SINGLEUSETOKEN" : null)
                                      .Set(hasToken ? "token" : "number", hasToken ? tokenValue : method.Number)
                                      .Set("expMon", method.ExpMonth)
                                      .Set("expYear", method.ExpYear);
                        request.Set("cardVerificationValue", method.Cvn);
                    }
                    else if (payment.PaymentMethod is ITrackData)
                    {
                        var method = payment.PaymentMethod as ITrackData;
                        paymentInfo = request.SubElement("track")
                                      .Set("data", method.Value)
                                      .Set("dataEntryMode", method.EntryMethod.ToString().ToUpper());
                    }
                    else if (payment.PaymentMethod is eCheck)
                    {
                        var check = payment.PaymentMethod as eCheck;
                        request.Set("achType", check.AccountType.ToInitialCase())
                        .Set("accountType", check.CheckType.ToInitialCase())
                        .Set("telephoneIndicator", (check.SecCode == SecCode.CCD || check.SecCode == SecCode.PPD) ? false : true)
                        .Set("routingNumber", check.RoutingNumber)
                        .Set("accountNumber", check.AccountNumber)
                        .Set("accountHolderYob", check.BirthYear.ToString())
                        .Set("driversLicenseState", check.DriversLicenseState)
                        .Set("driversLicenseNumber", check.DriversLicenseNumber)
                        .Set("socialSecurityNumberLast4", check.SsnLast4);
                        request.Remove("country");
                    }

                    if (payment.PaymentMethod is IEncryptable)
                    {
                        var enc = (payment.PaymentMethod as IEncryptable).EncryptionData;
                        if (enc != null)
                        {
                            paymentInfo.Set("trackNumber", enc.TrackNumber);
                            paymentInfo.Set("key", enc.KTB);
                            paymentInfo.Set("encryptionType", "E3");
                        }
                    }
                }
                else   // EDIT FIELDS
                {
                    request.Remove("customerKey");
                    request.Set("paymentStatus", payment.Status);
                    request.Set("cpcTaxType", payment.TaxType);
                    request.Set("expirationDate", payment.ExpirationDate);
                }
            }
            return(request);
        }
Example #12
0
 private JsonDoc BuildCustomer(JsonDoc request, Customer customer)
 {
     if (customer != null)
     {
         request.Set("customerIdentifier", customer.Id);
         request.Set("firstName", customer.FirstName);
         request.Set("lastName", customer.LastName);
         request.Set("company", customer.Company);
         request.Set("customerStatus", customer.Status);
         request.Set("primaryEmail", customer.Email);
         request.Set("phoneDay", customer.HomePhone);
         request.Set("phoneEvening", customer.WorkPhone);
         request.Set("phoneMobile", customer.MobilePhone);
         request.Set("fax", customer.Fax);
         request.Set("title", customer.Title);
         request.Set("department", customer.Department);
         BuildAddress(request, customer.Address);
     }
     return(request);
 }
Example #13
0
        public Transaction ProcessSecure3d(Secure3dBuilder builder)
        {
            TransactionType transType     = builder.TransactionType;
            IPaymentMethod  paymentMethod = builder.PaymentMethod;
            ISecure3d       secure3d      = (ISecure3d)paymentMethod;
            string          timestamp     = DateTime.Now.ToString("yyyy-MM-dd'T'hh:mm:ss.ffffff");

            JsonDoc request = new JsonDoc();

            if (transType.Equals(TransactionType.VerifyEnrolled))
            {
                request.Set("request_timestamp", timestamp);
                request.Set("merchant_id", MerchantId);
                request.Set("account_id", AccountId);
                request.Set("method_notification_url", MethodNotificationUrl);

                string hashValue = string.Empty;
                if (paymentMethod is CreditCardData cardData)
                {
                    request.Set("number", cardData.Number);
                    request.Set("scheme", MapCardScheme(cardData.CardType.ToUpper()));
                    hashValue = cardData.Number;
                }
                else if (paymentMethod is RecurringPaymentMethod storedCard)
                {
                    request.Set("payer_reference", storedCard.CustomerKey);
                    request.Set("payment_method_reference", storedCard.Key);
                    hashValue = storedCard.CustomerKey;
                }

                string hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, hashValue);
                SetAuthHeader(hash);

                string rawResponse = DoTransaction(HttpMethod.Post, "protocol-versions", request.ToString());
                return(MapResponse(rawResponse));
            }
            else if (transType.Equals(TransactionType.VerifySignature))
            {
                string hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, builder.ServerTransactionId);
                SetAuthHeader(hash);

                var queryValues = new Dictionary <string, string>();
                queryValues.Add("merchant_id", MerchantId);
                queryValues.Add("request_timestamp", timestamp);

                string rawResponse = DoTransaction(HttpMethod.Get, string.Format("authentications/{0}", builder.ServerTransactionId), null, queryValues);
                return(MapResponse(rawResponse));
            }
            else if (transType.Equals(TransactionType.InitiateAuthentication))
            {
                string orderId = builder.OrderId;
                if (string.IsNullOrEmpty(orderId))
                {
                    orderId = GenerationUtils.GenerateOrderId();
                }
                ThreeDSecure secureEcom = secure3d.ThreeDSecure;

                request.Set("request_timestamp", timestamp);
                request.Set("authentication_source", builder.AuthenticationSource.ToString());
                request.Set("authentication_request_type", builder.AuthenticationRequestType.ToString());
                request.Set("message_category", builder.MessageCategory.ToString());
                request.Set("message_version", "2.1.0");
                request.Set("server_trans_id", secureEcom.ServerTransactionId);
                request.Set("merchant_id", MerchantId);
                request.Set("account_id", AccountId);
                request.Set("challenge_notification_url", ChallengeNotificationUrl);
                request.Set("method_url_completion", builder.MethodUrlCompletion.ToString());
                request.Set("merchant_contact_url", MerchantContactUrl);
                request.Set("merchant_initiated_request_type", builder.MerchantInitiatedRequestType?.ToString());
                request.Set("whitelist_status", builder.WhitelistStatus);
                request.Set("decoupled_flow_request", builder.DecoupledFlowRequest);
                request.Set("decoupled_flow_timeout", builder.DecoupledFlowTimeout);
                request.Set("decoupled_notification_url", builder.DecoupledNotificationUrl);
                request.Set("enable_exemption_optimization", builder.EnableExemptionOptimization);

                // card details
                string  hashValue  = string.Empty;
                JsonDoc cardDetail = request.SubElement("card_detail");
                if (paymentMethod is CreditCardData cardData)
                {
                    hashValue = cardData.Number;
                    cardDetail.Set("number", cardData.Number);
                    cardDetail.Set("scheme", cardData.CardType.ToUpper());
                    cardDetail.Set("expiry_month", cardData.ExpMonth.ToString());
                    cardDetail.Set("expiry_year", cardData.ExpYear.ToString().Substring(2));
                    cardDetail.Set("full_name", cardData.CardHolderName);

                    if (!string.IsNullOrEmpty(cardData.CardHolderName))
                    {
                        string[] names = cardData.CardHolderName.Split(' ');
                        if (names.Length >= 1)
                        {
                            cardDetail.Set("first_name", names[0]);
                        }
                        if (names.Length >= 2)
                        {
                            cardDetail.Set("last_name", string.Join(" ", names.Skip(1)));
                        }
                    }
                }
                else if (paymentMethod is RecurringPaymentMethod storedCard)
                {
                    hashValue = storedCard.CustomerKey;
                    cardDetail.Set("payer_reference", storedCard.CustomerKey);
                    cardDetail.Set("payment_method_reference", storedCard.Key);
                }

                // order details
                JsonDoc order = request.SubElement("order");
                order.Set("amount", builder.Amount.ToNumericCurrencyString());
                order.Set("currency", builder.Currency);
                order.Set("id", orderId);
                order.Set("address_match_indicator", builder.AddressMatchIndicator ? "true" : "false");
                order.Set("date_time_created", builder.OrderCreateDate?.ToString("yyyy-MM-dd'T'hh:mm'Z'"));
                order.Set("gift_card_count", builder.GiftCardCount);
                order.Set("gift_card_currency", builder.GiftCardCurrency);
                order.Set("gift_card_amount", builder.GiftCardAmount.ToNumericCurrencyString());
                order.Set("delivery_email", builder.DeliveryEmail);
                order.Set("delivery_timeframe", builder.DeliveryTimeframe?.ToString());
                order.Set("shipping_method", builder.ShippingMethod?.ToString());
                order.Set("shipping_name_matches_cardholder_name", builder.ShippingNameMatchesCardHolderName);
                order.Set("preorder_indicator", builder.PreOrderIndicator?.ToString());
                order.Set("reorder_indicator", builder.ReorderIndicator?.ToString());
                order.Set("transaction_type", builder.OrderTransactionType?.ToString());
                order.Set("preorder_availability_date", builder.PreOrderAvailabilityDate?.ToString("yyyy-MM-dd"));

                // shipping address
                Address shippingAddress = builder.ShippingAddress;
                if (shippingAddress != null)
                {
                    JsonDoc shippingAddressElement = order.SubElement("shipping_address");
                    shippingAddressElement.Set("line1", shippingAddress.StreetAddress1);
                    shippingAddressElement.Set("line2", shippingAddress.StreetAddress2);
                    shippingAddressElement.Set("line3", shippingAddress.StreetAddress3);
                    shippingAddressElement.Set("city", shippingAddress.City);
                    shippingAddressElement.Set("postal_code", shippingAddress.PostalCode);
                    shippingAddressElement.Set("state", shippingAddress.State);
                    shippingAddressElement.Set("country", shippingAddress.CountryCode);
                }

                // payer
                JsonDoc payer = request.SubElement("payer");
                payer.Set("email", builder.CustomerEmail);
                payer.Set("id", builder.CustomerAccountId);
                payer.Set("account_age", builder.AccountAgeIndicator?.ToString());
                payer.Set("account_creation_date", builder.AccountCreateDate?.ToString("yyyy-MM-dd"));
                payer.Set("account_change_indicator", builder.AccountChangeIndicator?.ToString());
                payer.Set("account_change_date", builder.AccountChangeDate?.ToString("yyyy-MM-dd"));
                payer.Set("account_password_change_indicator", builder.PasswordChangeIndicator?.ToString());
                payer.Set("account_password_change_date", builder.PasswordChangeDate?.ToString("yyyy-MM-dd"));
                payer.Set("payment_account_age_indicator", builder.PaymentAgeIndicator?.ToString());
                payer.Set("payment_account_creation_date", builder.PaymentAccountCreateDate?.ToString("yyyy-MM-dd"));
                payer.Set("purchase_count_last_6months", builder.NumberOfPurchasesInLastSixMonths);
                payer.Set("transaction_count_last_24hours", builder.NumberOfTransactionsInLast24Hours);
                payer.Set("transaction_count_last_year", builder.NumberOfTransactionsInLastYear);
                payer.Set("provision_attempt_count_last_24hours", builder.NumberOfAddCardAttemptsInLast24Hours);
                payer.Set("shipping_address_creation_indicator", builder.ShippingAddressUsageIndicator?.ToString());
                payer.Set("shipping_address_creation_date", builder.ShippingAddressCreateDate?.ToString("yyyy-MM-dd"));

                // suspicious activity
                if (builder.PreviousSuspiciousActivity != null)
                {
                    payer.Set("suspicious_account_activity", builder.PreviousSuspiciousActivity.Value ? "SUSPICIOUS_ACTIVITY" : "NO_SUSPICIOUS_ACTIVITY");
                }

                // home phone
                if (!string.IsNullOrEmpty(builder.HomeNumber))
                {
                    payer.SubElement("home_phone")
                    .Set("country_code", builder.HomeCountryCode)
                    .Set("subscriber_number", builder.HomeNumber);
                }

                // work phone
                if (!string.IsNullOrEmpty(builder.WorkNumber))
                {
                    payer.SubElement("work_phone")
                    .Set("country_code", builder.WorkCountryCode)
                    .Set("subscriber_number", builder.WorkNumber);
                }

                // payer login data
                if (builder.HasPayerLoginData)
                {
                    request.SubElement("payer_login_data")
                    .Set("authentication_data", builder.CustomerAuthenticationData)
                    .Set("authentication_timestamp", builder.CustomerAuthenticationTimestamp?.ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'"))
                    .Set("authentication_type", builder.CustomerAuthenticationMethod?.ToString());
                }

                // prior authentication data
                if (builder.HasPriorAuthenticationData)
                {
                    request.SubElement("payer_prior_three_ds_authentication_data")
                    .Set("authentication_method", builder.PriorAuthenticationMethod?.ToString())
                    .Set("acs_transaction_id", builder.PriorAuthenticationTransactionId)
                    .Set("authentication_timestamp", builder.PriorAuthenticationTimestamp?.ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'"))
                    .Set("authentication_data", builder.PriorAuthenticationData);
                }

                // recurring authorization data
                if (builder.HasRecurringAuthData)
                {
                    request.SubElement("recurring_authorization_data")
                    .Set("max_number_of_instalments", builder.MaxNumberOfInstallments)
                    .Set("frequency", builder.RecurringAuthorizationFrequency)
                    .Set("expiry_date", builder.RecurringAuthorizationExpiryDate?.ToString("yyyy-MM-dd"));
                }

                // billing details
                Address billingAddress = builder.BillingAddress;
                if (billingAddress != null)
                {
                    JsonDoc billingAddressElement = payer.SubElement("billing_address");
                    billingAddressElement.Set("line1", billingAddress.StreetAddress1);
                    billingAddressElement.Set("line2", billingAddress.StreetAddress2);
                    billingAddressElement.Set("line3", billingAddress.StreetAddress3);
                    billingAddressElement.Set("city", billingAddress.City);
                    billingAddressElement.Set("postal_code", billingAddress.PostalCode);
                    billingAddressElement.Set("state", billingAddress.State);
                    billingAddressElement.Set("country", billingAddress.CountryCode);
                }

                // mobile phone
                if (!string.IsNullOrEmpty(builder.MobileNumber))
                {
                    JsonDoc mobilePhone = payer.SubElement("mobile_phone");
                    mobilePhone.Set("country_code", builder.MobileCountryCode);
                    mobilePhone.Set("subscriber_number", builder.MobileNumber);
                }

                // browser_data
                BrowserData broswerData = builder.BrowserData;
                if (broswerData != null)
                {
                    JsonDoc browserDataElement = request.SubElement("browser_data");
                    browserDataElement.Set("accept_header", broswerData.AcceptHeader);
                    browserDataElement.Set("color_depth", broswerData.ColorDepth.ToString());
                    browserDataElement.Set("ip", broswerData.IpAddress);
                    browserDataElement.Set("java_enabled", broswerData.JavaEnabled);
                    browserDataElement.Set("javascript_enabled", broswerData.JavaScriptEnabled);
                    browserDataElement.Set("language", broswerData.Language);
                    browserDataElement.Set("screen_height", broswerData.ScreenHeight);
                    browserDataElement.Set("screen_width", broswerData.ScreenWidth);
                    browserDataElement.Set("challenge_window_size", broswerData.ChallengeWindowSize.ToString());
                    browserDataElement.Set("timezone", broswerData.Timezone);
                    browserDataElement.Set("user_agent", broswerData.UserAgent);
                }

                // mobile fields
                if (builder.HasMobileFields)
                {
                    JsonDoc sdkInformationElement = request.SubElement("sdk_information")
                                                    .Set("application_id", builder.ApplicationId)
                                                    .Set("ephemeral_public_key", builder.EphemeralPublicKey)
                                                    .Set("maximum_timeout", builder.MaximumTimeout)
                                                    .Set("reference_number", builder.ReferenceNumber)
                                                    .Set("sdk_trans_id", builder.SdkTransactionId)
                                                    .Set("encoded_data", builder.EncodedData)
                    ;

                    // device render options
                    if (builder.SdkInterface != null || builder.SdkUiTypes != null)
                    {
                        var dro = sdkInformationElement.SubElement("device_render_options");
                        dro.Set("sdk_interface", builder.SdkInterface?.ToString());
                        if (builder.SdkUiTypes != null)
                        {
                            var uiTypes = new List <string>();
                            foreach (var sdkuiType in builder.SdkUiTypes)
                            {
                                uiTypes.Add(sdkuiType.ToString());
                            }
                            dro.Set("sdk_ui_type", uiTypes.ToArray());
                        }
                    }
                }

                string hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, hashValue, secureEcom.ServerTransactionId);
                SetAuthHeader(hash);

                string rawResponse = DoTransaction(HttpMethod.Post, "authentications", request.ToString());
                return(MapResponse(rawResponse));
            }

            throw new ApiException(string.Format("Unknown transaction type {0}.", transType));
        }
        public string SerializeRequest(AuthorizationBuilder builder)
        {
            // check for hpp config
            if (HostedPaymentConfig == null)
            {
                throw new ApiException("Hosted configuration missing, Please check you configuration.");
            }

            var encoder = (HostedPaymentConfig.Version == HppVersion.VERSION_2) ? null : JsonEncoders.Base64Encoder;
            var request = new JsonDoc(encoder);

            var orderId   = builder.OrderId ?? GenerationUtils.GenerateOrderId();
            var timestamp = builder.Timestamp ?? GenerationUtils.GenerateTimestamp();

            // check for right transaction types
            if (builder.TransactionType != TransactionType.Sale && builder.TransactionType != TransactionType.Auth && builder.TransactionType != TransactionType.Verify)
            {
                throw new UnsupportedTransactionException("Only Charge and Authorize are supported through hpp.");
            }

            request.Set("MERCHANT_ID", MerchantId);
            request.Set("ACCOUNT", AccountId);
            request.Set("CHANNEL", Channel);
            request.Set("ORDER_ID", orderId);
            if (builder.Amount != null)
            {
                request.Set("AMOUNT", builder.Amount.ToNumericCurrencyString());
            }
            request.Set("CURRENCY", builder.Currency);
            request.Set("TIMESTAMP", timestamp);
            request.Set("AUTO_SETTLE_FLAG", (builder.TransactionType == TransactionType.Sale) ? "1" : builder.MultiCapture == true ? "MULTI" : "0");
            request.Set("COMMENT1", builder.Description);
            // request.Set("COMMENT2", );
            if (HostedPaymentConfig.RequestTransactionStabilityScore.HasValue)
            {
                request.Set("RETURN_TSS", HostedPaymentConfig.RequestTransactionStabilityScore.Value ? "1" : "0");
            }
            if (HostedPaymentConfig.DynamicCurrencyConversionEnabled.HasValue)
            {
                request.Set("DCC_ENABLE", HostedPaymentConfig.DynamicCurrencyConversionEnabled.Value ? "1" : "0");
            }
            if (builder.HostedPaymentData != null)
            {
                AlternativePaymentType[] PaymentTypes = builder.HostedPaymentData.PresetPaymentMethods;
                if (PaymentTypes != null)
                {
                    PaymentValues = string.Join("|", PaymentTypes);
                }
                request.Set("CUST_NUM", builder.HostedPaymentData.CustomerNumber);
                if (HostedPaymentConfig.DisplaySavedCards.HasValue && builder.HostedPaymentData.CustomerKey != null)
                {
                    request.Set("HPP_SELECT_STORED_CARD", builder.HostedPaymentData.CustomerKey);
                }
                if (builder.HostedPaymentData.OfferToSaveCard.HasValue)
                {
                    request.Set("OFFER_SAVE_CARD", builder.HostedPaymentData.OfferToSaveCard.Value ? "1" : "0");
                }
                if (builder.HostedPaymentData.CustomerExists.HasValue)
                {
                    request.Set("PAYER_EXIST", builder.HostedPaymentData.CustomerExists.Value ? "1" : "0");
                }
                if (!HostedPaymentConfig.DisplaySavedCards.HasValue)
                {
                    request.Set("PAYER_REF", builder.HostedPaymentData.CustomerKey);
                }
                request.Set("PMT_REF", builder.HostedPaymentData.PaymentKey);
                request.Set("PROD_ID", builder.HostedPaymentData.ProductId);
                request.Set("HPP_CUSTOMER_COUNTRY", builder.HostedPaymentData.Country);
                request.Set("HPP_CUSTOMER_FIRSTNAME", builder.HostedPaymentData.CustomerFirstName);
                request.Set("HPP_CUSTOMER_LASTNAME", builder.HostedPaymentData.CustomerLastName);
                request.Set("MERCHANT_RESPONSE_URL", builder.HostedPaymentData.ReturnUrl);
                request.Set("HPP_TX_STATUS_URL", builder.HostedPaymentData.StatusUpdateUrl);
                request.Set("PM_METHODS", PaymentValues);
            }
            if (builder.ShippingAddress != null)
            {
                request.Set("SHIPPING_CODE", builder.ShippingAddress.PostalCode);
                request.Set("SHIPPING_CO", builder.ShippingAddress.Country);
            }
            if (builder.BillingAddress != null)
            {
                request.Set("BILLING_CODE", builder.BillingAddress.PostalCode);
                request.Set("BILLING_CO", builder.BillingAddress.Country);
            }
            request.Set("CUST_NUM", builder.CustomerId);
            request.Set("VAR_REF", builder.ClientTransactionId);
            request.Set("HPP_LANG", HostedPaymentConfig.Language);
            request.Set("MERCHANT_RESPONSE_URL", HostedPaymentConfig.ResponseUrl);
            request.Set("CARD_PAYMENT_BUTTON", HostedPaymentConfig.PaymentButtonText);
            if (HostedPaymentConfig.CardStorageEnabled.HasValue)
            {
                request.Set("CARD_STORAGE_ENABLE", HostedPaymentConfig.CardStorageEnabled.Value ? "1" : "0");
            }
            if (builder.TransactionType == TransactionType.Verify)
            {
                request.Set("VALIDATE_CARD_ONLY", builder.TransactionType == TransactionType.Verify ? "1" : "0");
            }
            if (HostedPaymentConfig.FraudFilterMode != FraudFilterMode.NONE)
            {
                request.Set("HPP_FRAUDFILTER_MODE", HostedPaymentConfig.FraudFilterMode.ToString());
            }
            if (builder.RecurringType != null || builder.RecurringSequence != null)
            {
                request.Set("RECURRING_TYPE", builder.RecurringType.ToString().ToLower());
                request.Set("RECURRING_SEQUENCE", builder.RecurringSequence.ToString().ToLower());
            }
            request.Set("HPP_VERSION", HostedPaymentConfig.Version);
            request.Set("HPP_POST_DIMENSIONS", HostedPaymentConfig.PostDimensions);
            request.Set("HPP_POST_RESPONSE", HostedPaymentConfig.PostResponse);

            var toHash = new List <string> {
                timestamp,
                MerchantId,
                orderId,
                (builder.Amount != null) ? builder.Amount.ToNumericCurrencyString() : null,
                builder.Currency
            };

            if (HostedPaymentConfig.CardStorageEnabled.HasValue || (builder.HostedPaymentData != null && builder.HostedPaymentData.OfferToSaveCard.HasValue) || HostedPaymentConfig.DisplaySavedCards.HasValue)
            {
                toHash.Add(builder.HostedPaymentData.CustomerKey ?? null);
                toHash.Add(builder.HostedPaymentData.PaymentKey ?? null);
            }

            if (HostedPaymentConfig.FraudFilterMode != FraudFilterMode.NONE)
            {
                toHash.Add(HostedPaymentConfig.FraudFilterMode.ToString());
            }

            request.Set("SHA1HASH", GenerationUtils.GenerateHash(SharedSecret, toHash.ToArray()));
            return(request.ToString());
        }
Example #15
0
        private string ConvertResponse(JsonDoc request, Transaction trans)
        {
            var merchantId = request.GetValue <string>("MERCHANT_ID");
            var account    = request.GetValue <string>("ACCOUNT");

            // begin building response
            var response = new JsonDoc(JsonEncoders.Base64Encoder);

            response.Set("MERCHANT_ID", merchantId);
            response.Set("ACCOUNT", request.GetValue <string>("ACCOUNT"));
            response.Set("ORDER_ID", trans.OrderId);
            response.Set("TIMESTAMP", trans.Timestamp);
            response.Set("RESULT", trans.ResponseCode);
            response.Set("PASREF", trans.TransactionId);
            response.Set("AUTHCODE", trans.AuthorizationCode);
            response.Set("AVSPOSTCODERESULT", trans.AvsResponseCode);
            response.Set("CVNRESULT", trans.CvnResponseCode);
            response.Set("HPP_LANG", request.GetValue <string>("HPP_LANG"));
            response.Set("SHIPPING_CODE", request.GetValue <string>("SHIPPING_CODE"));
            response.Set("SHIPPING_CO", request.GetValue <string>("SHIPPING_CO"));
            response.Set("BILLING_CODE", request.GetValue <string>("BILLING_CODE"));
            response.Set("BILLING_CO", request.GetValue <string>("BILLING_CO"));
            response.Set("ECI", request.GetValue <string>("ECI"));
            response.Set("CAVV", request.GetValue <string>("CAVV"));
            response.Set("XID", request.GetValue <string>("XID"));
            response.Set("MERCHANT_RESPONSE_URL", request.GetValue <string>("MERCHANT_RESPONSE_URL"));
            response.Set("CARD_PAYMENT_BUTTON", request.GetValue <string>("CARD_PAYMENT_BUTTON"));
            response.Set("MESSAGE", trans.ResponseMessage);
            response.Set("AMOUNT", trans.AuthorizedAmount);
            response.Set("SHA1HASH", GenerationUtils.GenerateHash(_sharedSecret, trans.Timestamp, merchantId, trans.OrderId, trans.ResponseCode, trans.ResponseMessage, trans.TransactionId, trans.AuthorizationCode));
            response.Set("DCC_INFO_REQUST", request.GetValue <string>("DCC_INFO"));
            response.Set("HPP_FRAUDFILTER_MODE", request.GetValue <string>("HPP_FRAUDFILTER_MODE"));
            if (trans?.FraudResponse?.Rules != null)
            {
                response.Set("HPP_FRAUDFILTER_RESULT", trans.FraudResponse?.Result);

                foreach (var rule in trans.FraudResponse.Rules)
                {
                    response.Set("HPP_FRAUDFILTER_RULE_" + rule.Id, rule.Action);
                }
            }
            if (trans?.AlternativePaymentResponse != null)
            {
                AlternativePaymentResponse alternativePaymentResponse = trans.AlternativePaymentResponse;
                response.Set("HPP_CUSTOMER_FIRSTNAME", request.GetValue <string>("HPP_CUSTOMER_FIRSTNAME"));
                response.Set("HPP_CUSTOMER_LASTNAME", request.GetValue <string>("HPP_CUSTOMER_LASTNAME"));
                response.Set("HPP_CUSTOMER_COUNTRY", request.GetValue <string>("HPP_CUSTOMER_COUNTRY"));
                response.Set("PAYMENTMETHOD", alternativePaymentResponse.ProviderName);
                response.Set("PAYMENTPURPOSE", alternativePaymentResponse.PaymentPurpose);
                response.Set("HPP_CUSTOMER_BANK_ACCOUNT", alternativePaymentResponse.BankAccount);
            }

            return(response.ToString());
        }
Example #16
0
        public T ProcessReport <T>(ReportBuilder <T> builder) where T : class
        {
            var request = new JsonDoc();

            string requestId  = "10004"; // TODO: Generate this?
            string reportType = MapReportType(builder.ReportType);

            // transaction reporting
            if (builder is TransactionReportBuilder <T> )
            {
                var trb = builder as TransactionReportBuilder <T>;

                request.Set("requestId", requestId);
                request.Set("transactionId", trb.TransactionId);
                request.Set("userId", UserId);
                request.Set("reportType", reportType);
                request.Set("startDepositDate", trb.SearchBuilder.StartDepositDate?.ToString("dd/MM/yyyy"));
                request.Set("endDepositDate", trb.SearchBuilder.EndDepositDate?.ToString("dd/MM/yyyy"));
                request.Set("mId", trb.SearchBuilder.MerchantId);
                request.Set("hierarchy", trb.SearchBuilder.Hierarchy);
                request.Set("timezone", trb.SearchBuilder.Timezone);
                request.Set("depositReference", trb.SearchBuilder.DepositReference);
                request.Set("orderId", trb.SearchBuilder.OrderId);
                request.Set("cardNumber", string.Format("{0}{1}", trb.SearchBuilder.CardNumberFirstSix ?? "", trb.SearchBuilder.CardNumberLastFour ?? ""));
                request.Set("startTransactionLocalTime", trb.SearchBuilder.LocalTransactionStartTime?.ToString("dd/MM/yyyy hh:mm:ss"));
                request.Set("endTransactionLocalTime", trb.SearchBuilder.LocalTransactionEndTime?.ToString("dd/MM/yyyy hh:mm:ss"));
                request.Set("paymentAmount", trb.SearchBuilder.Amount.ToNumericCurrencyString());
                request.Set("bankAccountNumber", trb.SearchBuilder.BankAccountNumber);
                request.Set("caseNumber", trb.SearchBuilder.CaseNumber);
                request.Set("caseId", trb.SearchBuilder.CaseId);
            }

            Headers["reporting_type"] = reportType;
            var response = DoTransaction(HttpMethod.Post, reportType + "/", request.ToString());

            return(MapResponse <T>(response, builder.ReportType));
        }
        internal static GpApiRequest BuildRequest(AuthorizationBuilder builder, GpApiConnector gateway)
        {
            var merchantUrl   = !string.IsNullOrEmpty(gateway.GpApiConfig.MerchantId) ? $"/merchants/{gateway.GpApiConfig.MerchantId}" : string.Empty;
            var paymentMethod = new JsonDoc()
                                .Set("entry_mode", GetEntryMode(builder, gateway.GpApiConfig.Channel)); // [MOTO, ECOM, IN_APP, CHIP, SWIPE, MANUAL, CONTACTLESS_CHIP, CONTACTLESS_SWIPE]

            paymentMethod.Set("narrative", !string.IsNullOrEmpty(builder.DynamicDescriptor) ? builder.DynamicDescriptor : null);
            if (builder.PaymentMethod is CreditCardData && (builder.TransactionModifier == TransactionModifier.EncryptedMobile || builder.TransactionModifier == TransactionModifier.DecryptedMobile))
            {
                var digitalWallet  = new JsonDoc();
                var creditCardData = (builder.PaymentMethod as CreditCardData);
                //Digital Wallet
                if (builder.TransactionModifier == TransactionModifier.EncryptedMobile)
                {
                    digitalWallet
                    .Set("payment_token", JsonDoc.Parse(creditCardData.Token));
                }
                else if (builder.TransactionModifier == TransactionModifier.DecryptedMobile)
                {
                    var tokenFormat = DigitalWalletTokenFormat.CARD_NUMBER;
                    digitalWallet
                    .Set("token", creditCardData.Token)
                    .Set("token_format", DigitalWalletTokenFormat.CARD_NUMBER)
                    .Set("expiry_month", creditCardData.ExpMonth.HasValue ? creditCardData.ExpMonth.ToString().PadLeft(2, '0') : null)
                    .Set("expiry_year", creditCardData.ExpYear.HasValue ? creditCardData.ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : null)
                    .Set("cryptogram", creditCardData.Cryptogram)
                    .Set("eci", creditCardData.Eci);
                }
                digitalWallet.Set("provider", (builder.PaymentMethod as CreditCardData).MobileType);
                paymentMethod.Set("digital_wallet", digitalWallet);
            }
            else
            {
                if (builder.PaymentMethod is ICardData)
                {
                    var cardData = builder.PaymentMethod as ICardData;

                    var card = new JsonDoc()
                               .Set("number", cardData.Number)
                               .Set("expiry_month", cardData.ExpMonth.HasValue ? cardData.ExpMonth.ToString().PadLeft(2, '0') : null)
                               .Set("expiry_year", cardData.ExpYear.HasValue ? cardData.ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : null)
                               //.Set("track", "")
                               .Set("tag", builder.TagData)
                               .Set("cvv", cardData.Cvn)
                               .Set("avs_address", builder.BillingAddress?.StreetAddress1)
                               .Set("avs_postal_code", builder.BillingAddress?.PostalCode)
                               .Set("authcode", builder.OfflineAuthCode)
                               .Set("brand_reference", builder.CardBrandTransactionId);

                    card.Set("chip_condition", EnumConverter.GetMapping(Target.GP_API, builder.EmvChipCondition)); // [PREV_SUCCESS, PREV_FAILED]

                    if (!(builder.TransactionType == TransactionType.Tokenize || builder.TransactionType == TransactionType.Verify))
                    {
                        card.Set("cvv_indicator", cardData.CvnPresenceIndicator != 0 ? EnumConverter.GetMapping(Target.GP_API, cardData.CvnPresenceIndicator) : null); // [ILLEGIBLE, NOT_PRESENT, PRESENT]
                        card.Set("funding", builder.PaymentMethod?.PaymentMethodType == PaymentMethodType.Debit ? "DEBIT" : "CREDIT");                                 // [DEBIT, CREDIT]
                    }

                    var hasToken = builder.PaymentMethod is ITokenizable tokenData && !string.IsNullOrEmpty(tokenData.Token);

                    if (!hasToken)
                    {
                        paymentMethod.Set("card", card);
                    }


                    if (builder.TransactionType == TransactionType.Tokenize)
                    {
                        var tokenizationData = new JsonDoc()
                                               .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TokenizationAccountName)
                                               .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                               .Set("usage_mode", EnumConverter.GetMapping(Target.GP_API, builder.PaymentMethodUsageMode))
                                               .Set("card", card);

                        return(new GpApiRequest {
                            Verb = HttpMethod.Post,
                            Endpoint = $"{merchantUrl}/payment-methods",
                            RequestBody = tokenizationData.ToString(),
                        });
                    }
                    else if (builder.TransactionType == TransactionType.DccRateLookup)
                    {
                        // tokenized payment method
                        if (builder.PaymentMethod is ITokenizable)
                        {
                            string token = ((ITokenizable)builder.PaymentMethod).Token;
                            if (!string.IsNullOrEmpty(token))
                            {
                                paymentMethod.Set("id", token);
                            }
                        }

                        var RequestData = new JsonDoc()
                                          .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TransactionProcessingAccountName)
                                          .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.GpApiConfig.Channel))
                                          .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                          .Set("amount", builder.Amount.ToNumericCurrencyString())
                                          .Set("currency", builder.Currency)
                                          .Set("country", gateway.GpApiConfig.Country)
                                          .Set("payment_method", paymentMethod);

                        return(new GpApiRequest
                        {
                            Verb = HttpMethod.Post,
                            Endpoint = $"{merchantUrl}/currency-conversions",
                            RequestBody = RequestData.ToString(),
                        });
                    }
                    else if (builder.TransactionType == TransactionType.Verify)
                    {
                        if (builder.RequestMultiUseToken && string.IsNullOrEmpty((builder.PaymentMethod as ITokenizable).Token))
                        {
                            var tokenizationData = new JsonDoc()
                                                   .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TokenizationAccountName)
                                                   .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                                   .Set("usage_mode", EnumConverter.GetMapping(Target.GP_API, builder.PaymentMethodUsageMode))
                                                   .Set("fingerprint_mode", builder.CustomerData?.DeviceFingerPrint ?? null)
                                                   .Set("card", card);

                            return(new GpApiRequest {
                                Verb = HttpMethod.Post,
                                Endpoint = $"{merchantUrl}/payment-methods",
                                RequestBody = tokenizationData.ToString(),
                            });
                        }
                        else
                        {
                            var verificationData = new JsonDoc()
                                                   .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TransactionProcessingAccountName)
                                                   .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.GpApiConfig.Channel))
                                                   .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                                   .Set("currency", builder.Currency)
                                                   .Set("country", gateway.GpApiConfig.Country)
                                                   .Set("payment_method", paymentMethod);

                            if (builder.PaymentMethod is ITokenizable && !string.IsNullOrEmpty((builder.PaymentMethod as ITokenizable).Token))
                            {
                                verificationData.Remove("payment_method");
                                verificationData.Set("payment_method", new JsonDoc()
                                                     .Set("entry_mode", GetEntryMode(builder, gateway.GpApiConfig.Channel))
                                                     .Set("id", (builder.PaymentMethod as ITokenizable).Token)
                                                     .Set("fingerprint_mode", builder.CustomerData?.DeviceFingerPrint ?? null)
                                                     );
                            }

                            return(new GpApiRequest {
                                Verb = HttpMethod.Post,
                                Endpoint = $"{merchantUrl}/verifications",
                                RequestBody = verificationData.ToString(),
                            });
                        }
                    }
                }
                else if (builder.PaymentMethod is ITrackData)
                {
                    var track = builder.PaymentMethod as ITrackData;

                    var card = new JsonDoc()
                               .Set("track", track.Value)
                               .Set("tag", builder.TagData)
                               .Set("avs_address", builder.BillingAddress?.StreetAddress1)
                               .Set("avs_postal_code", builder.BillingAddress?.PostalCode)
                               .Set("authcode", builder.OfflineAuthCode);

                    if (builder.TransactionType == TransactionType.Verify)
                    {
                        paymentMethod.Set("card", card);

                        var verificationData = new JsonDoc()
                                               .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TransactionProcessingAccountName)
                                               .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.GpApiConfig.Channel))
                                               .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                               .Set("currency", builder.Currency)
                                               .Set("country", gateway.GpApiConfig.Country)
                                               .Set("payment_method", paymentMethod)
                                               .Set("fingerprint_mode", builder.CustomerData?.DeviceFingerPrint ?? null);

                        return(new GpApiRequest {
                            Verb = HttpMethod.Post,
                            Endpoint = $"{merchantUrl}/verifications",
                            RequestBody = verificationData.ToString(),
                        });
                    }

                    if (builder.TransactionType == TransactionType.Sale || builder.TransactionType == TransactionType.Refund)
                    {
                        if (string.IsNullOrEmpty(track.Value))
                        {
                            card.Set("number", track.Pan);
                            card.Set("expiry_month", track.Expiry?.Substring(2, 2));
                            card.Set("expiry_year", track.Expiry?.Substring(0, 2));
                        }
                        if (string.IsNullOrEmpty(builder.TagData))
                        {
                            card.Set("chip_condition", EnumConverter.GetMapping(Target.GP_API, builder.EmvChipCondition)); // [PREV_SUCCESS, PREV_FAILED]
                        }
                    }

                    if (builder.TransactionType == TransactionType.Sale)
                    {
                        card.Set("funding", builder.PaymentMethod?.PaymentMethodType == PaymentMethodType.Debit ? "DEBIT" : "CREDIT"); // [DEBIT, CREDIT]
                    }

                    paymentMethod.Set("card", card);
                }

                // tokenized payment method
                if (builder.PaymentMethod is ITokenizable)
                {
                    string token = ((ITokenizable)builder.PaymentMethod).Token;
                    if (!string.IsNullOrEmpty(token))
                    {
                        paymentMethod.Set("id", token);
                    }
                }
            }
            // payment method storage mode
            if (builder.RequestMultiUseToken)
            {
                //ToDo: there might be a typo: should be storage_mode
                paymentMethod.Set("storage_mode", "ON_SUCCESS");
            }

            // pin block
            if (builder.PaymentMethod is IPinProtected)
            {
                paymentMethod.Get("card")?.Set("pin_block", ((IPinProtected)builder.PaymentMethod).PinBlock);
            }

            // authentication
            if (builder.PaymentMethod is CreditCardData)
            {
                paymentMethod.Set("name", (builder.PaymentMethod as CreditCardData).CardHolderName);

                var secureEcom = (builder.PaymentMethod as CreditCardData).ThreeDSecure;
                if (secureEcom != null)
                {
                    var authentication = new JsonDoc().Set("id", secureEcom.ServerTransactionId);

                    paymentMethod.Set("authentication", authentication);
                }

                paymentMethod.Set("fingerprint_mode", builder.CustomerData?.DeviceFingerPrint ?? null);
            }

            if (builder.PaymentMethod is EBT)
            {
                paymentMethod.Set("name", (builder.PaymentMethod as EBT).CardHolderName);
            }

            if (builder.PaymentMethod is eCheck)
            {
                eCheck check = (builder.PaymentMethod as eCheck);
                paymentMethod.Set("name", check.CheckHolderName);

                var bankTransfer = new JsonDoc()
                                   .Set("account_number", check.AccountNumber)
                                   .Set("account_type", (check.AccountType != null) ? EnumConverter.GetMapping(Target.GP_API, check.AccountType) : null)
                                   .Set("check_reference", check.CheckReference)
                                   .Set("sec_code", check.SecCode)
                                   .Set("narrative", check.MerchantNotes);

                var bank = new JsonDoc()
                           .Set("code", check.RoutingNumber)
                           .Set("name", check.BankName);

                var address = new JsonDoc()
                              .Set("line_1", check.BankAddress?.StreetAddress1)
                              .Set("line_2", check.BankAddress?.StreetAddress2)
                              .Set("line_3", check.BankAddress?.StreetAddress3)
                              .Set("city", check.BankAddress?.City)
                              .Set("postal_code", check.BankAddress?.PostalCode)
                              .Set("state", check.BankAddress?.State)
                              .Set("country", check.BankAddress?.CountryCode);

                bank.Set("address", address);

                bankTransfer.Set("bank", bank);

                paymentMethod.Set("bank_transfer", bankTransfer);
            }

            if (builder.PaymentMethod is AlternativePaymentMethod)
            {
                var alternatepaymentMethod = (AlternativePaymentMethod)builder.PaymentMethod;

                paymentMethod.Set("name", alternatepaymentMethod.AccountHolderName);

                var apm = new JsonDoc()
                          .Set("provider", alternatepaymentMethod.AlternativePaymentMethodType?.ToString()?.ToLower())
                          .Set("address_override_mode", alternatepaymentMethod.AddressOverrideMode);
                paymentMethod.Set("apm", apm);
            }

            // encryption
            if (builder.PaymentMethod is IEncryptable)
            {
                var encryptionData = ((IEncryptable)builder.PaymentMethod).EncryptionData;

                if (encryptionData != null)
                {
                    var encryption = new JsonDoc()
                                     .Set("version", encryptionData.Version);

                    if (!string.IsNullOrEmpty(encryptionData.KTB))
                    {
                        encryption.Set("method", "KTB");
                        encryption.Set("info", encryptionData.KTB);
                    }
                    else if (!string.IsNullOrEmpty(encryptionData.KSN))
                    {
                        encryption.Set("method", "KSN");
                        encryption.Set("info", encryptionData.KSN);
                    }

                    if (encryption.Has("info"))
                    {
                        paymentMethod.Set("encryption", encryption);
                    }
                }
            }

            if (builder.TransactionType == TransactionType.Create && builder.PayLinkData is PayLinkData)
            {
                var payLinkData = builder.PayLinkData;
                var requestData = new JsonDoc()
                                  .Set("usage_limit", payLinkData.UsageLimit.ToString())
                                  .Set("usage_mode", EnumConverter.GetMapping(Target.GP_API, payLinkData.UsageMode))
                                  .Set("images", payLinkData.Images)
                                  .Set("description", builder.Description ?? null)
                                  .Set("type", payLinkData.Type?.ToString())
                                  .Set("expiration_date", payLinkData.ExpirationDate ?? null);

                var transaction = new JsonDoc()
                                  .Set("country", gateway.GpApiConfig.Country)
                                  .Set("amount", builder.Amount.ToNumericCurrencyString())
                                  .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.GpApiConfig.Channel))
                                  .Set("currency", builder.Currency)
                                  .Set("allowed_payment_methods", GetAllowedPaymentMethod(payLinkData.AllowedPaymentMethods));

                requestData.Set("transactions", transaction)
                .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                .Set("shipping_amount", payLinkData.ShippingAmount.ToNumericCurrencyString())
                .Set("shippable", payLinkData.IsShippable?.ToString() ?? false.ToString())
                .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TransactionProcessingAccountName)
                .Set("name", payLinkData.Name ?? null);

                var notification = new JsonDoc()
                                   .Set("cancel_url", payLinkData.CancelUrl)
                                   .Set("return_url", payLinkData.ReturnUrl)
                                   .Set("status_url", payLinkData.StatusUpdateUrl);

                requestData.Set("notifications", notification)
                .Set("status", payLinkData.Status.ToString());

                return(new GpApiRequest
                {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/links",
                    RequestBody = requestData.ToString(),
                });
            }

            var data = new JsonDoc()
                       .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TransactionProcessingAccountName)
                       .Set("type", builder.TransactionType == TransactionType.Refund ? "REFUND" : "SALE")   // [SALE, REFUND]
                       .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.GpApiConfig.Channel)) // [CP, CNP]
                       .Set("capture_mode", GetCaptureMode(builder))                                         // [AUTO, LATER, MULTIPLE]
                                                                                                             //.Set("remaining_capture_count", "") //Pending Russell
                       .Set("authorization_mode", builder.AllowPartialAuth ? "PARTIAL" : null)
                       .Set("amount", builder.Amount.ToNumericCurrencyString())
                       .Set("currency", builder.Currency)
                       .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                       .Set("description", builder.Description)
                       //.Set("order_reference", builder.OrderId)
                       .Set("gratuity_amount", builder.Gratuity.ToNumericCurrencyString())
                       .Set("cashback_amount", builder.CashBackAmount.ToNumericCurrencyString())
                       .Set("surcharge_amount", builder.SurchargeAmount.ToNumericCurrencyString())
                       .Set("convenience_amount", builder.ConvenienceAmount.ToNumericCurrencyString())
                       .Set("country", gateway.GpApiConfig.Country)
                       //.Set("language", EnumConverter.GetMapping(Target.GP_API, Language))
                       .Set("ip_address", builder.CustomerIpAddress)
                       //.Set("site_reference", "") //
                       .Set("currency_conversion", !string.IsNullOrEmpty(builder.DccRateData?.DccId) ? new JsonDoc().Set("id", builder.DccRateData.DccId) : null)
                       .Set("payment_method", paymentMethod)
                       .Set("link", !string.IsNullOrEmpty(builder.PaymentLinkId) ? new JsonDoc()
                            .Set("id", builder.PaymentLinkId) : null);

            if (builder.PaymentMethod is eCheck || builder.PaymentMethod is AlternativePaymentMethod)
            {
                data.Set("payer", SetPayerInformation(builder));
            }

            // set order reference
            if (!string.IsNullOrEmpty(builder.OrderId))
            {
                var order = new JsonDoc()
                            .Set("reference", builder.OrderId);

                data.Set("order", order);
            }

            if (builder.PaymentMethod is AlternativePaymentMethod)
            {
                setOrderInformation(builder, ref data);

                var alternatepaymentMethod = (AlternativePaymentMethod)builder.PaymentMethod;

                var notifications = new JsonDoc()
                                    .Set("return_url", alternatepaymentMethod?.ReturnUrl)
                                    .Set("status_url", alternatepaymentMethod?.StatusUpdateUrl)
                                    .Set("cancel_url", alternatepaymentMethod?.CancelUrl);

                data.Set("notifications", notifications);
            }

            // stored credential
            if (builder.StoredCredential != null)
            {
                data.Set("initiator", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Initiator));
                var storedCredential = new JsonDoc()
                                       .Set("model", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Type))
                                       .Set("reason", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Reason))
                                       .Set("sequence", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Sequence));
                data.Set("stored_credential", storedCredential);
            }

            return(new GpApiRequest {
                Verb = HttpMethod.Post,
                Endpoint = $"{merchantUrl}/transactions",
                RequestBody = data.ToString(),
            });
        }
Example #18
0
        internal IDeviceMessage BuildProcessTransaction(TerminalAuthBuilder builder)
        {
            var  pmt           = builder.PaymentMethodType;
            var  transType     = builder.TransactionType;
            var  transModifier = builder.TransactionModifier;
            bool isTipAdjust   = IsTipAdjust(transType, builder.Gratuity);
            bool isCardHSAFSA  = IsCardHSAFSA(builder.AutoSubstantiation);

            if (pmt != PaymentMethodType.Credit && pmt != PaymentMethodType.Debit && pmt != PaymentMethodType.EBT)
            {
                throw new UnsupportedTransactionException("The supplied payment method type is not supported");
            }

            int requestId = builder.ReferenceNumber;

            if (requestId == default(int) && RequestIdProvider != null)
            {
                requestId = RequestIdProvider.GetRequestId();
            }

            var doc = new JsonDoc();

            doc.Set("message", "MSG");

            var baseRequest = doc.SubElement("data");

            baseRequest.Set("command", MapTransactionType(transType, transModifier, builder.RequestMultiUseToken, builder.Gratuity));
            baseRequest.Set("EcrId", builder.EcrId.ToString());
            baseRequest.Set("requestId", requestId.ToString());

            if (transType != TransactionType.Balance)
            {
                var txnData = baseRequest.SubElement("data");

                var txnParams = txnData.SubElement("params");
                txnParams.Set("clerkId", builder.ClerkId);
                if (transType == TransactionType.Tokenize || transType == TransactionType.Verify)
                {
                    txnParams.Set("cardIsHSAFSA", isCardHSAFSA ? "1" : "0");
                }
                if (!IsTokenRequestApplicable(isTipAdjust, transType))
                {
                    txnParams.Set("tokenRequest", builder.RequestMultiUseToken ? "1" : "0");
                }
                if (builder.PaymentMethod is CreditCardData)
                {
                    txnParams.Set("tokenValue", ((CreditCardData)builder.PaymentMethod).Token);
                }
                if (builder.RequestMultiUseToken && (transType == TransactionType.Sale || transType == TransactionType.Refund || transType == TransactionType.Verify ||
                                                     transType == TransactionType.Auth))
                {
                    if (builder.CardOnFileIndicator != null)
                    {
                        txnParams.Set("cardOnFileIndicator", EnumConverter.GetMapping(Target.UPA, builder.CardOnFileIndicator));
                    }
                    txnParams.Set("cardBrandTransId", builder.CardBrandTransId);
                }
                txnParams.Set("lineItemLeft", builder.LineItemLeft);
                txnParams.Set("lineItemRight", builder.LineItemRight);
                txnParams.Set("directMktInvoiceNbr", builder.InvoiceNumber);

                if (builder.ShippingDate != DateTime.MinValue)
                {
                    txnParams.Set("directMktShipMonth", builder.ShippingDate.Month.ToString("00"));
                    txnParams.Set("directMktShipDay", builder.ShippingDate.Day.ToString("00"));
                }

                if (transType != TransactionType.Verify && transType != TransactionType.Refund && !isTipAdjust && transType != TransactionType.Tokenize)
                {
                    var transaction = txnData.SubElement("transaction");
                    if (transType == TransactionType.Auth)
                    {
                        transaction.Set("amount", ToCurrencyString(builder.Amount));
                    }
                    else
                    {
                        transaction.Set("baseAmount", ToCurrencyString(builder.Amount));
                        transaction.Set("cashBackAmount", ToCurrencyString(builder.CashBackAmount));
                        transaction.Set("tipAmount", ToCurrencyString(builder.Gratuity));
                        transaction.Set("taxIndicator", builder.TaxExempt);
                        transaction.Set("invoiceNbr", builder.InvoiceNumber);
                        transaction.Set("processCPC", builder.ProcessCPC);
                        transaction.Set("taxAmount", ToCurrencyString(builder.TaxAmount));
                    }

                    transaction.Set("referenceNumber", builder.TerminalRefNumber);
                    transaction.Set("cardIsHSAFSA", isCardHSAFSA ? "1" : "0");


                    transaction.Set("prescriptionAmount", ToCurrencyString(builder.PrescriptionAmount));
                    transaction.Set("clinicAmount", ToCurrencyString(builder.ClinicAmount));
                    transaction.Set("dentalAmount", ToCurrencyString(builder.DentalAmount));
                    transaction.Set("visionOpticalAmount", ToCurrencyString(builder.VisionOpticalAmount));
                }

                if (transType == TransactionType.Refund)
                {
                    var transaction = txnData.SubElement("transaction");
                    transaction.Set("totalAmount", ToCurrencyString(builder.Amount));
                }

                if (isTipAdjust)
                {
                    var transaction = txnData.SubElement("transaction");
                    transaction.Set("tranNo", builder.TerminalRefNumber);
                    transaction.Set("tipAmount", ToCurrencyString(builder.Gratuity));
                }
            }

            return(TerminalUtilities.BuildUpaRequest(doc.ToString()));
        }
Example #19
0
        internal static GpApiRequest BuildRequest(AuthorizationBuilder builder, GpApiConnector gateway)
        {
            var paymentMethod = new JsonDoc()
                                .Set("entry_mode", GetEntryMode(builder)); // [MOTO, ECOM, IN_APP, CHIP, SWIPE, MANUAL, CONTACTLESS_CHIP, CONTACTLESS_SWIPE]

            if (builder.PaymentMethod is ICardData)
            {
                var cardData = builder.PaymentMethod as ICardData;

                var card = new JsonDoc()
                           .Set("number", cardData.Number)
                           .Set("expiry_month", cardData.ExpMonth.HasValue ? cardData.ExpMonth.ToString().PadLeft(2, '0') : null)
                           .Set("expiry_year", cardData.ExpYear.HasValue ? cardData.ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : null)
                           //.Set("track", "")
                           .Set("tag", builder.TagData)
                           .Set("cvv", cardData.Cvn)
                           .Set("cvv_indicator", EnumConverter.GetMapping(Target.GP_API, cardData.CvnPresenceIndicator)) // [ILLEGIBLE, NOT_PRESENT, PRESENT]
                           .Set("avs_address", builder.BillingAddress?.StreetAddress1)
                           .Set("avs_postal_code", builder.BillingAddress?.PostalCode)
                           .Set("funding", builder.PaymentMethod?.PaymentMethodType == PaymentMethodType.Debit ? "DEBIT" : "CREDIT") // [DEBIT, CREDIT]
                           .Set("authcode", builder.OfflineAuthCode);
                //.Set("brand_reference", "")

                card.Set("chip_condition", EnumConverter.GetMapping(Target.GP_API, builder.EmvChipCondition)); // [PREV_SUCCESS, PREV_FAILED]

                paymentMethod.Set("card", card);

                var tokenizationData = new JsonDoc()
                                       .Set("account_name", gateway.TokenizationAccountName)
                                       .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                       .Set("usage_mode", EnumConverter.GetMapping(Target.GP_API, builder.TokenUsageMode))
                                       .Set("name", "")
                                       .Set("card", card);

                if (builder.TransactionType == TransactionType.Tokenize)
                {
                    return(new GpApiRequest {
                        Verb = HttpMethod.Post,
                        Endpoint = "/payment-methods",
                        RequestBody = tokenizationData.ToString(),
                    });
                }
                else if (builder.TransactionType == TransactionType.Verify)
                {
                    if (builder.RequestMultiUseToken && string.IsNullOrEmpty((builder.PaymentMethod as ITokenizable).Token))
                    {
                        return(new GpApiRequest {
                            Verb = HttpMethod.Post,
                            Endpoint = "/payment-methods",
                            RequestBody = tokenizationData.ToString(),
                        });
                    }
                    else
                    {
                        var verificationData = new JsonDoc()
                                               .Set("account_name", gateway.TransactionProcessingAccountName)
                                               .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.Channel))
                                               .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                               .Set("currency", builder.Currency)
                                               .Set("country", gateway.Country)
                                               .Set("payment_method", paymentMethod);

                        if (builder.PaymentMethod is ITokenizable && !string.IsNullOrEmpty((builder.PaymentMethod as ITokenizable).Token))
                        {
                            verificationData.Remove("payment_method");
                            verificationData.Set("payment_method", new JsonDoc()
                                                 .Set("entry_mode", GetEntryMode(builder))
                                                 .Set("id", (builder.PaymentMethod as ITokenizable).Token)
                                                 );
                        }

                        return(new GpApiRequest {
                            Verb = HttpMethod.Post,
                            Endpoint = "/verifications",
                            RequestBody = verificationData.ToString(),
                        });
                    }
                }
            }
            else if (builder.PaymentMethod is ITrackData)
            {
                var track = builder.PaymentMethod as ITrackData;

                var card = new JsonDoc()
                           .Set("track", track.Value)
                           .Set("tag", builder.TagData)
                           .Set("avs_address", builder.BillingAddress?.StreetAddress1)
                           .Set("avs_postal_code", builder.BillingAddress?.PostalCode)
                           .Set("authcode", builder.OfflineAuthCode);

                if (builder.TransactionType == TransactionType.Verify)
                {
                    paymentMethod.Set("card", card);

                    var verificationData = new JsonDoc()
                                           .Set("account_name", gateway.TransactionProcessingAccountName)
                                           .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.Channel))
                                           .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                           .Set("currency", builder.Currency)
                                           .Set("country", gateway.Country)
                                           .Set("payment_method", paymentMethod);

                    return(new GpApiRequest {
                        Verb = HttpMethod.Post,
                        Endpoint = "/verifications",
                        RequestBody = verificationData.ToString(),
                    });
                }

                if (builder.TransactionType == TransactionType.Sale || builder.TransactionType == TransactionType.Refund)
                {
                    if (string.IsNullOrEmpty(track.Value))
                    {
                        card.Set("number", track.Pan);
                        card.Set("expiry_month", track.Expiry?.Substring(2, 2));
                        card.Set("expiry_year", track.Expiry?.Substring(0, 2));
                    }
                    if (string.IsNullOrEmpty(builder.TagData))
                    {
                        card.Set("chip_condition", EnumConverter.GetMapping(Target.GP_API, builder.EmvChipCondition)); // [PREV_SUCCESS, PREV_FAILED]
                    }
                }

                if (builder.TransactionType == TransactionType.Sale)
                {
                    card.Set("funding", builder.PaymentMethod?.PaymentMethodType == PaymentMethodType.Debit ? "DEBIT" : "CREDIT"); // [DEBIT, CREDIT]
                }

                paymentMethod.Set("card", card);
            }

            // payment method storage mode
            if (builder.RequestMultiUseToken)
            {
                //ToDo: there might be a typo: should be storage_mode
                paymentMethod.Set("storage_model", "ON_SUCCESS");
            }

            // tokenized payment method
            if (builder.PaymentMethod is ITokenizable)
            {
                string token = ((ITokenizable)builder.PaymentMethod).Token;
                if (!string.IsNullOrEmpty(token))
                {
                    paymentMethod.Set("id", token);
                }
            }

            // pin block
            if (builder.PaymentMethod is IPinProtected)
            {
                paymentMethod.Get("card")?.Set("pin_block", ((IPinProtected)builder.PaymentMethod).PinBlock);
            }

            // authentication
            if (builder.PaymentMethod is CreditCardData)
            {
                paymentMethod.Set("name", (builder.PaymentMethod as CreditCardData).CardHolderName);

                var secureEcom = (builder.PaymentMethod as CreditCardData).ThreeDSecure;
                if (secureEcom != null)
                {
                    var three_ds = new JsonDoc()
                                   // Indicates the version of 3DS
                                   .Set("message_version", secureEcom.MessageVersion)
                                   // An indication of the degree of the authentication and liability shift obtained for this transaction.
                                   // It is determined during the 3D Secure process.
                                   .Set("eci", secureEcom.Eci)
                                   // The authentication value created as part of the 3D Secure process.
                                   .Set("value", secureEcom.AuthenticationValue)
                                   // The reference created by the 3DSecure provider to identify the specific authentication attempt.
                                   .Set("server_trans_ref", secureEcom.ServerTransactionId)
                                   // The reference created by the 3DSecure Directory Server to identify the specific authentication attempt.
                                   .Set("ds_trans_ref", secureEcom.DirectoryServerTransactionId);

                    var authentication = new JsonDoc().Set("three_ds", three_ds);

                    paymentMethod.Set("authentication", authentication);
                }
            }

            // encryption
            if (builder.PaymentMethod is IEncryptable)
            {
                var encryptionData = ((IEncryptable)builder.PaymentMethod).EncryptionData;

                if (encryptionData != null)
                {
                    var encryption = new JsonDoc()
                                     .Set("version", encryptionData.Version);

                    if (!string.IsNullOrEmpty(encryptionData.KTB))
                    {
                        encryption.Set("method", "KTB");
                        encryption.Set("info", encryptionData.KTB);
                    }
                    else if (!string.IsNullOrEmpty(encryptionData.KSN))
                    {
                        encryption.Set("method", "KSN");
                        encryption.Set("info", encryptionData.KSN);
                    }

                    if (encryption.Has("info"))
                    {
                        paymentMethod.Set("encryption", encryption);
                    }
                }
            }

            var data = new JsonDoc()
                       .Set("account_name", gateway.TransactionProcessingAccountName)
                       .Set("type", builder.TransactionType == TransactionType.Refund ? "REFUND" : "SALE") // [SALE, REFUND]
                       .Set("channel", EnumConverter.GetMapping(Target.GP_API, gateway.Channel))           // [CP, CNP]
                       .Set("capture_mode", GetCaptureMode(builder))                                       // [AUTO, LATER, MULTIPLE]
                                                                                                           //.Set("remaining_capture_count", "") //Pending Russell
                       .Set("authorization_mode", builder.AllowPartialAuth ? "PARTIAL" : null)
                       .Set("amount", builder.Amount.ToNumericCurrencyString())
                       .Set("currency", builder.Currency)
                       .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                       .Set("description", builder.Description)
                       //.Set("order_reference", builder.OrderId)
                       .Set("gratuity_amount", builder.Gratuity.ToNumericCurrencyString())
                       .Set("cashback_amount", builder.CashBackAmount.ToNumericCurrencyString())
                       .Set("surcharge_amount", builder.SurchargeAmount.ToNumericCurrencyString())
                       .Set("convenience_amount", builder.ConvenienceAmount.ToNumericCurrencyString())
                       .Set("country", gateway.Country)
                       //.Set("language", EnumConverter.GetMapping(Target.GP_API, Language))
                       .Set("ip_address", builder.CustomerIpAddress)
                       //.Set("site_reference", "") //
                       .Set("payment_method", paymentMethod);

            // set order reference
            if (!string.IsNullOrEmpty(builder.OrderId))
            {
                var order = new JsonDoc()
                            .Set("reference", builder.OrderId);

                data.Set("order", order);
            }

            // stored credential
            if (builder.StoredCredential != null)
            {
                data.Set("initiator", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Initiator));
                var storedCredential = new JsonDoc()
                                       .Set("model", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Type))
                                       .Set("reason", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Reason))
                                       .Set("sequence", EnumConverter.GetMapping(Target.GP_API, builder.StoredCredential.Sequence));
                data.Set("stored_credential", storedCredential);
            }

            return(new GpApiRequest {
                Verb = HttpMethod.Post,
                Endpoint = "/transactions",
                RequestBody = data.ToString(),
            });
        }
        private static JsonDoc setOrderInformation(AuthorizationBuilder builder, ref JsonDoc requestBody)
        {
            JsonDoc order;

            if (requestBody.Has("order"))
            {
                order = requestBody.Get("order");
            }
            else
            {
                order = new JsonDoc();
            }
            order.Set("description", builder.OrderDetails?.Description);

            if (builder.ShippingAddress != null)
            {
                var shippingAddress = new JsonDoc()
                                      .Set("line1", builder.ShippingAddress.StreetAddress1)
                                      .Set("line2", builder.ShippingAddress.StreetAddress2)
                                      .Set("line3", builder.ShippingAddress.StreetAddress3)
                                      .Set("city", builder.ShippingAddress.City)
                                      .Set("postal_code", builder.ShippingAddress.PostalCode)
                                      .Set("state", builder.ShippingAddress.State)
                                      .Set("country", builder.ShippingAddress.CountryCode);

                order.Set("shipping_address", shippingAddress);
            }

            var shippingPhone = new JsonDoc()
                                .Set("country_code", builder.ShippingPhone?.CountryCode)
                                .Set("subscriber_number", builder.ShippingPhone?.Number);

            order.Set("shipping_phone", shippingPhone);

            decimal taxTotalAmount = 0;
            decimal itemsAmount    = 0;
            decimal?orderAmount    = null;

            if (builder.MiscProductData != null)
            {
                var items = new List <Dictionary <string, object> >();
                foreach (var product in builder.MiscProductData)
                {
                    var qta        = product.Quantity ?? 0;
                    var taxAmount  = product.TaxAmount ?? 0;
                    var unitAmount = product.UnitPrice ?? 0;
                    var item       = new Dictionary <string, object>();
                    item.Add("reference", product.ProductId);
                    item.Add("label", product.ProductName);
                    item.Add("description", product.Description);
                    item.Add("quantity", qta);
                    item.Add("unit_amount", unitAmount.ToNumericCurrencyString());
                    item.Add("unit_currency", product.UnitCurrency);
                    item.Add("tax_amount", taxAmount.ToNumericCurrencyString());
                    item.Add("amount", (qta * unitAmount).ToNumericCurrencyString());
                    items.Add(item);
                    taxTotalAmount += taxAmount;
                    itemsAmount    += unitAmount;
                }

                order.Set("tax_amount", taxTotalAmount.ToNumericCurrencyString());
                order.Set("item_amount", itemsAmount.ToNumericCurrencyString());
                var shippingAmount = builder.ShippingAmt ?? 0;
                order.Set("shipping_amount", builder.ShippingAmt.ToNumericCurrencyString());
                order.Set("insurance_offered", builder.OrderDetails != null ? (builder.OrderDetails.HasInsurance ? "YES" : "NO") : null);
                order.Set("shipping_discount", builder.ShippingDiscount?.ToNumericCurrencyString());
                order.Set("insurance_amount", builder.OrderDetails?.InsuranceAmount?.ToNumericCurrencyString());
                order.Set("handling_amount", builder.OrderDetails?.HandlingAmount?.ToNumericCurrencyString());
                var insuranceAmount = builder.OrderDetails?.InsuranceAmount ?? 0;
                var handlingAmount  = builder.OrderDetails?.HandlingAmount ?? 0;
                orderAmount = itemsAmount + taxTotalAmount + handlingAmount + insuranceAmount + shippingAmount;
                order.Set("amount", orderAmount.ToNumericCurrencyString());
                order.Set("currency", builder.Currency);
                order.Set("items", items);
            }
            if (!requestBody.Has("order"))
            {
                requestBody.Set("order", order);
            }

            return(requestBody);
        }
Example #21
0
        public Transaction ProcessAuthorization(AuthorizationBuilder builder)
        {
            if (string.IsNullOrEmpty(SessionToken))
            {
                SignIn();
            }

            var paymentMethod = new JsonDoc()
                                .Set("entry_mode", GetEntryMode(builder)); // [MOTO, ECOM, IN_APP, CHIP, SWIPE, MANUAL, CONTACTLESS_CHIP, CONTACTLESS_SWIPE]

            if (builder.PaymentMethod is ICardData)
            {
                var cardData = builder.PaymentMethod as ICardData;

                var card = new JsonDoc()
                           .Set("number", cardData.Number)
                           .Set("expiry_month", cardData.ExpMonth.HasValue ? cardData.ExpMonth.ToString().PadLeft(2, '0') : string.Empty)
                           .Set("expiry_year", cardData.ExpYear.HasValue ? cardData.ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : string.Empty)
                           //.Set("track", "")
                           .Set("tag", builder.TagData)
                           .Set("cvv", cardData.Cvn)
                           .Set("avs_address", builder.BillingAddress?.StreetAddress1)
                           .Set("avs_postal_code", builder.BillingAddress?.PostalCode)
                           .Set("funding", builder.PaymentMethod?.PaymentMethodType == PaymentMethodType.Debit ? "DEBIT" : "CREDIT") // [DEBIT, CREDIT]
                           .Set("authcode", builder.OfflineAuthCode);
                //.Set("brand_reference", "")

                if (builder.TransactionType == TransactionType.Verify)
                {
                    if (builder.RequestMultiUseToken)
                    {
                        var tokenizationData = new JsonDoc()
                                               .Set("account_name", TokenizationAccountName)
                                               .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                                               .Set("name", "")
                                               .Set("card", card);

                        var tokenizationResponse = DoTransaction(HttpMethod.Post, "/ucp/payment-methods", tokenizationData.ToString());

                        return(MapResponse(tokenizationResponse));
                    }
                    else
                    {
                        var tokenizationResponse = DoTransaction(HttpMethod.Get, $"/ucp/payment-methods/{(builder.PaymentMethod as ITokenizable).Token}");

                        return(MapResponse(tokenizationResponse));
                    }
                }

                if (builder.EmvLastChipRead != null)
                {
                    card.Set("chip_condition", EnumConverter.GetMapping(Target.GP_API, builder.EmvLastChipRead)); // [PREV_SUCCESS, PREV_FAILED]
                }
                if (cardData.CvnPresenceIndicator == CvnPresenceIndicator.Present || cardData.CvnPresenceIndicator == CvnPresenceIndicator.Illegible || cardData.CvnPresenceIndicator == CvnPresenceIndicator.NotOnCard)
                {
                    card.Set("cvv_indicator", EnumConverter.GetMapping(Target.GP_API, cardData.CvnPresenceIndicator)); // [ILLEGIBLE, NOT_PRESENT, PRESENT]
                }

                paymentMethod.Set("card", card);
            }
            else if (builder.PaymentMethod is ITrackData)
            {
                var track = builder.PaymentMethod as ITrackData;

                var card = new JsonDoc()
                           .Set("track", track.Value)
                           .Set("tag", builder.TagData)
                           //.Set("cvv", cardData.Cvn)
                           //.Set("cvv_indicator", "") // [ILLEGIBLE, NOT_PRESENT, PRESENT]
                           .Set("avs_address", builder.BillingAddress?.StreetAddress1)
                           .Set("avs_postal_code", builder.BillingAddress?.PostalCode)
                           .Set("authcode", builder.OfflineAuthCode);
                //.Set("brand_reference", "")

                if (builder.TransactionType == TransactionType.Sale)
                {
                    card.Set("number", track.Pan);
                    card.Set("expiry_month", track.Expiry?.Substring(2, 2));
                    card.Set("expiry_year", track.Expiry?.Substring(0, 2));
                    card.Set("chip_condition", EnumConverter.GetMapping(Target.GP_API, builder.EmvLastChipRead));                  // [PREV_SUCCESS, PREV_FAILED]
                    card.Set("funding", builder.PaymentMethod?.PaymentMethodType == PaymentMethodType.Debit ? "DEBIT" : "CREDIT"); // [DEBIT, CREDIT]
                }

                paymentMethod.Set("card", card);
            }

            // pin block
            if (builder.PaymentMethod is IPinProtected)
            {
                paymentMethod.Get("card")?.Set("pin_block", ((IPinProtected)builder.PaymentMethod).PinBlock);
            }

            // authentication
            if (builder.PaymentMethod is CreditCardData)
            {
                paymentMethod.Set("name", (builder.PaymentMethod as CreditCardData).CardHolderName);

                var secureEcom = (builder.PaymentMethod as CreditCardData).ThreeDSecure;
                if (secureEcom != null)
                {
                    var authentication = new JsonDoc()
                                         .Set("xid", secureEcom.Xid)
                                         .Set("cavv", secureEcom.Cavv)
                                         .Set("eci", secureEcom.Eci);
                    //.Set("mac", ""); //A message authentication code submitted to confirm integrity of the request.

                    paymentMethod.Set("authentication", authentication);
                }
            }

            // encryption
            if (builder.PaymentMethod is IEncryptable)
            {
                var encryptionData = ((IEncryptable)builder.PaymentMethod).EncryptionData;

                if (encryptionData != null)
                {
                    var encryption = new JsonDoc()
                                     .Set("version", encryptionData.Version);

                    if (!string.IsNullOrEmpty(encryptionData.KTB))
                    {
                        encryption.Set("method", "KTB");
                        encryption.Set("info", encryptionData.KTB);
                    }
                    else if (!string.IsNullOrEmpty(encryptionData.KSN))
                    {
                        encryption.Set("method", "KSN");
                        encryption.Set("info", encryptionData.KSN);
                    }

                    if (encryption.Has("info"))
                    {
                        paymentMethod.Set("encryption", encryption);
                    }
                }
            }

            var data = new JsonDoc()
                       .Set("account_name", TransactionProcessingAccountName)
                       .Set("type", builder.TransactionType == TransactionType.Refund ? "REFUND" : "SALE") // [SALE, REFUND]
                       .Set("channel", EnumConverter.GetMapping(Target.GP_API, Channel))                   // [CP, CNP]
                       .Set("capture_mode", GetCaptureMode(builder))                                       // [AUTO, LATER, MULTIPLE]
                                                                                                           //.Set("remaining_capture_count", "") //Pending Russell
                       .Set("authorization_mode", builder.AllowPartialAuth ? "PARTIAL" : "WHOLE")          // [PARTIAL, WHOLE]
                       .Set("amount", builder.Amount.ToNumericCurrencyString())
                       .Set("currency", builder.Currency)
                       .Set("reference", builder.ClientTransactionId ?? Guid.NewGuid().ToString())
                       .Set("description", builder.Description)
                       .Set("order_reference", builder.OrderId)
                       //.Set("initiator", "") // [PAYER, MERCHANT] //default to PAYER
                       .Set("gratuity_amount", builder.Gratuity.ToNumericCurrencyString())
                       .Set("cashback_amount", builder.CashBackAmount.ToNumericCurrencyString())
                       .Set("surcharge_amount", builder.SurchargeAmount.ToNumericCurrencyString())
                       .Set("convenience_amount", builder.ConvenienceAmount.ToNumericCurrencyString())
                       .Set("country", builder.BillingAddress?.Country ?? "US")
                       //.Set("language", EnumConverter.GetMapping(Target.GP_API, Language))
                       .Set("ip_address", builder.CustomerIpAddress)
                       //.Set("site_reference", "") //
                       .Set("payment_method", paymentMethod);

            var response = DoTransaction(HttpMethod.Post, "/ucp/transactions", data.ToString());

            return(MapResponse(response));
        }
        public Transaction ProcessOpenBanking(BankPaymentBuilder builder)
        {
            string timestamp = builder.Timestamp ?? GenerationUtils.GenerateTimestamp();
            string orderId   = builder.OrderId ?? GenerationUtils.GenerateOrderId();
            var    amount    = builder.Amount != null?builder.Amount.ToNumericCurrencyString() : null;

            JsonDoc request = new JsonDoc();

            var paymentMethod = builder.PaymentMethod as BankPayment;

            switch (builder.TransactionType)
            {
            case TransactionType.Sale:
                var bankPaymentType = paymentMethod.BankPaymentType != null ?
                                      paymentMethod.BankPaymentType : GetBankPaymentType(builder.Currency);
                string hash = GenerationUtils.GenerateHash(SharedSecret, ShaHashType, timestamp, MerchantId, orderId, amount, builder.Currency,
                                                           !string.IsNullOrEmpty(paymentMethod.SortCode) && bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ?
                                                           paymentMethod.SortCode : "",
                                                           !string.IsNullOrEmpty(paymentMethod.AccountNumber) && bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ?
                                                           paymentMethod.AccountNumber : "",
                                                           !string.IsNullOrEmpty(paymentMethod.Iban) && bankPaymentType.Equals(BankPaymentType.SEPA) ? paymentMethod.Iban : "");
                SetAuthorizationHeader(hash);

                request.Set("request_timestamp", timestamp)
                .Set("merchant_id", MerchantId)
                .Set("account_id", AccountId);

                JsonDoc order = new JsonDoc();
                order.Set("id", orderId)
                .Set("currency", builder.Currency)
                .Set("amount", amount)
                .Set("description", builder.Description);

                JsonDoc payment = new JsonDoc();

                JsonDoc destination = new JsonDoc();
                destination.Set("account_number", bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ? paymentMethod.AccountNumber : null)
                .Set("sort_code", bankPaymentType.Equals(BankPaymentType.FASTERPAYMENTS) ? paymentMethod.SortCode : null)
                .Set("iban", bankPaymentType.Equals(BankPaymentType.SEPA) ? paymentMethod.Iban : null)
                .Set("name", paymentMethod.AccountName);


                JsonDoc remittance_reference = new JsonDoc();
                remittance_reference.Set("type", builder.RemittanceReferenceType != null ? builder.RemittanceReferenceType.ToString() : null)
                .Set("value", builder.RemittanceReferenceValue);

                payment.Set("scheme", bankPaymentType.ToString())
                .Set("destination", destination);

                if (remittance_reference.HasKeys())
                {
                    payment.Set("remittance_reference", remittance_reference);
                }

                request.Set("order", order)
                .Set("payment", payment)
                .Set("return_url", paymentMethod.ReturnUrl)
                .Set("status_url", paymentMethod.StatusUpdateUrl);

                break;

            default:
                break;
            }

            try
            {
                string rawResponse = DoTransaction(HttpMethod.Post, "/payments", request.ToString());
                return(OpenBankingMapping.MapResponse(rawResponse));
            }
            catch (GatewayException gatewayException)
            {
                throw gatewayException;
            }
        }
Example #23
0
        private string ConvertResponse(JsonDoc request, Transaction trans)
        {
            var merchantId = request.GetValue <string>("MERCHANT_ID");
            var account    = request.GetValue <string>("ACCOUNT");

            // begin building response
            var response = new JsonDoc(JsonEncoders.Base64Encoder);

            response.Set("MERCHANT_ID", merchantId);
            response.Set("ACCOUNT", request.GetValue <string>("ACCOUNT"));
            response.Set("ORDER_ID", trans.OrderId);
            response.Set("TIMESTAMP", trans.Timestamp);
            response.Set("RESULT", trans.ResponseCode);
            response.Set("PASREF", trans.TransactionId);
            response.Set("AUTHCODE", trans.AuthorizationCode);
            response.Set("AVSPOSTCODERESULT", trans.AvsResponseCode);
            response.Set("CVNRESULT", trans.CvnResponseCode);
            response.Set("HPP_LANG", request.GetValue <string>("HPP_LANG"));
            response.Set("SHIPPING_CODE", request.GetValue <string>("SHIPPING_CODE"));
            response.Set("SHIPPING_CO", request.GetValue <string>("SHIPPING_CO"));
            response.Set("BILLING_CODE", request.GetValue <string>("BILLING_CODE"));
            response.Set("BILLING_CO", request.GetValue <string>("BILLING_CO"));
            response.Set("ECI", request.GetValue <string>("ECI"));
            response.Set("CAVV", request.GetValue <string>("CAVV"));
            response.Set("XID", request.GetValue <string>("XID"));
            response.Set("MERCHANT_RESPONSE_URL", request.GetValue <string>("MERCHANT_RESPONSE_URL"));
            response.Set("CARD_PAYMENT_BUTTON", request.GetValue <string>("CARD_PAYMENT_BUTTON"));
            response.Set("MESSAGE", trans.ResponseMessage);
            response.Set("AMOUNT", trans.AuthorizedAmount);
            response.Set("SHA1HASH", GenerationUtils.GenerateHash(_sharedSecret, trans.Timestamp, merchantId, trans.OrderId, trans.ResponseCode, trans.ResponseMessage, trans.TransactionId, trans.AuthorizationCode));

            return(response.ToString());
        }
Example #24
0
        internal static GpApiRequest BuildRequest(ManagementBuilder builder, GpApiConnector gateway)
        {
            var merchantUrl = !string.IsNullOrEmpty(gateway.GpApiConfig.MerchantId) ? $"/merchants/{gateway.GpApiConfig.MerchantId}" : string.Empty;

            if (builder.TransactionType == TransactionType.Capture)
            {
                var data = new JsonDoc()
                           .Set("amount", builder.Amount.ToNumericCurrencyString())
                           .Set("gratuity_amount", builder.Gratuity.ToNumericCurrencyString())
                           .Set("currency_conversion", builder.DccRateData?.DccId ?? null);

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/capture",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.Refund)
            {
                var data = new JsonDoc()
                           .Set("amount", builder.Amount.ToNumericCurrencyString())
                           .Set("currency_conversion", builder.DccRateData == null ? null : new JsonDoc()
                                .Set("id", builder.DccRateData?.DccId));

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/refund",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.Reversal)
            {
                var data = new JsonDoc()
                           .Set("amount", builder.Amount.ToNumericCurrencyString())
                           .Set("currency_conversion", builder.DccRateData?.DccId ?? null);

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/reversal",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.TokenUpdate)
            {
                if (!(builder.PaymentMethod is CreditCardData))
                {
                    throw new GatewayException("Payment method doesn't support this action!");
                }

                var cardData = builder.PaymentMethod as CreditCardData;

                var card = new JsonDoc()
                           .Set("expiry_month", cardData.ExpMonth.HasValue ? cardData.ExpMonth.ToString().PadLeft(2, '0') : string.Empty)
                           .Set("expiry_year", cardData.ExpYear.HasValue ? cardData.ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : string.Empty);

                var data = new JsonDoc()
                           .Set("usage_mode", !string.IsNullOrEmpty(builder.PaymentMethodUsageMode.ToString()) ? EnumConverter.GetMapping(Target.GP_API, builder.PaymentMethodUsageMode) : null)
                           .Set("name", !string.IsNullOrEmpty(cardData.CardHolderName) ? cardData.CardHolderName : null)
                           .Set("card", card);

                return(new GpApiRequest {
                    Verb = new HttpMethod("PATCH"),
                    Endpoint = $"{merchantUrl}/payment-methods/{(builder.PaymentMethod as ITokenizable).Token}",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.TokenDelete && builder.PaymentMethod is ITokenizable)
            {
                return(new GpApiRequest {
                    Verb = HttpMethod.Delete,
                    Endpoint = $"{merchantUrl}/payment-methods/{(builder.PaymentMethod as ITokenizable).Token}",
                });
            }
            else if (builder.TransactionType == TransactionType.DisputeAcceptance)
            {
                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/disputes/{builder.DisputeId}/acceptance",
                });
            }
            else if (builder.TransactionType == TransactionType.DisputeChallenge)
            {
                var data = new JsonDoc()
                           .Set("documents", builder.DisputeDocuments);

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/disputes/{builder.DisputeId}/challenge",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.BatchClose)
            {
                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/batches/{builder.BatchReference}",
                });
            }
            else if (builder.TransactionType == TransactionType.Reauth)
            {
                var data = new JsonDoc()
                           .Set("amount", builder.Amount.ToNumericCurrencyString());
                if (builder.PaymentMethod.PaymentMethodType == PaymentMethodType.ACH)
                {
                    data.Set("description", builder.Description);
                    if (builder.BankTransferDetails != null)
                    {
                        var eCheck = builder.BankTransferDetails;

                        var paymentMethod = new JsonDoc()
                                            .Set("narrative", eCheck.MerchantNotes);

                        var bankTransfer = new JsonDoc()
                                           .Set("account_number", eCheck.AccountNumber)
                                           .Set("account_type", (eCheck.AccountType != null) ? EnumConverter.GetMapping(Target.GP_API, eCheck.AccountType) : null)
                                           .Set("check_reference", eCheck.CheckReference);

                        var bank = new JsonDoc()
                                   .Set("code", eCheck.RoutingNumber)
                                   .Set("name", eCheck.BankName);

                        bankTransfer.Set("bank", bank);

                        paymentMethod.Set("bank_transfer", bankTransfer);

                        data.Set("payment_method", paymentMethod);
                    }
                }

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/reauthorization",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.Confirm)
            {
                if (builder.PaymentMethod is TransactionReference && builder.PaymentMethod.PaymentMethodType == PaymentMethodType.APM)
                {
                    var transactionReference = (TransactionReference)builder.PaymentMethod;
                    var apmResponse          = transactionReference.AlternativePaymentResponse;
                    var apm = new JsonDoc()
                              .Set("provider", apmResponse?.ProviderName)
                              .Set("provider_payer_reference", apmResponse?.ProviderReference);

                    var payment_method = new JsonDoc()
                                         .Set("apm", apm);

                    var data = new JsonDoc()
                               .Set("payment_method", payment_method);

                    return(new GpApiRequest
                    {
                        Verb = HttpMethod.Post,
                        Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/confirmation",
                        RequestBody = data.ToString(),
                    });
                }
            }
            else if (builder.TransactionType == TransactionType.Auth)
            {
                var payload = new JsonDoc();
                payload.Set("amount", builder.Amount);

                if (builder.LodgingData != null)
                {
                    var lodging = builder.LodgingData;
                    if (lodging.Items != null)
                    {
                        var lodginItems = new List <LodgingItems>();

                        foreach (var item in lodging.Items)
                        {
                            lodginItems.Add(new LodgingItems {
                                Types       = item.Types,
                                Reference   = item.Reference,
                                TotalAmount = item.TotalAmount,
                                paymentMethodProgramCodes = item.paymentMethodProgramCodes
                            });
                        }

                        var lodgingData = new JsonDoc()
                                          .Set("booking_reference", lodging.bookingReference)
                                          .Set("duration_days", lodging.StayDuration)
                                          .Set("date_checked_in", lodging.CheckInDate?.ToString("yyyy-MM-dd"))
                                          .Set("date_checked_out", lodging.CheckOutDate?.ToString("yyyy-MM-dd"))
                                          .Set("daily_rate_amount", lodging.Rate.ToNumericCurrencyString())
                                          .Set("charge_items", lodginItems);

                        payload.Set("lodging", lodgingData);
                    }

                    return(new GpApiRequest
                    {
                        Verb = HttpMethod.Post,
                        Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/incremental",
                        RequestBody = payload.ToString(),
                    });
                }
            }
            else if (builder.TransactionType == TransactionType.Edit)
            {
                var card = new JsonDoc()
                           .Set("tag", builder.TagData);

                var payment_method = new JsonDoc()
                                     .Set("card", card);

                var payload = new JsonDoc()
                              .Set("amount", builder.Amount.ToNumericCurrencyString())
                              .Set("gratuity_amount", builder.Gratuity.ToNumericCurrencyString())
                              .Set("payment_method", payment_method);

                return(new GpApiRequest
                {
                    Verb = HttpMethod.Post,
                    Endpoint = $"{merchantUrl}/transactions/{builder.TransactionId}/adjustment",
                    RequestBody = payload.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.PayLinkUpdate)
            {
                var payLinkData = builder.PayLinkData;

                var payload = new JsonDoc()
                              .Set("usage_mode", EnumConverter.GetMapping(Target.GP_API, payLinkData.UsageMode) ?? null)
                              .Set("usage_limit", payLinkData.UsageLimit ?? null)
                              .Set("name", payLinkData.Name ?? null)
                              .Set("description", builder.Description ?? null)
                              .Set("type", payLinkData.Type.ToString() ?? null)
                              .Set("status", payLinkData.Status.ToString() ?? null)
                              .Set("shippable", payLinkData.IsShippable?.ToString() ?? null)
                              .Set("shipping_amount", payLinkData.ShippingAmount.ToNumericCurrencyString());

                var transaction = new JsonDoc()
                                  .Set("amount", builder.Amount.ToNumericCurrencyString() ?? null);

                payload.Set("transactions", transaction)
                .Set("expiration_date", payLinkData.ExpirationDate ?? null)
                .Set("images", payLinkData.Images ?? null);

                return(new GpApiRequest
                {
                    Verb = new HttpMethod("PATCH"),
                    Endpoint = $"{merchantUrl}/links/{builder.PaymentLinkId}",
                    RequestBody = payload.ToString(),
                });
            }
            return(null);
        }