mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
fix(update_metadata): Update Metadata for any connectors other than stripe gives 500 error (#7984)
This commit is contained in:
@ -30,19 +30,18 @@ impl
|
|||||||
merchant_recipient_data: Option<types::MerchantRecipientData>,
|
merchant_recipient_data: Option<types::MerchantRecipientData>,
|
||||||
header_payload: Option<hyperswitch_domain_models::payments::HeaderPayload>,
|
header_payload: Option<hyperswitch_domain_models::payments::HeaderPayload>,
|
||||||
) -> RouterResult<types::PaymentsUpdateMetadataRouterData> {
|
) -> RouterResult<types::PaymentsUpdateMetadataRouterData> {
|
||||||
Box::pin(transformers::construct_payment_router_data::<
|
Box::pin(
|
||||||
api::UpdateMetadata,
|
transformers::construct_payment_router_data_for_update_metadata(
|
||||||
types::PaymentsUpdateMetadataData,
|
state,
|
||||||
>(
|
self.clone(),
|
||||||
state,
|
connector_id,
|
||||||
self.clone(),
|
merchant_context,
|
||||||
connector_id,
|
customer,
|
||||||
merchant_context,
|
merchant_connector_account,
|
||||||
customer,
|
merchant_recipient_data,
|
||||||
merchant_connector_account,
|
header_payload,
|
||||||
merchant_recipient_data,
|
),
|
||||||
header_payload,
|
)
|
||||||
))
|
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1247,6 +1247,195 @@ where
|
|||||||
Ok(router_data)
|
Ok(router_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))]
|
||||||
|
#[instrument(skip_all)]
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub async fn construct_payment_router_data_for_update_metadata<'a>(
|
||||||
|
state: &'a SessionState,
|
||||||
|
payment_data: PaymentData<api::UpdateMetadata>,
|
||||||
|
connector_id: &str,
|
||||||
|
merchant_context: &domain::MerchantContext,
|
||||||
|
customer: &'a Option<domain::Customer>,
|
||||||
|
merchant_connector_account: &helpers::MerchantConnectorAccountType,
|
||||||
|
merchant_recipient_data: Option<types::MerchantRecipientData>,
|
||||||
|
header_payload: Option<hyperswitch_domain_models::payments::HeaderPayload>,
|
||||||
|
) -> RouterResult<
|
||||||
|
types::RouterData<
|
||||||
|
api::UpdateMetadata,
|
||||||
|
types::PaymentsUpdateMetadataData,
|
||||||
|
types::PaymentsResponseData,
|
||||||
|
>,
|
||||||
|
> {
|
||||||
|
let (payment_method, router_data);
|
||||||
|
|
||||||
|
fp_utils::when(merchant_connector_account.is_disabled(), || {
|
||||||
|
Err(errors::ApiErrorResponse::MerchantConnectorAccountDisabled)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let test_mode = merchant_connector_account.is_test_mode_on();
|
||||||
|
|
||||||
|
let auth_type: types::ConnectorAuthType = merchant_connector_account
|
||||||
|
.get_connector_account_details()
|
||||||
|
.parse_value("ConnectorAuthType")
|
||||||
|
.change_context(errors::ApiErrorResponse::InternalServerError)
|
||||||
|
.attach_printable("Failed while parsing value for ConnectorAuthType")?;
|
||||||
|
|
||||||
|
payment_method = payment_data
|
||||||
|
.payment_attempt
|
||||||
|
.payment_method
|
||||||
|
.or(payment_data.payment_attempt.payment_method)
|
||||||
|
.get_required_value("payment_method_type")?;
|
||||||
|
|
||||||
|
// [#44]: why should response be filled during request
|
||||||
|
let response = Err(hyperswitch_domain_models::router_data::ErrorResponse {
|
||||||
|
code: "IR_20".to_string(),
|
||||||
|
message: "Update metadata is not implemented for this connector".to_string(),
|
||||||
|
reason: None,
|
||||||
|
status_code: http::StatusCode::BAD_REQUEST.as_u16(),
|
||||||
|
attempt_status: None,
|
||||||
|
connector_transaction_id: None,
|
||||||
|
network_decline_code: None,
|
||||||
|
network_advice_code: None,
|
||||||
|
network_error_message: None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let additional_data = PaymentAdditionalData {
|
||||||
|
router_base_url: state.base_url.clone(),
|
||||||
|
connector_name: connector_id.to_string(),
|
||||||
|
payment_data: payment_data.clone(),
|
||||||
|
state,
|
||||||
|
customer_data: customer,
|
||||||
|
};
|
||||||
|
|
||||||
|
let customer_id = customer.to_owned().map(|customer| customer.customer_id);
|
||||||
|
|
||||||
|
let supported_connector = &state
|
||||||
|
.conf
|
||||||
|
.multiple_api_version_supported_connectors
|
||||||
|
.supported_connectors;
|
||||||
|
let connector_enum = api_models::enums::Connector::from_str(connector_id)
|
||||||
|
.change_context(errors::ConnectorError::InvalidConnectorName)
|
||||||
|
.change_context(errors::ApiErrorResponse::InvalidDataValue {
|
||||||
|
field_name: "connector",
|
||||||
|
})
|
||||||
|
.attach_printable_lazy(|| format!("unable to parse connector name {connector_id:?}"))?;
|
||||||
|
|
||||||
|
let connector_api_version = if supported_connector.contains(&connector_enum) {
|
||||||
|
state
|
||||||
|
.store
|
||||||
|
.find_config_by_key(&format!("connector_api_version_{connector_id}"))
|
||||||
|
.await
|
||||||
|
.map(|value| value.config)
|
||||||
|
.ok()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
let apple_pay_flow = payments::decide_apple_pay_flow(
|
||||||
|
state,
|
||||||
|
payment_data.payment_attempt.payment_method_type,
|
||||||
|
Some(merchant_connector_account),
|
||||||
|
);
|
||||||
|
|
||||||
|
let unified_address = if let Some(payment_method_info) =
|
||||||
|
payment_data.payment_method_info.clone()
|
||||||
|
{
|
||||||
|
let payment_method_billing = payment_method_info
|
||||||
|
.payment_method_billing_address
|
||||||
|
.map(|decrypted_data| decrypted_data.into_inner().expose())
|
||||||
|
.map(|decrypted_value| decrypted_value.parse_value("payment_method_billing_address"))
|
||||||
|
.transpose()
|
||||||
|
.change_context(errors::ApiErrorResponse::InternalServerError)
|
||||||
|
.attach_printable("unable to parse payment_method_billing_address")?;
|
||||||
|
payment_data
|
||||||
|
.address
|
||||||
|
.clone()
|
||||||
|
.unify_with_payment_data_billing(payment_method_billing)
|
||||||
|
} else {
|
||||||
|
payment_data.address
|
||||||
|
};
|
||||||
|
let connector_mandate_request_reference_id = payment_data
|
||||||
|
.payment_attempt
|
||||||
|
.connector_mandate_detail
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|detail| detail.get_connector_mandate_request_reference_id());
|
||||||
|
|
||||||
|
crate::logger::debug!("unified address details {:?}", unified_address);
|
||||||
|
|
||||||
|
router_data = types::RouterData {
|
||||||
|
flow: PhantomData,
|
||||||
|
merchant_id: merchant_context.get_merchant_account().get_id().clone(),
|
||||||
|
customer_id,
|
||||||
|
tenant_id: state.tenant.tenant_id.clone(),
|
||||||
|
connector: connector_id.to_owned(),
|
||||||
|
payment_id: payment_data
|
||||||
|
.payment_attempt
|
||||||
|
.payment_id
|
||||||
|
.get_string_repr()
|
||||||
|
.to_owned(),
|
||||||
|
attempt_id: payment_data.payment_attempt.attempt_id.clone(),
|
||||||
|
status: payment_data.payment_attempt.status,
|
||||||
|
payment_method,
|
||||||
|
connector_auth_type: auth_type,
|
||||||
|
description: payment_data.payment_intent.description.clone(),
|
||||||
|
address: unified_address,
|
||||||
|
auth_type: payment_data
|
||||||
|
.payment_attempt
|
||||||
|
.authentication_type
|
||||||
|
.unwrap_or_default(),
|
||||||
|
connector_meta_data: merchant_connector_account.get_metadata(),
|
||||||
|
connector_wallets_details: merchant_connector_account.get_connector_wallets_details(),
|
||||||
|
request: types::PaymentsUpdateMetadataData::try_from(additional_data)?,
|
||||||
|
response,
|
||||||
|
amount_captured: payment_data
|
||||||
|
.payment_intent
|
||||||
|
.amount_captured
|
||||||
|
.map(|amt| amt.get_amount_as_i64()),
|
||||||
|
minor_amount_captured: payment_data.payment_intent.amount_captured,
|
||||||
|
access_token: None,
|
||||||
|
session_token: None,
|
||||||
|
reference_id: None,
|
||||||
|
payment_method_status: payment_data.payment_method_info.map(|info| info.status),
|
||||||
|
payment_method_token: payment_data
|
||||||
|
.pm_token
|
||||||
|
.map(|token| types::PaymentMethodToken::Token(Secret::new(token))),
|
||||||
|
connector_customer: payment_data.connector_customer_id,
|
||||||
|
recurring_mandate_payment_data: payment_data.recurring_mandate_payment_data,
|
||||||
|
connector_request_reference_id: core_utils::get_connector_request_reference_id(
|
||||||
|
&state.conf,
|
||||||
|
merchant_context.get_merchant_account().get_id(),
|
||||||
|
&payment_data.payment_attempt,
|
||||||
|
),
|
||||||
|
preprocessing_id: payment_data.payment_attempt.preprocessing_step_id,
|
||||||
|
#[cfg(feature = "payouts")]
|
||||||
|
payout_method_data: None,
|
||||||
|
#[cfg(feature = "payouts")]
|
||||||
|
quote_id: None,
|
||||||
|
test_mode,
|
||||||
|
payment_method_balance: None,
|
||||||
|
connector_api_version,
|
||||||
|
connector_http_status_code: None,
|
||||||
|
external_latency: None,
|
||||||
|
apple_pay_flow,
|
||||||
|
frm_metadata: None,
|
||||||
|
refund_id: None,
|
||||||
|
dispute_id: None,
|
||||||
|
connector_response: None,
|
||||||
|
integrity_check: Ok(()),
|
||||||
|
additional_merchant_data: merchant_recipient_data.map(|data| {
|
||||||
|
api_models::admin::AdditionalMerchantData::foreign_from(
|
||||||
|
types::AdditionalMerchantData::OpenBankingRecipientData(data),
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
header_payload,
|
||||||
|
connector_mandate_request_reference_id,
|
||||||
|
authentication_id: None,
|
||||||
|
psd2_sca_exemption_type: payment_data.payment_intent.psd2_sca_exemption_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(router_data)
|
||||||
|
}
|
||||||
|
|
||||||
pub trait ToResponse<F, D, Op>
|
pub trait ToResponse<F, D, Op>
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
|
|||||||
Reference in New Issue
Block a user