Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 27 additions & 7 deletions src/Redsys3ds.res
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@ open Utils

@react.component
let make = () => {
let logger = HyperLogger.make(~source=Elements(Payment))
let isCompleteAuthorizeCalledRef = React.useRef(false)
let timeoutRef = React.useRef(None)
let eventsToSendToParent = ["confirmParams", "poll_status", "openurl_if_required"]
let completeAuthorize = PaymentHelpers.useRedsysCompleteAuthorize(Some(logger))
let loggerState = Recoil.useRecoilValueFromAtom(RecoilAtoms.loggerAtom)
let completeAuthorize = PaymentHelpers.useRedsysCompleteAuthorize(Some(loggerState))

let handleCompleteAuthorizeCall = (
threeDsMethodComp,
paymentIntentId,
publishableKey,
headers,
returnUrl,
iframeId,
) => {
isCompleteAuthorizeCalledRef.current = true
let body = [
Expand All @@ -27,7 +28,7 @@ let make = () => {
publishableKey,
},
~headers,
~iframeId="redsys3ds",
~iframeId,
~clientSecret=Some(paymentIntentId),
)
}
Expand All @@ -45,9 +46,9 @@ let make = () => {
let metaDataDict = metadata->JSON.Decode.object->Option.getOr(Dict.make())
let paymentIntentId = metaDataDict->getString("paymentIntentId", "")
let publishableKey = metaDataDict->getString("publishableKey", "")

logger.setClientSecret(paymentIntentId)
logger.setMerchantId(publishableKey)
loggerState.setClientSecret(paymentIntentId)
loggerState.setMerchantId(publishableKey)
let iframeId = metaDataDict->getString("iframeId", "")

let headersDict = metaDataDict->getDictFromDict("headers")

Expand All @@ -71,19 +72,29 @@ let make = () => {
form.target = "threeDsAuthFrame"
form.appendChild(input)
form.submit()
} else {
loggerState.setLogError(
~value="three_ds_method_url is empty in metadata",
~eventName=REDSYS_3DS,
)
}
| None => ()
}

timeoutRef.current->Option.forEach(clearTimeout)

timeoutRef.current = Some(setTimeout(() => {
loggerState.setLogInfo(
~value="Fallback timeout reached for 3DS method completion",
~eventName=REDSYS_3DS,
)
handleCompleteAuthorizeCall(
"N",
paymentIntentId,
publishableKey,
headers,
returnUrl,
iframeId,
)->ignore
}, 10000))

Expand All @@ -98,10 +109,15 @@ let make = () => {
publishableKey,
headers,
returnUrl,
iframeId,
)->ignore
}
})
| None => ()
| None =>
loggerState.setLogError(
~value="Unable to locate threeDsAuthFrame iframe",
~eventName=REDSYS_3DS,
)
}
}
} catch {
Expand All @@ -110,6 +126,10 @@ let make = () => {
~errortype="complete_authorize_failed",
~message="Something went wrong.",
)
loggerState.setLogError(
~value="Exception in Redsys3DS iframe message handler",
~eventName=REDSYS_3DS,
)
}
}
Window.addEventListener("message", handle)
Expand Down
1 change: 1 addition & 0 deletions src/Types/HyperLoggerTypes.res
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ type eventName =
| THREE_DS_POPUP_REDIRECTION
| S3_API
| CARD_SCHEME_SELECTION
| REDSYS_3DS
| BLOCKED_BIN_CALL

type maskableDetails = Email | CardDetails
Expand Down
1 change: 1 addition & 0 deletions src/Utilities/LoggerUtils.res
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ let apiEventInitMapper = (eventName: HyperLoggerTypes.eventName): option<
| NETWORK_STATE
| CARD_SCHEME_SELECTION
| S3_API
| REDSYS_3DS
| BLOCKED_BIN_CALL =>
None
}
Loading