fix(core): add ephemeral key to payment_create response when customer_id is mentioned (#1133)

This commit is contained in:
Hrithikesh
2023-05-19 12:11:45 +05:30
committed by GitHub
parent 93dcd98640
commit f394c4abc0
20 changed files with 85 additions and 9 deletions

10
Cargo.lock generated
View File

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

View 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,
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -290,6 +290,7 @@ async fn get_tracker_for_sync<
creds_identifier,
pm_token: None,
connector_customer_id: None,
ephemeral_key: None,
},
None,
))

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1 @@
pub use api_models::ephemeral_key::*;

View File

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