Skip to content

Commit 97b45f7

Browse files
chore(fix): [XENDIT] Make CVV Optional and fix Capture flow (#8921)
1 parent 50f0b97 commit 97b45f7

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

crates/hyperswitch_connectors/src/connectors/xendit.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -626,31 +626,18 @@ impl ConnectorIntegration<Capture, PaymentsCaptureData, PaymentsResponseData> fo
626626
event_builder: Option<&mut ConnectorEvent>,
627627
res: Response,
628628
) -> CustomResult<PaymentsCaptureRouterData, errors::ConnectorError> {
629-
let response: xendit::XenditPaymentResponse = res
629+
let response: xendit::XenditCaptureResponse = res
630630
.response
631631
.parse_struct("Xendit PaymentsResponse")
632632
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
633-
634-
let response_integrity_object = connector_utils::get_capture_integrity_object(
635-
self.amount_converter,
636-
Some(response.amount),
637-
response.currency.to_string().clone(),
638-
)?;
639-
640633
event_builder.map(|i| i.set_response_body(&response));
641634
router_env::logger::info!(connector_response=?response);
642-
643-
let new_router_data = RouterData::try_from(ResponseRouterData {
635+
RouterData::try_from(ResponseRouterData {
644636
response,
645637
data: data.clone(),
646638
http_code: res.status_code,
647639
})
648-
.change_context(errors::ConnectorError::ResponseHandlingFailed);
649-
650-
new_router_data.map(|mut router_data| {
651-
router_data.request.integrity_object = Some(response_integrity_object);
652-
router_data
653-
})
640+
.change_context(errors::ConnectorError::ResponseHandlingFailed)
654641
}
655642

656643
fn get_error_response(

crates/hyperswitch_connectors/src/connectors/xendit/transformers.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ pub struct CardInformation {
133133
pub card_number: CardNumber,
134134
pub expiry_month: Secret<String>,
135135
pub expiry_year: Secret<String>,
136-
pub cvv: Secret<String>,
136+
#[serde(skip_serializing_if = "Option::is_none")]
137+
pub cvv: Option<Secret<String>>,
137138
pub cardholder_name: Secret<String>,
138139
pub cardholder_email: pii::Email,
139140
pub cardholder_phone_number: Secret<String>,
@@ -201,6 +202,16 @@ fn map_payment_response_to_attempt_status(
201202
}
202203
}
203204

205+
#[derive(Debug, Clone, Deserialize, Serialize)]
206+
pub struct XenditCaptureResponse {
207+
pub id: String,
208+
pub status: PaymentStatus,
209+
pub actions: Option<Vec<Action>>,
210+
pub payment_method: PaymentMethodInfo,
211+
pub failure_code: Option<String>,
212+
pub reference_id: Secret<String>,
213+
}
214+
204215
#[derive(Debug, Clone, Serialize, Deserialize)]
205216
#[serde(rename_all = "UPPERCASE")]
206217
pub enum MethodType {
@@ -242,7 +253,11 @@ impl TryFrom<XenditRouterData<&PaymentsAuthorizeRouterData>> for XenditPaymentsR
242253
card_number: card_data.card_number.clone(),
243254
expiry_month: card_data.card_exp_month.clone(),
244255
expiry_year: card_data.get_expiry_year_4_digit(),
245-
cvv: card_data.card_cvc.clone(),
256+
cvv: if card_data.card_cvc.clone().expose().is_empty() {
257+
None
258+
} else {
259+
Some(card_data.card_cvc.clone())
260+
},
246261
cardholder_name: card_data
247262
.get_cardholder_name()
248263
.or(item.router_data.get_billing_full_name())?,
@@ -410,20 +425,26 @@ impl<F>
410425
}
411426

412427
impl<F>
413-
TryFrom<ResponseRouterData<F, XenditPaymentResponse, PaymentsCaptureData, PaymentsResponseData>>
428+
TryFrom<ResponseRouterData<F, XenditCaptureResponse, PaymentsCaptureData, PaymentsResponseData>>
414429
for RouterData<F, PaymentsCaptureData, PaymentsResponseData>
415430
{
416431
type Error = error_stack::Report<errors::ConnectorError>;
417432

418433
fn try_from(
419434
item: ResponseRouterData<
420435
F,
421-
XenditPaymentResponse,
436+
XenditCaptureResponse,
422437
PaymentsCaptureData,
423438
PaymentsResponseData,
424439
>,
425440
) -> Result<Self, Self::Error> {
426-
let status = map_payment_response_to_attempt_status(item.response.clone(), true);
441+
let status = match item.response.status {
442+
PaymentStatus::Failed => enums::AttemptStatus::Failure,
443+
PaymentStatus::Succeeded | PaymentStatus::Verified => enums::AttemptStatus::Charged,
444+
PaymentStatus::Pending => enums::AttemptStatus::Pending,
445+
PaymentStatus::RequiresAction => enums::AttemptStatus::AuthenticationPending,
446+
PaymentStatus::AwaitingCapture => enums::AttemptStatus::Authorized,
447+
};
427448
let response = if status == enums::AttemptStatus::Failure {
428449
Err(ErrorResponse {
429450
code: item

0 commit comments

Comments
 (0)