diff --git a/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs b/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs index 2b58156d6f7..9e7768c1cb0 100644 --- a/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs +++ b/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs @@ -27,14 +27,9 @@ use hyperswitch_interfaces::{ api::{ self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorValidation, - }, - configs::Connectors, - errors, - events::connector_api_logs::ConnectorEvent, - types::{self, RefreshTokenType, Response}, - webhooks, + }, configs::Connectors, consts, errors, events::connector_api_logs::ConnectorEvent, types::{self, RefreshTokenType, Response}, webhooks }; -use transformers as jpmorgan; +use transformers::{self as jpmorgan, JpmorganErrorResponse}; use crate::{ constants::headers, types::{ResponseRouterData, RefreshTokenRouterData}, utils @@ -130,25 +125,26 @@ impl ConnectorCommon for Jpmorgan { } fn build_error_response( - &self, - res: Response, - event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { - let response: jpmorgan::JpmorganErrorResponse = res - .response - .parse_struct("JpmorganErrorResponse") - .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + let response : JpmorganErrorResponse = res.response.parse_struct("JpmorganErrorResponse"). + 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, - }) + router_env::logger::info!(connector_response=?response); + event_builder.map(|i| i.set_response_body(&response)); + + let response_message = response.response_message.as_ref().map_or_else(|| consts::NO_ERROR_MESSAGE.to_string(), ToString::to_string); + + Ok(ErrorResponse{ + status_code : res.status_code, + code : response.response_code, + message : response_message.clone(), + reason : Some(response_message), + attempt_status : None, + connector_transaction_id : None, + }) } } @@ -162,9 +158,13 @@ impl ConnectorValidation for Jpmorgan { let capture_method = capture_method.unwrap_or_default(); match capture_method { enums::CaptureMethod::Automatic | enums::CaptureMethod::Manual => Ok(()), - enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( + //enums::CaptureMethod::ManualMultiple | + enums::CaptureMethod::Scheduled => Err( utils::construct_not_implemented_error_report(capture_method, self.id()), ), + enums::CaptureMethod::ManualMultiple => Err(errors::ConnectorError::NotImplemented( //ManualMultiple unimplemented + utils::get_unimplemented_payment_method_error_message("Jpmorgan"), + ))?, } } diff --git a/crates/hyperswitch_connectors/src/connectors/jpmorgan/transformers.rs b/crates/hyperswitch_connectors/src/connectors/jpmorgan/transformers.rs index 8602e532d78..7f3f53af20a 100644 --- a/crates/hyperswitch_connectors/src/connectors/jpmorgan/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/jpmorgan/transformers.rs @@ -1233,10 +1233,27 @@ impl TryFrom, + pub message : Option, + pub entity : Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all="camelCase")] +pub struct JpmorganErrorInformation{ + pub code : Option, + pub message : Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all="camelCase")] pub struct JpmorganErrorResponse { - pub status_code: u16, - pub code: String, - pub message: String, - pub reason: Option, + pub response_status : JpmorganTransactionStatus, + pub response_code : String, + pub response_message : Option, + // pub validation_errors : Option>, + // pub information : JpmorganErrorInformation, } diff --git a/cypress-tests/cypress/e2e/PaymentUtils/Jpmorgan.js b/cypress-tests/cypress/e2e/PaymentUtils/Jpmorgan.js index e69de29bb2d..8d2f8fb77a3 100644 --- a/cypress-tests/cypress/e2e/PaymentUtils/Jpmorgan.js +++ b/cypress-tests/cypress/e2e/PaymentUtils/Jpmorgan.js @@ -0,0 +1,160 @@ +const successfulNo3DSCardDetails = { + card_number : "6011016011016011", + card_exp_month : "10", + card_exp_year : "2027", + card_holder_name : "John Doe", + card_cvc : "123", +}; + +export const connectorDetails = { + card_pm : { + PaymentIntent : { + Request : { + currency : "USD", + customer_acceptance : null, + setup_future_usage : "on_session", + }, + Response : { + status : 200, + body : { + status : + "requires_payment_method", + }, + }, + }, + No3DSManualCapture: { + Request: { + currency: "USD", + payment_method: "card", + billing: { + address: { + line1: "1467", + line2: "CA", + line3: "CA", + city: "Musterhausen", + state: "California", + zip: "12345", + country: "US", + first_name: "Max", + last_name: "Mustermann", + }, + email: "test@novalnet.de", + phone: { + number: "9123456789", + country_code: "+91", + }, + }, + payment_method_data: { + card: successfulNo3DSCardDetails, + }, + customer_acceptance: null, + setup_future_usage: "on_session", + }, + Response: { + status: 200, + body: { + status: "requires_capture", + }, + }, + }, + No3DSAutoCapture: { + Request: { + // Auto capture with different currency, so we need to pass currency in here + currency: "USD", + payment_method: "card", + // billing: { + // address: { + // line1: "1467", + // line2: "CA", + // line3: "CA", + // city: "Musterhausen", + // state: "California", + // zip: "12345", + // country: "US", + // first_name: "Max", + // last_name: "Mustermann", + // }, + // email: "test@novalnet.de", + // phone: { + // number: "9123456789", + // country_code: "+91", + // }, + // }, + payment_method_data: { + card: successfulNo3DSCardDetails, + }, + customer_acceptance: null, + setup_future_usage: "on_session", + }, + Response: { + status: 200, + body: { + status: "succeeded", + }, + }, + }, + Capture: { + Request: { + payment_method: "card", + payment_method_data: { + card: successfulNo3DSCardDetails, + }, + customer_acceptance: null, + }, + Response: { + status: 200, + body: { + status: "succeeded", + amount: 6500, + amount_capturable: 0, + amount_received: 6500, + }, + }, + }, + Refund: { + Request: { + payment_method: "card", + payment_method_data: { + card: successfulNo3DSCardDetails, + }, + customer_acceptance: null, + }, + Response: { + status: 200, + body: { + status: "succeeded", + }, + }, + }, + PartialRefund: { + Request: { + payment_method: "card", + payment_method_data: { + card: successfulNo3DSCardDetails, + }, + customer_acceptance: null, + }, + Response: { + status: 200, + body: { + status: "succeeded", + }, + }, + }, + SyncRefund: { + Request: { + payment_method: "card", + payment_method_data: { + card: successfulNo3DSCardDetails, + }, + customer_acceptance: null, + }, + Response: { + status: 200, + body: { + status: "succeeded", + }, + }, + }, + } +} \ No newline at end of file diff --git a/cypress-tests/cypress/e2e/PaymentUtils/Utils.js b/cypress-tests/cypress/e2e/PaymentUtils/Utils.js index 8848450bc61..a09690c76c5 100644 --- a/cypress-tests/cypress/e2e/PaymentUtils/Utils.js +++ b/cypress-tests/cypress/e2e/PaymentUtils/Utils.js @@ -10,6 +10,7 @@ import { connectorDetails as datatransConnectorDetails } from "./Datatrans.js"; import { connectorDetails as fiservemeaConnectorDetails } from "./Fiservemea.js"; import { connectorDetails as iatapayConnectorDetails } from "./Iatapay.js"; import { connectorDetails as itaubankConnectorDetails } from "./ItauBank.js"; +import { connectorDetails as jpmorganConnectorDetails} from "./Jpmorgan.js"; import { connectorDetails as nexixpayConnectorDetails } from "./Nexixpay.js"; import { connectorDetails as nmiConnectorDetails } from "./Nmi.js"; import { connectorDetails as novalnetConnectorDetails } from "./Novalnet.js"; @@ -30,6 +31,7 @@ const connectorDetails = { fiservemea: fiservemeaConnectorDetails, iatapay: iatapayConnectorDetails, itaubank: itaubankConnectorDetails, + jpmorgan : jpmorganConnectorDetails, nexixpay: nexixpayConnectorDetails, nmi: nmiConnectorDetails, novalnet: novalnetConnectorDetails, diff --git a/cypress-tests/cypress/support/commands.js b/cypress-tests/cypress/support/commands.js index 9b938e673d7..818d366599f 100644 --- a/cypress-tests/cypress/support/commands.js +++ b/cypress-tests/cypress/support/commands.js @@ -1470,7 +1470,7 @@ Cypress.Commands.add( if (response.body.capture_method !== undefined) { expect(response.body.payment_id).to.equal(payment_id); for (const key in res_data.body) { - expect(res_data.body[key]).to.equal(response.body[key]); + expect(res_data.body[key]).to.equal(response.body[key]); // } } else { defaultErrorHandler(response, res_data);