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:
Sahkal Poddar
2024-04-02 17:45:08 +05:30
committed by GitHub
parent 88b53b0d5c
commit 97fbc899c1
4 changed files with 33 additions and 9 deletions

View File

@ -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,

View File

@ -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<String> {
let payment_details_str = serde_json::to_string(&payment_details)
fn get_js_script(
payment_details: &api_models::payments::PaymentLinkData<'_>,
) -> RouterResult<String> {
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#"<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(
pub_key: Option<String>,
currency: Option<api_models::enums::Currency>,
@ -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,

View File

@ -3,6 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{{rendered_meta_tag_html}}
<title>Payments requested by HyperSwitch</title>
{{ preload_link_tags }}
<link rel="preconnect" href="https://fonts.gstatic.com">

View File

@ -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),