feat(ucs): transmit merchant order reference id to unified connector service (#9352)

This commit is contained in:
Hrithikesh
2025-09-18 13:26:22 +05:30
committed by GitHub
parent 94dc642393
commit 261bed2d8a
17 changed files with 172 additions and 25 deletions

View File

@ -2780,7 +2780,7 @@ pub(crate) async fn payments_create_and_confirm_intent(
merchant_context: domain::MerchantContext,
profile: domain::Profile,
request: payments_api::PaymentsRequest,
mut header_payload: HeaderPayload,
header_payload: HeaderPayload,
) -> RouterResponse<payments_api::PaymentsResponse> {
use hyperswitch_domain_models::{
payments::PaymentIntentData, router_flow_types::PaymentCreateIntent,
@ -4568,7 +4568,7 @@ where
customer,
&merchant_connector_account_type_details,
None,
None,
Some(header_payload),
)
.await?;
@ -4766,7 +4766,7 @@ where
&None,
&merchant_connector_account_type_details,
None,
None,
Some(header_payload.clone()),
)
.await?;
@ -5113,7 +5113,7 @@ where
customer,
&merchant_connector_account,
merchant_recipient_data,
None,
Some(header_payload.clone()),
)
.await?;
@ -5278,7 +5278,7 @@ where
&None,
&merchant_connector_account,
None,
None,
Some(header_payload.clone()),
)
.await?;
@ -5402,7 +5402,7 @@ where
&None,
&merchant_connector_account,
None,
None,
Some(header_payload.clone()),
)
.await?;
@ -5978,7 +5978,7 @@ where
customer,
&merchant_connector_account,
None,
None,
Some(header_payload.clone()),
)
.await?;
@ -6100,7 +6100,7 @@ where
customer,
&merchant_connector_account,
None,
None,
Some(header_payload.clone()),
)
.await?;

View File

@ -1,6 +1,9 @@
use std::str::FromStr;
use async_trait::async_trait;
use common_enums as enums;
use common_types::payments as common_payments_types;
use common_utils::{id_type, ucs_types};
use error_stack::ResultExt;
use hyperswitch_domain_models::errors::api_error_response::ApiErrorResponse;
#[cfg(feature = "v2")]
@ -853,9 +856,20 @@ async fn call_unified_connector_service_authorize(
build_unified_connector_service_auth_metadata(merchant_connector_account, merchant_context)
.change_context(ApiErrorResponse::InternalServerError)
.attach_printable("Failed to construct request metadata")?;
let merchant_order_reference_id = router_data
.header_payload
.as_ref()
.and_then(|payload| payload.x_reference_id.clone())
.map(|id| id_type::PaymentReferenceId::from_str(id.as_str()))
.transpose()
.inspect_err(|err| logger::warn!(error=?err, "Invalid Merchant ReferenceId found"))
.ok()
.flatten()
.map(ucs_types::UcsReferenceId::Payment);
let headers_builder = state
.get_grpc_headers_ucs()
.external_vault_proxy_metadata(None);
.external_vault_proxy_metadata(None)
.merchant_reference_id(merchant_order_reference_id);
let updated_router_data = Box::pin(ucs_logging_wrapper(
router_data.clone(),
state,
@ -926,9 +940,20 @@ async fn call_unified_connector_service_repeat_payment(
build_unified_connector_service_auth_metadata(merchant_connector_account, merchant_context)
.change_context(ApiErrorResponse::InternalServerError)
.attach_printable("Failed to construct request metadata")?;
let merchant_order_reference_id = router_data
.header_payload
.as_ref()
.and_then(|payload| payload.x_reference_id.clone())
.map(|id| id_type::PaymentReferenceId::from_str(id.as_str()))
.transpose()
.inspect_err(|err| logger::warn!(error=?err, "Invalid Merchant ReferenceId found"))
.ok()
.flatten()
.map(ucs_types::UcsReferenceId::Payment);
let headers_builder = state
.get_grpc_headers_ucs()
.external_vault_proxy_metadata(None);
.external_vault_proxy_metadata(None)
.merchant_reference_id(merchant_order_reference_id);
let updated_router_data = Box::pin(ucs_logging_wrapper(
router_data.clone(),
state,

View File

@ -1,5 +1,8 @@
use std::str::FromStr;
use async_trait::async_trait;
use common_enums as enums;
use common_utils::{id_type, ucs_types, ucs_types::UcsReferenceId};
use error_stack::ResultExt;
use hyperswitch_domain_models::errors::api_error_response::ApiErrorResponse;
#[cfg(feature = "v2")]
@ -393,9 +396,20 @@ impl Feature<api::ExternalVaultProxy, types::ExternalVaultProxyPaymentsData>
)
.change_context(ApiErrorResponse::InternalServerError)
.attach_printable("Failed to construct external vault proxy metadata")?;
let merchant_order_reference_id = self
.header_payload
.as_ref()
.and_then(|payload| payload.x_reference_id.clone())
.map(|id| id_type::PaymentReferenceId::from_str(id.as_str()))
.transpose()
.inspect_err(|err| logger::warn!(error=?err, "Invalid Merchant ReferenceId found"))
.ok()
.flatten()
.map(ucs_types::UcsReferenceId::Payment);
let headers_builder = state
.get_grpc_headers_ucs()
.external_vault_proxy_metadata(Some(external_vault_proxy_metadata));
.external_vault_proxy_metadata(Some(external_vault_proxy_metadata))
.merchant_reference_id(merchant_order_reference_id);
let updated_router_data = Box::pin(ucs_logging_wrapper(
self.clone(),
state,

View File

@ -1,6 +1,7 @@
use std::{collections::HashMap, str::FromStr};
use async_trait::async_trait;
use common_utils::{id_type, ucs_types};
use error_stack::ResultExt;
use masking::Secret;
use unified_connector_service_client::payments as payments_grpc;
@ -266,9 +267,20 @@ impl Feature<api::PSync, types::PaymentsSyncData>
)
.change_context(ApiErrorResponse::InternalServerError)
.attach_printable("Failed to construct request metadata")?;
let merchant_reference_id = self
.header_payload
.as_ref()
.and_then(|payload| payload.x_reference_id.clone())
.map(|id| id_type::PaymentReferenceId::from_str(id.as_str()))
.transpose()
.inspect_err(|err| logger::warn!(error=?err, "Invalid Merchant ReferenceId found"))
.ok()
.flatten()
.map(ucs_types::UcsReferenceId::Payment);
let header_payload = state
.get_grpc_headers_ucs()
.external_vault_proxy_metadata(None);
.external_vault_proxy_metadata(None)
.merchant_reference_id(merchant_reference_id);
let updated_router_data = Box::pin(ucs_logging_wrapper(
self.clone(),
state,

View File

@ -1,5 +1,8 @@
use std::str::FromStr;
use async_trait::async_trait;
use common_types::payments as common_payments_types;
use common_utils::{id_type, ucs_types};
use error_stack::ResultExt;
use router_env::logger;
use unified_connector_service_client::payments as payments_grpc;
@ -282,9 +285,20 @@ impl Feature<api::SetupMandate, types::SetupMandateRequestData> for types::Setup
)
.change_context(ApiErrorResponse::InternalServerError)
.attach_printable("Failed to construct request metadata")?;
let merchant_reference_id = self
.header_payload
.as_ref()
.and_then(|payload| payload.x_reference_id.clone())
.map(|id| id_type::PaymentReferenceId::from_str(id.as_str()))
.transpose()
.inspect_err(|err| logger::warn!(error=?err, "Invalid Merchant ReferenceId found"))
.ok()
.flatten()
.map(ucs_types::UcsReferenceId::Payment);
let header_payload = state
.get_grpc_headers_ucs()
.external_vault_proxy_metadata(None);
.external_vault_proxy_metadata(None)
.merchant_reference_id(merchant_reference_id);
let updated_router_data = Box::pin(ucs_logging_wrapper(
self.clone(),
state,

View File

@ -655,7 +655,7 @@ pub async fn construct_external_vault_proxy_payment_router_data<'a>(
authentication_data: None,
customer_acceptance: None,
split_payments: None,
merchant_order_reference_id: None,
merchant_order_reference_id: payment_data.payment_intent.merchant_reference_id.clone(),
integrity_object: None,
shipping_cost: payment_data.payment_intent.amount_details.shipping_cost,
additional_payment_method_data: None,

View File

@ -775,6 +775,7 @@ pub async fn call_unified_connector_service_for_webhook(
merchant_context.get_merchant_account().get_id().clone(),
))
.external_vault_proxy_metadata(None)
.merchant_reference_id(None)
.build();
// Make UCS call - client availability already verified

View File

@ -291,7 +291,13 @@ impl
.request
.request_extended_authorization
.map(|request_extended_authorization| request_extended_authorization.is_true()),
merchant_order_reference_id: router_data.request.merchant_order_reference_id.clone(),
merchant_order_reference_id: router_data
.request
.merchant_order_reference_id
.as_ref()
.map(|merchant_order_reference_id| {
merchant_order_reference_id.get_string_repr().to_string()
}),
shipping_cost: router_data
.request
.shipping_cost

View File

@ -98,6 +98,8 @@ pub mod headers {
pub const X_CONNECTOR_HTTP_STATUS_CODE: &str = "connector_http_status_code";
#[cfg(feature = "v2")]
pub const X_CONNECTOR_HTTP_STATUS_CODE: &str = "x-connector-http-status-code";
pub const X_REFERENCE_ID: &str = "X-Reference-Id";
}
pub mod pii {

View File

@ -24,6 +24,7 @@ use crate::{
headers::{
ACCEPT_LANGUAGE, BROWSER_NAME, X_APP_ID, X_CLIENT_PLATFORM, X_CLIENT_SOURCE,
X_CLIENT_VERSION, X_MERCHANT_DOMAIN, X_PAYMENT_CONFIRM_SOURCE, X_REDIRECT_URI,
X_REFERENCE_ID,
},
services::authentication::get_header_value_by_key,
types::{
@ -1339,6 +1340,8 @@ impl ForeignTryFrom<&HeaderMap> for hyperswitch_domain_models::payments::HeaderP
let x_redirect_uri =
get_header_value_by_key(X_REDIRECT_URI.into(), headers)?.map(|val| val.to_string());
let x_reference_id =
get_header_value_by_key(X_REFERENCE_ID.into(), headers)?.map(|val| val.to_string());
Ok(Self {
payment_confirm_source,
@ -1351,6 +1354,7 @@ impl ForeignTryFrom<&HeaderMap> for hyperswitch_domain_models::payments::HeaderP
locale,
x_app_id,
x_redirect_uri,
x_reference_id,
})
}
}
@ -1427,6 +1431,8 @@ impl ForeignTryFrom<&HeaderMap> for hyperswitch_domain_models::payments::HeaderP
let x_redirect_uri =
get_header_value_by_key(X_REDIRECT_URI.into(), headers)?.map(|val| val.to_string());
let x_reference_id =
get_header_value_by_key(X_REFERENCE_ID.into(), headers)?.map(|val| val.to_string());
Ok(Self {
payment_confirm_source,
@ -1439,6 +1445,7 @@ impl ForeignTryFrom<&HeaderMap> for hyperswitch_domain_models::payments::HeaderP
locale,
x_app_id,
x_redirect_uri,
x_reference_id,
})
}
}