Skip to main content

emv_3ds/message/
creq.rs

1use crate::types::{ChallengeWindowSize, MessageVersion};
2use serde::{Deserialize, Serialize};
3
4/// EMV 3DS Challenge Request (CReq).
5///
6/// Sent by the browser (or SDK) to the ACS to initiate or continue the
7/// challenge flow. For browser channel this is typically submitted as a
8/// hidden form POST; for app channel it is sent directly from the SDK.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct ChallengeRequest {
12    pub message_type: MessageType,
13    pub message_version: MessageVersion,
14    #[serde(rename = "threeDSServerTransID")]
15    pub three_ds_server_trans_id: String,
16    #[serde(rename = "acsTransID")]
17    pub acs_trans_id: String,
18    /// Cardholder-provided challenge data (OTP, text, selected option, etc.).
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub challenge_data_entry: Option<String>,
21    /// Preferred challenge window dimensions (browser channel only).
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub challenge_window_size: Option<ChallengeWindowSize>,
24    /// "Y" once the cardholder has completed the challenge.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub challenge_completion_ind: Option<CompletionIndicator>,
27    /// SDK transaction ID (app channel only).
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub sdk_trans_id: Option<String>,
30    /// HTML cancel requested by cardholder.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub resend_challenge: Option<ResendChallenge>,
33    /// Merchant whitelist opt-in preference (v2.2+).
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub whitelist_status_source: Option<String>,
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
39pub enum MessageType {
40    CReq,
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
44pub enum CompletionIndicator {
45    #[serde(rename = "Y")]
46    Completed,
47    #[serde(rename = "N")]
48    NotCompleted,
49}
50
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
52pub enum ResendChallenge {
53    #[serde(rename = "Y")]
54    Yes,
55}