-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(connector): [JPMORGAN] add Payment flows for cards #6668
Conversation
6d7ae12
to
99e5223
Compare
b5683d4
to
106fb95
Compare
808ae0e
to
678b508
Compare
config/deployments/sandbox.toml
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does jpmorgan use same base url in both sbx and prod env?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no, it uses different
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
add pm filters in toml files.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
config/docker_compose.toml
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
check if jpmorgan is needs to be added in temp_locker_enable_config
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we don't need to add that here
@@ -945,6 +945,7 @@ default_imp_for_payouts!( | |||
connector::Gpayments, | |||
connector::Iatapay, | |||
connector::Itaubank, | |||
//connector::Jpmorgan, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
will we add support for payouts also for jp morgan?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no, removing the commented code
cypress-tests/package-lock.json
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
revert this file change
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
cypress-tests/package.json
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
revert this change
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
package-lock.json
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
revert
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
package.json
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
revert
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
@@ -1,10 +1,13 @@ | |||
pub mod transformers; | |||
use std::convert::TryFrom; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove unused imports from the files
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we get warnings for unused imports, isn't it?
i got them and removed those, no more warnings remaining
3e3ded0
to
a818e57
Compare
@@ -320,6 +321,10 @@ debit.currency = "USD" | |||
ali_pay.currency = "GBP,CNY" | |||
we_chat_pay.currency = "GBP,CNY" | |||
|
|||
[pm.filters.jpmorgan] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please verify the currencies supported
client_id.peek(), | ||
client_secret.unwrap_or_default().peek() | ||
); | ||
// let creds = format!("{}:{}", client_id.peek(), client_secret.unwrap_or_default().peek()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove unused commented code
) -> CustomResult<String, errors::ConnectorError> { | ||
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) | ||
let endpoint = self.base_url(connectors); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok(format!("{}/payments", self.base_url(connectors)))
}) | ||
} | ||
_ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), | ||
_ => Err(errors::ConnectorError::NotImplemented( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mention all enums exclusively, in case of payment methods
}) | ||
} | ||
_ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), | ||
_ => Err(errors::ConnectorError::NotImplemented( | ||
"Selected payment method through jpmorgan".to_string(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Err(errors::ConnectorError::NotImplemented(
get_unimplemented_payment_method_error_message("jpmorgan"),
))?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
let capture_method = if let Some(method) = item.router_data.request.capture_method { | ||
map_capture_method(method) | ||
} else { | ||
String::from("AUTOMATIC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cover this condition in map_capture_method
itself
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
let mut transaction_state = item.response.transaction_state.to_string(); | ||
|
||
if transaction_state == "Closed" { | ||
let cm = item.response.capture_method.clone(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let capture_method = item.response.capture_method.clone();
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
modifying
let cm = item.response.capture_method.clone(); | ||
if cm == Some("NOW".to_string()) { | ||
transaction_state = String::from("Closed"); | ||
} else if cm == Some("MANUAL".to_string()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please make enums instead of string comparison.
|
||
let currency = Some(item.router_data.request.currency.to_string()); | ||
|
||
// let company_name : Option<String> = Some(String::from("JPMC")); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
config/deployments/production.toml
Outdated
[pm.filters.jpmorgan] | ||
debit = { country = "CA, EU, UK, US", currency = "AED, AFN, ALL, AMD, ANG, AOA, ARS, AUD, AWG, AZN, BAM, BBD, BDT, BGN, BIF, BMD, BND, BOB, BRL, BSD, BTN, BWP, BYN, BZD, CAD, CDF, CHF, CLP, CNY, COP, CRC, CVE, CZK, DJF, DKK, DOP, DZD, EGP, ETB, EUR, FJD, FKP, GBP, GEL, GHS, GIP, GMD, GTQ, GYD, HKD, HNL, HRK, HTG, HUF, IDR, ILS, INR, ISK, JMD, JPY, KES, KHR, KMF, KRW, KYD, KZT, LAK, LBP, LKR, LRD, LSL, MAD, MDL, MGA, MKD, MMK, MNT, MOP, MRU, MUR, MVR, MWK, MXN, MYR, MZN, NAD, NGN, NIO, NOK, NPR, NZD, PAB, PEN, PGK, PHP, PKR, PLN, PYG, QAR, RON, RSD, RWF, SAR, SBD, SCR, SEK, SGD, SHP, SLL, SOS, SRD, STN, SZL, THB, TJS, TOP, TRY, TTD, TWD, TZS, UAH, UGX, USD, UYU, UZS, VND, VUV, WST, XAF, XCD, XOF, XPF, YER, ZAR, ZMW" } | ||
credit = { country = "CA, EU, UK, US", currency = "AED, AFN, ALL, AMD, ANG, AOA, ARS, AUD, AWG, AZN, BAM, BBD, BDT, BGN, BIF, BMD, BND, BOB, BRL, BSD, BTN, BWP, BYN, BZD, CAD, CDF, CHF, CLP, CNY, COP, CRC, CVE, CZK, DJF, DKK, DOP, DZD, EGP, ETB, EUR, FJD, FKP, GBP, GEL, GHS, GIP, GMD, GTQ, GYD, HKD, HNL, HRK, HTG, HUF, IDR, ILS, INR, ISK, JMD, JPY, KES, KHR, KMF, KRW, KYD, KZT, LAK, LBP, LKR, LRD, LSL, MAD, MDL, MGA, MKD, MMK, MNT, MOP, MRU, MUR, MVR, MWK, MXN, MYR, MZN, NAD, NGN, NIO, NOK, NPR, NZD, PAB, PEN, PGK, PHP, PKR, PLN, PYG, QAR, RON, RSD, RWF, SAR, SBD, SCR, SEK, SGD, SHP, SLL, SOS, SRD, STN, SZL, THB, TJS, TOP, TRY, TTD, TWD, TZS, UAH, UGX, USD, UYU, UZS, VND, VUV, WST, XAF, XCD, XOF, XPF, YER, ZAR, ZMW" } | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this added only in config/deployments/production.toml
[[jpmorgan.debit]] | ||
payment_method_type = "Visa" | ||
[jpmorgan.connector_auth.BodyKey] | ||
api_key="Access Token" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the API key from JPMorgan referred to as an access_token
in their documentation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
api_key
is client_id
and key1
is client_secret
@@ -1,10 +1,13 @@ | |||
pub mod transformers; | |||
use std::convert::TryFrom; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cool
@@ -56,84 +139,258 @@ impl TryFrom<&JpmorganRouterData<&PaymentsAuthorizeRouterData>> for JpmorganPaym | |||
) -> Result<Self, Self::Error> { | |||
match item.router_data.request.payment_method_data.clone() { | |||
PaymentMethodData::Card(req_card) => { | |||
if item.router_data.is_three_ds() { | |||
return Err(errors::ConnectorError::NotSupported { | |||
message: "Three_ds payments".to_string(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
message: "Three_ds payments".to_string(), | |
message: "3DS Payments".to_string(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
okay
let capture_method = if let Some(method) = item.router_data.request.capture_method { | ||
map_capture_method(method) | ||
} else { | ||
String::from("AUTOMATIC") | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Handle the option in map_capture_method
only
|
||
let merchant_software = JpmorganMerchantSoftware { | ||
company_name: String::from("JPMC"), | ||
product_name: String::from("Hyperswitch"), //could be Amazon or something else, subject to change |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this hardcoded?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RouterData doesn't have this, hence hardcoded
complete: item.router_data.request.is_auto_capture()?, | ||
account_number, | ||
expiry, | ||
is_bill_payment: item.router_data.request.is_auto_capture()?, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the use of this value is_bill_payment
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nothing as such, just a field inside cards. Should i remove this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove it if it is not mandatory
//in jpm, we get a client id and secret and using these two, we have a curl, we make an api call and we get a access token in res with an expiry time as well | ||
#[derive(Debug)] | ||
pub struct JpmorganAuthType { | ||
pub(super) api_key: Secret<String>, | ||
#[allow(dead_code)] | ||
pub(super) key1: Secret<String>, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we have dead code?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
solved
d7378fd
to
17d3b31
Compare
}; | ||
use hyperswitch_interfaces::errors; | ||
use masking::Secret; | ||
use serde::{Deserialize, Serialize}; | ||
use strum::Display; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apply match statement on enum
fn map_capture_method(capture_method: CaptureMethod) -> CapMethod { | ||
match capture_method { | ||
CaptureMethod::Automatic => CapMethod::Now, | ||
CaptureMethod::Manual | CaptureMethod::ManualMultiple => CapMethod::Manual, | ||
CaptureMethod::Scheduled | CaptureMethod::SequentialAutomatic => CapMethod::Delayed, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Only map the capture methods that you actually support
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
complete: item.router_data.request.is_auto_capture()?, | ||
account_number, | ||
expiry, | ||
is_bill_payment: item.router_data.request.is_auto_capture()?, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove it if it is not mandatory
pub trait FromTransactionState { | ||
fn from_transaction_state(transaction_state: JpmorganTransactionState) -> Self; | ||
} | ||
|
||
pub trait FromResponseStatus { | ||
fn from_response_status(transaction_state: String) -> Self; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need to use trait. Directly write down the functions like attempt_status_from_transaction_state
and refund_status_from_transaction_state
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
JpmorganResponseStatus::Error => String::from("Error"), | ||
}; | ||
|
||
let status = common_enums::AttemptStatus::from_response_status(response_status); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Directly do status mapping here. No need to define a function for a single time use
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alright
config/config.example.toml
Outdated
@@ -223,6 +223,7 @@ iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" | |||
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" | |||
jpmorgan.secondary_base_url= "https://id.payments.jpmorgan.com/am/oauth2/alpha/access_token" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are we including the entire URL here instead of just the base URL?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the secondary base url is different from the base url, it is actually used for retrieving the access token, it is a separate api call
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't we be including only the base URL here instead of the entire URL?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
so where should we include the access token flow's url?
pub(super) _api_key: Secret<String>, | ||
pub(super) _key1: Secret<String>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we remove the underscore prefix if we are using this struct?
If we are not using this struct, why are we not using it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no we can't remove that struct, because if we do then the Payments Connector Create
flow will be successfully even if im using HeaderKey
, which shouldn't be the case. I should get a success response only when using the BodyKey
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These keys are unused because JPMorgan only requires an access token. The access token is obtained during the token flow using the JPMorgan API keys, which are provided through the AccessTokenRequestData
.
expiry: Option<ExpiryResponse>, | ||
card_type: Option<String>, | ||
card_type_name: Option<String>, | ||
masked_account_number: Option<String>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we consider wrapping this within a Secret
?
month: Option<i32>, | ||
year: Option<i32>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we wrap this within a Secret
? This would otherwise log these values in plaintext...
|
||
#[derive(Default, Debug, Serialize, Deserialize)] | ||
#[serde(rename_all = "camelCase")] | ||
pub struct ExpiryCapReq { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wrap fields carrying sensitive information within Secret
.
|
||
#[derive(Default, Debug, Serialize, Deserialize)] | ||
#[serde(rename_all = "camelCase")] | ||
pub struct SoftMerchantCapReq { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wrap fields carrying sensitive information within Secret
.
let capture_method = | ||
map_capture_method(item.router_data.request.capture_method.unwrap_or_default()); | ||
Ok(Self { | ||
capture_method: Some(capture_method?), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: Can you add the ?
on the map_capture_method()
call instead of here?
pub struct CardCapRes { | ||
pub card_type: Option<String>, | ||
pub card_type_name: Option<String>, | ||
unmasked_account_number: Option<String>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wrap this within Secret
.
pub struct TransactionData { | ||
payment_type: Option<String>, | ||
status_code: i32, | ||
txn_secret: Option<String>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this field be wrapped within a Secret
?
2d09c26
dc135fe
to
1666b1a
Compare
impl From<JpmorganTransactionStatus> for common_enums::AttemptStatus { | ||
fn from(item: JpmorganTransactionStatus) -> Self { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this function in code if it is not being used anywhere?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed
impl From<JpmorganTransactionState> for common_enums::AttemptStatus { | ||
fn from(item: JpmorganTransactionState) -> Self { | ||
match item { | ||
JpmorganTransactionState::Authorized => Self::Authorized, | ||
JpmorganTransactionState::Closed => Self::Charged, | ||
JpmorganTransactionState::Declined | JpmorganTransactionState::Error => Self::Failure, | ||
JpmorganTransactionState::Pending => Self::Pending, | ||
JpmorganTransactionState::Voided => Self::Voided, | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this function in code if it is not being used anywhere?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed
0713c41
to
5d10e37
Compare
loadtest/config/development.toml
Outdated
@@ -120,6 +120,7 @@ iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1" | |||
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" | |||
jpmorgan.secondary_base_url="https://id.payments.jpmorgan.com/am/oauth2/alpha/access_token" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit:
jpmorgan.secondary_base_url="https://id.payments.jpmorgan.com/am/oauth2/alpha/access_token" | |
jpmorgan.secondary_base_url="https://id.payments.jpmorgan.com" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
5d10e37
to
2045fba
Compare
…ete-pm * 'main' of github.com:juspay/hyperswitch: chore(version): 2024.12.23.0 feat(connector): [JPMORGAN] add Payment flows for cards (#6668) refactor(grpc): send `x-tenant-id` and `x-request-id` in grpc headers (#6904) feat(payment_methods_v2): Added Ephemeral auth for v2 (#6813) chore(cypress): payout - fix test cases for adyenplatform bank (#6887) refactor(connector): [Airwallex] add device_data in payment request (#6881) feat(router): add db interface for `/relay` (#6879) feat(payments_v2): implement payments capture v2 (#6722) feat(router): add /relay endpoint (#6870)
Type of Change
Description
Additional Changes
Motivation and Context
https://developer.payments.jpmorgan.com/docs/commerce/online-payments/capabilities/online-payments/how-to/auth-and-capture-payment
https://developer.payments.jpmorgan.com/api/commerce/online-payments/online-payments#/operations/V2PaymentPost
Closes juspay/hyperswitch-cloud#7569
How did you test it?
Cypress Tests
Test Passes for
1. No3DSAutoCapture
2. 3DSAutoCapture
3. No3DSManualCapture
4. VoidPayment
5. SyncPayment
6. RefundPayment
7. SyncRefund
Test Cases failing for
1. RefundPayment : The connector currently sends the same transaction ID for every request in the sandbox environment, causing refund failures. While the refund flow has been implemented in the code, it has been commented out, and an error message is thrown by default until the connector resolves this issue.
2. SyncRefund : Since refunds are not being processed, the sync refund functionality is expected to fail. To address this, the TRIGGER_FLAG is used in Cypress tests to prevent failures. However, the Sync Refund logic has already been implemented in the code.
Following flows need to be tested for card payments for new connector Jpmorgan:
1. Authorize (Manual)
2. Capture (Manual)
3. Authorize + Capture
4. PSync
5. Refund (Issue in the refund flow, because the connector sends the same transaction id for every hit on sandbox, hence conflicting)
6. RSync
7. Cancel/Void
Checklist
cargo +nightly fmt --all
cargo clippy