mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 18:17:13 +08:00 
			
		
		
		
	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>
This commit is contained in:
		| @ -4376,12 +4376,12 @@ pub struct PaymentLinkInitiateRequest { | |||||||
|  |  | ||||||
| #[derive(Debug, serde::Serialize)] | #[derive(Debug, serde::Serialize)] | ||||||
| #[serde(untagged)] | #[serde(untagged)] | ||||||
| pub enum PaymentLinkData { | pub enum PaymentLinkData<'a> { | ||||||
|     PaymentLinkDetails(PaymentLinkDetails), |     PaymentLinkDetails(&'a PaymentLinkDetails), | ||||||
|     PaymentLinkStatusDetails(PaymentLinkStatusDetails), |     PaymentLinkStatusDetails(PaymentLinkStatusDetails), | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, serde::Serialize)] | #[derive(Debug, serde::Serialize, Clone)] | ||||||
| pub struct PaymentLinkDetails { | pub struct PaymentLinkDetails { | ||||||
|     pub amount: String, |     pub amount: String, | ||||||
|     pub currency: api_enums::Currency, |     pub currency: api_enums::Currency, | ||||||
|  | |||||||
| @ -187,7 +187,7 @@ pub async fn intiate_payment_link_flow( | |||||||
|             return_url: return_url.clone(), |             return_url: return_url.clone(), | ||||||
|         }; |         }; | ||||||
|         let js_script = get_js_script( |         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 { |         let payment_link_error_data = services::PaymentLinkStatusData { | ||||||
|             js_script, |             js_script, | ||||||
| @ -215,13 +215,17 @@ pub async fn intiate_payment_link_flow( | |||||||
|         sdk_layout: payment_link_config.sdk_layout.clone(), |         sdk_layout: payment_link_config.sdk_layout.clone(), | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     let js_script = get_js_script(api_models::payments::PaymentLinkData::PaymentLinkDetails( |     let js_script = get_js_script(&api_models::payments::PaymentLinkData::PaymentLinkDetails( | ||||||
|         payment_details, |         &payment_details, | ||||||
|     ))?; |     ))?; | ||||||
|  |  | ||||||
|  |     let html_meta_tags = get_meta_tags_html(payment_details); | ||||||
|  |  | ||||||
|     let payment_link_data = services::PaymentLinkFormData { |     let payment_link_data = services::PaymentLinkFormData { | ||||||
|         js_script, |         js_script, | ||||||
|         sdk_url: state.conf.payment_link.sdk_url.clone(), |         sdk_url: state.conf.payment_link.sdk_url.clone(), | ||||||
|         css_script, |         css_script, | ||||||
|  |         html_meta_tags, | ||||||
|     }; |     }; | ||||||
|     Ok(services::ApplicationResponse::PaymentLinkForm(Box::new( |     Ok(services::ApplicationResponse::PaymentLinkForm(Box::new( | ||||||
|         services::api::PaymentLinkAction::PaymentLinkFormData(payment_link_data), |         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. | 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<String> { | fn get_js_script( | ||||||
|     let payment_details_str = serde_json::to_string(&payment_details) |     payment_details: &api_models::payments::PaymentLinkData<'_>, | ||||||
|  | ) -> RouterResult<String> { | ||||||
|  |     let payment_details_str = serde_json::to_string(payment_details) | ||||||
|         .change_context(errors::ApiErrorResponse::InternalServerError) |         .change_context(errors::ApiErrorResponse::InternalServerError) | ||||||
|         .attach_printable("Failed to serialize PaymentLinkData")?; |         .attach_printable("Failed to serialize PaymentLinkData")?; | ||||||
|     Ok(format!("window.__PAYMENT_DETAILS = {payment_details_str};")) |     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#"<meta property="og:title" content="Payment request from {0}"/> | ||||||
|  |         <meta property="og:description" content="{1}"/>"#, | ||||||
|  |         payment_details.merchant_name, | ||||||
|  |         payment_details.merchant_description.unwrap_or_default() | ||||||
|  |     ) | ||||||
|  | } | ||||||
|  |  | ||||||
| fn validate_sdk_requirements( | fn validate_sdk_requirements( | ||||||
|     pub_key: Option<String>, |     pub_key: Option<String>, | ||||||
|     currency: Option<api_models::enums::Currency>, |     currency: Option<api_models::enums::Currency>, | ||||||
| @ -562,7 +577,7 @@ pub async fn get_payment_link_status( | |||||||
|         return_url, |         return_url, | ||||||
|     }; |     }; | ||||||
|     let js_script = get_js_script( |     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 { |     let payment_link_status_data = services::PaymentLinkStatusData { | ||||||
|         js_script, |         js_script, | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ | |||||||
|   <head> |   <head> | ||||||
|     <meta charset="UTF-8" /> |     <meta charset="UTF-8" /> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||||
|  |     {{rendered_meta_tag_html}} | ||||||
|     <title>Payments requested by HyperSwitch</title> |     <title>Payments requested by HyperSwitch</title> | ||||||
|     {{ preload_link_tags }} |     {{ preload_link_tags }} | ||||||
|     <link rel="preconnect" href="https://fonts.gstatic.com"> |     <link rel="preconnect" href="https://fonts.gstatic.com"> | ||||||
|  | |||||||
| @ -853,6 +853,7 @@ pub struct PaymentLinkFormData { | |||||||
|     pub js_script: String, |     pub js_script: String, | ||||||
|     pub css_script: String, |     pub css_script: String, | ||||||
|     pub sdk_url: String, |     pub sdk_url: String, | ||||||
|  |     pub html_meta_tags: String, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, Eq, PartialEq, Clone, serde::Serialize, serde::Deserialize)] | #[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); |     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( |     context.insert( | ||||||
|         "preload_link_tags", |         "preload_link_tags", | ||||||
|         &get_preload_link_html_template(&payment_link_data.sdk_url), |         &get_preload_link_html_template(&payment_link_data.sdk_url), | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Sahkal Poddar
					Sahkal Poddar