From 1fa302ae98f8ce700224c783a833ba7fde914249 Mon Sep 17 00:00:00 2001 From: solid-maksymtielnyi Date: Fri, 23 Aug 2024 18:11:36 +0300 Subject: [PATCH 1/6] Add update PaymentIntent method --- lib/messages.dart | 4 +- lib/messages.g.dart | 130 ++++++++++++------ .../requests/update_payment_intent.dart | 99 +++++++++++++ lib/src/resources/payment_intent.dart | 15 ++ 4 files changed, 203 insertions(+), 45 deletions(-) create mode 100644 lib/src/messages/requests/update_payment_intent.dart diff --git a/lib/messages.dart b/lib/messages.dart index f4a69fb..e0945b0 100644 --- a/lib/messages.dart +++ b/lib/messages.dart @@ -1,7 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; import 'package:stripe/src/messages/converters.dart'; import 'package:stripe/src/messages/enums.dart'; -import 'package:stripe/src/messages/enums/pause_collection_behavior.dart'; export 'package:stripe/src/messages/enums.dart'; @@ -19,8 +18,8 @@ part 'src/messages/data_list.dart'; part 'src/messages/discount.dart'; part 'src/messages/event.dart'; part 'src/messages/invoice.dart'; -part 'src/messages/payment_intent.dart'; part 'src/messages/pause_collection.dart'; +part 'src/messages/payment_intent.dart'; part 'src/messages/payment_method.dart'; part 'src/messages/portal_session.dart'; part 'src/messages/price.dart'; @@ -48,6 +47,7 @@ part 'src/messages/requests/list_subscription_schedules.dart'; part 'src/messages/requests/list_subscriptions.dart'; part 'src/messages/requests/subscription_payment_settings.dart'; part 'src/messages/requests/update_customer.dart'; +part 'src/messages/requests/update_payment_intent.dart'; part 'src/messages/requests/update_subscription.dart'; part 'src/messages/requests/update_subscription_item.dart'; part 'src/messages/requests/update_subscription_schedule.dart'; diff --git a/lib/messages.g.dart b/lib/messages.g.dart index 520fab2..e26f235 100644 --- a/lib/messages.g.dart +++ b/lib/messages.g.dart @@ -774,6 +774,49 @@ Map _$TotalDiscountAmountToJson( 'discount': instance.discount, }; +PauseCollection _$PauseCollectionFromJson(Map json) => + PauseCollection( + behavior: $enumDecode(_$PauseCollectionBehaviorEnumMap, json['behavior']), + resumesAt: _$JsonConverterFromJson( + json['resumes_at'], const TimestampConverter().fromJson), + ); + +Map _$PauseCollectionToJson(PauseCollection instance) { + final val = { + 'behavior': _$PauseCollectionBehaviorEnumMap[instance.behavior]!, + }; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull( + 'resumes_at', + _$JsonConverterToJson( + instance.resumesAt, const TimestampConverter().toJson)); + return val; +} + +const _$PauseCollectionBehaviorEnumMap = { + PauseCollectionBehavior.keepAsDraft: 'keep_as_draft', + PauseCollectionBehavior.markUncollectible: 'mark_uncollectible', + PauseCollectionBehavior.void_: 'void', +}; + +Value? _$JsonConverterFromJson( + Object? json, + Value? Function(Json json) fromJson, +) => + json == null ? null : fromJson(json as Json); + +Json? _$JsonConverterToJson( + Value? value, + Json? Function(Value value) toJson, +) => + value == null ? null : toJson(value); + PaymentIntent _$PaymentIntentFromJson(Map json) => PaymentIntent( object: $enumDecode(_$_PaymentIntentObjectEnumMap, json['object']), @@ -862,23 +905,11 @@ const _$_PaymentIntentObjectEnumMap = { _PaymentIntentObject.payment_intent: 'payment_intent', }; -Value? _$JsonConverterFromJson( - Object? json, - Value? Function(Json json) fromJson, -) => - json == null ? null : fromJson(json as Json); - const _$SetupFutureUsageEnumMap = { SetupFutureUsage.on_session: 'on_session', SetupFutureUsage.off_session: 'off_session', }; -Json? _$JsonConverterToJson( - Value? value, - Json? Function(Value value) toJson, -) => - value == null ? null : toJson(value); - AutomaticPaymentMethods _$AutomaticPaymentMethodsFromJson( Map json) => AutomaticPaymentMethods( @@ -891,37 +922,6 @@ Map _$AutomaticPaymentMethodsToJson( 'enabled': instance.enabled, }; -PauseCollection _$PauseCollectionFromJson(Map json) => - PauseCollection( - behavior: $enumDecode(_$PauseCollectionBehaviorEnumMap, json['behavior']), - resumesAt: _$JsonConverterFromJson( - json['resumes_at'], const TimestampConverter().fromJson), - ); - -Map _$PauseCollectionToJson(PauseCollection instance) { - final val = { - 'behavior': _$PauseCollectionBehaviorEnumMap[instance.behavior]!, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull( - 'resumes_at', - _$JsonConverterToJson( - instance.resumesAt, const TimestampConverter().toJson)); - return val; -} - -const _$PauseCollectionBehaviorEnumMap = { - PauseCollectionBehavior.keepAsDraft: 'keep_as_draft', - PauseCollectionBehavior.markUncollectible: 'mark_uncollectible', - PauseCollectionBehavior.void_: 'void', -}; - PaymentMethod _$PaymentMethodFromJson(Map json) => PaymentMethod( id: json['id'] as String, @@ -2372,6 +2372,50 @@ Map _$UpdateCustomerRequestToJson( return val; } +UpdatePaymentIntentRequest _$UpdatePaymentIntentRequestFromJson( + Map json) => + UpdatePaymentIntentRequest( + (json['amount'] as num?)?.toInt(), + json['currency'] as String?, + json['customer'] as String?, + json['description'] as String?, + json['metadata'] as Map?, + json['payment_method'] as String?, + json['receipt_email'] as String?, + $enumDecodeNullable( + _$SetupFutureUsageEnumMap, json['setup_future_usage']), + json['statement_descriptor'] as String?, + json['statement_descriptor_suffix'] as String?, + json['payment_method_configuration'] as String?, + ); + +Map _$UpdatePaymentIntentRequestToJson( + UpdatePaymentIntentRequest instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('amount', instance.amount); + writeNotNull('currency', instance.currency); + writeNotNull('customer', instance.customer); + writeNotNull('description', instance.description); + writeNotNull('metadata', instance.metadata); + writeNotNull('payment_method', instance.paymentMethod); + writeNotNull('receipt_email', instance.receiptEmail); + writeNotNull('setup_future_usage', + _$SetupFutureUsageEnumMap[instance.setupFutureUsage]); + writeNotNull('statement_descriptor', instance.statementDescriptor); + writeNotNull( + 'statement_descriptor_suffix', instance.statementDescriptorSuffix); + writeNotNull( + 'payment_method_configuration', instance.paymentMethodConfiguration); + return val; +} + SubscriptionUpdate _$SubscriptionUpdateFromJson(Map json) => SubscriptionUpdate( cancelAtPeriodEnd: json['cancel_at_period_end'] as bool?, diff --git a/lib/src/messages/requests/update_payment_intent.dart b/lib/src/messages/requests/update_payment_intent.dart new file mode 100644 index 0000000..b829c86 --- /dev/null +++ b/lib/src/messages/requests/update_payment_intent.dart @@ -0,0 +1,99 @@ +part of '../../../messages.dart'; + +@JsonSerializable() +class UpdatePaymentIntentRequest { + /// Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + final int? amount; + + /// Three-letter ISO currency code, in lowercase. Must be a supported currency. + final String? currency; + + /// ID of the Customer this PaymentIntent belongs to, if one exists. + /// Payment methods attached to other Customers cannot be used with this + /// PaymentIntent. + /// + /// If setup_future_usage is set and this PaymentIntent’s payment method is + /// not card_present, then the payment method attaches to the Customer after + /// the PaymentIntent has been confirmed and any required actions from the + /// user are complete. If the payment method is card_present and isn’t a + /// digital wallet, then a generated_card payment method representing the + /// card is created and attached to the Customer instead. + final String? customer; + + /// An arbitrary string attached to the object. Often useful for displaying + /// to users. + final String? description; + + /// Set of key-value pairs that you can attach to an object. This can be + /// useful for storing additional information about the object in a + /// structured format. Individual keys can be unset by posting an empty value + /// to them. All keys can be unset by posting an empty value to metadata. + final Map? metadata; + + /// ID of the payment method (a PaymentMethod, Card, or compatible Source + /// object) to attach to this PaymentIntent. To unset this field to null, pass + /// in an empty string. + final String? paymentMethod; + + /// Email address that the receipt for the resulting payment will be sent to. + /// If receipt_email is specified for a payment in live mode, a receipt will + /// be sent regardless of your email settings. + final String? receiptEmail; + + /// Indicates that you intend to make future payments with this + /// PaymentIntent’s payment method. + /// + /// If you provide a Customer with the PaymentIntent, you can use this + /// parameter to attach the payment method to the Customer after the + /// PaymentIntent is confirmed and the customer completes any required + /// actions. If you don’t provide a Customer, you can still attach the + /// payment method to a Customer after the transaction completes. + /// + /// If the payment method is card_present and isn’t a digital wallet, Stripe + /// creates and attaches a generated_card payment method representing the + /// card to the Customer instead. + /// + /// When processing card payments, Stripe uses setup_future_usage to help you + /// comply with regional legislation and network rules, such as SCA. + /// + /// If you’ve already set setup_future_usage and you’re performing a request + /// using a publishable key, you can only update the value from on_session to + /// off_session. + final SetupFutureUsage? setupFutureUsage; + + /// Text that appears on the customer’s statement as the statement descriptor + /// for a non-card charge. This value overrides the account’s default + /// statement descriptor. For information about requirements, including the + /// 22-character limit, see the Statement Descriptor docs. + /// + /// Setting this value for a card charge returns an error. For card charges, + /// set the statement_descriptor_suffix instead. + final String? statementDescriptor; + + /// Provides information about a card charge. Concatenated to the account’s + /// statement descriptor prefix to form the complete statement descriptor that + /// appears on the customer’s statement. + final String? statementDescriptorSuffix; + + /// The ID of the payment method configuration to use with this PaymentIntent. + final String? paymentMethodConfiguration; + + const UpdatePaymentIntentRequest( + this.amount, + this.currency, + this.customer, + this.description, + this.metadata, + this.paymentMethod, + this.receiptEmail, + this.setupFutureUsage, + this.statementDescriptor, + this.statementDescriptorSuffix, + this.paymentMethodConfiguration, + ); + + factory UpdatePaymentIntentRequest.fromJson(Map json) => + _$UpdatePaymentIntentRequestFromJson(json); + + Map toJson() => _$UpdatePaymentIntentRequestToJson(this); +} diff --git a/lib/src/resources/payment_intent.dart b/lib/src/resources/payment_intent.dart index e8b76c3..b239102 100644 --- a/lib/src/resources/payment_intent.dart +++ b/lib/src/resources/payment_intent.dart @@ -9,6 +9,8 @@ import '_resource.dart'; final log = Logger('Stripe PaymentIntentResource'); class PaymentIntentResource extends Resource { + static const _resourceName = 'payment_intents'; + PaymentIntentResource(Client client) : super(client); Future create(CreatePaymentIntentRequest request) async { @@ -49,4 +51,17 @@ class PaymentIntentResource extends Resource { return intents; } + + /// https://docs.stripe.com/api/payment_intents/update + Future update( + String id, { + required UpdatePaymentIntentRequest request, + }) async { + final response = await post( + '$_resourceName/$id', + data: request.toJson(), + ); + + return PaymentIntent.fromJson(response); + } } From e0c3ef3417aa7775e35aabc38e1ae94eeeee763b Mon Sep 17 00:00:00 2001 From: solid-maksymtielnyi Date: Fri, 23 Aug 2024 18:51:21 +0300 Subject: [PATCH 2/6] Convert positional params to optional --- lib/messages.g.dart | 23 ++++++++++--------- .../requests/update_payment_intent.dart | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/messages.g.dart b/lib/messages.g.dart index e26f235..fa679d1 100644 --- a/lib/messages.g.dart +++ b/lib/messages.g.dart @@ -2375,18 +2375,19 @@ Map _$UpdateCustomerRequestToJson( UpdatePaymentIntentRequest _$UpdatePaymentIntentRequestFromJson( Map json) => UpdatePaymentIntentRequest( - (json['amount'] as num?)?.toInt(), - json['currency'] as String?, - json['customer'] as String?, - json['description'] as String?, - json['metadata'] as Map?, - json['payment_method'] as String?, - json['receipt_email'] as String?, - $enumDecodeNullable( + amount: (json['amount'] as num?)?.toInt(), + currency: json['currency'] as String?, + customer: json['customer'] as String?, + description: json['description'] as String?, + metadata: json['metadata'] as Map?, + paymentMethod: json['payment_method'] as String?, + receiptEmail: json['receipt_email'] as String?, + setupFutureUsage: $enumDecodeNullable( _$SetupFutureUsageEnumMap, json['setup_future_usage']), - json['statement_descriptor'] as String?, - json['statement_descriptor_suffix'] as String?, - json['payment_method_configuration'] as String?, + statementDescriptor: json['statement_descriptor'] as String?, + statementDescriptorSuffix: json['statement_descriptor_suffix'] as String?, + paymentMethodConfiguration: + json['payment_method_configuration'] as String?, ); Map _$UpdatePaymentIntentRequestToJson( diff --git a/lib/src/messages/requests/update_payment_intent.dart b/lib/src/messages/requests/update_payment_intent.dart index b829c86..89a375f 100644 --- a/lib/src/messages/requests/update_payment_intent.dart +++ b/lib/src/messages/requests/update_payment_intent.dart @@ -78,7 +78,7 @@ class UpdatePaymentIntentRequest { /// The ID of the payment method configuration to use with this PaymentIntent. final String? paymentMethodConfiguration; - const UpdatePaymentIntentRequest( + const UpdatePaymentIntentRequest({ this.amount, this.currency, this.customer, @@ -90,7 +90,7 @@ class UpdatePaymentIntentRequest { this.statementDescriptor, this.statementDescriptorSuffix, this.paymentMethodConfiguration, - ); + }); factory UpdatePaymentIntentRequest.fromJson(Map json) => _$UpdatePaymentIntentRequestFromJson(json); From df6460366817e5508834c513afca49b7eba83565 Mon Sep 17 00:00:00 2001 From: solid-maksymtielnyi Date: Fri, 23 Aug 2024 19:06:40 +0300 Subject: [PATCH 3/6] Expand latest_invoice with payment_intent --- .../latest_invoice_expanded_expandable_field.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart b/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart index 2bfd161..b8ba85f 100644 --- a/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart +++ b/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart @@ -7,7 +7,7 @@ class LatestInvoiceExpandedExpandableField final Set expand; @override - String get field => 'latest_invoice'; + String get field => 'latest_invoice.payment_intent'; const LatestInvoiceExpandedExpandableField({ required this.expand, From 9cd11cf4a2c0dd6af4feb6ce5a25105df69ac039 Mon Sep 17 00:00:00 2001 From: solid-maksymtielnyi Date: Fri, 23 Aug 2024 21:13:38 +0300 Subject: [PATCH 4/6] Fix expand query param building --- lib/src/resources/subscription.dart | 43 ++++++------------- ...est_invoice_expanded_expandable_field.dart | 2 +- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/lib/src/resources/subscription.dart b/lib/src/resources/subscription.dart index 6b6c3e7..6054ea0 100644 --- a/lib/src/resources/subscription.dart +++ b/lib/src/resources/subscription.dart @@ -2,10 +2,6 @@ import 'dart:async'; import 'package:stripe/messages.dart'; import 'package:stripe/src/expanded.dart'; -import 'package:stripe/src/utils/expandable_field.dart'; -import 'package:stripe/src/utils/expandable_fields/customer_expandable_field.dart'; -import 'package:stripe/src/utils/expandable_fields/discounts_expandable_field.dart'; -import 'package:stripe/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart'; import '../client.dart'; import '_resource.dart'; @@ -34,38 +30,27 @@ class SubscriptionResource extends Resource { String id, { required Set expand, }) async { - final expandableFields = _expandableFields(expand); final response = await get( '$_resourceName/$id', queryParameters: { - 'expand': expandableFields.map((e) => e.field).toList(), + 'expand': _expandParamComponents, }, ); return SubscriptionExpanded.fromJson(response, expand); } - Iterable _expandableFields( - Set fields, - ) { - return fields.map( - (field) => _expandableField(field), - ); - } - - ExpandableField _expandableField( - SubscriptionExpandableField field, - ) { - switch (field) { - case SubscriptionExpandableField.discounts: - return DiscountsExpandableField(); - case SubscriptionExpandableField.latestInvoice: - return LatestInvoiceExpandedExpandableField( - expand: {InvoiceExpandableField.paymentIntent}, - ); - case SubscriptionExpandableField.customer: - return CustomerExpandableField(); - } + List _expandParamComponents(Set fields) { + return fields.map((field) { + switch (field) { + case SubscriptionExpandableField.discounts: + return 'discounts'; + case SubscriptionExpandableField.latestInvoice: + return 'latest_invoice.payment_intent'; + case SubscriptionExpandableField.customer: + return 'customer'; + } + }).toList(); } Future> list( @@ -79,13 +64,11 @@ class SubscriptionResource extends Resource { required Set expand, ListSubscriptionsRequest? request, }) async { - final expandableFields = _expandableFields(expand); - final response = await get( _resourceName, queryParameters: { ...?request?.toJson(), - 'expand': expandableFields.map((e) => 'data.${e.field}').toList(), + 'expand': _expandParamComponents(expand).map((e) => 'data.$e').toList(), }, ); diff --git a/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart b/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart index b8ba85f..2bfd161 100644 --- a/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart +++ b/lib/src/utils/expandable_fields/latest_invoice_expanded_expandable_field.dart @@ -7,7 +7,7 @@ class LatestInvoiceExpandedExpandableField final Set expand; @override - String get field => 'latest_invoice.payment_intent'; + String get field => 'latest_invoice'; const LatestInvoiceExpandedExpandableField({ required this.expand, From d6884ca1b166df383c01189e433cf1e39270dbb0 Mon Sep 17 00:00:00 2001 From: solid-maksymtielnyi Date: Fri, 23 Aug 2024 21:47:15 +0300 Subject: [PATCH 5/6] Fix expand query param building --- lib/src/resources/subscription.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/resources/subscription.dart b/lib/src/resources/subscription.dart index 6054ea0..cf05f13 100644 --- a/lib/src/resources/subscription.dart +++ b/lib/src/resources/subscription.dart @@ -33,7 +33,7 @@ class SubscriptionResource extends Resource { final response = await get( '$_resourceName/$id', queryParameters: { - 'expand': _expandParamComponents, + 'expand': _expandParamComponents(expand), }, ); From a8958f6891cc4193a615f397b6fd2207f501f0a1 Mon Sep 17 00:00:00 2001 From: solid-maksymtielnyi Date: Fri, 23 Aug 2024 23:26:58 +0300 Subject: [PATCH 6/6] Add payment intent confirmation method --- lib/messages.dart | 1 + lib/messages.g.dart | 38 +++++++++ .../requests/confirm_payment_intent.dart | 83 +++++++++++++++++++ lib/src/resources/payment_intent.dart | 13 +++ 4 files changed, 135 insertions(+) create mode 100644 lib/src/messages/requests/confirm_payment_intent.dart diff --git a/lib/messages.dart b/lib/messages.dart index e0945b0..6690c9b 100644 --- a/lib/messages.dart +++ b/lib/messages.dart @@ -26,6 +26,7 @@ part 'src/messages/price.dart'; part 'src/messages/product.dart'; part 'src/messages/promotion_code.dart'; part 'src/messages/refund.dart'; +part 'src/messages/requests/confirm_payment_intent.dart'; part 'src/messages/requests/create_checkout_session.dart'; part 'src/messages/requests/create_customer.dart'; part 'src/messages/requests/create_discount.dart'; diff --git a/lib/messages.g.dart b/lib/messages.g.dart index fa679d1..d0e99cc 100644 --- a/lib/messages.g.dart +++ b/lib/messages.g.dart @@ -1222,6 +1222,44 @@ const _$_RefundObjectEnumMap = { _RefundObject.refund: 'refund', }; +ConfirmPaymentIntentRequest _$ConfirmPaymentIntentRequestFromJson( + Map json) => + ConfirmPaymentIntentRequest( + paymentMethod: json['payment_method'] as String?, + receiptEmail: json['receipt_email'] as String?, + setupFutureUsage: $enumDecodeNullable( + _$SetupFutureUsageEnumMap, json['setup_future_usage']), + confirmationToken: json['confirmation_token'] as String?, + errorOnRequiresAction: json['error_on_requires_action'] as bool?, + mandate: json['mandate'] as String?, + offSession: json['off_session'] as bool?, + returnUrl: json['return_url'] as String?, + useStripeSdk: json['use_stripe_sdk'] as bool?, + ); + +Map _$ConfirmPaymentIntentRequestToJson( + ConfirmPaymentIntentRequest instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('payment_method', instance.paymentMethod); + writeNotNull('receipt_email', instance.receiptEmail); + writeNotNull('setup_future_usage', + _$SetupFutureUsageEnumMap[instance.setupFutureUsage]); + writeNotNull('confirmation_token', instance.confirmationToken); + writeNotNull('error_on_requires_action', instance.errorOnRequiresAction); + writeNotNull('mandate', instance.mandate); + writeNotNull('off_session', instance.offSession); + writeNotNull('return_url', instance.returnUrl); + writeNotNull('use_stripe_sdk', instance.useStripeSdk); + return val; +} + CreateCheckoutSessionRequest _$CreateCheckoutSessionRequestFromJson( Map json) => CreateCheckoutSessionRequest( diff --git a/lib/src/messages/requests/confirm_payment_intent.dart b/lib/src/messages/requests/confirm_payment_intent.dart new file mode 100644 index 0000000..dfac821 --- /dev/null +++ b/lib/src/messages/requests/confirm_payment_intent.dart @@ -0,0 +1,83 @@ +part of '../../../messages.dart'; + +@JsonSerializable() +class ConfirmPaymentIntentRequest { + /// ID of the payment method (a PaymentMethod, Card, or compatible Source + /// object) to attach to this PaymentIntent. + final String? paymentMethod; + + /// Email address that the receipt for the resulting payment will be sent to. + /// If receipt_email is specified for a payment in live mode, a receipt will + /// be sent regardless of your email settings. + final String? receiptEmail; + + /// Indicates that you intend to make future payments with this + /// PaymentIntent’s payment method. + /// + /// If you provide a Customer with the PaymentIntent, you can use this + /// parameter to attach the payment method to the Customer after the + /// PaymentIntent is confirmed and the customer completes any required + /// actions. If you don’t provide a Customer, you can still attach the + /// payment method to a Customer after the transaction completes. + /// + /// If the payment method is card_present and isn’t a digital wallet, Stripe + /// creates and attaches a generated_card payment method representing the + /// card to the Customer instead. + /// + /// When processing card payments, Stripe uses setup_future_usage to help you + /// comply with regional legislation and network rules, such as SCA. + /// + /// If you’ve already set setup_future_usage and you’re performing a request + /// using a publishable key, you can only update the value from on_session to + /// off_session. + final SetupFutureUsage? setupFutureUsage; + + /// ID of the ConfirmationToken used to confirm this PaymentIntent. + /// + /// If the provided ConfirmationToken contains properties that are also being + /// provided in this request, such as payment_method, then the values in + /// this request will take precedence. + final String? confirmationToken; + + /// Set to true to fail the payment attempt if the PaymentIntent transitions + /// into requires_action. This parameter is intended for simpler integrations + /// that do not handle customer actions, like saving cards without + /// authentication. + final bool? errorOnRequiresAction; + + /// ID of the mandate that’s used for this payment. + final String? mandate; + + /// Set to true to indicate that the customer isn’t in your checkout flow + /// during this payment attempt and can’t authenticate. Use this parameter in + /// scenarios where you collect card details and charge them later. + final bool? offSession; + + /// The URL to redirect your customer back to after they authenticate or + /// cancel their payment on the payment method’s app or site. If you’d prefer + /// to redirect to a mobile application, you can alternatively supply an + /// application URI scheme. This parameter is only used for cards and other + /// redirect-based payment methods. + final String? returnUrl; + + /// Set to true when confirming server-side and using Stripe.js, iOS, or + /// Android client-side SDKs to handle the next actions. + final bool? useStripeSdk; + + ConfirmPaymentIntentRequest({ + this.paymentMethod, + this.receiptEmail, + this.setupFutureUsage, + this.confirmationToken, + this.errorOnRequiresAction, + this.mandate, + this.offSession, + this.returnUrl, + this.useStripeSdk, + }); + + factory ConfirmPaymentIntentRequest.fromJson(Map json) => + _$ConfirmPaymentIntentRequestFromJson(json); + + Map toJson() => _$ConfirmPaymentIntentRequestToJson(this); +} diff --git a/lib/src/resources/payment_intent.dart b/lib/src/resources/payment_intent.dart index b239102..8209b97 100644 --- a/lib/src/resources/payment_intent.dart +++ b/lib/src/resources/payment_intent.dart @@ -64,4 +64,17 @@ class PaymentIntentResource extends Resource { return PaymentIntent.fromJson(response); } + + /// https://docs.stripe.com/api/payment_intents/confirm + Future confirm( + String id, { + required ConfirmPaymentIntentRequest request, + }) async { + final response = await post( + '$_resourceName/$id/confirm', + data: request.toJson(), + ); + + return PaymentIntent.fromJson(response); + } }