authorization method
Future<void>
authorization({
- required double priceAmount,
- Locale locale = const Locale("en", "US"),
- bool online = true,
- required void builder(
- Uri endpoint,
- Widget webView,
- VoidCallback onClosed
- VoidCallback? onClosed,
- String? emailTitleOnRequired3DSecure,
- 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が返されます。
online
をtrue
にすると、クレジットカードの3Dセキュア認証が必要な場合builder
にWebViewが渡され認証を続けることができます。
online
がfalse
の場合、メールにて認証を行うことができます。
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;
}
}