mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +08:00
fix(core): add ephemeral key to payment_create response when customer_id is mentioned (#1133)
This commit is contained in:
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -3000,7 +3000,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "opentelemetry"
|
||||
version = "0.18.0"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
dependencies = [
|
||||
"opentelemetry_api",
|
||||
"opentelemetry_sdk",
|
||||
@ -3009,7 +3009,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "opentelemetry-otlp"
|
||||
version = "0.11.0"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"futures",
|
||||
@ -3026,7 +3026,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "opentelemetry-proto"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"futures-util",
|
||||
@ -3038,7 +3038,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "opentelemetry_api"
|
||||
version = "0.18.0"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"futures-channel",
|
||||
@ -3053,7 +3053,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "opentelemetry_sdk"
|
||||
version = "0.18.0"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"crossbeam-channel",
|
||||
|
||||
14
crates/api_models/src/ephemeral_key.rs
Normal file
14
crates/api_models/src/ephemeral_key.rs
Normal file
@ -0,0 +1,14 @@
|
||||
use serde;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone, Eq, PartialEq, ToSchema)]
|
||||
pub struct EphemeralKeyCreateResponse {
|
||||
/// customer_id to which this ephemeral key belongs to
|
||||
pub customer_id: String,
|
||||
/// time at which this ephemeral key was created
|
||||
pub created_at: i64,
|
||||
/// time at which this ephemeral key would expire
|
||||
pub expires: i64,
|
||||
/// ephemeral key
|
||||
pub secret: String,
|
||||
}
|
||||
@ -6,6 +6,7 @@ pub mod cards_info;
|
||||
pub mod customers;
|
||||
pub mod disputes;
|
||||
pub mod enums;
|
||||
pub mod ephemeral_key;
|
||||
#[cfg(feature = "errors")]
|
||||
pub mod errors;
|
||||
pub mod files;
|
||||
|
||||
@ -7,7 +7,9 @@ use router_derive::Setter;
|
||||
use time::PrimitiveDateTime;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
use crate::{admin, disputes, enums as api_enums, refunds};
|
||||
use crate::{
|
||||
admin, disputes, enums as api_enums, ephemeral_key::EphemeralKeyCreateResponse, refunds,
|
||||
};
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum PaymentOp {
|
||||
@ -1190,6 +1192,9 @@ pub struct PaymentsResponse {
|
||||
/// Allowed Payment Method Types for a given PaymentIntent
|
||||
#[schema(value_type = Option<Vec<PaymentMethodType>>)]
|
||||
pub allowed_payment_method_types: Option<Vec<api_enums::PaymentMethodType>>,
|
||||
|
||||
/// ephemeral_key for the customer_id mentioned
|
||||
pub ephemeral_key: Option<EphemeralKeyCreateResponse>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, serde::Deserialize, ToSchema)]
|
||||
|
||||
@ -14,6 +14,7 @@ use error_stack::{IntoReport, ResultExt};
|
||||
use futures::future::join_all;
|
||||
use masking::Secret;
|
||||
use router_env::{instrument, tracing};
|
||||
use storage_models::ephemeral_key;
|
||||
use time;
|
||||
|
||||
pub use self::operations::{
|
||||
@ -78,7 +79,6 @@ where
|
||||
.validate_request(&req, &merchant_account)?;
|
||||
|
||||
tracing::Span::current().record("payment_id", &format!("{}", validate_result.payment_id));
|
||||
|
||||
let (operation, mut payment_data, customer_details) = operation
|
||||
.to_get_tracker()?
|
||||
.get_trackers(
|
||||
@ -887,6 +887,7 @@ where
|
||||
pub creds_identifier: Option<String>,
|
||||
pub pm_token: Option<String>,
|
||||
pub connector_customer_id: Option<String>,
|
||||
pub ephemeral_key: Option<ephemeral_key::EphemeralKey>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
|
||||
@ -151,6 +151,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsCancelRequest>
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
None,
|
||||
))
|
||||
|
||||
@ -157,6 +157,7 @@ impl<F: Send + Clone> GetTracker<F, payments::PaymentData<F>, api::PaymentsCaptu
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
None,
|
||||
))
|
||||
|
||||
@ -194,6 +194,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Co
|
||||
creds_identifier: None,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
Some(CustomerDetails {
|
||||
customer_id: request.customer_id.clone(),
|
||||
|
||||
@ -228,6 +228,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
Some(CustomerDetails {
|
||||
customer_id: request.customer_id.clone(),
|
||||
|
||||
@ -5,6 +5,7 @@ use common_utils::ext_traits::{AsyncExt, Encode, ValueExt};
|
||||
use error_stack::{self, ResultExt};
|
||||
use router_derive::PaymentOperation;
|
||||
use router_env::{instrument, tracing};
|
||||
use storage_models::ephemeral_key;
|
||||
use uuid::Uuid;
|
||||
|
||||
use super::{BoxedOperation, Domain, GetTracker, Operation, UpdateTracker, ValidateRequest};
|
||||
@ -17,6 +18,7 @@ use crate::{
|
||||
},
|
||||
db::StorageInterface,
|
||||
routes::AppState,
|
||||
services,
|
||||
types::{
|
||||
self,
|
||||
api::{self, PaymentIdTypeExt},
|
||||
@ -48,7 +50,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
||||
Option<CustomerDetails>,
|
||||
)> {
|
||||
let db = &*state.store;
|
||||
|
||||
let ephemeral_key = Self::get_ephemeral_key(request, state, merchant_account).await;
|
||||
let merchant_id = &merchant_account.merchant_id;
|
||||
let storage_scheme = merchant_account.storage_scheme;
|
||||
|
||||
@ -238,6 +240,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key,
|
||||
},
|
||||
Some(CustomerDetails {
|
||||
customer_id: request.customer_id.clone(),
|
||||
@ -577,6 +580,31 @@ impl PaymentCreate {
|
||||
encoded_data: None,
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
pub async fn get_ephemeral_key(
|
||||
request: &api::PaymentsRequest,
|
||||
state: &AppState,
|
||||
merchant_account: &storage::MerchantAccount,
|
||||
) -> Option<ephemeral_key::EphemeralKey> {
|
||||
match request.customer_id.clone() {
|
||||
Some(customer_id) => helpers::make_ephemeral_key(
|
||||
state,
|
||||
customer_id,
|
||||
merchant_account.merchant_id.clone(),
|
||||
)
|
||||
.await
|
||||
.ok()
|
||||
.and_then(|ek| {
|
||||
if let services::ApplicationResponse::Json(ek) = ek {
|
||||
Some(ek)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}),
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
|
||||
@ -178,6 +178,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::VerifyRequest> for Paym
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
Some(payments::CustomerDetails {
|
||||
customer_id: request.customer_id.clone(),
|
||||
|
||||
@ -171,6 +171,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsSessionRequest>
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
Some(customer_details),
|
||||
))
|
||||
|
||||
@ -142,6 +142,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsStartRequest> f
|
||||
creds_identifier: None,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
Some(customer_details),
|
||||
))
|
||||
|
||||
@ -290,6 +290,7 @@ async fn get_tracker_for_sync<
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
None,
|
||||
))
|
||||
|
||||
@ -294,6 +294,7 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
||||
creds_identifier,
|
||||
pm_token: None,
|
||||
connector_customer_id: None,
|
||||
ephemeral_key: None,
|
||||
},
|
||||
Some(CustomerDetails {
|
||||
customer_id: request.customer_id.clone(),
|
||||
|
||||
@ -3,6 +3,7 @@ use std::{fmt::Debug, marker::PhantomData};
|
||||
use common_utils::fp_utils;
|
||||
use error_stack::{IntoReport, ResultExt};
|
||||
use router_env::{instrument, tracing};
|
||||
use storage_models::ephemeral_key;
|
||||
|
||||
use super::{flows::Feature, PaymentAddress, PaymentData};
|
||||
use crate::{
|
||||
@ -164,6 +165,7 @@ where
|
||||
server,
|
||||
payment_data.connector_response.authentication_data,
|
||||
operation,
|
||||
payment_data.ephemeral_key,
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -254,6 +256,7 @@ pub fn payments_to_payments_response<R, Op>(
|
||||
server: &Server,
|
||||
redirection_data: Option<serde_json::Value>,
|
||||
operation: Op,
|
||||
ephemeral_key_option: Option<ephemeral_key::EphemeralKey>,
|
||||
) -> RouterResponse<api::PaymentsResponse>
|
||||
where
|
||||
Op: Debug,
|
||||
@ -418,6 +421,7 @@ where
|
||||
parsed_metadata
|
||||
.and_then(|metadata| metadata.allowed_payment_method_types),
|
||||
)
|
||||
.set_ephemeral_key(ephemeral_key_option.map(ForeignFrom::foreign_from))
|
||||
.to_owned(),
|
||||
)
|
||||
}
|
||||
@ -489,6 +493,17 @@ impl ForeignFrom<(storage::PaymentIntent, storage::PaymentAttempt)> for api::Pay
|
||||
}
|
||||
}
|
||||
|
||||
impl ForeignFrom<ephemeral_key::EphemeralKey> for api::ephemeral_key::EphemeralKeyCreateResponse {
|
||||
fn foreign_from(from: ephemeral_key::EphemeralKey) -> Self {
|
||||
Self {
|
||||
customer_id: from.customer_id,
|
||||
created_at: from.created_at,
|
||||
expires: from.expires,
|
||||
secret: from.secret,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct PaymentAdditionalData<'a, F>
|
||||
where
|
||||
|
||||
@ -209,6 +209,7 @@ Never share your secret api keys. Keep them guarded and secure.
|
||||
api_models::mandates::MandateRevokedResponse,
|
||||
api_models::mandates::MandateResponse,
|
||||
api_models::mandates::MandateCardDetails,
|
||||
api_models::ephemeral_key::EphemeralKeyCreateResponse,
|
||||
crate::types::api::admin::MerchantAccountResponse,
|
||||
crate::types::api::admin::MerchantConnectorId,
|
||||
crate::types::api::admin::MerchantDetails,
|
||||
|
||||
@ -4,6 +4,7 @@ pub mod configs;
|
||||
pub mod customers;
|
||||
pub mod disputes;
|
||||
pub mod enums;
|
||||
pub mod ephemeral_key;
|
||||
pub mod files;
|
||||
pub mod mandates;
|
||||
pub mod payment_methods;
|
||||
|
||||
1
crates/router/src/types/api/ephemeral_key.rs
Normal file
1
crates/router/src/types/api/ephemeral_key.rs
Normal file
@ -0,0 +1 @@
|
||||
pub use api_models::ephemeral_key::*;
|
||||
@ -5,7 +5,7 @@ pub struct EphemeralKeyNew {
|
||||
pub secret: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
||||
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
|
||||
pub struct EphemeralKey {
|
||||
pub id: String,
|
||||
pub merchant_id: String,
|
||||
|
||||
Reference in New Issue
Block a user