Documentation
¶
Overview ¶
Package acpauthentication serves the ACP Delegated Authentication API.
The API provides a session-based 3DS2 lifecycle: create a session, submit browser fingerprint results, then retrieve the final authentication result. Implement Provider and pass it to NewHandler.
Index ¶
- type APIVersion
- type AcceptLanguage
- type Action
- func (t Action) AsAction0() (Action0, error)
- func (t Action) AsAction1() (Action1, error)
- func (t *Action) FromAction0(v Action0) error
- func (t *Action) FromAction1(v Action1) error
- func (t Action) MarshalJSON() ([]byte, error)
- func (t *Action) MergeAction0(v Action0) error
- func (t *Action) MergeAction1(v Action1) error
- func (t *Action) UnmarshalJSON(b []byte) error
- type Action0
- type Action1
- type ActionType
- type Address
- type Amount
- type AuthenticateSessionJSONRequestBody
- type AuthenticateSessionParams
- type AuthenticationResult
- type Authorization
- type BrowserInfo
- type ChallengeAction
- type Channel
- type ChannelType
- type ContentType
- type CreateAuthenticationSessionJSONRequestBody
- type CreateAuthenticationSessionParams
- type DelegateAuthenticationAuthenticateRequest
- type DelegateAuthenticationAuthenticateRequestFingerprintCompletion
- type DelegateAuthenticationCreateRequest
- type DelegateAuthenticationSession
- type DelegateAuthenticationSessionBase
- type DelegateAuthenticationSessionBaseStatus
- type DelegateAuthenticationSessionWithResult
- type DelegateAuthenticationSessionWithResultStatus
- type Error
- type ErrorCode
- type ErrorType
- type FingerprintAction
- type FlowPreference
- type FlowPreferenceChallengeType
- type FlowPreferenceType
- type GetAuthenticationSessionParams
- type Handler
- type IdempotencyKey
- type Option
- type PaymentMethod
- type PaymentMethodType
- type Provider
- type RequestId
- type ShopperDetails
- type Signature
- type Timestamp
- type UserAgent
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Action ¶
type Action struct {
// Challenge Configuration for cardholder challenge interaction.
Challenge *ChallengeAction `json:"challenge,omitempty"`
// Fingerprint Configuration for browser fingerprinting via iframe.
Fingerprint *FingerprintAction `json:"fingerprint,omitempty"`
// Type Category of action.
Type ActionType `json:"type"`
// contains filtered or unexported fields
}
Action Describes browser action required
func (*Action) FromAction0 ¶
FromAction0 overwrites any union data inside the Action as the provided Action0
func (*Action) FromAction1 ¶
FromAction1 overwrites any union data inside the Action as the provided Action1
func (Action) MarshalJSON ¶
func (*Action) MergeAction0 ¶
MergeAction0 performs a merge with any union data inside the Action, using the provided Action0
func (*Action) MergeAction1 ¶
MergeAction1 performs a merge with any union data inside the Action, using the provided Action1
func (*Action) UnmarshalJSON ¶
type Action0 ¶
type Action0 struct {
Type interface{} `json:"type,omitempty"`
}
Action0 defines model for Action.0.
type Action1 ¶
type Action1 struct {
Type interface{} `json:"type,omitempty"`
}
Action1 defines model for Action.1.
type ActionType ¶
type ActionType string
ActionType Category of action.
const ( ActionTypeChallenge ActionType = "challenge" ActionTypeFingerprint ActionType = "fingerprint" )
Defines values for ActionType.
func (ActionType) Valid ¶
func (e ActionType) Valid() bool
Valid indicates whether the value is a known member of the ActionType enum.
type Address ¶
type Address struct {
// City City name.
City string `json:"city"`
// Country ISO-3166-1 alpha-2
Country string `json:"country"`
// LineOne Street address line 1.
LineOne string `json:"line_one"`
// LineTwo Street address line 2.
LineTwo *string `json:"line_two,omitempty"`
// Name Full name of the recipient.
Name string `json:"name"`
// PostalCode Postal code or ZIP code.
PostalCode string `json:"postal_code"`
// State ISO-3166-2 where applicable
State string `json:"state"`
}
Address Physical address schema for shopper or shipping.
type Amount ¶
type Amount struct {
// Currency ISO 4217 currency code
Currency string `json:"currency"`
// Value Amount in minor units (e.g., 1000 = €10.00)
Value int `json:"value"`
}
Amount Monetary amount for the authentication request.
type AuthenticateSessionJSONRequestBody ¶
type AuthenticateSessionJSONRequestBody = DelegateAuthenticationAuthenticateRequest
AuthenticateSessionJSONRequestBody defines body for AuthenticateSession for application/json ContentType.
type AuthenticateSessionParams ¶
type AuthenticateSessionParams struct {
Authorization Authorization `json:"Authorization"`
ContentType ContentType `json:"Content-Type"`
AcceptLanguage *AcceptLanguage `json:"Accept-Language,omitempty"`
UserAgent *UserAgent `json:"User-Agent,omitempty"`
IdempotencyKey *IdempotencyKey `json:"Idempotency-Key,omitempty"`
RequestId *RequestId `json:"Request-Id,omitempty"`
Signature *Signature `json:"Signature,omitempty"`
Timestamp *Timestamp `json:"Timestamp,omitempty"`
APIVersion APIVersion `json:"API-Version"`
}
AuthenticateSessionParams defines parameters for AuthenticateSession.
type AuthenticationResult ¶
type AuthenticationResult struct {
// AuthenticationValue Authentication value (CAVV)
AuthenticationValue *string `json:"authentication_value,omitempty"`
// CardholderInfo Message to display to cardholder
CardholderInfo *string `json:"cardholder_info,omitempty"`
// ElectronicCommerceIndicator Electronic Commerce Indicator (ECI)
ElectronicCommerceIndicator *string `json:"electronic_commerce_indicator,omitempty"`
// ThreeDsCryptogram Authentication cryptogram (CAVV/AAV)
ThreeDsCryptogram *string `json:"three_ds_cryptogram,omitempty"`
// ThreeDsServerTransId 3DS Server transaction ID
ThreeDsServerTransId string `json:"three_ds_server_trans_id"`
// TransStatus Transaction status (Y, N, A, U, R, etc.)
TransStatus string `json:"trans_status"`
// TransStatusReason Reason code for trans_status
TransStatusReason *string `json:"trans_status_reason,omitempty"`
// TransactionId Directory Server transaction ID
TransactionId string `json:"transaction_id"`
// Version 3DS protocol version (e.g., "2.2.0")
Version string `json:"version"`
}
AuthenticationResult The finalized 3DS authentication data.
type BrowserInfo ¶
type BrowserInfo struct {
// AcceptHeader HTTP Accept header from the browser
AcceptHeader string `json:"accept_header"`
// ColorDepth Screen color depth (required if javascript_enabled is true)
ColorDepth *int `json:"color_depth,omitempty"`
// IpAddress IP address of the browser
IpAddress string `json:"ip_address"`
// JavaEnabled Whether Java is enabled (required if javascript_enabled is true)
JavaEnabled *bool `json:"java_enabled,omitempty"`
// JavascriptEnabled Whether JavaScript is enabled
JavascriptEnabled bool `json:"javascript_enabled"`
// Language IETF BCP 47 language tag
Language string `json:"language"`
// ScreenHeight Screen height in pixels (required if javascript_enabled is true)
ScreenHeight *int `json:"screen_height,omitempty"`
// ScreenWidth Screen width in pixels (required if javascript_enabled is true)
ScreenWidth *int `json:"screen_width,omitempty"`
// TimezoneOffset Timezone offset in minutes (required if javascript_enabled is true)
TimezoneOffset *int `json:"timezone_offset,omitempty"`
// UserAgent Browser user agent string
UserAgent string `json:"user_agent"`
}
BrowserInfo Detailed browser metadata for 3DS2.
type ChallengeAction ¶
type ChallengeAction struct {
// AcsTransId ACS transaction identifier
AcsTransId string `json:"acs_trans_id"`
// AcsUrl URL to POST challenge request to
AcsUrl string `json:"acs_url"`
// MessageVersion 3DS protocol version (e.g., "2.2.0")
MessageVersion string `json:"message_version"`
// ThreeDsServerTransId 3DS Server transaction identifier
ThreeDsServerTransId string `json:"three_ds_server_trans_id"`
}
ChallengeAction Configuration for cardholder challenge interaction.
type Channel ¶
type Channel struct {
// Browser Detailed browser metadata for 3DS2.
Browser BrowserInfo `json:"browser"`
// Type Channel type
Type ChannelType `json:"type"`
}
Channel Defines the platform/medium for the session.
type ChannelType ¶
type ChannelType string
ChannelType Channel type
const (
Browser ChannelType = "browser"
)
Defines values for ChannelType.
func (ChannelType) Valid ¶
func (e ChannelType) Valid() bool
Valid indicates whether the value is a known member of the ChannelType enum.
type CreateAuthenticationSessionJSONRequestBody ¶
type CreateAuthenticationSessionJSONRequestBody = DelegateAuthenticationCreateRequest
CreateAuthenticationSessionJSONRequestBody defines body for CreateAuthenticationSession for application/json ContentType.
type CreateAuthenticationSessionParams ¶
type CreateAuthenticationSessionParams struct {
Authorization Authorization `json:"Authorization"`
ContentType ContentType `json:"Content-Type"`
AcceptLanguage *AcceptLanguage `json:"Accept-Language,omitempty"`
UserAgent *UserAgent `json:"User-Agent,omitempty"`
IdempotencyKey *IdempotencyKey `json:"Idempotency-Key,omitempty"`
RequestId *RequestId `json:"Request-Id,omitempty"`
Signature *Signature `json:"Signature,omitempty"`
Timestamp *Timestamp `json:"Timestamp,omitempty"`
APIVersion APIVersion `json:"API-Version"`
}
CreateAuthenticationSessionParams defines parameters for CreateAuthenticationSession.
type DelegateAuthenticationAuthenticateRequest ¶
type DelegateAuthenticationAuthenticateRequest struct {
// ChallengeNotificationUrl URL for challenge result callback
ChallengeNotificationUrl *string `json:"challenge_notification_url,omitempty"`
// Channel Defines the platform/medium for the session.
Channel *Channel `json:"channel,omitempty"`
// CheckoutSessionId Checkout session identifier
CheckoutSessionId *string `json:"checkout_session_id,omitempty"`
// FingerprintCompletion Result of the 3DS Method fingerprint:
// - Y: Completed successfully
// - N: Timeout/not completed
// - U: Unavailable/not performed
FingerprintCompletion DelegateAuthenticationAuthenticateRequestFingerprintCompletion `json:"fingerprint_completion"`
// ShopperDetails Identity and contact info for the shopper.
ShopperDetails *ShopperDetails `json:"shopper_details,omitempty"`
}
DelegateAuthenticationAuthenticateRequest Request body to submit fingerprint result and trigger AReq.
type DelegateAuthenticationAuthenticateRequestFingerprintCompletion ¶
type DelegateAuthenticationAuthenticateRequestFingerprintCompletion string
DelegateAuthenticationAuthenticateRequestFingerprintCompletion Result of the 3DS Method fingerprint: - Y: Completed successfully - N: Timeout/not completed - U: Unavailable/not performed
const ( N DelegateAuthenticationAuthenticateRequestFingerprintCompletion = "N" U DelegateAuthenticationAuthenticateRequestFingerprintCompletion = "U" Y DelegateAuthenticationAuthenticateRequestFingerprintCompletion = "Y" )
Defines values for DelegateAuthenticationAuthenticateRequestFingerprintCompletion.
func (DelegateAuthenticationAuthenticateRequestFingerprintCompletion) Valid ¶
func (e DelegateAuthenticationAuthenticateRequestFingerprintCompletion) Valid() bool
Valid indicates whether the value is a known member of the DelegateAuthenticationAuthenticateRequestFingerprintCompletion enum.
type DelegateAuthenticationCreateRequest ¶
type DelegateAuthenticationCreateRequest struct {
// AcquirerDetails Object containing acquirer data used for AReq construction.
// **Recommended:** To ensure the AReq matches the final Authorization, especially when using different authentication and payment providers.
AcquirerDetails *struct {
// AcquirerBin The Acquirer BIN.
AcquirerBin string `json:"acquirer_bin"`
// AcquirerCountry Two-letter ISO 3166-1 alpha-2 country code.
AcquirerCountry string `json:"acquirer_country"`
// AcquirerMerchantId The Merchant ID assigned by the acquirer.
AcquirerMerchantId string `json:"acquirer_merchant_id"`
// MerchantName Merchant name assigned by the acquirer.
MerchantName string `json:"merchant_name"`
// RequestorId 3DS Requestor ID (if required by directory server).
RequestorId *string `json:"requestor_id,omitempty"`
} `json:"acquirer_details,omitempty"`
// Amount Monetary amount for the authentication request.
Amount Amount `json:"amount"`
// ChallengeNotificationUrl URL for challenge result callback
ChallengeNotificationUrl *string `json:"challenge_notification_url,omitempty"`
// Channel Defines the platform/medium for the session.
Channel *Channel `json:"channel,omitempty"`
// CheckoutSessionId Checkout session identifier
CheckoutSessionId *string `json:"checkout_session_id,omitempty"`
// FlowPreference Preference for the 3DS authentication flow. Clients MAY request a preference,
// but issuers ultimately decide the actual flow.
FlowPreference *FlowPreference `json:"flow_preference,omitempty"`
// MerchantId Merchant identifier
MerchantId string `json:"merchant_id"`
// PaymentMethod Card information for the authentication session.
PaymentMethod PaymentMethod `json:"payment_method"`
// ShopperDetails Identity and contact info for the shopper.
ShopperDetails *ShopperDetails `json:"shopper_details,omitempty"`
}
DelegateAuthenticationCreateRequest Request body to initialize an authentication session.
type DelegateAuthenticationSession ¶
type DelegateAuthenticationSession = DelegateAuthenticationSessionBase
DelegateAuthenticationSession Response object representing a standard session state.
type DelegateAuthenticationSessionBase ¶
type DelegateAuthenticationSessionBase struct {
// Action Describes browser action required
Action *Action `json:"action,omitempty"`
// AuthenticationSessionId Session ID for subsequent requests
AuthenticationSessionId string `json:"authentication_session_id"`
// Status Current state of the session.
// - action_required: Browser action needed.
// - pending: Awaiting completion.
// - not_supported: Method not available.
Status DelegateAuthenticationSessionBaseStatus `json:"status"`
}
DelegateAuthenticationSessionBase Base properties for an authentication session response.
type DelegateAuthenticationSessionBaseStatus ¶
type DelegateAuthenticationSessionBaseStatus string
DelegateAuthenticationSessionBaseStatus Current state of the session. - action_required: Browser action needed. - pending: Awaiting completion. - not_supported: Method not available.
const ( DelegateAuthenticationSessionBaseStatusActionRequired DelegateAuthenticationSessionBaseStatus = "action_required" DelegateAuthenticationSessionBaseStatusAttempted DelegateAuthenticationSessionBaseStatus = "attempted" DelegateAuthenticationSessionBaseStatusAuthenticated DelegateAuthenticationSessionBaseStatus = "authenticated" DelegateAuthenticationSessionBaseStatusChallengeAbandoned DelegateAuthenticationSessionBaseStatus = "challenge_abandoned" DelegateAuthenticationSessionBaseStatusExpired DelegateAuthenticationSessionBaseStatus = "expired" DelegateAuthenticationSessionBaseStatusNotAuthenticated DelegateAuthenticationSessionBaseStatus = "not_authenticated" DelegateAuthenticationSessionBaseStatusNotSupported DelegateAuthenticationSessionBaseStatus = "not_supported" DelegateAuthenticationSessionBaseStatusPending DelegateAuthenticationSessionBaseStatus = "pending" DelegateAuthenticationSessionBaseStatusRejected DelegateAuthenticationSessionBaseStatus = "rejected" )
Defines values for DelegateAuthenticationSessionBaseStatus.
func (DelegateAuthenticationSessionBaseStatus) Valid ¶
func (e DelegateAuthenticationSessionBaseStatus) Valid() bool
Valid indicates whether the value is a known member of the DelegateAuthenticationSessionBaseStatus enum.
type DelegateAuthenticationSessionWithResult ¶
type DelegateAuthenticationSessionWithResult struct {
// Action Describes browser action required
Action *Action `json:"action,omitempty"`
// AuthenticationResult The finalized 3DS authentication data.
AuthenticationResult *AuthenticationResult `json:"authentication_result,omitempty"`
// AuthenticationSessionId Session ID for subsequent requests
AuthenticationSessionId string `json:"authentication_session_id"`
// Status Current state of the session.
// - action_required: Browser action needed.
// - pending: Awaiting completion.
// - not_supported: Method not available.
Status DelegateAuthenticationSessionWithResultStatus `json:"status"`
}
DelegateAuthenticationSessionWithResult Response object containing the full session state and final result.
type DelegateAuthenticationSessionWithResultStatus ¶
type DelegateAuthenticationSessionWithResultStatus string
DelegateAuthenticationSessionWithResultStatus Current state of the session. - action_required: Browser action needed. - pending: Awaiting completion. - not_supported: Method not available.
const ( DelegateAuthenticationSessionWithResultStatusActionRequired DelegateAuthenticationSessionWithResultStatus = "action_required" DelegateAuthenticationSessionWithResultStatusAttempted DelegateAuthenticationSessionWithResultStatus = "attempted" DelegateAuthenticationSessionWithResultStatusAuthenticated DelegateAuthenticationSessionWithResultStatus = "authenticated" DelegateAuthenticationSessionWithResultStatusChallengeAbandoned DelegateAuthenticationSessionWithResultStatus = "challenge_abandoned" DelegateAuthenticationSessionWithResultStatusExpired DelegateAuthenticationSessionWithResultStatus = "expired" DelegateAuthenticationSessionWithResultStatusNotAuthenticated DelegateAuthenticationSessionWithResultStatus = "not_authenticated" DelegateAuthenticationSessionWithResultStatusNotSupported DelegateAuthenticationSessionWithResultStatus = "not_supported" DelegateAuthenticationSessionWithResultStatusPending DelegateAuthenticationSessionWithResultStatus = "pending" DelegateAuthenticationSessionWithResultStatusRejected DelegateAuthenticationSessionWithResultStatus = "rejected" )
Defines values for DelegateAuthenticationSessionWithResultStatus.
func (DelegateAuthenticationSessionWithResultStatus) Valid ¶
func (e DelegateAuthenticationSessionWithResultStatus) Valid() bool
Valid indicates whether the value is a known member of the DelegateAuthenticationSessionWithResultStatus enum.
type Error ¶
type Error struct {
// Code Specific error sub-code.
Code ErrorCode `json:"code"`
// Message Detailed error description.
Message string `json:"message"`
// Param RFC 9535 JSONPath (optional)
Param *string `json:"param,omitempty"`
// Type Category of error.
Type ErrorType `json:"type"`
}
Error Structured error response.
type ErrorCode ¶
type ErrorCode string
ErrorCode Specific error sub-code.
type ErrorType ¶
type ErrorType string
ErrorType Category of error.
type FingerprintAction ¶
type FingerprintAction struct {
// ThreeDsMethodUrl URL to POST fingerprint data to via hidden iframe
ThreeDsMethodUrl string `json:"three_ds_method_url"`
// ThreeDsServerTransId 3DS Server transaction ID
ThreeDsServerTransId string `json:"three_ds_server_trans_id"`
}
FingerprintAction Configuration for browser fingerprinting via iframe.
type FlowPreference ¶
type FlowPreference struct {
// Challenge Preference details for a challenge flow.
Challenge *struct {
// Type Subtype of challenge preference
Type *FlowPreferenceChallengeType `json:"type,omitempty"`
} `json:"challenge,omitempty"`
// Frictionless Details about the requested frictionless flow
Frictionless *map[string]interface{} `json:"frictionless,omitempty"`
// Type Type of flow requested
Type FlowPreferenceType `json:"type"`
}
FlowPreference Preference for the 3DS authentication flow. Clients MAY request a preference, but issuers ultimately decide the actual flow.
type FlowPreferenceChallengeType ¶
type FlowPreferenceChallengeType string
FlowPreferenceChallengeType Subtype of challenge preference
const ( Mandated FlowPreferenceChallengeType = "mandated" Preferred FlowPreferenceChallengeType = "preferred" )
Defines values for FlowPreferenceChallengeType.
func (FlowPreferenceChallengeType) Valid ¶
func (e FlowPreferenceChallengeType) Valid() bool
Valid indicates whether the value is a known member of the FlowPreferenceChallengeType enum.
type FlowPreferenceType ¶
type FlowPreferenceType string
FlowPreferenceType Type of flow requested
const ( FlowPreferenceTypeChallenge FlowPreferenceType = "challenge" FlowPreferenceTypeFrictionless FlowPreferenceType = "frictionless" )
Defines values for FlowPreferenceType.
func (FlowPreferenceType) Valid ¶
func (e FlowPreferenceType) Valid() bool
Valid indicates whether the value is a known member of the FlowPreferenceType enum.
type GetAuthenticationSessionParams ¶
type GetAuthenticationSessionParams struct {
Authorization Authorization `json:"Authorization"`
AcceptLanguage *AcceptLanguage `json:"Accept-Language,omitempty"`
UserAgent *UserAgent `json:"User-Agent,omitempty"`
RequestId *RequestId `json:"Request-Id,omitempty"`
Signature *Signature `json:"Signature,omitempty"`
Timestamp *Timestamp `json:"Timestamp,omitempty"`
APIVersion APIVersion `json:"API-Version"`
}
GetAuthenticationSessionParams defines parameters for GetAuthenticationSession.
type Handler ¶
type Handler struct {
// contains filtered or unexported fields
}
Handler exposes the ACP delegated authentication API over net/http.
func NewHandler ¶
func NewHandler(provider Provider, authorizer acpauth.Authorizer, opts ...Option) *Handler
NewHandler returns a Handler that serves the ACP delegated authentication API.
Example ¶
package main
import (
"context"
"errors"
"fmt"
"github.com/sumup/acp/acpauth"
"github.com/sumup/acp/acpauthentication"
)
type authenticationProvider struct{}
func (authenticationProvider) CreateAuthenticationSession(context.Context, acpauthentication.DelegateAuthenticationCreateRequest) (*acpauthentication.DelegateAuthenticationSession, error) {
return nil, errors.ErrUnsupported
}
func (authenticationProvider) AuthenticateSession(context.Context, string, acpauthentication.DelegateAuthenticationAuthenticateRequest) (*acpauthentication.DelegateAuthenticationSession, error) {
return nil, errors.ErrUnsupported
}
func (authenticationProvider) GetAuthenticationSession(context.Context, string) (*acpauthentication.DelegateAuthenticationSessionWithResult, error) {
return nil, errors.ErrUnsupported
}
func main() {
handler := acpauthentication.NewHandler(
authenticationProvider{},
acpauth.StaticTokenAuthorizer("api_key_123"),
)
fmt.Printf("%T\n", handler)
}
Output: *acpauthentication.Handler
type Option ¶
type Option func(*config)
Option configures a Handler.
func WithServeMux ¶
WithServeMux registers delegated-authentication routes on mux instead of creating a new http.ServeMux.
type PaymentMethod ¶
type PaymentMethod struct {
// ExpMonth Expiry month (01-12)
ExpMonth string `json:"exp_month"`
// ExpYear Expiry year (4 digits)
ExpYear string `json:"exp_year"`
// Name Cardholder name
Name string `json:"name"`
// Number Card number (PAN)
Number string `json:"number"`
// Type Payment method type
Type PaymentMethodType `json:"type"`
}
PaymentMethod Card information for the authentication session.
type PaymentMethodType ¶
type PaymentMethodType string
PaymentMethodType Payment method type
const (
Card PaymentMethodType = "card"
)
Defines values for PaymentMethodType.
func (PaymentMethodType) Valid ¶
func (e PaymentMethodType) Valid() bool
Valid indicates whether the value is a known member of the PaymentMethodType enum.
type Provider ¶
type Provider interface {
// CreateAuthenticationSession initializes a 3DS authentication session.
CreateAuthenticationSession(context.Context, DelegateAuthenticationCreateRequest) (*DelegateAuthenticationSession, error)
// AuthenticateSession submits browser fingerprint results and starts authentication.
AuthenticateSession(context.Context, string, DelegateAuthenticationAuthenticateRequest) (*DelegateAuthenticationSession, error)
// GetAuthenticationSession returns the current session and its final result, when available.
GetAuthenticationSession(context.Context, string) (*DelegateAuthenticationSessionWithResult, error)
}
Provider owns delegated consumer-authentication sessions.
type ShopperDetails ¶
type ShopperDetails struct {
// Address Physical address schema for shopper or shipping.
Address *Address `json:"address,omitempty"`
// Email Shopper email
Email *openapi_types.Email `json:"email,omitempty"`
// Name Shopper name
Name *string `json:"name,omitempty"`
// PhoneNumber Shopper phone number
PhoneNumber *string `json:"phone_number,omitempty"`
}
ShopperDetails Identity and contact info for the shopper.