From 701cadf455b25cacf27cb4d91c5541d7880c489d Mon Sep 17 00:00:00 2001 From: Ayush Anand Date: Thu, 2 Jul 2026 14:08:24 +0530 Subject: [PATCH 1/2] fix(router): correct payment_method_data parsing in list-payments response --- .../router/src/core/payments/transformers.rs | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index 6c2b4f2b6c2..c8a12525cb1 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -4600,6 +4600,39 @@ pub fn construct_connector_invoke_hidden_frame( impl ForeignFrom<(storage::PaymentIntent, storage::PaymentAttempt)> for api::PaymentsResponse { fn foreign_from((pi, pa): (storage::PaymentIntent, storage::PaymentAttempt)) -> Self { let connector_transaction_id = pa.get_connector_payment_id().map(ToString::to_string); + // Build `payment_method_data` by first parsing the stored column as + // `AdditionalPaymentData` and then converting via `PaymentMethodDataResponse::from` + let payment_method_data = pa + .check_and_get_payment_method_data_based_on_encryption_strategy() + .and_then(|data| match data { + serde_json::Value::Null => { + router_env::logger::debug!( + payment_attempt_id = ?pa.attempt_id, + "No additional payment method data present for payment attempt" + ); + None + } + _ => match data.parse_value::( + "AdditionalPaymentData", + ) { + Ok(additional_payment_data) => { + Some(api_models::payments::PaymentMethodDataResponseWithBilling { + payment_method_data: Some(api::PaymentMethodDataResponse::from( + additional_payment_data, + )), + billing: None, + }) + } + Err(e) => { + router_env::logger::error!( + payment_attempt_id = ?pa.attempt_id, + error = ?e, + "Failed to parse 'AdditionalPaymentData' from payment method data" + ); + None + } + }, + }); Self { connector_response_metadata: pa.get_connector_response_metadata_from_attempt_metadata(), payment_id: pi.payment_id, @@ -4629,15 +4662,7 @@ impl ForeignFrom<(storage::PaymentIntent, storage::PaymentAttempt)> for api::Pay attempt_count: pi.attempt_count, profile_id: pi.profile_id, merchant_connector_id: pa.merchant_connector_id, - payment_method_data: pa.payment_method_data.and_then(|data| { - match data.parse_value("PaymentMethodDataResponseWithBilling") { - Ok(parsed_data) => Some(parsed_data), - Err(e) => { - router_env::logger::error!("Failed to parse 'PaymentMethodDataResponseWithBilling' from payment method data. Error: {e:?}"); - None - } - } - }), + payment_method_data, merchant_order_reference_id: pi.merchant_order_reference_id, customer: pi.customer_details.and_then(|customer_details| match customer_details.into_inner().expose().parse_value::("CustomerData"){ From 2abb83c97f7b30d4eb4e694b86895554e65a8b99 Mon Sep 17 00:00:00 2001 From: Ayush Anand Date: Thu, 2 Jul 2026 14:13:07 +0530 Subject: [PATCH 2/2] chore: empty commit to trigger tests