TM-SGNL-iOS/SignalServiceKit/Subscriptions/Donations/Stripe+Subscriptions.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

63 lines
2.4 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
extension Stripe {
/// Create a payment method entry with the Signal service for a subscription
/// processed by Stripe.
///
/// - Returns
/// A Stripe secret used to authorize payment for the new subscription.
public static func createSignalPaymentMethodForSubscription(subscriberId: Data) -> Promise<String> {
return firstly {
let request = OWSRequestFactory.subscriptionCreateStripePaymentMethodRequest(subscriberID: subscriberId)
return SSKEnvironment.shared.networkManagerRef.makePromise(request: request)
}.map(on: DispatchQueue.global()) { response in
let statusCode = response.responseStatusCode
guard statusCode == 200 else {
throw OWSAssertionError("Got bad response code \(statusCode).")
}
guard let parser = ParamParser(responseObject: response.responseBodyJson) else {
throw OWSAssertionError("Missing or invalid response.")
}
do {
let clientSecret: String = try parser.required(key: "clientSecret")
return clientSecret
} catch {
throw OWSAssertionError("Missing clientID key")
}
}
}
/// Perform the relevant Stripe API calls to set up a new subscription with
/// the given client secret and payment method.
///
/// - Parameter clientSecret
/// A Stripe secret retrieved from the Signal service, used to authorize
/// payment for the new subscription. See ``createSignalPaymentMethodForSubscription(withSubscriberId:)``.
/// - Returns
/// The new payment ID.
public static func setupNewSubscription(
clientSecret: String,
paymentMethod: PaymentMethod
) -> Promise<ConfirmedSetupIntent> {
firstly {
createPaymentMethod(with: paymentMethod)
}.then(on: DispatchQueue.sharedUserInitiated) { paymentMethodId -> Promise<ConfirmedSetupIntent> in
// Pass in the correct callback URL
confirmSetupIntent(
mandate: paymentMethod.mandate,
paymentMethodId: paymentMethodId,
clientSecret: clientSecret,
callbackURL: paymentMethod.callbackURL
)
}
}
}