Skip to main content

emv_3ds/message/
rreq.rs

1use crate::types::{
2    AcsAuthMethod, AuthenticationType, Eci, MessageCategory, MessageVersion, TransStatus,
3    TransStatusReason,
4};
5use serde::{Deserialize, Serialize};
6
7/// EMV 3DS Results Request (RReq).
8///
9/// Sent by the ACS to the 3DS Server (via the DS) after a decoupled or
10/// app-based challenge completes. The 3DS Server must respond with an RRes.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "camelCase")]
13pub struct ResultsRequest {
14    pub message_type: MessageType,
15    pub message_version: MessageVersion,
16    #[serde(rename = "threeDSServerTransID")]
17    pub three_ds_server_trans_id: String,
18    #[serde(rename = "acsTransID")]
19    pub acs_trans_id: String,
20    #[serde(rename = "dsTransID", skip_serializing_if = "Option::is_none")]
21    pub ds_trans_id: Option<String>,
22    #[serde(rename = "sdkTransID", skip_serializing_if = "Option::is_none")]
23    pub sdk_trans_id: Option<String>,
24    pub message_category: MessageCategory,
25    pub trans_status: TransStatus,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub trans_status_reason: Option<TransStatusReason>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub authentication_method: Option<AcsAuthMethod>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub authentication_type: Option<AuthenticationType>,
32    /// CAVV / AAV — base64url encoded; present when transStatus is Y or A.
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub authentication_value: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub eci: Option<Eci>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub interaction_counter: Option<String>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub acs_rendering_type: Option<AcsRenderingType>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub message_extension: Option<Vec<MessageExtension>>,
43}
44
45/// ACS UI rendering information for app-based flows.
46#[derive(Debug, Clone, Serialize, Deserialize)]
47#[serde(rename_all = "camelCase")]
48pub struct AcsRenderingType {
49    pub acs_interface: String,
50    pub acs_ui_template: String,
51}
52
53/// Generic protocol extension element — carried in RReq and RRes.
54#[derive(Debug, Clone, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct MessageExtension {
57    pub name: String,
58    pub id: String,
59    pub critical_indicator: bool,
60    pub data: serde_json::Value,
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
64pub enum MessageType {
65    RReq,
66}