mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
feat(connector) : [Globalpay]add mandates and bank redirects support for globalpay (#830)
Signed-off-by: chikke srujan <121822803+srujanchikke@users.noreply.github.com>
This commit is contained in:
@ -18,7 +18,10 @@ use self::{
|
|||||||
use crate::{
|
use crate::{
|
||||||
configs::settings,
|
configs::settings,
|
||||||
connector::utils as conn_utils,
|
connector::utils as conn_utils,
|
||||||
core::errors::{self, CustomResult},
|
core::{
|
||||||
|
errors::{self, CustomResult},
|
||||||
|
payments,
|
||||||
|
},
|
||||||
db, headers,
|
db, headers,
|
||||||
services::{self, ConnectorIntegration},
|
services::{self, ConnectorIntegration},
|
||||||
types::{
|
types::{
|
||||||
@ -882,3 +885,27 @@ impl api::IncomingWebhook for Globalpay {
|
|||||||
Ok(res_json)
|
Ok(res_json)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl services::ConnectorRedirectResponse for Globalpay {
|
||||||
|
fn get_flow_type(
|
||||||
|
&self,
|
||||||
|
query_params: &str,
|
||||||
|
_json_payload: Option<Value>,
|
||||||
|
_action: services::PaymentAction,
|
||||||
|
) -> CustomResult<payments::CallConnectorAction, errors::ConnectorError> {
|
||||||
|
let query = serde_urlencoded::from_str::<response::GlobalpayRedirectResponse>(query_params)
|
||||||
|
.into_report()
|
||||||
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
|
Ok(query.status.map_or(
|
||||||
|
payments::CallConnectorAction::Trigger,
|
||||||
|
|status| match status {
|
||||||
|
response::GlobalpayPaymentStatus::Captured => {
|
||||||
|
payments::CallConnectorAction::StatusUpdate(
|
||||||
|
storage_models::enums::AttemptStatus::from(status),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => payments::CallConnectorAction::Trigger,
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -332,9 +332,6 @@ pub struct Card {
|
|||||||
pub chip_condition: Option<ChipCondition>,
|
pub chip_condition: Option<ChipCondition>,
|
||||||
/// The numeric value printed on the physical card.
|
/// The numeric value printed on the physical card.
|
||||||
pub cvv: Secret<String>,
|
pub cvv: Secret<String>,
|
||||||
/// Card Verification Value Indicator sent by the Merchant indicating the CVV
|
|
||||||
/// availability.
|
|
||||||
pub cvv_indicator: CvvIndicator,
|
|
||||||
/// The 2 digit expiry date month of the card.
|
/// The 2 digit expiry date month of the card.
|
||||||
pub expiry_month: Secret<String>,
|
pub expiry_month: Secret<String>,
|
||||||
/// The 2 digit expiry date year of the card.
|
/// The 2 digit expiry date year of the card.
|
||||||
@ -375,8 +372,6 @@ pub struct StoredCredential {
|
|||||||
/// Indicates the transaction processing model being executed when using stored
|
/// Indicates the transaction processing model being executed when using stored
|
||||||
/// credentials.
|
/// credentials.
|
||||||
pub model: Option<Model>,
|
pub model: Option<Model>,
|
||||||
/// The reason stored credentials are being used to to create a transaction.
|
|
||||||
pub reason: Option<Reason>,
|
|
||||||
/// Indicates the order of this transaction in the sequence of a planned repeating
|
/// Indicates the order of this transaction in the sequence of a planned repeating
|
||||||
/// transaction processing model.
|
/// transaction processing model.
|
||||||
pub sequence: Option<Sequence>,
|
pub sequence: Option<Sequence>,
|
||||||
@ -578,6 +573,7 @@ pub enum ApmProvider {
|
|||||||
Ideal,
|
Ideal,
|
||||||
Paypal,
|
Paypal,
|
||||||
Sofort,
|
Sofort,
|
||||||
|
Eps,
|
||||||
Testpay,
|
Testpay,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -642,20 +638,6 @@ pub enum ChipCondition {
|
|||||||
PrevSuccess,
|
PrevSuccess,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Card Verification Value Indicator sent by the Merchant indicating the CVV
|
|
||||||
/// availability.
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
|
|
||||||
pub enum CvvIndicator {
|
|
||||||
/// indicates the cvv is present but cannot be read.
|
|
||||||
Illegible,
|
|
||||||
/// indicates the cvv is not present on the card.
|
|
||||||
NotPresent,
|
|
||||||
#[default]
|
|
||||||
/// indicates the cvv is present.
|
|
||||||
Present,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Indicates whether the card is a debit or credit card.
|
/// Indicates whether the card is a debit or credit card.
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
|
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use url::Url;
|
|
||||||
|
|
||||||
use super::requests;
|
use super::requests;
|
||||||
|
|
||||||
@ -133,8 +132,6 @@ pub struct PaymentMethod {
|
|||||||
pub message: Option<String>,
|
pub message: Option<String>,
|
||||||
/// Result code from the payment method provider.
|
/// Result code from the payment method provider.
|
||||||
pub result: Option<String>,
|
pub result: Option<String>,
|
||||||
/// Redirect url for payment method provider
|
|
||||||
pub redirect_url: Option<Url>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Data associated with the response of an APM transaction.
|
/// Data associated with the response of an APM transaction.
|
||||||
@ -156,7 +153,12 @@ pub struct Apm {
|
|||||||
/// The reference the payment method provider created for the transaction.
|
/// The reference the payment method provider created for the transaction.
|
||||||
pub provider_transaction_reference: Option<String>,
|
pub provider_transaction_reference: Option<String>,
|
||||||
/// URL to redirect the payer from the merchant's system to the payment method's system.
|
/// URL to redirect the payer from the merchant's system to the payment method's system.
|
||||||
pub redirect_url: Option<Url>,
|
//1)paypal sends redirect_url as provider_redirect_url for require_customer_action
|
||||||
|
//2)bankredirects sends redirect_url as redirect_url for require_customer_action
|
||||||
|
//3)after completeauthorize in paypal it doesn't send redirect_url
|
||||||
|
//4)after customer action in bankredirects it sends empty string in redirect_url
|
||||||
|
#[serde(alias = "provider_redirect_url")]
|
||||||
|
pub redirect_url: Option<String>,
|
||||||
/// A string generated by the payment method to represent the session created on the payment
|
/// A string generated by the payment method to represent the session created on the payment
|
||||||
/// method's platform to facilitate the creation of a transaction.
|
/// method's platform to facilitate the creation of a transaction.
|
||||||
pub session_token: Option<String>,
|
pub session_token: Option<String>,
|
||||||
@ -283,6 +285,7 @@ pub enum ApmProvider {
|
|||||||
Ideal,
|
Ideal,
|
||||||
Paypal,
|
Paypal,
|
||||||
Sofort,
|
Sofort,
|
||||||
|
Eps,
|
||||||
Testpay,
|
Testpay,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,3 +419,8 @@ pub enum GlobalpayWebhookStatus {
|
|||||||
Declined,
|
Declined,
|
||||||
Captured,
|
Captured,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct GlobalpayRedirectResponse {
|
||||||
|
pub status: Option<GlobalpayPaymentStatus>,
|
||||||
|
}
|
||||||
|
|||||||
@ -1,17 +1,21 @@
|
|||||||
use common_utils::crypto::{self, GenerateDigest};
|
use common_utils::crypto::{self, GenerateDigest};
|
||||||
use error_stack::ResultExt;
|
use error_stack::{IntoReport, ResultExt};
|
||||||
use rand::distributions::DistString;
|
use rand::distributions::DistString;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
requests::{self, GlobalpayPaymentsRequest, GlobalpayRefreshTokenRequest},
|
requests::{
|
||||||
|
self, ApmProvider, GlobalpayPaymentsRequest, GlobalpayRefreshTokenRequest, Initiator,
|
||||||
|
PaymentMethodData, StoredCredential,
|
||||||
|
},
|
||||||
response::{GlobalpayPaymentStatus, GlobalpayPaymentsResponse, GlobalpayRefreshTokenResponse},
|
response::{GlobalpayPaymentStatus, GlobalpayPaymentsResponse, GlobalpayRefreshTokenResponse},
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
connector::utils::{self, RouterData, WalletData},
|
connector::utils::{self, PaymentsAuthorizeRequestData, RouterData, WalletData},
|
||||||
consts,
|
consts,
|
||||||
core::errors,
|
core::errors,
|
||||||
services::{self},
|
services::{self, RedirectForm},
|
||||||
types::{self, api, storage::enums, ErrorResponse},
|
types::{self, api, storage::enums, ErrorResponse},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -26,46 +30,8 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for GlobalpayPaymentsRequest {
|
|||||||
let metadata: GlobalPayMeta =
|
let metadata: GlobalPayMeta =
|
||||||
utils::to_connector_meta_from_secret(item.connector_meta_data.clone())?;
|
utils::to_connector_meta_from_secret(item.connector_meta_data.clone())?;
|
||||||
let account_name = metadata.account_name;
|
let account_name = metadata.account_name;
|
||||||
let payment_method_data = match item.request.payment_method_data.clone() {
|
let (initiator, stored_credential, brand_reference) = get_mandate_details(item)?;
|
||||||
api::PaymentMethodData::Card(ccard) => {
|
let payment_method_data = get_payment_method_data(item, brand_reference)?;
|
||||||
requests::PaymentMethodData::Card(requests::Card {
|
|
||||||
number: ccard.card_number,
|
|
||||||
expiry_month: ccard.card_exp_month,
|
|
||||||
expiry_year: ccard.card_exp_year,
|
|
||||||
cvv: ccard.card_cvc,
|
|
||||||
account_type: None,
|
|
||||||
authcode: None,
|
|
||||||
avs_address: None,
|
|
||||||
avs_postal_code: None,
|
|
||||||
brand_reference: None,
|
|
||||||
chip_condition: None,
|
|
||||||
cvv_indicator: Default::default(),
|
|
||||||
funding: None,
|
|
||||||
pin_block: None,
|
|
||||||
tag: None,
|
|
||||||
track: None,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
api::PaymentMethodData::Wallet(wallet_data) => match wallet_data {
|
|
||||||
api_models::payments::WalletData::PaypalRedirect(_) => {
|
|
||||||
requests::PaymentMethodData::Apm(requests::Apm {
|
|
||||||
provider: Some(requests::ApmProvider::Paypal),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
api_models::payments::WalletData::GooglePay(_) => {
|
|
||||||
requests::PaymentMethodData::DigitalWallet(requests::DigitalWallet {
|
|
||||||
provider: Some(requests::DigitalWalletProvider::PayByGoogle),
|
|
||||||
payment_token: wallet_data.get_wallet_token_as_json()?,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
_ => Err(errors::ConnectorError::NotImplemented(
|
|
||||||
"Payment methods".to_string(),
|
|
||||||
))?,
|
|
||||||
},
|
|
||||||
_ => Err(errors::ConnectorError::NotImplemented(
|
|
||||||
"Payment methods".to_string(),
|
|
||||||
))?,
|
|
||||||
};
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
account_name,
|
account_name,
|
||||||
amount: Some(item.request.amount.to_string()),
|
amount: Some(item.request.amount.to_string()),
|
||||||
@ -87,7 +53,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for GlobalpayPaymentsRequest {
|
|||||||
storage_mode: None,
|
storage_mode: None,
|
||||||
},
|
},
|
||||||
notifications: Some(requests::Notifications {
|
notifications: Some(requests::Notifications {
|
||||||
return_url: item.request.complete_authorize_url.clone(),
|
return_url: get_return_url(item),
|
||||||
challenge_return_url: None,
|
challenge_return_url: None,
|
||||||
decoupled_challenge_return_url: None,
|
decoupled_challenge_return_url: None,
|
||||||
status_url: item.request.webhook_url.clone(),
|
status_url: item.request.webhook_url.clone(),
|
||||||
@ -101,14 +67,14 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for GlobalpayPaymentsRequest {
|
|||||||
description: None,
|
description: None,
|
||||||
device: None,
|
device: None,
|
||||||
gratuity_amount: None,
|
gratuity_amount: None,
|
||||||
initiator: None,
|
initiator,
|
||||||
ip_address: None,
|
ip_address: None,
|
||||||
language: None,
|
language: None,
|
||||||
lodging: None,
|
lodging: None,
|
||||||
order: None,
|
order: None,
|
||||||
payer_reference: None,
|
payer_reference: None,
|
||||||
site_reference: None,
|
site_reference: None,
|
||||||
stored_credential: None,
|
stored_credential,
|
||||||
surcharge_amount: None,
|
surcharge_amount: None,
|
||||||
total_capture_count: None,
|
total_capture_count: None,
|
||||||
globalpay_payments_request_type: None,
|
globalpay_payments_request_type: None,
|
||||||
@ -226,11 +192,12 @@ impl From<Option<enums::CaptureMethod>> for requests::CaptureMode {
|
|||||||
fn get_payment_response(
|
fn get_payment_response(
|
||||||
status: enums::AttemptStatus,
|
status: enums::AttemptStatus,
|
||||||
response: GlobalpayPaymentsResponse,
|
response: GlobalpayPaymentsResponse,
|
||||||
|
redirection_data: Option<RedirectForm>,
|
||||||
) -> Result<types::PaymentsResponseData, ErrorResponse> {
|
) -> Result<types::PaymentsResponseData, ErrorResponse> {
|
||||||
let redirection_data = response.payment_method.as_ref().and_then(|payment_method| {
|
let mandate_reference = response.payment_method.as_ref().and_then(|pm| {
|
||||||
payment_method.redirect_url.as_ref().map(|redirect_url| {
|
pm.card
|
||||||
services::RedirectForm::from((redirect_url.to_owned(), services::Method::Get))
|
.as_ref()
|
||||||
})
|
.and_then(|card| card.brand_reference.to_owned())
|
||||||
});
|
});
|
||||||
match status {
|
match status {
|
||||||
enums::AttemptStatus::Failure => Err(ErrorResponse {
|
enums::AttemptStatus::Failure => Err(ErrorResponse {
|
||||||
@ -243,7 +210,7 @@ fn get_payment_response(
|
|||||||
_ => Ok(types::PaymentsResponseData::TransactionResponse {
|
_ => Ok(types::PaymentsResponseData::TransactionResponse {
|
||||||
resource_id: types::ResponseId::ConnectorTransactionId(response.id),
|
resource_id: types::ResponseId::ConnectorTransactionId(response.id),
|
||||||
redirection_data,
|
redirection_data,
|
||||||
mandate_reference: None,
|
mandate_reference,
|
||||||
connector_metadata: None,
|
connector_metadata: None,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
@ -263,9 +230,28 @@ impl<F, T>
|
|||||||
>,
|
>,
|
||||||
) -> Result<Self, Self::Error> {
|
) -> Result<Self, Self::Error> {
|
||||||
let status = enums::AttemptStatus::from(item.response.status);
|
let status = enums::AttemptStatus::from(item.response.status);
|
||||||
|
let redirect_url = item
|
||||||
|
.response
|
||||||
|
.payment_method
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|payment_method| {
|
||||||
|
payment_method
|
||||||
|
.apm
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|apm| apm.redirect_url.as_ref())
|
||||||
|
})
|
||||||
|
.filter(|redirect_str| !redirect_str.is_empty())
|
||||||
|
.map(|url| {
|
||||||
|
Url::parse(url)
|
||||||
|
.into_report()
|
||||||
|
.change_context(errors::ConnectorError::FailedToObtainIntegrationUrl)
|
||||||
|
})
|
||||||
|
.transpose()?;
|
||||||
|
let redirection_data =
|
||||||
|
redirect_url.map(|url| services::RedirectForm::from((url, services::Method::Get)));
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
status,
|
status,
|
||||||
response: get_payment_response(status, item.response),
|
response: get_payment_response(status, item.response, redirection_data),
|
||||||
..item.data
|
..item.data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -338,3 +324,120 @@ pub struct GlobalpayErrorResponse {
|
|||||||
pub detailed_error_code: String,
|
pub detailed_error_code: String,
|
||||||
pub detailed_error_description: String,
|
pub detailed_error_description: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_payment_method_data(
|
||||||
|
item: &types::PaymentsAuthorizeRouterData,
|
||||||
|
brand_reference: Option<String>,
|
||||||
|
) -> Result<PaymentMethodData, error_stack::Report<errors::ConnectorError>> {
|
||||||
|
match &item.request.payment_method_data {
|
||||||
|
api::PaymentMethodData::Card(ccard) => Ok(PaymentMethodData::Card(requests::Card {
|
||||||
|
number: ccard.card_number.clone(),
|
||||||
|
expiry_month: ccard.card_exp_month.clone(),
|
||||||
|
expiry_year: ccard.card_exp_year.clone(),
|
||||||
|
cvv: ccard.card_cvc.clone(),
|
||||||
|
account_type: None,
|
||||||
|
authcode: None,
|
||||||
|
avs_address: None,
|
||||||
|
avs_postal_code: None,
|
||||||
|
brand_reference,
|
||||||
|
chip_condition: None,
|
||||||
|
funding: None,
|
||||||
|
pin_block: None,
|
||||||
|
tag: None,
|
||||||
|
track: None,
|
||||||
|
})),
|
||||||
|
api::PaymentMethodData::Wallet(wallet_data) => get_wallet_data(wallet_data),
|
||||||
|
api::PaymentMethodData::BankRedirect(bank_redirect) => {
|
||||||
|
get_bank_redirect_data(bank_redirect)
|
||||||
|
}
|
||||||
|
_ => Err(errors::ConnectorError::NotImplemented(
|
||||||
|
"Payment methods".to_string(),
|
||||||
|
))?,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_return_url(item: &types::PaymentsAuthorizeRouterData) -> Option<String> {
|
||||||
|
match item.request.payment_method_data.clone() {
|
||||||
|
api::PaymentMethodData::Wallet(api_models::payments::WalletData::PaypalRedirect(_)) => {
|
||||||
|
item.request.complete_authorize_url.clone()
|
||||||
|
}
|
||||||
|
_ => item.request.router_return_url.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type MandateDetails = (Option<Initiator>, Option<StoredCredential>, Option<String>);
|
||||||
|
fn get_mandate_details(
|
||||||
|
item: &types::PaymentsAuthorizeRouterData,
|
||||||
|
) -> Result<MandateDetails, error_stack::Report<errors::ConnectorError>> {
|
||||||
|
Ok(if item.request.is_mandate_payment() {
|
||||||
|
let connector_mandate_id = item
|
||||||
|
.request
|
||||||
|
.mandate_id
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|mandate_ids| mandate_ids.connector_mandate_id.clone());
|
||||||
|
(
|
||||||
|
Some(match item.request.off_session {
|
||||||
|
Some(true) => Initiator::Merchant,
|
||||||
|
_ => Initiator::Payer,
|
||||||
|
}),
|
||||||
|
Some(StoredCredential {
|
||||||
|
model: Some(requests::Model::Recurring),
|
||||||
|
sequence: Some(match connector_mandate_id.is_some() {
|
||||||
|
true => requests::Sequence::Subsequent,
|
||||||
|
false => requests::Sequence::First,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
connector_mandate_id,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(None, None, None)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_wallet_data(
|
||||||
|
wallet_data: &api_models::payments::WalletData,
|
||||||
|
) -> Result<PaymentMethodData, error_stack::Report<errors::ConnectorError>> {
|
||||||
|
match wallet_data {
|
||||||
|
api_models::payments::WalletData::PaypalRedirect(_) => {
|
||||||
|
Ok(PaymentMethodData::Apm(requests::Apm {
|
||||||
|
provider: Some(ApmProvider::Paypal),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
api_models::payments::WalletData::GooglePay(_) => {
|
||||||
|
Ok(PaymentMethodData::DigitalWallet(requests::DigitalWallet {
|
||||||
|
provider: Some(requests::DigitalWalletProvider::PayByGoogle),
|
||||||
|
payment_token: wallet_data.get_wallet_token_as_json()?,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
_ => Err(errors::ConnectorError::NotImplemented(
|
||||||
|
"Payment methods".to_string(),
|
||||||
|
))?,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_bank_redirect_data(
|
||||||
|
bank_redirect: &api_models::payments::BankRedirectData,
|
||||||
|
) -> Result<PaymentMethodData, error_stack::Report<errors::ConnectorError>> {
|
||||||
|
match bank_redirect {
|
||||||
|
api_models::payments::BankRedirectData::Eps { .. } => {
|
||||||
|
Ok(PaymentMethodData::Apm(requests::Apm {
|
||||||
|
provider: Some(ApmProvider::Eps),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
api_models::payments::BankRedirectData::Giropay { .. } => {
|
||||||
|
Ok(PaymentMethodData::Apm(requests::Apm {
|
||||||
|
provider: Some(ApmProvider::Giropay),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
api_models::payments::BankRedirectData::Ideal { .. } => {
|
||||||
|
Ok(PaymentMethodData::Apm(requests::Apm {
|
||||||
|
provider: Some(ApmProvider::Ideal),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
api_models::payments::BankRedirectData::Sofort { .. } => {
|
||||||
|
Ok(PaymentMethodData::Apm(requests::Apm {
|
||||||
|
provider: Some(ApmProvider::Sofort),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -145,6 +145,7 @@ pub trait PaymentsAuthorizeRequestData {
|
|||||||
fn get_browser_info(&self) -> Result<types::BrowserInformation, Error>;
|
fn get_browser_info(&self) -> Result<types::BrowserInformation, Error>;
|
||||||
fn get_card(&self) -> Result<api::Card, Error>;
|
fn get_card(&self) -> Result<api::Card, Error>;
|
||||||
fn get_return_url(&self) -> Result<String, Error>;
|
fn get_return_url(&self) -> Result<String, Error>;
|
||||||
|
fn is_mandate_payment(&self) -> bool;
|
||||||
fn get_webhook_url(&self) -> Result<String, Error>;
|
fn get_webhook_url(&self) -> Result<String, Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,6 +172,14 @@ impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
|
|||||||
.clone()
|
.clone()
|
||||||
.ok_or_else(missing_field_err("return_url"))
|
.ok_or_else(missing_field_err("return_url"))
|
||||||
}
|
}
|
||||||
|
fn is_mandate_payment(&self) -> bool {
|
||||||
|
self.setup_mandate_details.is_some()
|
||||||
|
|| self
|
||||||
|
.mandate_id
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|mandate_ids| mandate_ids.connector_mandate_id.as_ref())
|
||||||
|
.is_some()
|
||||||
|
}
|
||||||
fn get_webhook_url(&self) -> Result<String, Error> {
|
fn get_webhook_url(&self) -> Result<String, Error> {
|
||||||
self.router_return_url
|
self.router_return_url
|
||||||
.clone()
|
.clone()
|
||||||
|
|||||||
@ -141,7 +141,6 @@ default_imp_for_connector_redirect_response!(
|
|||||||
connector::Cybersource,
|
connector::Cybersource,
|
||||||
connector::Dlocal,
|
connector::Dlocal,
|
||||||
connector::Fiserv,
|
connector::Fiserv,
|
||||||
connector::Globalpay,
|
|
||||||
connector::Klarna,
|
connector::Klarna,
|
||||||
connector::Multisafepay,
|
connector::Multisafepay,
|
||||||
connector::Opennode,
|
connector::Opennode,
|
||||||
|
|||||||
Reference in New Issue
Block a user