Ejemplo n.º 1
0
        internal override void ConfigureContainer(ConfiguredServices services)
        {
            if (string.IsNullOrEmpty(ServiceUrl))
            {
                if (Environment.Equals(Entities.Environment.TEST))
                {
                    ServiceUrl = ServiceEndpoints.GP_API_TEST;
                }
                else
                {
                    ServiceUrl = ServiceEndpoints.GP_API_PRODUCTION;
                }
            }

            var gateway = new GpApiConnector {
                AppId            = AppId,
                AppKey           = AppKey,
                Nonce            = Nonce,
                SecondsToExpire  = SecondsToExpire,
                IntervalToExpire = IntervalToExpire,
                Channel          = Channel,
                Language         = Language,
                ServiceUrl       = ServiceUrl,
                Timeout          = Timeout
            };

            services.GatewayConnector = gateway;

            services.ReportingService = gateway;
        }
Ejemplo n.º 2
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(),
                });
            }
Ejemplo n.º 3
0
        public static AccessTokenInfo GenerateTransactionKey(GpApiConfig gpApiConfig)
        {
            GpApiConnector connector = new GpApiConnector(gpApiConfig);

            var data = connector.GetAccessToken();

            return(new AccessTokenInfo {
                Token = data.Token,
                DataAccountName = data.DataAccountName,
                DisputeManagementAccountName = data.DisputeManagementAccountName,
                TokenizationAccountName = data.TokenizationAccountName,
                TransactionProcessingAccountName = data.TransactionProcessingAccountName,
            });
        }
Ejemplo n.º 4
0
        internal override void ConfigureContainer(ConfiguredServices services)
        {
            if (string.IsNullOrEmpty(ServiceUrl))
            {
                if (Environment.Equals(Entities.Environment.TEST))
                {
                    ServiceUrl = ServiceEndpoints.GP_API_TEST;
                }
                else
                {
                    ServiceUrl = ServiceEndpoints.GP_API_PRODUCTION;
                }
            }

            var gpApiConfig = new GpApiConfig
            {
                AppId                    = AppId,
                AppKey                   = AppKey,
                SecondsToExpire          = SecondsToExpire,
                IntervalToExpire         = IntervalToExpire,
                Channel                  = Channel,
                Language                 = Language,
                Country                  = Country,
                ServiceUrl               = ServiceUrl,
                Timeout                  = Timeout,
                Permissions              = Permissions,
                MethodNotificationUrl    = MethodNotificationUrl,
                RequestLogger            = RequestLogger,
                MerchantContactUrl       = MerchantContactUrl,
                ChallengeNotificationUrl = ChallengeNotificationUrl,
                WebProxy                 = WebProxy,
                DynamicHeaders           = DynamicHeaders,
                MerchantId               = MerchantId,
                AccessTokenInfo          = AccessTokenInfo,
            };

            var gateway = new GpApiConnector(gpApiConfig);

            services.GatewayConnector = gateway;

            services.ReportingService = gateway;

            services.SetSecure3dProvider(Secure3dVersion.One, gateway);
            services.SetSecure3dProvider(Secure3dVersion.Two, gateway);
        }
Ejemplo n.º 5
0
        internal override void ConfigureContainer(ConfiguredServices services)
        {
            if (string.IsNullOrEmpty(ServiceUrl))
            {
                if (Environment.Equals(Entities.Environment.TEST))
                {
                    ServiceUrl = ServiceEndpoints.GP_API_TEST;
                }
                else
                {
                    ServiceUrl = ServiceEndpoints.GP_API_PRODUCTION;
                }
            }

            var gateway = new GpApiConnector {
                AppId                            = AppId,
                AppKey                           = AppKey,
                SecondsToExpire                  = SecondsToExpire,
                IntervalToExpire                 = IntervalToExpire,
                Channel                          = Channel,
                Language                         = Language,
                Country                          = Country,
                ServiceUrl                       = ServiceUrl,
                Timeout                          = Timeout,
                Permissions                      = Permissions,
                AccessToken                      = AccessTokenInfo?.Token,
                DataAccountName                  = AccessTokenInfo?.DataAccountName,
                DisputeManagementAccountName     = AccessTokenInfo?.DisputeManagementAccountName,
                TokenizationAccountName          = AccessTokenInfo?.TokenizationAccountName,
                TransactionProcessingAccountName = AccessTokenInfo?.TransactionProcessingAccountName,
                ChallengeNotificationUrl         = ChallengeNotificationUrl,
                MethodNotificationUrl            = MethodNotificationUrl,
                RequestLogger                    = RequestLogger,
                WebProxy                         = WebProxy,
            };

            services.GatewayConnector = gateway;

            services.ReportingService = gateway;

            services.SetSecure3dProvider(Secure3dVersion.One, gateway);
            services.SetSecure3dProvider(Secure3dVersion.Two, gateway);
        }
Ejemplo n.º 6
0
        public static AccessTokenInfo GenerateTransactionKey(Entities.Environment environment, string appId, string appKey, int?secondsToExpire = null, IntervalToExpire?intervalToExpire = null)
        {
            var connector = new GpApiConnector {
                AppId            = appId,
                AppKey           = appKey,
                SecondsToExpire  = secondsToExpire,
                IntervalToExpire = intervalToExpire,
                ServiceUrl       = environment.Equals(Entities.Environment.PRODUCTION) ? ServiceEndpoints.GP_API_PRODUCTION : ServiceEndpoints.GP_API_TEST,
                Timeout          = 10000,
            };

            var data = connector.GetAccessToken();

            return(new AccessTokenInfo {
                Token = data.Token,
                DataAccountName = data.DataAccountName,
                DisputeManagementAccountName = data.DisputeManagementAccountName,
                TokenizationAccountName = data.TokenizationAccountName,
                TransactionProcessingAccountName = data.TransactionProcessingAccountName,
            });
        }
Ejemplo n.º 7
0
        internal static GpApiRequest BuildRequest(ManagementBuilder builder, GpApiConnector gateway)
        {
            if (builder.TransactionType == TransactionType.Capture)
            {
                var data = new JsonDoc()
                           .Set("amount", builder.Amount.ToNumericCurrencyString())
                           .Set("gratuity_amount", builder.Gratuity.ToNumericCurrencyString());

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

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

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"/transactions/{builder.TransactionId}/reversal",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.TokenUpdate && builder.PaymentMethod is CreditCardData)
            {
                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("card", card);

                return(new GpApiRequest {
                    Verb = new HttpMethod("PATCH"),
                    Endpoint = $"/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 = $"/payment-methods/{(builder.PaymentMethod as ITokenizable).Token}",
                });
            }
            else if (builder.TransactionType == TransactionType.Detokenize && builder.PaymentMethod is ITokenizable)
            {
                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"/payment-methods/{(builder.PaymentMethod as ITokenizable).Token}/detokenize",
                });
            }
            else if (builder.TransactionType == TransactionType.DisputeAcceptance)
            {
                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"/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 = $"/disputes/{builder.DisputeId}/challenge",
                    RequestBody = data.ToString(),
                });
            }
            else if (builder.TransactionType == TransactionType.BatchClose)
            {
                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"/batches/{builder.BatchReference}",
                });
            }
            else if (builder.TransactionType == TransactionType.Reauth)
            {
                var data = new JsonDoc()
                           .Set("amount", builder.Amount.ToNumericCurrencyString());

                return(new GpApiRequest {
                    Verb = HttpMethod.Post,
                    Endpoint = $"/transactions/{builder.TransactionId}/reauthorization",
                    RequestBody = data.ToString(),
                });
            }
            return(null);
        }
Ejemplo n.º 8
0
        internal static GpApiRequest BuildRequest <T>(ReportBuilder <T> builder, GpApiConnector gateway) where T : class
        {
            if (builder is TransactionReportBuilder <T> trb)
            {
                var request = new GpApiRequest();
                switch (builder.ReportType)
                {
                case ReportType.TransactionDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"/transactions/{trb.TransactionId}",
                    });

                case ReportType.FindTransactionsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/transactions",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.TransactionOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("id", trb.TransactionId);
                    request.AddQueryStringParam("type", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.PaymentType));
                    request.AddQueryStringParam("channel", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.Channel));
                    request.AddQueryStringParam("amount", trb.SearchBuilder.Amount.ToNumericCurrencyString());
                    request.AddQueryStringParam("currency", trb.SearchBuilder.Currency);
                    request.AddQueryStringParam("number_first6", trb.SearchBuilder.CardNumberFirstSix);
                    request.AddQueryStringParam("number_last4", trb.SearchBuilder.CardNumberLastFour);
                    request.AddQueryStringParam("token_first6", trb.SearchBuilder.TokenFirstSix);
                    request.AddQueryStringParam("token_last4", trb.SearchBuilder.TokenLastFour);
                    request.AddQueryStringParam("account_name", trb.SearchBuilder.AccountName);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("brand_reference", trb.SearchBuilder.BrandReference);
                    request.AddQueryStringParam("authcode", trb.SearchBuilder.AuthCode);
                    request.AddQueryStringParam("reference", trb.SearchBuilder.ReferenceNumber);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.TransactionStatus));
                    request.AddQueryStringParam("from_time_created", trb.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("country", trb.SearchBuilder.Country);
                    request.AddQueryStringParam("batch_id", trb.SearchBuilder.BatchId);
                    request.AddQueryStringParam("entry_mode", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.PaymentEntryMode));
                    request.AddQueryStringParam("name", trb.SearchBuilder.Name);

                    return(request);

                case ReportType.FindSettlementTransactionsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/settlement/transactions",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.TransactionOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("number_first6", trb.SearchBuilder.CardNumberFirstSix);
                    request.AddQueryStringParam("number_last4", trb.SearchBuilder.CardNumberLastFour);
                    request.AddQueryStringParam("deposit_status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DepositStatus));
                    request.AddQueryStringParam("account_name", gateway.DataAccountName);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("arn", trb.SearchBuilder.AquirerReferenceNumber);
                    request.AddQueryStringParam("brand_reference", trb.SearchBuilder.BrandReference);
                    request.AddQueryStringParam("authcode", trb.SearchBuilder.AuthCode);
                    request.AddQueryStringParam("reference", trb.SearchBuilder.ReferenceNumber);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.TransactionStatus));
                    request.AddQueryStringParam("from_time_created", trb.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("deposit_id", trb.SearchBuilder.DepositReference);
                    request.AddQueryStringParam("from_deposit_time_created", trb.SearchBuilder.StartDepositDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_deposit_time_created", trb.SearchBuilder.EndDepositDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("from_batch_time_created", trb.SearchBuilder.StartBatchDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_batch_time_created", trb.SearchBuilder.EndBatchDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.DepositDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"/settlement/deposits/{trb.SearchBuilder.DepositReference}",
                    });

                case ReportType.FindDepositsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/settlement/deposits",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.DepositOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("account_name", gateway.DataAccountName);
                    request.AddQueryStringParam("from_time_created", trb.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("id", trb.SearchBuilder.DepositReference);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DepositStatus));
                    request.AddQueryStringParam("amount", trb.SearchBuilder.Amount.ToNumericCurrencyString());
                    request.AddQueryStringParam("masked_account_number_last4", trb.SearchBuilder.AccountNumberLastFour);
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.DisputeDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"/disputes/{trb.SearchBuilder.DisputeId}",
                    });

                case ReportType.FindDisputesPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/disputes",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.DisputeOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("arn", trb.SearchBuilder.AquirerReferenceNumber);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStatus));
                    request.AddQueryStringParam("stage", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStage));
                    request.AddQueryStringParam("from_stage_time_created", trb.SearchBuilder.StartStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_stage_time_created", trb.SearchBuilder.EndStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.SettlementDisputeDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"/settlement/disputes/{trb.SearchBuilder.SettlementDisputeId}",
                    });

                case ReportType.FindSettlementDisputesPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/settlement/disputes",
                    };
                    request.AddQueryStringParam("account_name", gateway.DataAccountName);
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.DisputeOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("arn", trb.SearchBuilder.AquirerReferenceNumber);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("STATUS", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStatus));
                    request.AddQueryStringParam("stage", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStage));
                    request.AddQueryStringParam("from_stage_time_created", trb.SearchBuilder.StartStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_stage_time_created", trb.SearchBuilder.EndStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.StoredPaymentMethodDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"/payment-methods/{trb.SearchBuilder.StoredPaymentMethodId}",
                    });

                case ReportType.FindStoredPaymentMethodsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/payment-methods",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.StoredPaymentMethodOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("id", trb.SearchBuilder.StoredPaymentMethodId);
                    request.AddQueryStringParam("number_last4", trb.SearchBuilder.CardNumberLastFour);
                    request.AddQueryStringParam("reference", trb.SearchBuilder.ReferenceNumber);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.StoredPaymentMethodStatus));
                    request.AddQueryStringParam("from_time_created", trb.SearchBuilder.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.SearchBuilder.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("from_time_last_updated", trb.SearchBuilder.StartLastUpdatedDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_last_updated", trb.SearchBuilder.EndLastUpdatedDate?.ToString("yyyy-MM-dd"));

                    return(request);

                case ReportType.ActionDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"/actions/{trb.SearchBuilder.ActionId}",
                    });

                case ReportType.FindActionsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = "/actions",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.ActionOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("id", trb.SearchBuilder.ActionId);
                    request.AddQueryStringParam("type", trb.SearchBuilder.ActionType);
                    request.AddQueryStringParam("resource", trb.SearchBuilder.Resource);
                    request.AddQueryStringParam("resource_status", trb.SearchBuilder.ResourceStatus);
                    request.AddQueryStringParam("resource_id", trb.SearchBuilder.ResourceId);
                    request.AddQueryStringParam("from_time_created", trb.SearchBuilder.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.SearchBuilder.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("merchant_name", trb.SearchBuilder.MerchantName);
                    request.AddQueryStringParam("account_name", trb.SearchBuilder.AccountName);
                    request.AddQueryStringParam("app_name", trb.SearchBuilder.AppName);
                    request.AddQueryStringParam("version", trb.SearchBuilder.Version);
                    request.AddQueryStringParam("response_code", trb.SearchBuilder.ResponseCode);
                    request.AddQueryStringParam("http_response_code", trb.SearchBuilder.HttpResponseCode);

                    return(request);
                }
            }
            return(null);
        }
Ejemplo n.º 9
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(),
            });
        }
        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(),
            });
        }
Ejemplo n.º 11
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);
        }
        internal static GpApiRequest BuildRequest <T>(ReportBuilder <T> builder, GpApiConnector gateway) where T : class
        {
            var merchantUrl = !string.IsNullOrEmpty(gateway.GpApiConfig.MerchantId) ? $"/merchants/{gateway.GpApiConfig.MerchantId}" : string.Empty;

            if (builder is TransactionReportBuilder <T> trb)
            {
                var request = new GpApiRequest();
                switch (builder.ReportType)
                {
                case ReportType.TransactionDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/transactions/{trb.TransactionId}",
                    });

                case ReportType.FindTransactionsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/transactions",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.TransactionOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("id", trb.TransactionId);
                    request.AddQueryStringParam("type", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.PaymentType));
                    request.AddQueryStringParam("channel", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.Channel));
                    request.AddQueryStringParam("amount", trb.SearchBuilder.Amount.ToNumericCurrencyString());
                    request.AddQueryStringParam("currency", trb.SearchBuilder.Currency);
                    request.AddQueryStringParam("number_first6", trb.SearchBuilder.CardNumberFirstSix);
                    request.AddQueryStringParam("number_last4", trb.SearchBuilder.CardNumberLastFour);
                    request.AddQueryStringParam("token_first6", trb.SearchBuilder.TokenFirstSix);
                    request.AddQueryStringParam("token_last4", trb.SearchBuilder.TokenLastFour);
                    request.AddQueryStringParam("account_name", trb.SearchBuilder.AccountName);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("brand_reference", trb.SearchBuilder.BrandReference);
                    request.AddQueryStringParam("authcode", trb.SearchBuilder.AuthCode);
                    request.AddQueryStringParam("reference", trb.SearchBuilder.ReferenceNumber);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.TransactionStatus));
                    request.AddQueryStringParam("from_time_created", trb.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("country", trb.SearchBuilder.Country);
                    request.AddQueryStringParam("batch_id", trb.SearchBuilder.BatchId);
                    request.AddQueryStringParam("entry_mode", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.PaymentEntryMode));
                    request.AddQueryStringParam("name", trb.SearchBuilder.Name);
                    request.AddQueryStringParam("payment_method", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.PaymentMethodName));

                    return(request);

                case ReportType.FindSettlementTransactionsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/settlement/transactions",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.TransactionOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("number_first6", trb.SearchBuilder.CardNumberFirstSix);
                    request.AddQueryStringParam("number_last4", trb.SearchBuilder.CardNumberLastFour);
                    request.AddQueryStringParam("deposit_status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DepositStatus));
                    request.AddQueryStringParam("account_name", gateway.GpApiConfig.AccessTokenInfo.DataAccountName);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("arn", trb.SearchBuilder.AquirerReferenceNumber);
                    request.AddQueryStringParam("brand_reference", trb.SearchBuilder.BrandReference);
                    request.AddQueryStringParam("authcode", trb.SearchBuilder.AuthCode);
                    request.AddQueryStringParam("reference", trb.SearchBuilder.ReferenceNumber);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.TransactionStatus));
                    request.AddQueryStringParam("from_time_created", trb.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("deposit_id", trb.SearchBuilder.DepositReference);
                    request.AddQueryStringParam("from_deposit_time_created", trb.SearchBuilder.StartDepositDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_deposit_time_created", trb.SearchBuilder.EndDepositDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("from_batch_time_created", trb.SearchBuilder.StartBatchDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_batch_time_created", trb.SearchBuilder.EndBatchDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.DepositDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/settlement/deposits/{trb.SearchBuilder.DepositReference}",
                    });

                case ReportType.FindDepositsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/settlement/deposits",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.DepositOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("account_name", gateway.GpApiConfig.AccessTokenInfo.DataAccountName);
                    request.AddQueryStringParam("from_time_created", trb.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("id", trb.SearchBuilder.DepositReference);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DepositStatus));
                    request.AddQueryStringParam("amount", trb.SearchBuilder.Amount.ToNumericCurrencyString());
                    request.AddQueryStringParam("masked_account_number_last4", trb.SearchBuilder.AccountNumberLastFour);
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.DisputeDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/disputes/{trb.SearchBuilder.DisputeId}",
                    });

                case ReportType.DocumentDisputeDetail:
                    var apiRequest = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/disputes/{trb.SearchBuilder.DisputeId}/documents/{trb.SearchBuilder.DisputeDocumentId}",
                    };
                    return(apiRequest);

                case ReportType.FindDisputesPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/disputes",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.DisputeOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("arn", trb.SearchBuilder.AquirerReferenceNumber);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStatus));
                    request.AddQueryStringParam("stage", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStage));
                    request.AddQueryStringParam("from_stage_time_created", trb.SearchBuilder.StartStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_stage_time_created", trb.SearchBuilder.EndStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.SettlementDisputeDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/settlement/disputes/{trb.SearchBuilder.SettlementDisputeId}",
                    });

                case ReportType.FindSettlementDisputesPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/settlement/disputes",
                    };
                    request.AddQueryStringParam("account_name", gateway.GpApiConfig.AccessTokenInfo.DataAccountName);
                    request.AddQueryStringParam("deposit_id", trb.SearchBuilder.DepositReference);
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.DisputeOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("arn", trb.SearchBuilder.AquirerReferenceNumber);
                    request.AddQueryStringParam("brand", trb.SearchBuilder.CardBrand);
                    request.AddQueryStringParam("STATUS", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStatus));
                    request.AddQueryStringParam("stage", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.DisputeStage));
                    request.AddQueryStringParam("from_stage_time_created", trb.SearchBuilder.StartStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_stage_time_created", trb.SearchBuilder.EndStageDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("from_deposit_time_created", trb.SearchBuilder.StartDepositDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_deposit_time_created", trb.SearchBuilder.EndDepositDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("system.mid", trb.SearchBuilder.MerchantId);
                    request.AddQueryStringParam("system.hierarchy", trb.SearchBuilder.SystemHierarchy);

                    return(request);

                case ReportType.StoredPaymentMethodDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/payment-methods/{trb.SearchBuilder.StoredPaymentMethodId}",
                    });

                case ReportType.FindStoredPaymentMethodsPaged:
                    if (trb.SearchBuilder.PaymentMethod is CreditCardData)
                    {
                        var creditCardData = trb.SearchBuilder.PaymentMethod as CreditCardData;

                        var card = new JsonDoc()
                                   .Set("number", creditCardData.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);

                        var payload = new JsonDoc()
                                      .Set("account_name", gateway.GpApiConfig.AccessTokenInfo.TokenizationAccountName)
                                      .Set("reference", trb.SearchBuilder.ReferenceNumber)
                                      .Set("card", card != null ? card : null);

                        request = new GpApiRequest {
                            Verb        = HttpMethod.Post,
                            Endpoint    = $"{merchantUrl}/payment-methods/search",
                            RequestBody = payload.ToString()
                        };
                        return(request);
                    }
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/payment-methods",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.StoredPaymentMethodOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("id", trb.SearchBuilder.StoredPaymentMethodId);
                    request.AddQueryStringParam("number_last4", trb.SearchBuilder.CardNumberLastFour);
                    request.AddQueryStringParam("reference", trb.SearchBuilder.ReferenceNumber);
                    request.AddQueryStringParam("status", EnumConverter.GetMapping(Target.GP_API, trb.SearchBuilder.StoredPaymentMethodStatus));
                    request.AddQueryStringParam("from_time_created", trb.SearchBuilder.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.SearchBuilder.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("from_time_last_updated", trb.SearchBuilder.StartLastUpdatedDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_last_updated", trb.SearchBuilder.EndLastUpdatedDate?.ToString("yyyy-MM-dd"));

                    return(request);

                case ReportType.ActionDetail:
                    return(new GpApiRequest {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/actions/{trb.SearchBuilder.ActionId}",
                    });

                case ReportType.FindActionsPaged:
                    request = new GpApiRequest {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/actions",
                    };
                    request.AddQueryStringParam("page", trb.Page?.ToString());
                    request.AddQueryStringParam("page_size", trb.PageSize?.ToString());
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.ActionOrderBy));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("id", trb.SearchBuilder.ActionId);
                    request.AddQueryStringParam("type", trb.SearchBuilder.ActionType);
                    request.AddQueryStringParam("resource", trb.SearchBuilder.Resource);
                    request.AddQueryStringParam("resource_status", trb.SearchBuilder.ResourceStatus);
                    request.AddQueryStringParam("resource_id", trb.SearchBuilder.ResourceId);
                    request.AddQueryStringParam("from_time_created", trb.SearchBuilder.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.SearchBuilder.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("merchant_name", trb.SearchBuilder.MerchantName);
                    request.AddQueryStringParam("account_name", trb.SearchBuilder.AccountName);
                    request.AddQueryStringParam("app_name", trb.SearchBuilder.AppName);
                    request.AddQueryStringParam("version", trb.SearchBuilder.Version);
                    request.AddQueryStringParam("response_code", trb.SearchBuilder.ResponseCode);
                    request.AddQueryStringParam("http_response_code", trb.SearchBuilder.HttpResponseCode);

                    return(request);

                case ReportType.PayLinkDetail:
                    return(new GpApiRequest
                    {
                        Verb = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/links/{trb.SearchBuilder.PayLinkId}",
                    });


                case ReportType.FindPayLinkPaged:
                    request = new GpApiRequest
                    {
                        Verb     = HttpMethod.Get,
                        Endpoint = $"{merchantUrl}/links",
                    };

                    request.AddQueryStringParam("from_time_created", trb.SearchBuilder.StartDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("to_time_created", trb.SearchBuilder.EndDate?.ToString("yyyy-MM-dd"));
                    request.AddQueryStringParam("order", EnumConverter.GetMapping(Target.GP_API, trb.Order));
                    request.AddQueryStringParam("order_by", EnumConverter.GetMapping(Target.GP_API, trb.ActionOrderBy));

                    return(request);
                }
            }
            return(null);
        }