The NDM Simulator allows external configuration of the simulated VERes per account number. This simulates the functionality of 3DS 1.0 Directory Server.
Possible types of VERes are listed below:
In order to configure the type of VERes, use the threeds-one-ds-simulator-config.properties
configuration file in the $NDM_SIMULATOR_HOME/conf
.
If you are using a multi-tenant setup, the response type can be defined on organization level. In this case, a configuration consists of the organization ID, an underscore as delimiter and a pan.
Please note that if you choose to use configurations on organization level, the NDM Simulator would need to receive the specific organization ID in the request header. This is done by activating the ds.send.org.id=true
flag in the 3DS Server application.propertiess
.
The NDM Simulator tries to retrieve a configuration which matches the organization ID and pan. If no configuration is found, the NDM Simulator will look for global configurations with no organization ID but matching pan. If the card is not present at all in the configuration file, the default response is ENROLLED_Y.
The 3DS 1.0 ACS URL should be configured there as well using threeds-one-ds-simulator-config.acs-url parameter. The value must be in format: http(s)://NDM Simulator Host
:NDM Simulator Port
/3ds1/acs/authenticate
An example configuration is listed below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | threeds-one-ds-simulator-config.acs-url =http://localhost:8080/3ds1/acs/authenticate # configuration on global level # VALID_RESPONSE Category (PANs ending in 0xy) threeds-one-ds-simulator-config.responses.4234123412340000 =ENROLLED_Y threeds-one-ds-simulator-config.responses.4234123412340001 =ENROLLED_N threeds-one-ds-simulator-config.responses.4234123412340002 =ENROLLED_U # INVALID_RESPONSE Category (PANs ending in 1xy) threeds-one-ds-simulator-config.responses.4234123412340100 =MISSING_ROOT threeds-one-ds-simulator-config.responses.4234123412340101 =MISSING_MESSAGE threeds-one-ds-simulator-config.responses.4234123412340102 =INVALID_MESSAGE threeds-one-ds-simulator-config.responses.4234123412340103 =MISSING_VERSION threeds-one-ds-simulator-config.responses.4234123412340104 =ILLEGAL_VERSION threeds-one-ds-simulator-config.responses.4234123412340105 =MISSING_URL threeds-one-ds-simulator-config.responses.4234123412340106 =ILLEGAL_URL threeds-one-ds-simulator-config.responses.4234123412340107 =MISSING_ENROLLED threeds-one-ds-simulator-config.responses.4234123412340108 =ILLEGAL_ENROLLED threeds-one-ds-simulator-config.responses.4234123412340109 =ILLEGAL_EXTENSION # ERROR_RESPONSE Category (PANs ending in 2xy) threeds-one-ds-simulator-config.responses.4234123412340200 =ERROR_CUSTOM threeds-one-ds-simulator-config.responses.4234123412340201 =ERROR_1 threeds-one-ds-simulator-config.responses.4234123412340202 =ERROR_2 threeds-one-ds-simulator-config.responses.4234123412340203 =ERROR_3 threeds-one-ds-simulator-config.responses.4234123412340204 =ERROR_4 threeds-one-ds-simulator-config.responses.4234123412340205 =ERROR_5 threeds-one-ds-simulator-config.responses.4234123412340206 =ERROR_6 threeds-one-ds-simulator-config.responses.4234123412340220 =ERROR_CUSTOM_WITH_DIFFERENT_MESSAGE_ID threeds-one-ds-simulator-config.responses.4234123412340250 =ERROR_50 threeds-one-ds-simulator-config.responses.4234123412340251 =ERROR_51 threeds-one-ds-simulator-config.responses.4234123412340252 =ERROR_52 threeds-one-ds-simulator-config.responses.4234123412340253 =ERROR_53 threeds-one-ds-simulator-config.responses.4234123412340258 =ERROR_58 threeds-one-ds-simulator-config.responses.4234123412340298 =ERROR_98 threeds-one-ds-simulator-config.responses.4234123412340299 =ERROR_99 # IREQ_RESPONSE Category (PANs ending in 3xy) threeds-one-ds-simulator-config.responses.4234123412340300 =IREQ_CUSTOM threeds-one-ds-simulator-config.responses.4234123412340301 =IREQ_ENROLLED_Y threeds-one-ds-simulator-config.responses.4234123412340350 =IREQ_50 threeds-one-ds-simulator-config.responses.4234123412340351 =IREQ_51 threeds-one-ds-simulator-config.responses.4234123412340352 =IREQ_52 threeds-one-ds-simulator-config.responses.4234123412340353 =IREQ_53 threeds-one-ds-simulator-config.responses.4234123412340354 =IREQ_54 threeds-one-ds-simulator-config.responses.4234123412340355 =IREQ_55 threeds-one-ds-simulator-config.responses.4234123412340356 =IREQ_56 threeds-one-ds-simulator-config.responses.4234123412340358 =IREQ_58 threeds-one-ds-simulator-config.responses.4234123412340398 =IREQ_98 threeds-one-ds-simulator-config.responses.4234123412340399 =IREQ_99 # OTHER Category (PANs ending in 4xy) threeds-one-ds-simulator-config.responses.4234123412340400 =UNSUPPORTED_VERSION threeds-one-ds-simulator-config.responses.4234123412340401 =UNRECOGNIZED_CRITICAL_EXTENSION threeds-one-ds-simulator-config.responses.4234123412340402 =SERVER_ERROR threeds-one-ds-simulator-config.responses.4234123412340403 =TIMEOUT # AMEX PAN threeds-one-ds-simulator-config.responses.3734123412340000 =ENROLLED_Y # configuration on organization level # VALID_RESPONSE Category (PANs ending in 0xy) threeds-one-ds-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_4234123412340000 =MISSING_ROOT threeds-one-ds-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_4234123412340001 =UNSUPPORTED_VERSION threeds-one-ds-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_4234123412340002 =MISSING_URL threeds-one-ds-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_7891448791740000 =ENROLLED_Y threeds-one-ds-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_7891448791740001 =ENROLLED_N threeds-one-ds-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_7891448791740002 =ENROLLED_U |
The NDM Simulator allows external configuration of the simulated PARes and other specific message fields (cavv, cavv algorithm and eci) per account number. This simulates the functionality of 3DS 1.0 ACS.
Possible types of PARes are listed below:
In order to configure the type of PARes, cavv, cavv algorithm or eci value, use the threeds-one-acs-simulator-config.properties
configuration file in the $NDM_SIMULATOR_HOME/conf
.
If you are using a multi-tenant setup, the response type can be defined on organization level. In this case, a configuration consists of the organization ID, an underscore as delimiter and a pan.
Please note that if you choose to use configurations on organization level you will have to include the organization ID in the header of the auth request that you send directly to the simulator (ACS). The header name is 3DS-Organization-ID.
The NDM Simulator tries to retrieve a configuration which matches the organization ID and pan. If no configuration is found, the NDM Simulator will look for global configurations with no organization ID but matching pan. If the card is not present at all in the configuration file, the default response is TRANSACTION_STATUS_N.
Specific PARes message field values can be configured: cavv, cavv algorithm and eci. They must be specified in that order after the PARes type. If some message field is not configured, a default value will be used. The field values are separated with comma.
The NDM simulator is signing the content of a PARes. The signing certificate store location, alias and password must be configured here as well. The configured certificate information will be used for signing all simulation scenarios responses except for the SIGNATURE_UNTRUSTED_ANCHOR simulation scenario. For this specific scenario, the NDM Simulator generates a certificate itself for signing the PaRes which is unknown to the 3DS Server, thus causing validation error on 3DS Server side which is the intention of this simulation.
An example configuration is listed below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | threeds-one-acs-simulator-config.signing-keystore-location =file:client.jks threeds-one-acs-simulator-config.signing-keystore-alias =3ds1-acs-signing threeds-one-acs-simulator-config.signing-keystore-password =secret # configuration on global level #PARes type, cavv, cavv algorithm, eci threeds-one-acs-simulator-config.responses.4000001000000000 =TRANSACTION_STATUS_Y, VGhpcyBpcyBhIHRlc3QgYmFzZTY=, 4, 05 threeds-one-acs-simulator-config.responses.4000001000000005 =TRANSACTION_STATUS_Y, 3I0nosyZzWfncgfgYYT/jJglZTbu threeds-one-acs-simulator-config.responses.4234123412340000 =TRANSACTION_STATUS_Y, , , 05 threeds-one-acs-simulator-config.responses.4234123412340006 =TRANSACTION_STATUS_U threeds-one-acs-simulator-config.responses.4234123412340007 =TRANSACTION_STATUS_A threeds-one-acs-simulator-config.responses.5333259155643223 =TRANSACTION_STATUS_Y threeds-one-acs-simulator-config.responses.5512459816707531 =TRANSACTION_STATUS_Y # configuration on organization level threeds-one-acs-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_4000001000000000 =TRANSACTION_STATUS_U threeds-one-acs-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_4000001000000005 =TRANSACTION_STATUS_A threeds-one-acs-simulator-config.responses.cc6a754b-5807-4343-a9e0-87c6f37d0c05_4234123412340003 =TRANSACTION_STATUS_U |
To configure a pan for challenge flow, set TRANSACTION_CHALLENGE_OTP
as PaRes type in the threeds-one-acs-simulator-config.properties
configuration file in the $NDM_SIMULATOR_HOME/conf
.
The NDM Simulator allows configuration of the challenge data sent when simulating an ACS for Challenge flow. The configurable values are: transaction status, cavv, cavv algorithm and eci. They are configured per OTP code. The values of: cavv, cavv algorithm and eci can be omitted by leaving a blank value, but they must be specified in the particular order. In case a field is not configured, a default value will be used. The configurable values are separated with comma.
In order to configure the challenge data, use the threeds-one-simulated-otp-responses.properties
configuration file in the $NDM_SIMULATOR_HOME/conf
.
If the otp value is not present in the configuration file, the default response is TRANSACTION_STATUS_N.
An example configuration file is also listed below:
1 2 3 | #threeds-one-simulated-otp-responses.otp-responses.<otpValue>=<paResType>, <cavv>, <cavvAlgorithm>, <eci> threeds-one-simulated-otp-responses.otp-responses.1234 =TRANSACTION_STATUS_Y, VGhpcyBpcyBhIHRlc3QgYmFzZTY=, 7, 05 threeds-one-simulated-otp-responses.otp-responses.1111 =TRANSACTION_STATUS_N |
The Netcetera Demo Merchant Simulator provides a pre-defined HTML template that is returned when initiating a challenge to the simulated ACS Challenge handler. The challenge screen and the template source are displayed below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" /> < title >NDM Simulator Challenge</ title > </ head > < body style = "margin: 0; padding: 8px;" > < main > < div > < header > < span class = "logo" ></ span > </ header > < div class = "content" > < form id = "mainForm" method = "post" action = "%otpValidationUrl$" > < input id = "threeDSSTransId" type = "text" name = "threeDSSTransId" class = "hidden" value = "%threeDSSTransId$" > < input id = "accountNumber" type = "text" name = "accountNumber" class = "hidden" value = "%acctNumber$" > < input id = "paReq" type = "text" name = "paReq" class = "hidden" value = "%paReq$" /> < input id = "TermUrl" type = "text" name = "TermUrl" class = "hidden" value = "%TermUrl$" /> < input id = "MD" type = "text" name = "MD" class = "hidden" value = "%MD$" /> < h1 >Challenge Form</ h1 > < div class = "transaction-details" > < ul > < li > < span class = "ui-messages-summary" >Cardholder Account Number: </ span > < span class = "ui-messages-detail" > %maskedAcctNumber$ </ span > </ li > < li > < span class = "ui-messages-summary" >Merchant Name: </ span > < span class = "ui-messages-detail" >%merchantName$</ span > </ li > < div id = "purchaseDetails" > < li > < span class = "ui-messages-summary" >Purchase Amount: </ span > < span class = "ui-messages-detail" >%purchaseAmount$</ span > < span class = "ui-messages-detail" >%purchaseCurrency$</ span > </ li > < li > < span class = "ui-messages-summary" >Purchase Date: </ span > < span class = "ui-messages-detail" >%purchaseDate$</ span > </ li > </ div > </ ul > </ div > < div class = "explainText" >Please enter the sent OTP Code</ div > < div class = "code-section" > < dt >< label for = "otp" >Code</ label ></ dt > < dd >< input id = "otp" type = "text" name = "otp" maxlength = "10" onkeyup = "checkOtp()" onblur = "checkOtp()" ></ dd > </ div > < footer > < button type = "submit" class = "btn btn-secondary" id = "cancel" name = "challengeCancel" >Cancel</ button > < button type = "submit" class = "btn btn-primary" id = "sendOtp" disabled = "" >Pay</ button > </ footer > </ form > </ div > </ div > </ main > <script> function checkOtp() { var otp = document.getElementById( "otp" ); var submitOtp = document.getElementById( "sendOtp" ); var validInputRegex = /^[a-zA-Z0-9]+$/; submitOtp.disabled = !validInputRegex.test(otp.value); } </script> < style > header { background-color: #458962; color: white; } ul { list-style-type: none; } .ui-messages-summary { font-weight: bold; } .hidden { visibility: hidden; position: absolute; } .logo { padding-top: 2%; background: no-repeat left center url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjEyM3B4IiBoZWlnaHQ9IjQwcHgiIHZpZXdCb3g9IjAgMCAxMjMgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+DQogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA1MS4xICg1NzUwMSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+DQogICAgPHRpdGxlPkdyb3VwPC90aXRsZT4NCiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4NCiAgICA8ZGVmcz48L2RlZnM+DQogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+DQogICAgICAgIDxnIGlkPSJHcm91cCIgZmlsbD0iI0ZGRkZGRiI+DQogICAgICAgICAgICA8cGF0aCBkPSJNMTA5LjcyNDAyMSw5LjA4OTE4MTgyIEwxMDQuNTg0NzA2LDkuMDg5MTgxODIgQzEwMS41NzI5NTcsOS4wODkxODE4MiA5OC45NTc5NTY5LDkuODM4Njc2NzcgOTcuMDExNzYxOSwxMS4zNzE2MDYxIEM5NC45NzkxMzIzLDkuODM4Njc2NzcgOTIuMDk4NDUyMSw5LjA4OTE4MTgyIDg4LjI0NTAyODUsOS4wODkxODE4MiBMODMuMTA1NzEzNSw5LjA4OTE4MTgyIEM3Ni41Njg1NjcyLDkuMDg5MTgxODIgNzEuOTAwMzkxNCwxMi42MDI2MTYyIDcxLjkwMDM5MTQsMjAuMDQwMjkyOSBMNzEuOTAwMzkxNCwzNy43NTAyOTI5IEM3MS45MDAzOTE0LDM4LjIxNjk1OTYgNzIuMzY0NDQ1OSwzOC42ODI5MTkyIDcyLjgzMjA0MjgsMzguNjgyOTE5MiBMNzguNDM3NTM3OCwzOC42ODI5MTkyIEM3OC45MDUxMzQ3LDM4LjY4MjkxOTIgNzkuMzcyMDIzMSwzOC4yMTY5NTk2IDc5LjM3MjAyMzEsMzcuNzUwMjkyOSBMNzkuMzcyMDIzMSwyMC41MDYyNTI1IEM3OS4zNzIwMjMxLDE3LjcxMTIwMiA4MC43Njk4NTQ1LDE1Ljg0NjY1NjYgODQuMDM5NDkwMywxNS44NDY2NTY2IEw4Ni44NDI5NDYzLDE1Ljg0NjY1NjYgQzkyLjQ0NTYwNzMsMTUuODQ2NjU2NiA5My4zODAwOTI2LDE3LjI0NTI0MjQgOTMuMzgwMDkyNiwyMS40Mzk1ODU5IEw5My4zODAwOTI2LDM3Ljc1MDI5MjkgQzkzLjM4MDA5MjYsMzguMjE2OTU5NiA5My44NDY5ODExLDM4LjY4MjkxOTIgOTQuMzEzODY5NSwzOC42ODI5MTkyIEw5OS45MTY1MzA1LDM4LjY4MjkxOTIgQzEwMC4zODM0MTksMzguNjgyOTE5MiAxMDAuODUxMDE2LDM4LjIxNjk1OTYgMTAwLjg1MTAxNiwzNy43NTAyOTI5IEwxMDAuODUxMDE2LDIxLjQzOTU4NTkgTDEwMC44NTEwMTYsMjAuNTA2MjUyNSBDMTAwLjg1MTAxNiwxNy43MTEyMDIgMTAyLjI1MjM5LDE1Ljg0NjY1NjYgMTA1LjUxODQ4MywxNS44NDY2NTY2IEwxMDguMzIxOTM5LDE1Ljg0NjY1NjYgQzExMy45MjQ2LDE1Ljg0NjY1NjYgMTE0Ljg1OTA4NSwxNy4yNDUyNDI0IDExNC44NTkwODUsMjEuNDM5NTg1OSBMMTE0Ljg1OTA4NSwzNy43NTAyOTI5IEMxMTQuODU5MDg1LDM4LjIxNjk1OTYgMTE1LjMyNTk3NCwzOC42ODI5MTkyIDExNS43OTI4NjIsMzguNjgyOTE5MiBMMTIxLjM5NjIzMiwzOC42ODI5MTkyIEMxMjEuODQxODY2LDM4LjY4MjkxOTIgMTIyLjMzMDAwOSwzOC4yMTY5NTk2IDEyMi4zMzAwMDksMzcuNzUwMjkyOSBMMTIyLjMzMDAwOSwyMS40Mzk1ODU5IEMxMjIuMzMwMDA5LDEzLjA1MDg5OSAxMTguNTk2MzE4LDkuMDg5MTgxODIgMTA5LjcyNDAyMSw5LjA4OTE4MTgyIiBpZD0iRmlsbC01MCI+PC9wYXRoPg0KICAgICAgICAgICAgPHBhdGggZD0iTTU4LjcwMzEwNjYsMjcuNTgyODI4MyBDNTcuNDIyMTc0NSwzMS4yNzMwMzAzIDU0LjA3MjQ4MDMsMzMuNzUzNDM0MyA1MC4zNjc4Mzc2LDMzLjc1MzQzNDMgQzQ1LjQ2NzI4MDQsMzMuNzUzNDM0MyA0MS40Nzk5NTQxLDI5LjUzMjIyMjIgNDEuNDc5OTU0MSwyNC4zNDM3Mzc0IEM0MS40Nzk5NTQxLDE5LjE1NDU0NTUgNDUuNDY3MjgwNCwxNC45MzMzMzMzIDUwLjM2NzgzNzYsMTQuOTMzMzMzMyBDNTUuMjY4Mzk0OCwxNC45MzMzMzMzIDU5LjI1NTcyMTEsMTkuMTU0NTQ1NSA1OS4yNTU3MjExLDI0LjM0MzczNzQgQzU5LjI1NTcyMTEsMjUuMTI4NTg1OSA1OS4xNTM3LDI1LjkzNjc2NzcgNTguOTUyNDkxNiwyNi43NDM1MzU0IEw1OC45MzEyMzcyLDI2LjgzMDUwNTEgQzU4Ljg4MzA2MDYsMjcuMDE1MDUwNSA1OC44MzI3NTg1LDI3LjE5ODE4MTggNTguNzczOTU0NiwyNy4zNzg0ODQ4IEw1OC43NzM5NTQ2LDI3LjM3OTE5MTkgTDU4LjcwMzEwNjYsMjcuNTgyODI4MyBaIE01OC45NDI1NzI5LDAgTDU4Ljk0MjU3MjksMTEuNDM4OTg5OSBDNTguMjQ0NzE5OSwxMC45MTc4Nzg4IDU3LjQ2OTY0MjcsMTAuNDY0NjQ2NSA1Ni42MzAwOTM3LDEwLjA4Nzc3NzggQzU0Ljg2Mzg1MjcsOS4yOTUxNTE1MiA1Mi44MjkwOTc3LDguODkzNTM1MzUgNTAuNTgxMDkwMiw4Ljg5MzUzNTM1IEM0NS43NTg0NjU4LDguODkzNTM1MzUgNDEuODQyNjk2LDEwLjM0Nzk3OTggMzguOTQxNDY5OCwxMy4yMTU4NTg2IEMzNi4wNzU2Njc2LDE2LjA0ODM4MzggMzQuNjIzMjgzMywxOS45NTI4MjgzIDM0LjYyMzI4MzMsMjQuODIxNzE3MiBDMzQuNjIzMjgzMywyOS4wODYwNjA2IDM2LjEwNDAwNjgsMzIuNjM5MDkwOSAzOS4wMjM2NTM1LDM1LjM4MzIzMjMgQzQxLjk2NDU1NDYsMzguMTQ4NTg1OSA0NS42NDE1NjY1LDM5LjU1MDcwNzEgNDkuOTUxOTU5OCwzOS41NTA3MDcxIEM1Mi41NTI3OTA0LDM5LjU1MDcwNzEgNTQuNzc4MTI2NiwzOS4xNDU1NTU2IDU2LjU2NDkxMzUsMzguMzQ1MTUxNSBDNTcuNTM2OTQ4MywzNy45MDg4ODg5IDU4LjQ2MDA5NzksMzcuMzI2OTY5NyA1OS4zMjAxOTI4LDM2LjYwNzg3ODggTDU5LjMyMDE5MjgsMzguNzAxNTE1MiBMNjUuODQ2MDAzNSwzOC43MDE1MTUyIEw2NS44NDYwMDM1LDAgTDU4Ljk0MjU3MjksMCBaIiBpZD0iRmlsbC00NCI+PC9wYXRoPg0KICAgICAgICAgICAgPHBhdGggZD0iTTE3LjI3OTEyMjQsOS4wODkxODE4MiBMMTEuMjA4MTU2LDkuMDg5MTgxODIgQzQuNjcwMzAxMTUsOS4wODkxODE4MiAwLDEyLjYwMDQ5NDkgMCwyMC4wNDAyOTI5IEwwLDM3Ljc1MSBDMCwzOC4yMTY5NTk2IDAuNDY3NTk2ODk5LDM4LjY4MjkxOTIgMC45MzUxOTM3OTgsMzguNjgyOTE5MiBMNi41Mzg1NjMzMSwzOC42ODI5MTkyIEM3LjAwNTQ1MTczLDM4LjY4MjkxOTIgNy40NzIzNDAxNSwzOC4yMTY5NTk2IDcuNDcyMzQwMTUsMzcuNzUxIEw3LjQ3MjM0MDE1LDIwLjUwNjk1OTYgQzcuNDcyMzQwMTUsMTcuNzEwNDk0OSA4Ljg3MzAwNTQsMTUuODQ2NjU2NiAxMi4xNDE5MzI4LDE1Ljg0NjY1NjYgTDE1Ljg3Nzc0ODYsMTUuODQ2NjU2NiBDMjEuNDgxODI2NiwxNS44NDY2NTY2IDIyLjQxNTYwMzUsMTcuMjQ0NTM1NCAyMi40MTU2MDM1LDIxLjQzODg3ODggTDIyLjQxNTYwMzUsMzcuNzUxIEMyMi40MTU2MDM1LDM4LjIxNjk1OTYgMjIuODgzMjAwNCwzOC42ODI5MTkyIDIzLjM0OTM4MDMsMzguNjgyOTE5MiBMMjguOTU0MTY2OCwzOC42ODI5MTkyIEMyOS4zOTc2NzU0LDM4LjY4MjkxOTIgMjkuODg3MjM1MSwzOC4yMTY5NTk2IDI5Ljg4NzIzNTEsMzcuNzUxIEwyOS44ODcyMzUxLDIxLjQzODg3ODggQzI5Ljg4NzIzNTEsMTMuMDUwODk5IDI2LjE1MjEyNzgsOS4wODkxODE4MiAxNy4yNzkxMjI0LDkuMDg5MTgxODIiIGlkPSJGaWxsLTQ3Ij48L3BhdGg+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4='); display: inline-block; background-size: contain; margin: 0 1rem 0 1rem; width: 90px; min-height: 30px; } dd, dt { display: inline-block; font-size: 20px; margin: 24px; } input[type="text"] { border: 1px solid #e4e4e4; border-radius: 2rem; font-weight: 600; padding: .5rem 1rem; line-height: 1; max-width: 100%; text-align: center; width: 10rem; margin-bottom: .25rem; font-size: 15px; } .btn { cursor: pointer; padding: .5rem 2rem; font-weight: 600; line-height: 1; letter-spacing: .05rem; margin-right: .5rem; border: 2px solid #458962; border-radius: 1rem; } .btn-primary { color: #fff; background-color: #458962; } .btn-secondary { background-color: #fff; color: #458962; } footer { font-size: 20px; } button:disabled { background: darkseagreen; border-color: darkseagreen; } .explainText { font-size: 20px; margin-bottom: 10px; } h1 { display: block; font-weight: bold; color: #9a9a9a; } .content { position: absolute; height: auto; } .code-section dd,dt { margin: 24px 24px 0 24px; } .whitelist-merchant-section dt { margin: 10px 10px 24px 24px; } .whitelist-merchant-section dd { margin: 10px 24px 24px 10px; } </ style > </ body > </ html > |
The NDM Simulator can be also configured to provide a custom Challenge form. This can be configured via the threeds-one-acs-simulator-config.challenge-template-location
configuration property.
In order for the NDM Simulator to properly handle challenge, the customized challenge template must contain the following placeholders:
$ <form method="POST" action="%otpValidationUrl$">
in order for the NDM Simulator to fill the OTP validation URL to a proper endpoint for validating the entered OTP.
$ <input value="%threeDSSTransId$">
in order for the NDM Simulator to fill the 3DS Server Transaction ID and later on when validating the OTP to identify the transaction.
$ <input name="otp">
in order for the NDM Simulator to handle the entered Challenge data.
$ <input value="%acctNumber$">
in order for the NDM Simulator to fill out the account number.
For handling challenge cancel, the custom challenge template should include additional submit button to the form with name 'challengeCancel', like:
$ <button type="submit" name="challengeCancel">Cancel</button>
$ <input value="%paReq$">
in order for the NDM Simulator to proceed with authentication upon successful handling of the challenge.
$ <input value="%TermUrl$">
required for the NDM Simulator to proceed with authentication upon successful handling of the challenge.
$ <input value="%MD$">
required for the NDM Simulator to proceed with authentication upon successful handling of the challenge.
Additionally, there is an option to include the following placeholders in the customized template, in order to provide details about the current transaction:
The NDM Simulator will inject values into them retrieved from the current transaction.