Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalServiceKit/Subscriptions/Donations/Stripe+3DSecure.swift
1 views
//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import Foundation

extension Stripe {
    public enum RedirectAuthorizationError: Error {
        case cancelled
        case denied
        case invalidCallback
    }

    // These values are somewhat arbitrary.
    public static let SCHEME_FOR_3DS = "sgnlpay"
    static let RETURN_URL_FOR_3DS = "\(SCHEME_FOR_3DS)://3ds"

    static let RETURN_URL_FOR_IDEAL = "https://signaldonations.org/ideal"

    /// Parse the redirect URL from a Stripe response. See [Stripe's docs][0].
    ///
    /// [0]: https://stripe.com/docs/api/payment_intents/object#payment_intent_object-next_action-redirect_to_url-return_url
    static func parseNextActionRedirectUrl(from responseDict: [String: Any]?) -> URL? {
        if
            let responseDict,
            let nextAction = responseDict["next_action"] as? [String: Any?],
            let nextActionType = nextAction["type"] as? String,
            nextActionType == "redirect_to_url",
            let redirectToUrlDict = nextAction["redirect_to_url"] as? [String: Any?],
            let redirectToUrlString = redirectToUrlDict["url"] as? String,
            let redirectToUrl = URL(string: redirectToUrlString),
            redirectToUrl.scheme != nil
        {
            return redirectToUrl
        } else {
            return nil
        }
    }
}