From 97fbc899c12a0c66ac89a7feaa6d45d39239a746 Mon Sep 17 00:00:00 2001 From: Sahkal Poddar Date: Tue, 2 Apr 2024 17:45:08 +0530 Subject: [PATCH] feat(payment_link): Add payment info metadata to payment link (#4270) Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> --- crates/api_models/src/payments.rs | 6 ++--- crates/router/src/core/payment_link.rs | 27 ++++++++++++++----- .../payment_link_initiate/payment_link.html | 1 + crates/router/src/services/api.rs | 8 ++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index b719d1f7d1..2748ccbff4 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -4376,12 +4376,12 @@ pub struct PaymentLinkInitiateRequest { #[derive(Debug, serde::Serialize)] #[serde(untagged)] -pub enum PaymentLinkData { - PaymentLinkDetails(PaymentLinkDetails), +pub enum PaymentLinkData<'a> { + PaymentLinkDetails(&'a PaymentLinkDetails), PaymentLinkStatusDetails(PaymentLinkStatusDetails), } -#[derive(Debug, serde::Serialize)] +#[derive(Debug, serde::Serialize, Clone)] pub struct PaymentLinkDetails { pub amount: String, pub currency: api_enums::Currency, diff --git a/crates/router/src/core/payment_link.rs b/crates/router/src/core/payment_link.rs index 722aad26c0..94d8227989 100644 --- a/crates/router/src/core/payment_link.rs +++ b/crates/router/src/core/payment_link.rs @@ -187,7 +187,7 @@ pub async fn intiate_payment_link_flow( return_url: return_url.clone(), }; let js_script = get_js_script( - api_models::payments::PaymentLinkData::PaymentLinkStatusDetails(payment_details), + &api_models::payments::PaymentLinkData::PaymentLinkStatusDetails(payment_details), )?; let payment_link_error_data = services::PaymentLinkStatusData { js_script, @@ -215,13 +215,17 @@ pub async fn intiate_payment_link_flow( sdk_layout: payment_link_config.sdk_layout.clone(), }; - let js_script = get_js_script(api_models::payments::PaymentLinkData::PaymentLinkDetails( - payment_details, + let js_script = get_js_script(&api_models::payments::PaymentLinkData::PaymentLinkDetails( + &payment_details, ))?; + + let html_meta_tags = get_meta_tags_html(payment_details); + let payment_link_data = services::PaymentLinkFormData { js_script, sdk_url: state.conf.payment_link.sdk_url.clone(), css_script, + html_meta_tags, }; Ok(services::ApplicationResponse::PaymentLinkForm(Box::new( services::api::PaymentLinkAction::PaymentLinkFormData(payment_link_data), @@ -232,8 +236,10 @@ pub async fn intiate_payment_link_flow( The get_js_script function is used to inject dynamic value to payment_link sdk, which is unique to every payment. */ -fn get_js_script(payment_details: api_models::payments::PaymentLinkData) -> RouterResult { - let payment_details_str = serde_json::to_string(&payment_details) +fn get_js_script( + payment_details: &api_models::payments::PaymentLinkData<'_>, +) -> RouterResult { + let payment_details_str = serde_json::to_string(payment_details) .change_context(errors::ApiErrorResponse::InternalServerError) .attach_printable("Failed to serialize PaymentLinkData")?; Ok(format!("window.__PAYMENT_DETAILS = {payment_details_str};")) @@ -248,6 +254,15 @@ fn get_color_scheme_css(payment_link_config: api_models::admin::PaymentLinkConfi ) } +fn get_meta_tags_html(payment_details: api_models::payments::PaymentLinkDetails) -> String { + format!( + r#" + "#, + payment_details.merchant_name, + payment_details.merchant_description.unwrap_or_default() + ) +} + fn validate_sdk_requirements( pub_key: Option, currency: Option, @@ -562,7 +577,7 @@ pub async fn get_payment_link_status( return_url, }; let js_script = get_js_script( - api_models::payments::PaymentLinkData::PaymentLinkStatusDetails(payment_details), + &api_models::payments::PaymentLinkData::PaymentLinkStatusDetails(payment_details), )?; let payment_link_status_data = services::PaymentLinkStatusData { js_script, diff --git a/crates/router/src/core/payment_link/payment_link_initiate/payment_link.html b/crates/router/src/core/payment_link/payment_link_initiate/payment_link.html index 732e331892..6b487395c6 100644 --- a/crates/router/src/core/payment_link/payment_link_initiate/payment_link.html +++ b/crates/router/src/core/payment_link/payment_link_initiate/payment_link.html @@ -3,6 +3,7 @@ + {{rendered_meta_tag_html}} Payments requested by HyperSwitch {{ preload_link_tags }} diff --git a/crates/router/src/services/api.rs b/crates/router/src/services/api.rs index 95eb4a44c8..5a139d8da3 100644 --- a/crates/router/src/services/api.rs +++ b/crates/router/src/services/api.rs @@ -853,6 +853,7 @@ pub struct PaymentLinkFormData { pub js_script: String, pub css_script: String, pub sdk_url: String, + pub html_meta_tags: String, } #[derive(Debug, Eq, PartialEq, Clone, serde::Serialize, serde::Deserialize)] @@ -1977,6 +1978,13 @@ pub fn build_payment_link_html( let _ = tera.add_raw_template("payment_link", &html_template); + context.insert("rendered_meta_tag_html", &payment_link_data.html_meta_tags); + + context.insert( + "preload_link_tags", + &get_preload_link_html_template(&payment_link_data.sdk_url), + ); + context.insert( "preload_link_tags", &get_preload_link_html_template(&payment_link_data.sdk_url),