Skip to content

Commit 7954516

Browse files
fix(connector): [Trustpay] fix deserialization error for incoming webhook response for trustpay and add error code mapping '800.100.203' (#4199)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
1 parent 8621777 commit 7954516

2 files changed

Lines changed: 39 additions & 10 deletions

File tree

crates/router/src/connector/trustpay.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ impl api::IncomingWebhook for Trustpay {
983983
dispute_stage: api_models::enums::DisputeStage::Dispute,
984984
connector_dispute_id,
985985
connector_reason: reason.reason.reject_reason,
986-
connector_reason_code: Some(reason.reason.code),
986+
connector_reason_code: reason.reason.code,
987987
challenge_required_by: None,
988988
connector_status: payment_info.status.to_string(),
989989
created_at: None,

crates/router/src/connector/trustpay/transformers.rs

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ pub struct Amount {
112112
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
113113
#[serde(rename_all = "PascalCase")]
114114
pub struct Reason {
115-
pub code: String,
115+
pub code: Option<String>,
116116
pub reject_reason: Option<String>,
117117
}
118118

@@ -510,6 +510,7 @@ fn is_payment_failed(payment_status: &str) -> (bool, &'static str) {
510510
"800.100.172" => (true, "Transaction declined (account blocked)"),
511511
"800.100.190" => (true, "Transaction declined (invalid configuration data)"),
512512
"800.100.202" => (true, "Account Closed"),
513+
"800.100.203" => (true, "Insufficient Funds"),
513514
"800.120.100" => (true, "Rejected by throttling"),
514515
"800.300.102" => (true, "Country blacklisted"),
515516
"800.300.401" => (true, "Bin blacklisted"),
@@ -823,9 +824,16 @@ fn handle_bank_redirects_sync_response(
823824
.status_reason_information
824825
.unwrap_or_default();
825826
Some(types::ErrorResponse {
826-
code: reason_info.reason.code.clone(),
827+
code: reason_info
828+
.reason
829+
.code
830+
.clone()
831+
.unwrap_or(consts::NO_ERROR_CODE.to_string()),
827832
// message vary for the same code, so relying on code alone as it is unique
828-
message: reason_info.reason.code,
833+
message: reason_info
834+
.reason
835+
.code
836+
.unwrap_or(consts::NO_ERROR_MESSAGE.to_string()),
829837
reason: reason_info.reason.reject_reason,
830838
status_code,
831839
attempt_status: None,
@@ -875,9 +883,16 @@ pub fn handle_webhook_response(
875883
.status_reason_information
876884
.unwrap_or_default();
877885
Some(types::ErrorResponse {
878-
code: reason_info.reason.code.clone(),
886+
code: reason_info
887+
.reason
888+
.code
889+
.clone()
890+
.unwrap_or(consts::NO_ERROR_CODE.to_string()),
879891
// message vary for the same code, so relying on code alone as it is unique
880-
message: reason_info.reason.code,
892+
message: reason_info
893+
.reason
894+
.code
895+
.unwrap_or(consts::NO_ERROR_MESSAGE.to_string()),
881896
reason: reason_info.reason.reject_reason,
882897
status_code,
883898
attempt_status: None,
@@ -1483,9 +1498,16 @@ fn handle_webhooks_refund_response(
14831498
let error = if utils::is_refund_failure(refund_status) {
14841499
let reason_info = response.status_reason_information.unwrap_or_default();
14851500
Some(types::ErrorResponse {
1486-
code: reason_info.reason.code.clone(),
1501+
code: reason_info
1502+
.reason
1503+
.code
1504+
.clone()
1505+
.unwrap_or(consts::NO_ERROR_CODE.to_string()),
14871506
// message vary for the same code, so relying on code alone as it is unique
1488-
message: reason_info.reason.code,
1507+
message: reason_info
1508+
.reason
1509+
.code
1510+
.unwrap_or(consts::NO_ERROR_MESSAGE.to_string()),
14891511
reason: reason_info.reason.reject_reason,
14901512
status_code,
14911513
attempt_status: None,
@@ -1540,9 +1562,16 @@ fn handle_bank_redirects_refund_sync_response(
15401562
.status_reason_information
15411563
.unwrap_or_default();
15421564
Some(types::ErrorResponse {
1543-
code: reason_info.reason.code.clone(),
1565+
code: reason_info
1566+
.reason
1567+
.code
1568+
.clone()
1569+
.unwrap_or(consts::NO_ERROR_CODE.to_string()),
15441570
// message vary for the same code, so relying on code alone as it is unique
1545-
message: reason_info.reason.code,
1571+
message: reason_info
1572+
.reason
1573+
.code
1574+
.unwrap_or(consts::NO_ERROR_MESSAGE.to_string()),
15461575
reason: reason_info.reason.reject_reason,
15471576
status_code,
15481577
attempt_status: None,

0 commit comments

Comments
 (0)