diff --git a/api-reference/v1/openapi_spec_v1.json b/api-reference/v1/openapi_spec_v1.json index 95bfd54057f..8938262883f 100644 --- a/api-reference/v1/openapi_spec_v1.json +++ b/api-reference/v1/openapi_spec_v1.json @@ -15870,6 +15870,7 @@ "hyperswitch_vault", "inespay", "iatapay", + "imerchantsolutions", "itaubank", "jpmorgan", "juspaythreedsserver", @@ -38715,6 +38716,7 @@ "helcim", "hyperpg", "iatapay", + "imerchantsolutions", "inespay", "itaubank", "jpmorgan", diff --git a/api-reference/v2/openapi_spec_v2.json b/api-reference/v2/openapi_spec_v2.json index e2ec18274b1..dbca49e5c9d 100644 --- a/api-reference/v2/openapi_spec_v2.json +++ b/api-reference/v2/openapi_spec_v2.json @@ -10876,6 +10876,7 @@ "hyperswitch_vault", "inespay", "iatapay", + "imerchantsolutions", "itaubank", "jpmorgan", "juspaythreedsserver", @@ -28409,6 +28410,7 @@ "helcim", "hyperpg", "iatapay", + "imerchantsolutions", "inespay", "itaubank", "jpmorgan", diff --git a/config/config.example.toml b/config/config.example.toml index 846a385ed74..295ad4da402 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -264,6 +264,7 @@ hyperwallet.base_url = "https://uat-api.paylution.com" hipay.secondary_base_url = "https://stage-secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://stage-api-gateway.hipay.com/" iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://sandbox.devportal.itau.com.br/" jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2" @@ -1332,7 +1333,7 @@ url = "http://localhost:8080" # Open Router URL [grpc_client.unified_connector_service] base_url = "http://localhost:8000" # Unified Connector Service Base URL connection_timeout = 10 # Connection Timeout Duration in Seconds -ucs_only_connectors = "paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only +ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call [grpc_client.recovery_decider_client] # Revenue recovery client base url diff --git a/config/deployments/env_specific.toml b/config/deployments/env_specific.toml index ec26f03886e..c4a7c2fecec 100644 --- a/config/deployments/env_specific.toml +++ b/config/deployments/env_specific.toml @@ -406,7 +406,7 @@ connector_names = "connector_names" # Comma-separated list of allowed connec [grpc_client.unified_connector_service] base_url = "http://localhost:8000" # Unified Connector Service Base URL connection_timeout = 10 # Connection Timeout Duration in Seconds -ucs_only_connectors = "paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only +ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call [revenue_recovery] diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml index 542fa84e063..7087cd464bc 100644 --- a/config/deployments/integration_test.toml +++ b/config/deployments/integration_test.toml @@ -89,6 +89,7 @@ hipay.secondary_base_url = "https://stage-secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://stage-api-gateway.hipay.com/" hyperwallet.base_url = "https://uat-api.paylution.com" iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://sandbox.devportal.itau.com.br/" jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2" @@ -1013,7 +1014,7 @@ connector_list = "juspaythreedsserver, ctp_mastercard, ctp_visa" connector_list = "worldpayvantiv" [grpc_client.unified_connector_service] -ucs_only_connectors = "paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only +ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call # Merchant Advice Code Configuration diff --git a/config/deployments/production.toml b/config/deployments/production.toml index 67c8dd5d8f0..154ec861842 100644 --- a/config/deployments/production.toml +++ b/config/deployments/production.toml @@ -92,6 +92,7 @@ hipay.secondary_base_url = "https://secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://api-gateway.hipay.com/" hyperwallet.base_url = "https://uat-api.paylution.com" iatapay.base_url = "https://iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://secure.api.itau/" jpmorgan.base_url = "https://api-ms.payments.jpmorgan.com/api/v2" @@ -1021,7 +1022,7 @@ click_to_pay = {connector_list = "adyen, cybersource, trustpay"} connector_list = "juspaythreedsserver, ctp_mastercard, ctp_visa" [grpc_client.unified_connector_service] -ucs_only_connectors = "paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only +ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call # Merchant Advice Code Configuration diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml index fd7b13b60fa..0d7f23ee906 100644 --- a/config/deployments/sandbox.toml +++ b/config/deployments/sandbox.toml @@ -92,6 +92,7 @@ hipay.secondary_base_url = "https://stage-secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://stage-api-gateway.hipay.com/" hyperwallet.base_url = "https://uat-api.paylution.com" iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://sandbox.devportal.itau.com.br/" jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2" @@ -1031,7 +1032,7 @@ connector_list = "juspaythreedsserver, ctp_mastercard, ctp_visa" connector_list = "worldpayvantiv" [grpc_client.unified_connector_service] -ucs_only_connectors = "paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only +ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call # Merchant Advice Code Configuration diff --git a/config/development.toml b/config/development.toml index 65b019ca3c0..8121198ade5 100644 --- a/config/development.toml +++ b/config/development.toml @@ -294,6 +294,7 @@ hyperwallet.base_url = "https://uat-api.paylution.com" hipay.secondary_base_url = "https://stage-secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://stage-api-gateway.hipay.com/" iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://sandbox.devportal.itau.com.br/" jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2" @@ -1467,7 +1468,7 @@ enabled = "true" [grpc_client.unified_connector_service] base_url = "http://localhost:8000" connection_timeout = 10 -ucs_only_connectors = "paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only +ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub" # Comma-separated list of connectors that use UCS only ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call [revenue_recovery] diff --git a/config/docker_compose.toml b/config/docker_compose.toml index 5b511550701..a0bbf09e35d 100644 --- a/config/docker_compose.toml +++ b/config/docker_compose.toml @@ -195,6 +195,7 @@ hyperwallet.base_url = "https://uat-api.paylution.com" hipay.secondary_base_url = "https://stage-secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://stage-api-gateway.hipay.com/" iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://sandbox.devportal.itau.com.br/" jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2" diff --git a/crates/common_enums/src/connector_enums.rs b/crates/common_enums/src/connector_enums.rs index 24064774c7e..d488ccf9020 100644 --- a/crates/common_enums/src/connector_enums.rs +++ b/crates/common_enums/src/connector_enums.rs @@ -125,6 +125,7 @@ pub enum Connector { // Hyperwallet, added as template code for future usage Inespay, Iatapay, + Imerchantsolutions, Itaubank, Jpmorgan, Juspaythreedsserver, @@ -435,7 +436,8 @@ impl Connector { | Self::Paytm | Self::Payjustnow | Self::Payjustnowinstore - | Self::Phonepe => false, + | Self::Phonepe + | Self::Imerchantsolutions => false, Self::Stripe | Self::Checkout | Self::Zift | Self::Nmi | Self::Braintree| Self::Cybersource | Self::Archipel | Self::Nuvei | Self::Adyen => true, } diff --git a/crates/connector_configs/src/connector.rs b/crates/connector_configs/src/connector.rs index ed13248d988..389af6d654d 100644 --- a/crates/connector_configs/src/connector.rs +++ b/crates/connector_configs/src/connector.rs @@ -281,6 +281,7 @@ pub struct ConnectorConfig { #[cfg(feature = "payouts")] pub cybersource_payout: Option, pub iatapay: Option, + pub imerchantsolutions: Option, pub itaubank: Option, pub opennode: Option, pub bambora: Option, @@ -664,6 +665,7 @@ impl ConnectorConfig { Connector::Phonepe => Ok(connector_data.phonepe), Connector::Payjustnow => Ok(connector_data.payjustnow), Connector::Payjustnowinstore => Ok(connector_data.payjustnowinstore), + Connector::Imerchantsolutions => Ok(connector_data.imerchantsolutions), } } } diff --git a/crates/connector_configs/toml/development.toml b/crates/connector_configs/toml/development.toml index 3b629c5f5d2..3586ae7301b 100644 --- a/crates/connector_configs/toml/development.toml +++ b/crates/connector_configs/toml/development.toml @@ -8372,4 +8372,34 @@ api_secret = "Private Key(Base64 encoded)" [[trustly.bank_redirect]] payment_method_type = "trustly" [trustly.connector_webhook_details] -merchant_secret="Trustly's public key" \ No newline at end of file +merchant_secret="Trustly's public key" + +[imerchantsolutions] +[imerchantsolutions.connector_auth.HeaderKey] +api_key = "API Key" +[imerchantsolutions.connector_webhook_details] +merchant_secret="Source verification key" +[[imerchantsolutions.credit]] +payment_method_type = "Mastercard" +[[imerchantsolutions.credit]] +payment_method_type = "Visa" +[[imerchantsolutions.credit]] +payment_method_type = "AmericanExpress" +[[imerchantsolutions.credit]] +payment_method_type = "JCB" +[[imerchantsolutions.credit]] +payment_method_type = "Discover" +[[imerchantsolutions.credit]] +payment_method_type = "UnionPay" +[[imerchantsolutions.debit]] +payment_method_type = "Mastercard" +[[imerchantsolutions.debit]] +payment_method_type = "Visa" +[[imerchantsolutions.debit]] +payment_method_type = "AmericanExpress" +[[imerchantsolutions.debit]] +payment_method_type = "JCB" +[[imerchantsolutions.debit]] +payment_method_type = "Discover" +[[imerchantsolutions.debit]] +payment_method_type = "UnionPay" \ No newline at end of file diff --git a/crates/connector_configs/toml/production.toml b/crates/connector_configs/toml/production.toml index 3af850bcf8d..65de1a962a7 100644 --- a/crates/connector_configs/toml/production.toml +++ b/crates/connector_configs/toml/production.toml @@ -7428,4 +7428,34 @@ api_secret = "Private Key(Base64 encoded)" [[trustly.bank_redirect]] payment_method_type = "trustly" [trustly.connector_webhook_details] -merchant_secret="Trustly's public key" \ No newline at end of file +merchant_secret="Trustly's public key" + +[imerchantsolutions] +[imerchantsolutions.connector_auth.HeaderKey] +api_key = "API Key" +[imerchantsolutions.connector_webhook_details] +merchant_secret="Source verification key" +[[imerchantsolutions.credit]] +payment_method_type = "Mastercard" +[[imerchantsolutions.credit]] +payment_method_type = "Visa" +[[imerchantsolutions.credit]] +payment_method_type = "AmericanExpress" +[[imerchantsolutions.credit]] +payment_method_type = "JCB" +[[imerchantsolutions.credit]] +payment_method_type = "Discover" +[[imerchantsolutions.credit]] +payment_method_type = "UnionPay" +[[imerchantsolutions.debit]] +payment_method_type = "Mastercard" +[[imerchantsolutions.debit]] +payment_method_type = "Visa" +[[imerchantsolutions.debit]] +payment_method_type = "AmericanExpress" +[[imerchantsolutions.debit]] +payment_method_type = "JCB" +[[imerchantsolutions.debit]] +payment_method_type = "Discover" +[[imerchantsolutions.debit]] +payment_method_type = "UnionPay" diff --git a/crates/connector_configs/toml/sandbox.toml b/crates/connector_configs/toml/sandbox.toml index 1fa61c5992d..c52352cc5b1 100644 --- a/crates/connector_configs/toml/sandbox.toml +++ b/crates/connector_configs/toml/sandbox.toml @@ -8345,4 +8345,34 @@ api_secret = "Private Key(Base64 encoded)" [[trustly.bank_redirect]] payment_method_type = "trustly" [trustly.connector_webhook_details] -merchant_secret="Trustly's public key" \ No newline at end of file +merchant_secret="Trustly's public key" + +[imerchantsolutions] +[imerchantsolutions.connector_auth.HeaderKey] +api_key = "API Key" +[imerchantsolutions.connector_webhook_details] +merchant_secret="Source verification key" +[[imerchantsolutions.credit]] +payment_method_type = "Mastercard" +[[imerchantsolutions.credit]] +payment_method_type = "Visa" +[[imerchantsolutions.credit]] +payment_method_type = "AmericanExpress" +[[imerchantsolutions.credit]] +payment_method_type = "JCB" +[[imerchantsolutions.credit]] +payment_method_type = "Discover" +[[imerchantsolutions.credit]] +payment_method_type = "UnionPay" +[[imerchantsolutions.debit]] +payment_method_type = "Mastercard" +[[imerchantsolutions.debit]] +payment_method_type = "Visa" +[[imerchantsolutions.debit]] +payment_method_type = "AmericanExpress" +[[imerchantsolutions.debit]] +payment_method_type = "JCB" +[[imerchantsolutions.debit]] +payment_method_type = "Discover" +[[imerchantsolutions.debit]] +payment_method_type = "UnionPay" diff --git a/crates/euclid/src/enums.rs b/crates/euclid/src/enums.rs index 5b3ce231ee4..46273bdc263 100644 --- a/crates/euclid/src/enums.rs +++ b/crates/euclid/src/enums.rs @@ -282,6 +282,7 @@ pub enum RoutableConnectors { Helcim, Hyperpg, Iatapay, + Imerchantsolutions, Inespay, Itaubank, Jpmorgan, @@ -441,6 +442,7 @@ impl TryFrom for RoutableConnectors { Connector::Helcim => Ok(Self::Helcim), Connector::Hyperpg => Ok(Self::Hyperpg), Connector::Iatapay => Ok(Self::Iatapay), + Connector::Imerchantsolutions => Ok(Self::Imerchantsolutions), Connector::Itaubank => Ok(Self::Itaubank), Connector::Jpmorgan => Ok(Self::Jpmorgan), Connector::Klarna => Ok(Self::Klarna), @@ -602,6 +604,7 @@ impl From for Connector { RoutableConnectors::Helcim => Self::Helcim, RoutableConnectors::Hyperpg => Self::Hyperpg, RoutableConnectors::Iatapay => Self::Iatapay, + RoutableConnectors::Imerchantsolutions => Self::Imerchantsolutions, RoutableConnectors::Itaubank => Self::Itaubank, RoutableConnectors::Jpmorgan => Self::Jpmorgan, RoutableConnectors::Klarna => Self::Klarna, diff --git a/crates/hyperswitch_connectors/src/connectors.rs b/crates/hyperswitch_connectors/src/connectors.rs index b901362630e..3d99139db3d 100644 --- a/crates/hyperswitch_connectors/src/connectors.rs +++ b/crates/hyperswitch_connectors/src/connectors.rs @@ -61,6 +61,7 @@ pub mod hyperpg; pub mod hyperswitch_vault; pub mod hyperwallet; pub mod iatapay; +pub mod imerchantsolutions; pub mod inespay; pub mod itaubank; pub mod jpmorgan; @@ -162,22 +163,22 @@ pub use self::{ flexiti::Flexiti, forte::Forte, getnet::Getnet, gigadat::Gigadat, globalpay::Globalpay, globepay::Globepay, gocardless::Gocardless, gpayments::Gpayments, helcim::Helcim, hipay::Hipay, hyperpg::Hyperpg, hyperswitch_vault::HyperswitchVault, hyperwallet::Hyperwallet, - iatapay::Iatapay, inespay::Inespay, itaubank::Itaubank, jpmorgan::Jpmorgan, - juspaythreedsserver::Juspaythreedsserver, katapult::Katapult, klarna::Klarna, loonio::Loonio, - mifinity::Mifinity, mollie::Mollie, moneris::Moneris, mpgs::Mpgs, multisafepay::Multisafepay, - netcetera::Netcetera, nexinets::Nexinets, nexixpay::Nexixpay, nmi::Nmi, nomupay::Nomupay, - noon::Noon, nordea::Nordea, novalnet::Novalnet, nuvei::Nuvei, opayo::Opayo, opennode::Opennode, - paybox::Paybox, payeezy::Payeezy, payjustnow::Payjustnow, payjustnowinstore::Payjustnowinstore, - payload::Payload, payme::Payme, payone::Payone, paypal::Paypal, paysafe::Paysafe, - paystack::Paystack, paytm::Paytm, payu::Payu, peachpayments::Peachpayments, phonepe::Phonepe, - placetopay::Placetopay, plaid::Plaid, powertranz::Powertranz, prophetpay::Prophetpay, - rapyd::Rapyd, razorpay::Razorpay, recurly::Recurly, redsys::Redsys, revolv3::Revolv3, - riskified::Riskified, santander::Santander, shift4::Shift4, sift::Sift, signifyd::Signifyd, - silverflow::Silverflow, square::Square, stax::Stax, stripe::Stripe, - stripebilling::Stripebilling, taxjar::Taxjar, tesouro::Tesouro, threedsecureio::Threedsecureio, - thunes::Thunes, tokenex::Tokenex, tokenio::Tokenio, truelayer::Truelayer, trustly::Trustly, - trustpay::Trustpay, trustpayments::Trustpayments, tsys::Tsys, - unified_authentication_service::UnifiedAuthenticationService, vgs::Vgs, volt::Volt, + iatapay::Iatapay, imerchantsolutions::Imerchantsolutions, inespay::Inespay, itaubank::Itaubank, + jpmorgan::Jpmorgan, juspaythreedsserver::Juspaythreedsserver, katapult::Katapult, + klarna::Klarna, loonio::Loonio, mifinity::Mifinity, mollie::Mollie, moneris::Moneris, + mpgs::Mpgs, multisafepay::Multisafepay, netcetera::Netcetera, nexinets::Nexinets, + nexixpay::Nexixpay, nmi::Nmi, nomupay::Nomupay, noon::Noon, nordea::Nordea, novalnet::Novalnet, + nuvei::Nuvei, opayo::Opayo, opennode::Opennode, paybox::Paybox, payeezy::Payeezy, + payjustnow::Payjustnow, payjustnowinstore::Payjustnowinstore, payload::Payload, payme::Payme, + payone::Payone, paypal::Paypal, paysafe::Paysafe, paystack::Paystack, paytm::Paytm, payu::Payu, + peachpayments::Peachpayments, phonepe::Phonepe, placetopay::Placetopay, plaid::Plaid, + powertranz::Powertranz, prophetpay::Prophetpay, rapyd::Rapyd, razorpay::Razorpay, + recurly::Recurly, redsys::Redsys, revolv3::Revolv3, riskified::Riskified, santander::Santander, + shift4::Shift4, sift::Sift, signifyd::Signifyd, silverflow::Silverflow, square::Square, + stax::Stax, stripe::Stripe, stripebilling::Stripebilling, taxjar::Taxjar, tesouro::Tesouro, + threedsecureio::Threedsecureio, thunes::Thunes, tokenex::Tokenex, tokenio::Tokenio, + truelayer::Truelayer, trustly::Trustly, trustpay::Trustpay, trustpayments::Trustpayments, + tsys::Tsys, unified_authentication_service::UnifiedAuthenticationService, vgs::Vgs, volt::Volt, wellsfargo::Wellsfargo, wellsfargopayout::Wellsfargopayout, wise::Wise, worldline::Worldline, worldpay::Worldpay, worldpaymodular::Worldpaymodular, worldpayvantiv::Worldpayvantiv, worldpayxml::Worldpayxml, xendit::Xendit, zen::Zen, zift::Zift, zsl::Zsl, diff --git a/crates/hyperswitch_connectors/src/connectors/imerchantsolutions.rs b/crates/hyperswitch_connectors/src/connectors/imerchantsolutions.rs new file mode 100644 index 00000000000..94f254a3d6a --- /dev/null +++ b/crates/hyperswitch_connectors/src/connectors/imerchantsolutions.rs @@ -0,0 +1,712 @@ +pub mod transformers; + +use std::sync::LazyLock; + +use common_enums::enums; +use common_utils::{ + errors::CustomResult, + ext_traits::BytesExt, + request::{Method, Request, RequestBuilder, RequestContent}, + types::{AmountConvertor, MinorUnit, MinorUnitForConnector}, +}; +use error_stack::{report, ResultExt}; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{ + ConnectorInfo, PaymentMethodDetails, PaymentsResponseData, RefundsResponseData, + SupportedPaymentMethods, SupportedPaymentMethodsExt, + }, + types::{ + PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, PaymentsSyncRouterData, + RefundSyncRouterData, RefundsRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{ + self, CaptureSyncMethod, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, + ConnectorSpecifications, ConnectorValidation, + }, + configs::Connectors, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks, +}; +use hyperswitch_masking::{ExposeInterface, Mask}; +use transformers as imerchantsolutions; + +use crate::{constants::headers, types::ResponseRouterData, utils}; + +#[derive(Clone)] +pub struct Imerchantsolutions { + amount_converter: &'static (dyn AmountConvertor + Sync), +} + +impl Imerchantsolutions { + pub fn new() -> &'static Self { + &Self { + amount_converter: &MinorUnitForConnector, + } + } +} + +impl api::Payment for Imerchantsolutions {} +impl api::PaymentSession for Imerchantsolutions {} +impl api::ConnectorAccessToken for Imerchantsolutions {} +impl api::MandateSetup for Imerchantsolutions {} +impl api::PaymentAuthorize for Imerchantsolutions {} +impl api::PaymentSync for Imerchantsolutions {} +impl api::PaymentCapture for Imerchantsolutions {} +impl api::PaymentVoid for Imerchantsolutions {} +impl api::Refund for Imerchantsolutions {} +impl api::RefundExecute for Imerchantsolutions {} +impl api::RefundSync for Imerchantsolutions {} +impl api::PaymentToken for Imerchantsolutions {} + +impl ConnectorIntegration + for Imerchantsolutions +{ + // Not Implemented (R) +} + +impl ConnectorCommonExt for Imerchantsolutions +where + Self: ConnectorIntegration, +{ + fn build_headers( + &self, + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> + { + let mut header = vec![( + headers::CONTENT_TYPE.to_string(), + self.get_content_type().to_string().into(), + )]; + let mut api_key = self.get_auth_header(&req.connector_auth_type)?; + header.append(&mut api_key); + Ok(header) + } +} + +impl ConnectorCommon for Imerchantsolutions { + fn id(&self) -> &'static str { + "imerchantsolutions" + } + + fn get_currency_unit(&self) -> api::CurrencyUnit { + api::CurrencyUnit::Minor + } + + fn common_get_content_type(&self) -> &'static str { + "application/json" + } + + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { + connectors.imerchantsolutions.base_url.as_ref() + } + + fn get_auth_header( + &self, + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> + { + let auth = imerchantsolutions::ImerchantsolutionsAuthType::try_from(auth_type) + .change_context(errors::ConnectorError::FailedToObtainAuthType)?; + Ok(vec![( + headers::AUTHORIZATION.to_string(), + auth.api_key.expose().into_masked(), + )]) + } + + fn build_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + let response: imerchantsolutions::ImerchantsolutionsErrorResponse = res + .response + .parse_struct("ImerchantsolutionsErrorResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + + Ok(ErrorResponse { + status_code: res.status_code, + code: response.code, + message: response.message, + reason: response.reason, + attempt_status: None, + connector_transaction_id: None, + connector_response_reference_id: None, + network_advice_code: None, + network_decline_code: None, + network_error_message: None, + connector_metadata: None, + }) + } +} + +impl ConnectorValidation for Imerchantsolutions { + fn validate_mandate_payment( + &self, + _pm_type: Option, + pm_data: PaymentMethodData, + ) -> CustomResult<(), errors::ConnectorError> { + match pm_data { + PaymentMethodData::Card(_) => Err(errors::ConnectorError::NotImplemented( + "validate_mandate_payment does not support cards".to_string(), + ) + .into()), + _ => Ok(()), + } + } + + fn validate_psync_reference_id( + &self, + _data: &PaymentsSyncData, + _is_three_ds: bool, + _status: enums::AttemptStatus, + _connector_meta_data: Option, + ) -> CustomResult<(), errors::ConnectorError> { + Ok(()) + } +} + +impl ConnectorIntegration + for Imerchantsolutions +{ + //TODO: implement sessions flow +} + +impl ConnectorIntegration + for Imerchantsolutions +{ +} + +impl ConnectorIntegration + for Imerchantsolutions +{ +} + +impl ConnectorIntegration + for Imerchantsolutions +{ + fn get_headers( + &self, + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> + { + self.build_headers(req, connectors) + } + + fn get_content_type(&self) -> &'static str { + self.common_get_content_type() + } + + fn get_url( + &self, + _req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, + ) -> CustomResult { + Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) + } + + fn get_request_body( + &self, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, + ) -> CustomResult { + let amount = utils::convert_amount( + self.amount_converter, + req.request.minor_amount, + req.request.currency, + )?; + + let connector_router_data = + imerchantsolutions::ImerchantsolutionsRouterData::from((amount, req)); + let connector_req = imerchantsolutions::ImerchantsolutionsPaymentsRequest::try_from( + &connector_router_data, + )?; + Ok(RequestContent::Json(Box::new(connector_req))) + } + + fn build_request( + &self, + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + Ok(Some( + RequestBuilder::new() + .method(Method::Post) + .url(&types::PaymentsAuthorizeType::get_url( + self, req, connectors, + )?) + .attach_default_headers() + .headers(types::PaymentsAuthorizeType::get_headers( + self, req, connectors, + )?) + .set_body(types::PaymentsAuthorizeType::get_request_body( + self, req, connectors, + )?) + .build(), + )) + } + + fn handle_response( + &self, + data: &PaymentsAuthorizeRouterData, + event_builder: Option<&mut ConnectorEvent>, + res: Response, + ) -> CustomResult { + let response: imerchantsolutions::ImerchantsolutionsPaymentsResponse = res + .response + .parse_struct("Imerchantsolutions PaymentsAuthorizeResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + RouterData::try_from(ResponseRouterData { + response, + data: data.clone(), + http_code: res.status_code, + }) + } + + fn get_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + self.build_error_response(res, event_builder) + } +} + +impl ConnectorIntegration for Imerchantsolutions { + fn get_headers( + &self, + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> + { + self.build_headers(req, connectors) + } + + fn get_content_type(&self) -> &'static str { + self.common_get_content_type() + } + + fn get_url( + &self, + _req: &PaymentsSyncRouterData, + _connectors: &Connectors, + ) -> CustomResult { + Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) + } + + fn build_request( + &self, + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + Ok(Some( + RequestBuilder::new() + .method(Method::Get) + .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) + .attach_default_headers() + .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) + .build(), + )) + } + + fn handle_response( + &self, + data: &PaymentsSyncRouterData, + event_builder: Option<&mut ConnectorEvent>, + res: Response, + ) -> CustomResult { + let response: imerchantsolutions::ImerchantsolutionsPaymentsResponse = res + .response + .parse_struct("imerchantsolutions PaymentsSyncResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + RouterData::try_from(ResponseRouterData { + response, + data: data.clone(), + http_code: res.status_code, + }) + } + + fn get_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + self.build_error_response(res, event_builder) + } + + fn get_multiple_capture_sync_method( + &self, + ) -> CustomResult { + Ok(CaptureSyncMethod::Individual) + } +} + +impl ConnectorIntegration + for Imerchantsolutions +{ + fn get_headers( + &self, + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> + { + self.build_headers(req, connectors) + } + + fn get_content_type(&self) -> &'static str { + self.common_get_content_type() + } + + fn get_url( + &self, + _req: &PaymentsCaptureRouterData, + _connectors: &Connectors, + ) -> CustomResult { + Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) + } + + fn get_request_body( + &self, + _req: &PaymentsCaptureRouterData, + _connectors: &Connectors, + ) -> CustomResult { + Err(errors::ConnectorError::NotImplemented("get_request_body method".to_string()).into()) + } + + fn build_request( + &self, + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + Ok(Some( + RequestBuilder::new() + .method(Method::Post) + .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) + .attach_default_headers() + .headers(types::PaymentsCaptureType::get_headers( + self, req, connectors, + )?) + .set_body(types::PaymentsCaptureType::get_request_body( + self, req, connectors, + )?) + .build(), + )) + } + + fn handle_response( + &self, + data: &PaymentsCaptureRouterData, + event_builder: Option<&mut ConnectorEvent>, + res: Response, + ) -> CustomResult { + let response: imerchantsolutions::ImerchantsolutionsPaymentsResponse = res + .response + .parse_struct("Imerchantsolutions PaymentsCaptureResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + RouterData::try_from(ResponseRouterData { + response, + data: data.clone(), + http_code: res.status_code, + }) + } + + fn get_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + self.build_error_response(res, event_builder) + } +} + +impl ConnectorIntegration for Imerchantsolutions {} + +impl ConnectorIntegration for Imerchantsolutions { + fn get_headers( + &self, + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> + { + self.build_headers(req, connectors) + } + + fn get_content_type(&self) -> &'static str { + self.common_get_content_type() + } + + fn get_url( + &self, + _req: &RefundsRouterData, + _connectors: &Connectors, + ) -> CustomResult { + Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) + } + + fn get_request_body( + &self, + req: &RefundsRouterData, + _connectors: &Connectors, + ) -> CustomResult { + let refund_amount = utils::convert_amount( + self.amount_converter, + req.request.minor_refund_amount, + req.request.currency, + )?; + + let connector_router_data = + imerchantsolutions::ImerchantsolutionsRouterData::from((refund_amount, req)); + let connector_req = + imerchantsolutions::ImerchantsolutionsRefundRequest::try_from(&connector_router_data)?; + Ok(RequestContent::Json(Box::new(connector_req))) + } + + fn build_request( + &self, + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&types::RefundExecuteType::get_url(self, req, connectors)?) + .attach_default_headers() + .headers(types::RefundExecuteType::get_headers( + self, req, connectors, + )?) + .set_body(types::RefundExecuteType::get_request_body( + self, req, connectors, + )?) + .build(); + Ok(Some(request)) + } + + fn handle_response( + &self, + data: &RefundsRouterData, + event_builder: Option<&mut ConnectorEvent>, + res: Response, + ) -> CustomResult, errors::ConnectorError> { + let response: imerchantsolutions::RefundResponse = res + .response + .parse_struct("imerchantsolutions RefundResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + RouterData::try_from(ResponseRouterData { + response, + data: data.clone(), + http_code: res.status_code, + }) + } + + fn get_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + self.build_error_response(res, event_builder) + } +} + +impl ConnectorIntegration for Imerchantsolutions { + fn get_headers( + &self, + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> + { + self.build_headers(req, connectors) + } + + fn get_content_type(&self) -> &'static str { + self.common_get_content_type() + } + + fn get_url( + &self, + _req: &RefundSyncRouterData, + _connectors: &Connectors, + ) -> CustomResult { + Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) + } + + fn build_request( + &self, + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + Ok(Some( + RequestBuilder::new() + .method(Method::Get) + .url(&types::RefundSyncType::get_url(self, req, connectors)?) + .attach_default_headers() + .headers(types::RefundSyncType::get_headers(self, req, connectors)?) + .set_body(types::RefundSyncType::get_request_body( + self, req, connectors, + )?) + .build(), + )) + } + + fn handle_response( + &self, + data: &RefundSyncRouterData, + event_builder: Option<&mut ConnectorEvent>, + res: Response, + ) -> CustomResult { + let response: imerchantsolutions::RefundResponse = res + .response + .parse_struct("imerchantsolutions RefundSyncResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + RouterData::try_from(ResponseRouterData { + response, + data: data.clone(), + http_code: res.status_code, + }) + } + + fn get_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + self.build_error_response(res, event_builder) + } +} + +#[async_trait::async_trait] +impl webhooks::IncomingWebhook for Imerchantsolutions { + fn get_webhook_object_reference_id( + &self, + _request: &webhooks::IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { + Err(report!(errors::ConnectorError::WebhooksNotImplemented)) + } + + fn get_webhook_event_type( + &self, + _request: &webhooks::IncomingWebhookRequestDetails<'_>, + _context: Option<&webhooks::WebhookContext>, + ) -> CustomResult { + Err(report!(errors::ConnectorError::WebhooksNotImplemented)) + } + + fn get_webhook_resource_object( + &self, + _request: &webhooks::IncomingWebhookRequestDetails<'_>, + ) -> CustomResult, errors::ConnectorError> + { + Err(report!(errors::ConnectorError::WebhooksNotImplemented)) + } +} + +static IMERCHANTSOLUTIONS_SUPPORTED_PAYMENT_METHODS: LazyLock = + LazyLock::new(|| { + let supported_capture_methods = vec![ + enums::CaptureMethod::Automatic, + enums::CaptureMethod::Manual, + enums::CaptureMethod::ManualMultiple, + ]; + + let supported_card_networks = vec![ + common_enums::CardNetwork::Mastercard, + common_enums::CardNetwork::Visa, + common_enums::CardNetwork::AmericanExpress, + common_enums::CardNetwork::JCB, + common_enums::CardNetwork::Discover, + common_enums::CardNetwork::UnionPay, + ]; + + let mut imerchant_supported_payment_methods = SupportedPaymentMethods::new(); + + imerchant_supported_payment_methods.add( + enums::PaymentMethod::Card, + enums::PaymentMethodType::Credit, + PaymentMethodDetails { + mandates: enums::FeatureStatus::NotSupported, + refunds: enums::FeatureStatus::Supported, + supported_capture_methods: supported_capture_methods.clone(), + specific_features: Some( + api_models::feature_matrix::PaymentMethodSpecificFeatures::Card({ + api_models::feature_matrix::CardSpecificFeatures { + three_ds: common_enums::FeatureStatus::NotSupported, + no_three_ds: common_enums::FeatureStatus::Supported, + supported_card_networks: supported_card_networks.clone(), + } + }), + ), + }, + ); + + imerchant_supported_payment_methods.add( + enums::PaymentMethod::Card, + enums::PaymentMethodType::Debit, + PaymentMethodDetails { + mandates: enums::FeatureStatus::NotSupported, + refunds: enums::FeatureStatus::Supported, + supported_capture_methods, + specific_features: Some( + api_models::feature_matrix::PaymentMethodSpecificFeatures::Card({ + api_models::feature_matrix::CardSpecificFeatures { + three_ds: common_enums::FeatureStatus::NotSupported, + no_three_ds: common_enums::FeatureStatus::Supported, + supported_card_networks, + } + }), + ), + }, + ); + + imerchant_supported_payment_methods + }); + +static IMERCHANTSOLUTIONS_CONNECTOR_INFO: ConnectorInfo = ConnectorInfo { + display_name: "iMerchant Solutions", + description: "iMerchant Solutions is a modern payment processing platform that empowers businesses to accept payments globally with fast and low-friction onboarding.", + connector_type: enums::HyperswitchConnectorCategory::PaymentGateway, + integration_status: enums::ConnectorIntegrationStatus::Alpha, +}; + +static IMERCHANTSOLUTIONS_SUPPORTED_WEBHOOK_FLOWS: [enums::EventClass; 0] = []; + +impl ConnectorSpecifications for Imerchantsolutions { + fn get_connector_about(&self) -> Option<&'static ConnectorInfo> { + Some(&IMERCHANTSOLUTIONS_CONNECTOR_INFO) + } + + fn get_supported_payment_methods(&self) -> Option<&'static SupportedPaymentMethods> { + Some(&*IMERCHANTSOLUTIONS_SUPPORTED_PAYMENT_METHODS) + } + + fn get_supported_webhook_flows(&self) -> Option<&'static [enums::EventClass]> { + Some(&IMERCHANTSOLUTIONS_SUPPORTED_WEBHOOK_FLOWS) + } +} diff --git a/crates/hyperswitch_connectors/src/connectors/imerchantsolutions/transformers.rs b/crates/hyperswitch_connectors/src/connectors/imerchantsolutions/transformers.rs new file mode 100644 index 00000000000..1e02afa97c6 --- /dev/null +++ b/crates/hyperswitch_connectors/src/connectors/imerchantsolutions/transformers.rs @@ -0,0 +1,227 @@ +use common_enums::enums; +use common_utils::types::MinorUnit; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{ConnectorAuthType, RouterData}, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::ResponseId, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{PaymentsAuthorizeRouterData, RefundsRouterData}, +}; +use hyperswitch_interfaces::errors; +use hyperswitch_masking::Secret; +use serde::{Deserialize, Serialize}; + +use crate::types::{RefundsResponseRouterData, ResponseRouterData}; + +//TODO: Fill the struct with respective fields +pub struct ImerchantsolutionsRouterData { + pub amount: MinorUnit, // The type of amount that a connector accepts, for example, String, i64, f64, etc. + pub router_data: T, +} + +impl From<(MinorUnit, T)> for ImerchantsolutionsRouterData { + fn from((amount, item): (MinorUnit, T)) -> Self { + //Todo : use utils to convert the amount to the type of amount that a connector accepts + Self { + amount, + router_data: item, + } + } +} + +//TODO: Fill the struct with respective fields +#[derive(Default, Debug, Serialize, PartialEq)] +pub struct ImerchantsolutionsPaymentsRequest { + amount: MinorUnit, + card: ImerchantsolutionsCard, +} + +#[derive(Default, Debug, Serialize, Eq, PartialEq)] +pub struct ImerchantsolutionsCard { + number: cards::CardNumber, + expiry_month: Secret, + expiry_year: Secret, + cvc: Secret, + complete: bool, +} + +impl TryFrom<&ImerchantsolutionsRouterData<&PaymentsAuthorizeRouterData>> + for ImerchantsolutionsPaymentsRequest +{ + type Error = error_stack::Report; + fn try_from( + item: &ImerchantsolutionsRouterData<&PaymentsAuthorizeRouterData>, + ) -> Result { + match item.router_data.request.payment_method_data.clone() { + PaymentMethodData::Card(_) => Err(errors::ConnectorError::NotImplemented( + "Card payment method not implemented".to_string(), + ) + .into()), + _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), + } + } +} + +//TODO: Fill the struct with respective fields +// Auth Struct +pub struct ImerchantsolutionsAuthType { + pub(super) api_key: Secret, +} + +impl TryFrom<&ConnectorAuthType> for ImerchantsolutionsAuthType { + type Error = error_stack::Report; + fn try_from(auth_type: &ConnectorAuthType) -> Result { + match auth_type { + ConnectorAuthType::HeaderKey { api_key } => Ok(Self { + api_key: api_key.to_owned(), + }), + _ => Err(errors::ConnectorError::FailedToObtainAuthType.into()), + } + } +} +// PaymentsResponse +//TODO: Append the remaining status flags +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "lowercase")] +pub enum ImerchantsolutionsPaymentStatus { + Succeeded, + Failed, + #[default] + Processing, +} + +impl From for common_enums::AttemptStatus { + fn from(item: ImerchantsolutionsPaymentStatus) -> Self { + match item { + ImerchantsolutionsPaymentStatus::Succeeded => Self::Charged, + ImerchantsolutionsPaymentStatus::Failed => Self::Failure, + ImerchantsolutionsPaymentStatus::Processing => Self::Authorizing, + } + } +} + +//TODO: Fill the struct with respective fields +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct ImerchantsolutionsPaymentsResponse { + status: ImerchantsolutionsPaymentStatus, + id: String, +} + +impl + TryFrom> + for RouterData +{ + type Error = error_stack::Report; + fn try_from( + item: ResponseRouterData, + ) -> Result { + Ok(Self { + status: common_enums::AttemptStatus::from(item.response.status), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.id), + redirection_data: Box::new(None), + mandate_reference: Box::new(None), + connector_metadata: None, + network_txn_id: None, + connector_response_reference_id: None, + incremental_authorization_allowed: None, + authentication_data: None, + charges: None, + }), + ..item.data + }) + } +} + +//TODO: Fill the struct with respective fields +// REFUND : +// Type definition for RefundRequest +#[derive(Default, Debug, Serialize)] +pub struct ImerchantsolutionsRefundRequest { + pub amount: MinorUnit, +} + +impl TryFrom<&ImerchantsolutionsRouterData<&RefundsRouterData>> + for ImerchantsolutionsRefundRequest +{ + type Error = error_stack::Report; + fn try_from( + item: &ImerchantsolutionsRouterData<&RefundsRouterData>, + ) -> Result { + Ok(Self { + amount: item.amount.to_owned(), + }) + } +} + +// Type definition for Refund Response + +#[allow(dead_code)] +#[derive(Debug, Copy, Serialize, Default, Deserialize, Clone)] +pub enum RefundStatus { + Succeeded, + Failed, + #[default] + Processing, +} + +impl From for enums::RefundStatus { + fn from(item: RefundStatus) -> Self { + match item { + RefundStatus::Succeeded => Self::Success, + RefundStatus::Failed => Self::Failure, + RefundStatus::Processing => Self::Pending, + //TODO: Review mapping + } + } +} + +//TODO: Fill the struct with respective fields +#[derive(Default, Debug, Clone, Serialize, Deserialize)] +pub struct RefundResponse { + id: String, + status: RefundStatus, +} + +impl TryFrom> for RefundsRouterData { + type Error = error_stack::Report; + fn try_from( + item: RefundsResponseRouterData, + ) -> Result { + Ok(Self { + response: Ok(RefundsResponseData { + connector_refund_id: item.response.id.to_string(), + refund_status: enums::RefundStatus::from(item.response.status), + }), + ..item.data + }) + } +} + +impl TryFrom> for RefundsRouterData { + type Error = error_stack::Report; + fn try_from( + item: RefundsResponseRouterData, + ) -> Result { + Ok(Self { + response: Ok(RefundsResponseData { + connector_refund_id: item.response.id.to_string(), + refund_status: enums::RefundStatus::from(item.response.status), + }), + ..item.data + }) + } +} + +//TODO: Fill the struct with respective fields +#[derive(Default, Debug, Serialize, Deserialize, PartialEq)] +pub struct ImerchantsolutionsErrorResponse { + pub status_code: u16, + pub code: String, + pub message: String, + pub reason: Option, + pub network_advice_code: Option, + pub network_decline_code: Option, + pub network_error_message: Option, +} diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs index 073718503d4..e21b5527bab 100644 --- a/crates/hyperswitch_connectors/src/default_implementations.rs +++ b/crates/hyperswitch_connectors/src/default_implementations.rs @@ -243,6 +243,7 @@ default_imp_for_authorize_session_token!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -400,6 +401,7 @@ default_imp_for_payment_settlement_split_create!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -559,6 +561,7 @@ default_imp_for_calculate_tax!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -710,6 +713,7 @@ default_imp_for_session_update!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -869,6 +873,7 @@ default_imp_for_post_session_tokens!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1025,6 +1030,7 @@ default_imp_for_create_order!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1181,6 +1187,7 @@ default_imp_for_update_metadata!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1349,6 +1356,7 @@ default_imp_for_cancel_post_capture!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1509,6 +1517,7 @@ default_imp_for_complete_authorize!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1652,6 +1661,7 @@ default_imp_for_incremental_authorization!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1797,6 +1807,7 @@ default_imp_for_extend_authorization!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1959,6 +1970,7 @@ default_imp_for_create_customer!( connectors::Helcim, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2111,6 +2123,7 @@ default_imp_for_connector_redirect_response!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2253,6 +2266,7 @@ default_imp_for_pre_authenticate_steps!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2406,6 +2420,7 @@ default_imp_for_authenticate_steps!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2563,6 +2578,7 @@ default_imp_for_post_authenticate_steps!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2721,6 +2737,7 @@ default_imp_for_pre_processing_steps!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2867,6 +2884,7 @@ default_imp_for_post_processing_steps!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3027,6 +3045,7 @@ default_imp_for_approve!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3188,6 +3207,7 @@ default_imp_for_reject!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3351,6 +3371,7 @@ default_imp_for_webhook_source_verification!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3507,6 +3528,7 @@ default_imp_for_accept_dispute!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3665,6 +3687,7 @@ default_imp_for_submit_evidence!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3821,6 +3844,7 @@ default_imp_for_defend_dispute!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3982,6 +4006,7 @@ default_imp_for_fetch_disputes!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4142,6 +4167,7 @@ default_imp_for_dispute_sync!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4310,6 +4336,7 @@ default_imp_for_file_upload!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4458,6 +4485,7 @@ default_imp_for_payouts!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4604,6 +4632,7 @@ default_imp_for_payouts_create!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4762,6 +4791,7 @@ default_imp_for_payouts_retrieve!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4916,6 +4946,7 @@ default_imp_for_payouts_eligibility!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5073,6 +5104,7 @@ default_imp_for_payouts_fulfill!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5222,6 +5254,7 @@ default_imp_for_payouts_cancel!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5379,6 +5412,7 @@ default_imp_for_payouts_quote!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5539,6 +5573,7 @@ default_imp_for_payouts_recipient!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5698,6 +5733,7 @@ default_imp_for_payouts_recipient_account!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5859,6 +5895,7 @@ default_imp_for_frm_sale!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6019,6 +6056,7 @@ default_imp_for_frm_checkout!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6179,6 +6217,7 @@ default_imp_for_frm_transaction!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6340,6 +6379,7 @@ default_imp_for_frm_fulfillment!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6501,6 +6541,7 @@ default_imp_for_frm_record_return!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6657,6 +6698,7 @@ default_imp_for_revoking_mandates!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6816,6 +6858,7 @@ default_imp_for_uas_pre_authentication!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -6974,6 +7017,7 @@ default_imp_for_uas_webhook!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -7132,6 +7176,7 @@ default_imp_for_uas_post_authentication!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -7291,6 +7336,7 @@ default_imp_for_uas_authentication_confirmation!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -7441,6 +7487,7 @@ default_imp_for_connector_request_id!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -7594,6 +7641,7 @@ default_imp_for_fraud_check!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -7776,6 +7824,7 @@ default_imp_for_connector_authentication!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -7933,6 +7982,7 @@ default_imp_for_uas_authentication!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -8084,6 +8134,7 @@ default_imp_for_revenue_recovery!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -8295,6 +8346,7 @@ default_imp_for_subscriptions!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -8456,6 +8508,7 @@ default_imp_for_billing_connector_payment_sync!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -8609,6 +8662,7 @@ default_imp_for_revenue_recovery_record_back!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -8769,6 +8823,7 @@ default_imp_for_billing_connector_invoice_sync!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -8923,6 +8978,7 @@ default_imp_for_external_vault!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -9082,6 +9138,7 @@ default_imp_for_external_vault_insert!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -9238,6 +9295,7 @@ default_imp_for_gift_card_balance_check!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -9399,6 +9457,7 @@ default_imp_for_external_vault_retrieve!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -9558,6 +9617,7 @@ default_imp_for_external_vault_delete!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -9718,6 +9778,7 @@ default_imp_for_external_vault_create!( connectors::Hipay, connectors::Hyperpg, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -9879,6 +9940,7 @@ default_imp_for_connector_authentication_token!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Juspaythreedsserver, @@ -10037,6 +10099,7 @@ default_imp_for_external_vault_proxy_payments_create!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -10199,6 +10262,7 @@ default_imp_for_connector_webhook_register!( connectors::Hyperwallet, connectors::Hyperpg, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -11091,6 +11155,7 @@ default_imp_for_generate_qr_flow!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -11251,6 +11316,7 @@ default_imp_for_push_notification_flow!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, diff --git a/crates/hyperswitch_connectors/src/default_implementations_v2.rs b/crates/hyperswitch_connectors/src/default_implementations_v2.rs index 9a7139910c9..abb17629905 100644 --- a/crates/hyperswitch_connectors/src/default_implementations_v2.rs +++ b/crates/hyperswitch_connectors/src/default_implementations_v2.rs @@ -396,6 +396,7 @@ default_imp_for_new_connector_integration_payment!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -557,6 +558,7 @@ default_imp_for_new_connector_integration_refund!( connectors::Helcim, connectors::HyperswitchVault, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -711,6 +713,7 @@ default_imp_for_new_connector_integration_connector_authentication_token!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -862,6 +865,7 @@ default_imp_for_new_connector_integration_connector_access_token!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1023,6 +1027,7 @@ default_imp_for_new_connector_integration_accept_dispute!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1184,6 +1189,7 @@ default_imp_for_new_connector_integration_fetch_disputes!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1346,6 +1352,7 @@ default_imp_for_new_connector_integration_dispute_sync!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1508,6 +1515,7 @@ default_imp_for_new_connector_integration_defend_dispute!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1668,6 +1676,7 @@ default_imp_for_new_connector_integration_submit_evidence!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -1839,6 +1848,7 @@ default_imp_for_new_connector_integration_file_upload!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2002,6 +2012,7 @@ default_imp_for_new_connector_integration_payouts_create!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2165,6 +2176,7 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2328,6 +2340,7 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2491,6 +2504,7 @@ default_imp_for_new_connector_integration_payouts_cancel!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2654,6 +2668,7 @@ default_imp_for_new_connector_integration_payouts_quote!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2817,6 +2832,7 @@ default_imp_for_new_connector_integration_payouts_recipient!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -2980,6 +2996,7 @@ default_imp_for_new_connector_integration_payouts_sync!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3143,6 +3160,7 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3304,6 +3322,7 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3467,6 +3486,7 @@ default_imp_for_new_connector_integration_frm_sale!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3630,6 +3650,7 @@ default_imp_for_new_connector_integration_frm_checkout!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3793,6 +3814,7 @@ default_imp_for_new_connector_integration_frm_transaction!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -3956,6 +3978,7 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4119,6 +4142,7 @@ default_imp_for_new_connector_integration_frm_record_return!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4280,6 +4304,7 @@ default_imp_for_new_connector_integration_revoking_mandates!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -4372,6 +4397,7 @@ macro_rules! default_imp_for_new_connector_integration_frm { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm!( + connectors::Imerchantsolutions, connectors::Loonio, connectors::Gigadat, connectors::Affirm, @@ -4532,6 +4558,7 @@ macro_rules! default_imp_for_new_connector_integration_connector_authentication } default_imp_for_new_connector_integration_connector_authentication!( + connectors::Imerchantsolutions, connectors::Loonio, connectors::Gigadat, connectors::Affirm, @@ -4681,6 +4708,7 @@ macro_rules! default_imp_for_new_connector_integration_revenue_recovery { } default_imp_for_new_connector_integration_revenue_recovery!( + connectors::Imerchantsolutions, connectors::Loonio, connectors::Gigadat, connectors::Affirm, @@ -4901,6 +4929,7 @@ default_imp_for_new_connector_integration_external_vault!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5061,6 +5090,7 @@ default_imp_for_new_connector_integration_external_vault_proxy!( connectors::HyperswitchVault, connectors::Hyperwallet, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, @@ -5226,6 +5256,7 @@ default_imp_for_new_connector_integration_webhook_register!( connectors::Hyperwallet, connectors::Hyperpg, connectors::Iatapay, + connectors::Imerchantsolutions, connectors::Inespay, connectors::Itaubank, connectors::Jpmorgan, diff --git a/crates/hyperswitch_domain_models/src/connector_endpoints.rs b/crates/hyperswitch_domain_models/src/connector_endpoints.rs index 87e5eefe4cb..6ce2c9ad301 100644 --- a/crates/hyperswitch_domain_models/src/connector_endpoints.rs +++ b/crates/hyperswitch_domain_models/src/connector_endpoints.rs @@ -75,6 +75,7 @@ pub struct Connectors { pub hyperswitch_vault: ConnectorParams, pub hyperwallet: ConnectorParams, pub iatapay: ConnectorParams, + pub imerchantsolutions: ConnectorParams, pub inespay: ConnectorParams, pub itaubank: ConnectorParams, pub jpmorgan: ConnectorParams, diff --git a/crates/payment_methods/src/configs/payment_connector_required_fields.rs b/crates/payment_methods/src/configs/payment_connector_required_fields.rs index 85645905742..af715e2280d 100644 --- a/crates/payment_methods/src/configs/payment_connector_required_fields.rs +++ b/crates/payment_methods/src/configs/payment_connector_required_fields.rs @@ -1761,6 +1761,10 @@ fn get_cards_required_fields() -> HashMap { common: HashMap::new(), }, ), + ( + Connector::Imerchantsolutions, + fields(vec![], card_basic(), vec![]), + ), ]) } diff --git a/crates/router/src/connector.rs b/crates/router/src/connector.rs index fa804c7122d..b2dba4c0039 100644 --- a/crates/router/src/connector.rs +++ b/crates/router/src/connector.rs @@ -26,27 +26,28 @@ pub use hyperswitch_connectors::connectors::{ globepay::Globepay, gocardless, gocardless::Gocardless, gpayments, gpayments::Gpayments, helcim, helcim::Helcim, hipay, hipay::Hipay, hyperpg, hyperpg::Hyperpg, hyperswitch_vault, hyperswitch_vault::HyperswitchVault, hyperwallet, hyperwallet::Hyperwallet, iatapay, - iatapay::Iatapay, inespay, inespay::Inespay, itaubank, itaubank::Itaubank, jpmorgan, - jpmorgan::Jpmorgan, juspaythreedsserver, juspaythreedsserver::Juspaythreedsserver, katapult, - katapult::Katapult, klarna, klarna::Klarna, loonio, loonio::Loonio, mifinity, - mifinity::Mifinity, mollie, mollie::Mollie, moneris, moneris::Moneris, mpgs, mpgs::Mpgs, - multisafepay, multisafepay::Multisafepay, netcetera, netcetera::Netcetera, nexinets, - nexinets::Nexinets, nexixpay, nexixpay::Nexixpay, nmi, nmi::Nmi, nomupay, nomupay::Nomupay, - noon, noon::Noon, nordea, nordea::Nordea, novalnet, novalnet::Novalnet, nuvei, nuvei::Nuvei, - opayo, opayo::Opayo, opennode, opennode::Opennode, paybox, paybox::Paybox, payeezy, - payeezy::Payeezy, payjustnow, payjustnow::Payjustnow, payjustnowinstore, - payjustnowinstore::Payjustnowinstore, payload, payload::Payload, payme, payme::Payme, payone, - payone::Payone, paypal, paypal::Paypal, paysafe, paysafe::Paysafe, paystack, - paystack::Paystack, paytm, paytm::Paytm, payu, payu::Payu, peachpayments, - peachpayments::Peachpayments, phonepe, phonepe::Phonepe, placetopay, placetopay::Placetopay, - plaid, plaid::Plaid, powertranz, powertranz::Powertranz, prophetpay, prophetpay::Prophetpay, - rapyd, rapyd::Rapyd, razorpay, razorpay::Razorpay, recurly, recurly::Recurly, redsys, - redsys::Redsys, revolv3, revolv3::Revolv3, riskified, riskified::Riskified, santander, - santander::Santander, shift4, shift4::Shift4, sift, sift::Sift, signifyd, signifyd::Signifyd, - silverflow, silverflow::Silverflow, square, square::Square, stax, stax::Stax, stripe, - stripe::Stripe, stripebilling, stripebilling::Stripebilling, taxjar, taxjar::Taxjar, tesouro, - tesouro::Tesouro, threedsecureio, threedsecureio::Threedsecureio, thunes, thunes::Thunes, - tokenex, tokenex::Tokenex, tokenio, tokenio::Tokenio, truelayer, truelayer::Truelayer, trustly, + iatapay::Iatapay, imerchantsolutions, imerchantsolutions::Imerchantsolutions, inespay, + inespay::Inespay, itaubank, itaubank::Itaubank, jpmorgan, jpmorgan::Jpmorgan, + juspaythreedsserver, juspaythreedsserver::Juspaythreedsserver, katapult, katapult::Katapult, + klarna, klarna::Klarna, loonio, loonio::Loonio, mifinity, mifinity::Mifinity, mollie, + mollie::Mollie, moneris, moneris::Moneris, mpgs, mpgs::Mpgs, multisafepay, + multisafepay::Multisafepay, netcetera, netcetera::Netcetera, nexinets, nexinets::Nexinets, + nexixpay, nexixpay::Nexixpay, nmi, nmi::Nmi, nomupay, nomupay::Nomupay, noon, noon::Noon, + nordea, nordea::Nordea, novalnet, novalnet::Novalnet, nuvei, nuvei::Nuvei, opayo, opayo::Opayo, + opennode, opennode::Opennode, paybox, paybox::Paybox, payeezy, payeezy::Payeezy, payjustnow, + payjustnow::Payjustnow, payjustnowinstore, payjustnowinstore::Payjustnowinstore, payload, + payload::Payload, payme, payme::Payme, payone, payone::Payone, paypal, paypal::Paypal, paysafe, + paysafe::Paysafe, paystack, paystack::Paystack, paytm, paytm::Paytm, payu, payu::Payu, + peachpayments, peachpayments::Peachpayments, phonepe, phonepe::Phonepe, placetopay, + placetopay::Placetopay, plaid, plaid::Plaid, powertranz, powertranz::Powertranz, prophetpay, + prophetpay::Prophetpay, rapyd, rapyd::Rapyd, razorpay, razorpay::Razorpay, recurly, + recurly::Recurly, redsys, redsys::Redsys, revolv3, revolv3::Revolv3, riskified, + riskified::Riskified, santander, santander::Santander, shift4, shift4::Shift4, sift, + sift::Sift, signifyd, signifyd::Signifyd, silverflow, silverflow::Silverflow, square, + square::Square, stax, stax::Stax, stripe, stripe::Stripe, stripebilling, + stripebilling::Stripebilling, taxjar, taxjar::Taxjar, tesouro, tesouro::Tesouro, + threedsecureio, threedsecureio::Threedsecureio, thunes, thunes::Thunes, tokenex, + tokenex::Tokenex, tokenio, tokenio::Tokenio, truelayer, truelayer::Truelayer, trustly, trustly::Trustly, trustpay, trustpay::Trustpay, trustpayments, trustpayments::Trustpayments, tsys, tsys::Tsys, unified_authentication_service, unified_authentication_service::UnifiedAuthenticationService, vgs, vgs::Vgs, volt, volt::Volt, diff --git a/crates/router/src/core/connector_validation.rs b/crates/router/src/core/connector_validation.rs index 55f73763159..b30b6ac6ed2 100644 --- a/crates/router/src/core/connector_validation.rs +++ b/crates/router/src/core/connector_validation.rs @@ -324,6 +324,12 @@ impl ConnectorAuthTypeAndMetadataValidation<'_> { iatapay::transformers::IatapayAuthType::try_from(self.auth_type)?; Ok(()) } + api_enums::Connector::Imerchantsolutions => { + imerchantsolutions::transformers::ImerchantsolutionsAuthType::try_from( + self.auth_type, + )?; + Ok(()) + } api_enums::Connector::Inespay => { inespay::transformers::InespayAuthType::try_from(self.auth_type)?; Ok(()) diff --git a/crates/router/src/core/unified_connector_service/connector_config.rs b/crates/router/src/core/unified_connector_service/connector_config.rs index 2882b339d9e..969bf4c3c14 100644 --- a/crates/router/src/core/unified_connector_service/connector_config.rs +++ b/crates/router/src/core/unified_connector_service/connector_config.rs @@ -514,6 +514,8 @@ pub enum ConnectorSpecificConfig { client_id: Secret, client_secret: Secret, }, + /// Imerchantsolutions connector configuration + Imerchantsolutions { api_key: Secret }, } impl ForeignTryFrom<(Connector, &ConnectorAuthType, Option<&serde_json::Value>)> @@ -1399,6 +1401,14 @@ impl ForeignTryFrom<(Connector, &ConnectorAuthType, Option<&serde_json::Value>)> }), _ => Err(err("Itaubank requires BodyKey auth type")), }, + + Connector::Imerchantsolutions => match auth { + ConnectorAuthType::HeaderKey { api_key } => Ok(Self::Imerchantsolutions { + api_key: api_key.clone(), + }), + _ => Err(err("Imerchantsolutions requires HeaderKey auth type")), + }, + // --- Unsupported connectors --- _ => Err( error_stack::report!(errors::ApiErrorResponse::InternalServerError) diff --git a/crates/router/src/types/api/connector_mapping.rs b/crates/router/src/types/api/connector_mapping.rs index cdf96668ca3..ea0a258ffe5 100644 --- a/crates/router/src/types/api/connector_mapping.rs +++ b/crates/router/src/types/api/connector_mapping.rs @@ -307,6 +307,9 @@ impl ConnectorData { enums::Connector::Iatapay => { Ok(ConnectorEnum::Old(Box::new(connector::Iatapay::new()))) } + enums::Connector::Imerchantsolutions => Ok(ConnectorEnum::Old(Box::new( + connector::Imerchantsolutions::new(), + ))), enums::Connector::Inespay => { Ok(ConnectorEnum::Old(Box::new(connector::Inespay::new()))) } diff --git a/crates/router/src/types/api/feature_matrix.rs b/crates/router/src/types/api/feature_matrix.rs index 44289616c74..07645b52053 100644 --- a/crates/router/src/types/api/feature_matrix.rs +++ b/crates/router/src/types/api/feature_matrix.rs @@ -221,6 +221,9 @@ impl FeatureMatrixConnectorData { enums::Connector::Iatapay => { Ok(ConnectorEnum::Old(Box::new(connector::Iatapay::new()))) } + enums::Connector::Imerchantsolutions => Ok(ConnectorEnum::Old(Box::new( + connector::Imerchantsolutions::new(), + ))), enums::Connector::Inespay => { Ok(ConnectorEnum::Old(Box::new(connector::Inespay::new()))) } diff --git a/crates/router/src/types/connector_transformers.rs b/crates/router/src/types/connector_transformers.rs index 68d9834254d..f15da18e462 100644 --- a/crates/router/src/types/connector_transformers.rs +++ b/crates/router/src/types/connector_transformers.rs @@ -88,6 +88,7 @@ impl ForeignTryFrom for euclid::enums::RoutableConnectors })? } api_enums::Connector::Iatapay => Self::Iatapay, + api_enums::Connector::Imerchantsolutions => Self::Imerchantsolutions, api_enums::Connector::Inespay => Self::Inespay, api_enums::Connector::Itaubank => Self::Itaubank, api_enums::Connector::Jpmorgan => Self::Jpmorgan, diff --git a/crates/router/tests/connectors/imerchantsolutions.rs b/crates/router/tests/connectors/imerchantsolutions.rs new file mode 100644 index 00000000000..cf68de995d6 --- /dev/null +++ b/crates/router/tests/connectors/imerchantsolutions.rs @@ -0,0 +1,421 @@ +use hyperswitch_domain_models::payment_method_data::{Card, PaymentMethodData}; +use hyperswitch_masking::Secret; +use router::types::{self, api, storage::enums}; +use test_utils::connector_auth; + +use crate::utils::{self, ConnectorActions}; + +#[derive(Clone, Copy)] +struct ImerchantsolutionsTest; +impl ConnectorActions for ImerchantsolutionsTest {} +impl utils::Connector for ImerchantsolutionsTest { + fn get_data(&self) -> api::ConnectorData { + use router::connector::Imerchantsolutions; + utils::construct_connector_data_old( + Box::new(Imerchantsolutions::new()), + types::Connector::Imerchantsolutions, + api::GetToken::Connector, + None, + ) + } + + fn get_auth_token(&self) -> types::ConnectorAuthType { + utils::to_connector_auth_type( + connector_auth::ConnectorAuthentication::new() + .imerchantsolutions + .expect("Missing connector authentication configuration") + .into(), + ) + } + + fn get_name(&self) -> String { + "imerchantsolutions".to_string() + } +} + +static CONNECTOR: ImerchantsolutionsTest = ImerchantsolutionsTest {}; + +fn get_default_payment_info() -> Option { + None +} + +fn payment_method_details() -> Option { + None +} + +// Cards Positive Tests +// Creates a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_only_authorize_payment() { + let response = CONNECTOR + .authorize_payment(payment_method_details(), get_default_payment_info()) + .await + .expect("Authorize payment response"); + assert_eq!(response.status, enums::AttemptStatus::Authorized); +} + +// Captures a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_capture_authorized_payment() { + let response = CONNECTOR + .authorize_and_capture_payment(payment_method_details(), None, get_default_payment_info()) + .await + .expect("Capture payment response"); + assert_eq!(response.status, enums::AttemptStatus::Charged); +} + +// Partially captures a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_partially_capture_authorized_payment() { + let response = CONNECTOR + .authorize_and_capture_payment( + payment_method_details(), + Some(types::PaymentsCaptureData { + amount_to_capture: 50, + ..utils::PaymentCaptureType::default().0 + }), + get_default_payment_info(), + ) + .await + .expect("Capture payment response"); + assert_eq!(response.status, enums::AttemptStatus::Charged); +} + +// Synchronizes a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_sync_authorized_payment() { + let authorize_response = CONNECTOR + .authorize_payment(payment_method_details(), get_default_payment_info()) + .await + .expect("Authorize payment response"); + let txn_id = utils::get_connector_transaction_id(authorize_response.response); + let response = CONNECTOR + .psync_retry_till_status_matches( + enums::AttemptStatus::Authorized, + Some(types::PaymentsSyncData { + connector_transaction_id: types::ResponseId::ConnectorTransactionId( + txn_id.unwrap(), + ), + ..Default::default() + }), + get_default_payment_info(), + ) + .await + .expect("PSync response"); + assert_eq!(response.status, enums::AttemptStatus::Authorized,); +} + +// Voids a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_void_authorized_payment() { + let response = CONNECTOR + .authorize_and_void_payment( + payment_method_details(), + Some(types::PaymentsCancelData { + connector_transaction_id: String::from(""), + cancellation_reason: Some("requested_by_customer".to_string()), + ..Default::default() + }), + get_default_payment_info(), + ) + .await + .expect("Void payment response"); + assert_eq!(response.status, enums::AttemptStatus::Voided); +} + +// Refunds a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_refund_manually_captured_payment() { + let response = CONNECTOR + .capture_payment_and_refund( + payment_method_details(), + None, + None, + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap().refund_status, + enums::RefundStatus::Success, + ); +} + +// Partially refunds a payment using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_partially_refund_manually_captured_payment() { + let response = CONNECTOR + .capture_payment_and_refund( + payment_method_details(), + None, + Some(types::RefundsData { + refund_amount: 50, + ..utils::PaymentRefundType::default().0 + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap().refund_status, + enums::RefundStatus::Success, + ); +} + +// Synchronizes a refund using the manual capture flow (Non 3DS). +#[actix_web::test] +async fn should_sync_manually_captured_refund() { + let refund_response = CONNECTOR + .capture_payment_and_refund( + payment_method_details(), + None, + None, + get_default_payment_info(), + ) + .await + .unwrap(); + let response = CONNECTOR + .rsync_retry_till_status_matches( + enums::RefundStatus::Success, + refund_response.response.unwrap().connector_refund_id, + None, + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap().refund_status, + enums::RefundStatus::Success, + ); +} + +// Creates a payment using the automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_make_payment() { + let authorize_response = CONNECTOR + .make_payment(payment_method_details(), get_default_payment_info()) + .await + .unwrap(); + assert_eq!(authorize_response.status, enums::AttemptStatus::Charged); +} + +// Synchronizes a payment using the automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_sync_auto_captured_payment() { + let authorize_response = CONNECTOR + .make_payment(payment_method_details(), get_default_payment_info()) + .await + .unwrap(); + assert_eq!(authorize_response.status, enums::AttemptStatus::Charged); + let txn_id = utils::get_connector_transaction_id(authorize_response.response); + assert_ne!(txn_id, None, "Empty connector transaction id"); + let response = CONNECTOR + .psync_retry_till_status_matches( + enums::AttemptStatus::Charged, + Some(types::PaymentsSyncData { + connector_transaction_id: types::ResponseId::ConnectorTransactionId( + txn_id.unwrap(), + ), + capture_method: Some(enums::CaptureMethod::Automatic), + ..Default::default() + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!(response.status, enums::AttemptStatus::Charged,); +} + +// Refunds a payment using the automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_refund_auto_captured_payment() { + let response = CONNECTOR + .make_payment_and_refund(payment_method_details(), None, get_default_payment_info()) + .await + .unwrap(); + assert_eq!( + response.response.unwrap().refund_status, + enums::RefundStatus::Success, + ); +} + +// Partially refunds a payment using the automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_partially_refund_succeeded_payment() { + let refund_response = CONNECTOR + .make_payment_and_refund( + payment_method_details(), + Some(types::RefundsData { + refund_amount: 50, + ..utils::PaymentRefundType::default().0 + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + refund_response.response.unwrap().refund_status, + enums::RefundStatus::Success, + ); +} + +// Creates multiple refunds against a payment using the automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_refund_succeeded_payment_multiple_times() { + CONNECTOR + .make_payment_and_multiple_refund( + payment_method_details(), + Some(types::RefundsData { + refund_amount: 50, + ..utils::PaymentRefundType::default().0 + }), + get_default_payment_info(), + ) + .await; +} + +// Synchronizes a refund using the automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_sync_refund() { + let refund_response = CONNECTOR + .make_payment_and_refund(payment_method_details(), None, get_default_payment_info()) + .await + .unwrap(); + let response = CONNECTOR + .rsync_retry_till_status_matches( + enums::RefundStatus::Success, + refund_response.response.unwrap().connector_refund_id, + None, + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap().refund_status, + enums::RefundStatus::Success, + ); +} + +// Cards Negative scenarios +// Creates a payment with incorrect CVC. +#[actix_web::test] +async fn should_fail_payment_for_incorrect_cvc() { + let response = CONNECTOR + .make_payment( + Some(types::PaymentsAuthorizeData { + payment_method_data: PaymentMethodData::Card(Card { + card_cvc: Secret::new("12345".to_string()), + ..utils::CCardType::default().0 + }), + ..utils::PaymentAuthorizeType::default().0 + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap_err().message, + "Your card's security code is invalid.".to_string(), + ); +} + +// Creates a payment with incorrect expiry month. +#[actix_web::test] +async fn should_fail_payment_for_invalid_exp_month() { + let response = CONNECTOR + .make_payment( + Some(types::PaymentsAuthorizeData { + payment_method_data: PaymentMethodData::Card(Card { + card_exp_month: Secret::new("20".to_string()), + ..utils::CCardType::default().0 + }), + ..utils::PaymentAuthorizeType::default().0 + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap_err().message, + "Your card's expiration month is invalid.".to_string(), + ); +} + +// Creates a payment with incorrect expiry year. +#[actix_web::test] +async fn should_fail_payment_for_incorrect_expiry_year() { + let response = CONNECTOR + .make_payment( + Some(types::PaymentsAuthorizeData { + payment_method_data: PaymentMethodData::Card(Card { + card_exp_year: Secret::new("2000".to_string()), + ..utils::CCardType::default().0 + }), + ..utils::PaymentAuthorizeType::default().0 + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap_err().message, + "Your card's expiration year is invalid.".to_string(), + ); +} + +// Voids a payment using automatic capture flow (Non 3DS). +#[actix_web::test] +async fn should_fail_void_payment_for_auto_capture() { + let authorize_response = CONNECTOR + .make_payment(payment_method_details(), get_default_payment_info()) + .await + .unwrap(); + assert_eq!(authorize_response.status, enums::AttemptStatus::Charged); + let txn_id = utils::get_connector_transaction_id(authorize_response.response); + assert_ne!(txn_id, None, "Empty connector transaction id"); + let void_response = CONNECTOR + .void_payment(txn_id.unwrap(), None, get_default_payment_info()) + .await + .unwrap(); + assert_eq!( + void_response.response.unwrap_err().message, + "You cannot cancel this PaymentIntent because it has a status of succeeded." + ); +} + +// Captures a payment using invalid connector payment id. +#[actix_web::test] +async fn should_fail_capture_for_invalid_payment() { + let capture_response = CONNECTOR + .capture_payment("123456789".to_string(), None, get_default_payment_info()) + .await + .unwrap(); + assert_eq!( + capture_response.response.unwrap_err().message, + String::from("No such payment_intent: '123456789'") + ); +} + +// Refunds a payment with refund amount higher than payment amount. +#[actix_web::test] +async fn should_fail_for_refund_amount_higher_than_payment_amount() { + let response = CONNECTOR + .make_payment_and_refund( + payment_method_details(), + Some(types::RefundsData { + refund_amount: 150, + ..utils::PaymentRefundType::default().0 + }), + get_default_payment_info(), + ) + .await + .unwrap(); + assert_eq!( + response.response.unwrap_err().message, + "Refund amount (₹1.50) is greater than charge amount (₹1.00)", + ); +} + +// Connector dependent test cases goes here + +// [#478]: add unit tests for non 3DS, wallets & webhooks in connector tests diff --git a/crates/router/tests/connectors/main.rs b/crates/router/tests/connectors/main.rs index 72f6b641fe0..6688ea50c38 100644 --- a/crates/router/tests/connectors/main.rs +++ b/crates/router/tests/connectors/main.rs @@ -64,6 +64,7 @@ mod hyperpg; mod hyperswitch_vault; mod hyperwallet; mod iatapay; +mod imerchantsolutions; mod inespay; mod itaubank; mod jpmorgan; diff --git a/crates/router/tests/connectors/sample_auth.toml b/crates/router/tests/connectors/sample_auth.toml index 470d3774e2d..323d7c0c31a 100644 --- a/crates/router/tests/connectors/sample_auth.toml +++ b/crates/router/tests/connectors/sample_auth.toml @@ -390,4 +390,7 @@ key1 = "Merchant Terminal Id" [truelayer] api_key = "Client ID" -key1 = "Client Secret" \ No newline at end of file +key1 = "Client Secret" + +[imerchantsolutions] +api_key = "API Key" \ No newline at end of file diff --git a/crates/test_utils/src/connector_auth.rs b/crates/test_utils/src/connector_auth.rs index 57580007a2c..1ea1cec6b4d 100644 --- a/crates/test_utils/src/connector_auth.rs +++ b/crates/test_utils/src/connector_auth.rs @@ -74,6 +74,7 @@ pub struct ConnectorAuthentication { pub hyperswitch_vault: Option, pub hyperwallet: Option, pub iatapay: Option, + pub imerchantsolutions: Option, pub inespay: Option, pub itaubank: Option, pub jpmorgan: Option, diff --git a/crates/test_utils/tests/sample_auth.toml b/crates/test_utils/tests/sample_auth.toml index b4dc017424a..c2ab67fe932 100644 --- a/crates/test_utils/tests/sample_auth.toml +++ b/crates/test_utils/tests/sample_auth.toml @@ -180,4 +180,7 @@ key1 = "Merchant Terminal Id" [truelayer] api_key="Client ID" -key1="Client Secret" \ No newline at end of file +key1="Client Secret" + +[imerchantsolutions] +api_key = "API Key" \ No newline at end of file diff --git a/loadtest/config/development.toml b/loadtest/config/development.toml index b830c84b7e9..58c5bf4d847 100644 --- a/loadtest/config/development.toml +++ b/loadtest/config/development.toml @@ -155,6 +155,7 @@ hyperwallet.base_url = "https://uat-api.paylution.com" hipay.secondary_base_url = "https://stage-secure2-vault.hipay-tpp.com/rest/" hipay.third_base_url = "https://stage-api-gateway.hipay.com/" iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" +imerchantsolutions.base_url = "https://imerchantsolutions.com/api" inespay.base_url = "https://apiflow.inespay.com/san/v21" itaubank.base_url = "https://sandbox.devportal.itau.com.br/" jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2" diff --git a/scripts/add_connector.sh b/scripts/add_connector.sh index 957650cb7ed..3312323f7c9 100755 --- a/scripts/add_connector.sh +++ b/scripts/add_connector.sh @@ -6,7 +6,7 @@ function find_prev_connector() { git checkout $self cp $self $self.tmp # Add new connector to existing list and sort it - connectors=(aci adyen adyenplatform affirm airwallex amazonpay applepay archipel authipay authorizedotnet bambora bamboraapac bankofamerica barclaycard billwerk bitpay blackhawknetwork bluesnap boku braintree breadpay calida cashtocode celero chargebee checkbook checkout coinbase cryptopay ctp_visa custombilling cybersource cybersourcedecisionmanager datatrans deutschebank digitalvirgo dlocal dummyconnector dwolla ebanx elavon envoy facilitapay finix fiserv fiservcommercehub fiservemea fiuu flexiti forte getnet gigadat globalpay globepay gocardless gpayments helcim hipay hyperpg hyperswitch_vault hyperwallet hyperwallet iatapay inespay itaubank jpmorgan juspaythreedsserver katapult klarna loonio mifinity mollie moneris mpgs multisafepay netcetera nexinets nexixpay nomupay noon nordea novalnet nuvei opayo opennode paybox payeezy payjustnow payjustnowinstore payload payme payone paypal paysafe paystack paytm payu peachpayments phonepe placetopay plaid powertranz prophetpay rapyd razorpay recurly redsys revolv3 santander shift4 sift silverflow square stax stripe stripebilling taxjar tesouro threedsecureio thunes tokenex tokenio truelayer trustly trustpay trustpayments tsys unified_authentication_service vgs volt wellsfargo wellsfargopayout wise worldline worldpay worldpaymodular worldpayvantiv worldpayxml xendit zift zsl "$1") + connectors=(aci adyen adyenplatform affirm airwallex amazonpay applepay archipel authipay authorizedotnet bambora bamboraapac bankofamerica barclaycard billwerk bitpay blackhawknetwork bluesnap boku braintree breadpay calida cashtocode celero chargebee checkbook checkout coinbase cryptopay ctp_visa custombilling cybersource cybersourcedecisionmanager datatrans deutschebank digitalvirgo dlocal dummyconnector dwolla ebanx elavon envoy facilitapay finix fiserv fiservcommercehub fiservemea fiuu flexiti forte getnet gigadat globalpay globepay gocardless gpayments helcim hipay hyperpg hyperswitch_vault hyperwallet hyperwallet iatapay imerchantsolutions inespay itaubank jpmorgan juspaythreedsserver katapult klarna loonio mifinity mollie moneris mpgs multisafepay netcetera nexinets nexixpay nomupay noon nordea novalnet nuvei opayo opennode paybox payeezy payjustnow payjustnowinstore payload payme payone paypal paysafe paystack paytm payu peachpayments phonepe placetopay plaid powertranz prophetpay rapyd razorpay recurly redsys revolv3 santander shift4 sift silverflow square stax stripe stripebilling taxjar tesouro threedsecureio thunes tokenex tokenio truelayer trustly trustpay trustpayments tsys unified_authentication_service vgs volt wellsfargo wellsfargopayout wise worldline worldpay worldpaymodular worldpayvantiv worldpayxml xendit zift zsl "$1") IFS=$'\n' sorted=($(sort <<<"${connectors[*]}")); unset IFS