authorization method

Future<void> authorization({
  1. required double priceAmount,
  2. Locale locale = const Locale("en", "US"),
  3. bool online = true,
  4. required void builder(
    1. Uri endpoint,
    2. Widget webView,
    3. VoidCallback onClosed
    ),
  5. VoidCallback? onClosed,
  6. String? emailTitleOnRequired3DSecure,
  7. String? emailContentOnRequired3DSecure,
})

Check if priceAmount is available for payment.

If an error occurs, Exception is returned.

If you set online to true, WebView will be passed to builder when credit card 3D secure authentication is required and authentication can continue.

If online is false, you can authenticate by e-mail.

priceAmountが支払い可能かどうかをチェックします。

エラーが発生した場合はExceptionが返されます。

onlinetrueにすると、クレジットカードの3Dセキュア認証が必要な場合builderにWebViewが渡され認証を続けることができます。

onlinefalseの場合、メールにて認証を行うことができます。

Implementation

Future<void> authorization({
  required double priceAmount,
  Locale locale = const Locale("en", "US"),
  bool online = true,
  required void Function(
    Uri endpoint,
    Widget webView,
    VoidCallback onClosed,
  ) builder,
  VoidCallback? onClosed,
  String? emailTitleOnRequired3DSecure,
  String? emailContentOnRequired3DSecure,
}) async {
  if (_completer != null) {
    return _completer!.future;
  }
  _completer = Completer<void>();
  Completer<void>? internalCompleter = Completer<void>();
  try {
    final functionsAdapter =
        StripePurchaseMasamuneAdapter.primary.functionsAdapter ??
            FunctionsAdapter.primary;
    final callbackHost = StripePurchaseMasamuneAdapter
        .primary.callbackURLSchemeOrHost
        .toString()
        .trimQuery()
        .trimString("/");
    final returnPathOptions =
        StripePurchaseMasamuneAdapter.primary.returnPathOptions;

    final response = await functionsAdapter.execute(
      StripeAuthorizationAction(
        userId: userId,
        priceAmount: priceAmount,
        online: online,
        currency: StripePurchaseMasamuneAdapter.primary.currency,
        email: StripeMail(
          from: StripePurchaseMasamuneAdapter.primary.supportEmail,
          title: emailTitleOnRequired3DSecure ??
              StripePurchaseMasamuneAdapter
                  .primary.threeDSecureOptions.emailTitle,
          content: emailContentOnRequired3DSecure ??
              StripePurchaseMasamuneAdapter
                  .primary.threeDSecureOptions.emailContent,
        ),
        returnUrl: online
            ? Uri.parse(
                "$callbackHost/${returnPathOptions.finishedOnAuthorization.trimString("/")}")
            : Uri.parse(
                "${functionsAdapter.endpoint}/${StripePurchaseMasamuneAdapter.primary.threeDSecureOptions.redirectFunctionPath}"),
      ),
    );

    if (response.authorizedId.isEmpty) {
      throw Exception("Response is invalid.");
    }
    bool authenticated = true;
    onCompleted() {
      if (authenticated) {
        internalCompleter?.complete();
        internalCompleter = null;
      } else {
        internalCompleter
            ?.completeError(Exception("3D Secure authentication failed."));
        internalCompleter = null;
      }
    }

    if (response.nextActionUrl != null) {
      final webView = StripeWebview(
        response.nextActionUrl!,
        shouldOverrideUrlLoading: (url) {
          final path = url.trimQuery().replaceAll(callbackHost, "");
          if (path ==
              "/${returnPathOptions.finishedOnAuthorization.trimString("/")}") {
            onClosed?.call();
            onCompleted.call();
            return StripeNavigationActionPolicy.cancel;
          }
          final uri = Uri.parse(url);
          if (uri.host == "hooks.stripe.com" &&
              uri.queryParameters.containsKey("authenticated")) {
            authenticated = uri.queryParameters["authenticated"] == "true";
          }
          return StripeNavigationActionPolicy.allow;
        },
        onCloseWindow: () {
          onCompleted();
        },
      );
      builder.call(response.nextActionUrl!, webView, onCompleted);
      await internalCompleter!.future;
    }
    await functionsAdapter.execute(
      StripeConfirmAuthorizationAction(
        authorizedId: response.authorizedId,
      ),
    );
    _completer?.complete();
    _completer = null;
    internalCompleter?.complete();
    internalCompleter = null;
    notifyListeners();
  } catch (e) {
    _completer?.completeError(e);
    _completer = null;
    internalCompleter?.completeError(e);
    internalCompleter = null;
    rethrow;
  } finally {
    _completer?.complete();
    _completer = null;
    internalCompleter?.complete();
    internalCompleter = null;
  }
}