Netcetera 3DS SDK API

The API of the Netcetera 3DS SDK complies with the API defined by the EMVCo 3DS SDK Specification document. This section describes how the Netcetera 3DS SDK can be used to perform 3DS Authentication of payment or non-payment transactions.

Instantiation

First create instance of ThreeDS2ServiceSDK:

1
let threeDS2Service: ThreeDS2Service = ThreeDS2ServiceSDK()

Initialization

The 3DS Requestor App calls the initialize method at the start of the payment stage of a transaction. The app passes configuration parameters, UI configuration parameters, and user locale to this method. Until the ThreeDS2Service instance is initialized, it is unusable.

In order to use the ThreeDS2Service for further actions, initialize it with ThreeDS2Service.initialize(...) method.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
do {
    let threeDS2Service: ThreeDS2Service = ThreeDS2ServiceSDK()
    let configParameters = ConfigParameters()
    try configParamethers.setLicenseKey(licenseKey: "ey...")
    try threeDS2Service.initialize(configParameters,
                                   locale: nil,
                                   uiCustomization: nil)
    //...
} catch ThreeDS2Error.InvalidInput(let message, _) {
    //...
} catch ThreeDS2Error.SDKAlreadyInitialized(let message, _) {
    //...
 
} catch {
    //...
 
}
Parameter Description
configParameters Instance of ConfigParameters. Before passing this parameter set the licence as described in License Setup
locale String that represents the locale for the app’s user interface.
uiCustomization Instance of UiCustomization created during SDK Configuration.

During initialization, security checks are performed and device information are collected. These parameters will be part of the Authentication and will be provided to the ACS via 3DS Server for risk analysis.

Fore more details about the security checks and their handling, refer to Security Features.

For more details on the device data that is collected, refer to EMVCo 3DS SDK Device Info Specification.

Warnings

After the security checks are performed, the SDK provides the outcome as list of Warning.

To obtain the result of these security checks call ThreeDS2Service.getWarnings().

1
2
3
4
5
6
7
do {
    let sdkWarnings = try threeDS2Service.getWarnings()
} catch ThreeDS2Error.SDKNotInitialized(let message, _){
    //...
} catch {
    //...
}

Each of the resulting Warning has Severity with value of LOW, MEDIUM and HIGH and it is up to the integrator to decide whether to act on each of them. For more details, please refer to Security Warnings.

The resulting warnings will be provided as part of Device Info in the Authentication.

Authentication

The 3DS Authentication flow starts with the authentication request that the 3DS Requestor Environment (Application or Library) sends it to the 3DS Server. The 3DS Server uses the data to compose the AReq that is sent to the DS and further forwarded to the appropriate ACS.

The ACS evaluates the data provided in the AReq and responds with ARes message to the DS, which then forwards the message to the 3DS Server. At the end the 3DS Server communicates the result of the ARes message back to the 3DS Requestor Environment.

The 3DS SDK generates authentication parameters that should be used for building the initial Authentication Request. All these parameters should be send to the 3DS Server, in the format the 3DS Server API defines. This parameters can be retrieved from Transaction object.

To obtain instance of Transaction, ThreeDS2Service.createTransaction(...) method can be used.

1
2
3
4
5
6
7
do {
  let directoryServerId = //...
  try threeDS2Service.createTransaction(directoryServerId: directoryServerId,
                                           messageVersion: "2.1.0")
} catch {
  // ...
}
Parameter Description
directoryServerID The ID of the Directory Server that will be used. Make sure there is already configuration for this DS made in DS Configuration.
messageVersion Protocol version according to which the transaction shall be created. If null highest supported value will be used.

After the Transaction object has been created, the AuthenticationRequestParameters can be obtained by calling Transaction.getAuthenticationRequestParameters().

1
2
3
4
5
try {
  let transactionParameters = try transaction.getAuthenticationRequestParameters()
} catch {
  // ...
}

The parameters that are part of the AuthenticationRequestParameters are defined in chapter 4.12 in the EMVCo 3DS SDK Specification.

Starting of Challenge Flow

If the ACS assesses the transaction as high-risk, above certain threshold or that it requires higher level of authentication, it forces the Challenge Flow communication.

In case of Challenge Flow, the 3DS Requestor calls Transaction.doChallenge(...),` and the SDK takes over the Challenge process.

1
2
3
4
5
6
7
8
do {
    try transaction.doChallenge(challengeParameters: challengeParamethers,
                                challengeStatusReceiver: challengeStatusReceiver,
                                timeOut:5,
                                inViewController: viewController)
} catch {
    // ...
}

Once a challenge has been started, invocation on Transaction.doChallenge(...) and Transaction.close() will result in SDK Runtime Error, but the Challenge Flow won’t be interrupted nor the Transaction will be put in invalid state. Once any result comes through the ChallengeStatusReceiver, calling of Transaction.doChallenge(...) and Transaction.close() is allowed if required.

Parameter Description
challengeParameters Instance of ChallengeParameters created with values from the Authentication Response.
challengeStatusReceiver Callback object that implements ChallengeStatusReceiver. It will be notified about the challenge status.
timeOut Timeout interval (in minutes) within which the challenge process must be completed. The minimum timeout interval is defined to be 5 minutes.
inViewController The view controller in which the challenge flow will be presented modally. This must not be a view controller that is presented. A presented view controller cannot present another view controller, so make sure the method is called with a correct parameter, otherwise the challenge view will not be shown.

Challenge Flow Results

After invoking Transaction.doChallenge(...), Challenge Flow is started and the control of the UI is handed over to the 3DS SDK. The DS Requestor has the controls back when any of the callback methods from the ChallengeStatusReceiver are invoked.

Implement a class that conform to the ChallengeStatusReceiver protocol.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class AppChallengeStatusReceiver: ChallengeStatusReceiver {
     
    func completed(completionEvent: CompletionEvent) {
        // Handle successfully or unsuccessful completion of challenge flow 
    }
     
    func cancelled() {
        // Handle challenge canceled by the user
    }
     
    func timedout() {
        // Handle challenge timeout
    }
     
    func protocolError(protocolErrorEvent: ProtocolErrorEvent) {
        // Handle protocol error that has been send by the ACS
    }
     
    func runtimeError(runtimeErrorEvent: RuntimeErrorEvent) {
        // Handle error that has occurred in the SDK at runtime
    }
}

When any of the callback methods of the ChallengeStatusReceiver are invoked, the challenge flow UI is dismissed by the 3DS SDK and the 3DS Requestor has the controls of the UI.

Closing of the Transaction

After the 3DS Authentication has finished, the 3DS Requestor should close the Transaction by calling Transaction.close() in order to clear references and avoid possible memory leaks.

Cleanup of the ThreeDS2Service

Similar to closing Transaction, in order to free up resources which are used by the ThreeDS2Service, the ThreeDS2Service.cleanup() shall be used. Once an instance of ThreeDS2Service has freed up the used resources, it is in the same state as newly created ThreeDS2Service and can be used once again, but should go through Initialization again. After the ThreeDS2Service.cleanup() has been performed, previously created Transaction objects are in invalid state and shall not be used anymore. It is recommended to always create new transaction object, after initializing the service.

Error handling

According to the EMVCo 3DS SDK Specification, the Netcetera iOS 3DS SDK throws a messaging error whenever a problem occurs. There are four types of errors which are thrown by the SDK.

  • Invalid input - Represents an error which occurs due to invalid parameters provided to the 3DS SDK.
  • SDK not initialized - Represents error that is caused when calling ThreeDS2Service method that requires it to be initialized, but it has not yet been initialized.
  • SDK already initialized - Represents error that is caused when initializing the ThreeDS2Service instance, but it has been already initialized.
  • SDK runtime error - Represents an error that is thrown when an internal error is encountered by the 3DS SDK.

In case of a problem, the integrator of the Netcetera 3DS SDK is provided with an appropriate error. All these errors are returned as an NSError object. The information that can be retrieved from the error object are:

Information Description
error.localizedDescription Message explaining the error
error.code The code of the error
error.localizedFailureReason Additional error code that gives more detailed information of the error