From 749a4d2b42d7118c97414e153c2c42b76b158008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mon?= Date: Wed, 10 Jul 2024 08:29:37 +0100 Subject: [PATCH] implement affirm example screen (#1816) Co-authored-by: Remon --- .../affirm_screen.dart | 87 +++++++++++++++++++ example/lib/screens/screens.dart | 7 ++ .../lib/src/models/payment_methods.dart | 2 +- 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 example/lib/screens/regional_payment_methods/affirm_screen.dart diff --git a/example/lib/screens/regional_payment_methods/affirm_screen.dart b/example/lib/screens/regional_payment_methods/affirm_screen.dart new file mode 100644 index 000000000..ca64b52fb --- /dev/null +++ b/example/lib/screens/regional_payment_methods/affirm_screen.dart @@ -0,0 +1,87 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_stripe/flutter_stripe.dart'; +import 'package:http/http.dart' as http; +import 'package:stripe_example/widgets/example_scaffold.dart'; +import 'package:stripe_example/widgets/loading_button.dart'; + +import '../../config.dart'; + +class AffirmScreen extends StatelessWidget { + const AffirmScreen({Key? key}) : super(key: key); + + Future> _createPaymentIntent() async { + final url = Uri.parse('$kApiUrl/create-payment-intent'); + final response = await http.post( + url, + headers: { + 'Content-Type': 'application/json', + }, + body: json.encode({ + 'currency': 'usd', + 'payment_method_types': ['affirm'], + }), + ); + + print('blaat ${json.decode(response.body)}'); + return json.decode(response.body); + } + + Future _pay(BuildContext context) async { + // Precondition: + //Make sure to have set a custom URI scheme in your app and add it to Stripe SDK + // see file main.dart in this example app. + // 1. on the backend create a payment intent for payment method and save the + // client secret. + final result = await _createPaymentIntent(); + final clientSecret = await result['clientSecret']; + + // 2. use the client secret to confirm the payment and handle the result. + try { + await Stripe.instance.confirmPayment( + paymentIntentClientSecret: clientSecret, + data: + PaymentMethodParams.affirm(paymentMethodData: PaymentMethodData()), + ); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Payment succesfully completed'), + ), + ); + } on Exception catch (e) { + if (e is StripeException) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + 'Error from Stripe: ${e.error.localizedMessage ?? e.error.code}'), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Unforeseen error: ${e}'), + ), + ); + } + } + } + + @override + Widget build(BuildContext context) { + return ExampleScaffold( + title: 'Affirm', + tags: ['Payment method'], + padding: EdgeInsets.all(16), + children: [ + LoadingButton( + onPressed: () async { + await _pay(context); + }, + text: 'Pay', + ), + ], + ); + } +} diff --git a/example/lib/screens/screens.dart b/example/lib/screens/screens.dart index 608187c46..d821c4411 100644 --- a/example/lib/screens/screens.dart +++ b/example/lib/screens/screens.dart @@ -5,6 +5,7 @@ import 'package:stripe_example/screens/payment_sheet/payment_element/payment_ele import 'package:stripe_example/screens/payment_sheet/payment_sheet_deffered_screen.dart'; import 'package:stripe_example/screens/payment_sheet/payment_sheet_screen.dart'; import 'package:stripe_example/screens/payment_sheet/payment_sheet_screen_custom_flow.dart'; +import 'package:stripe_example/screens/regional_payment_methods/affirm_screen.dart'; import 'package:stripe_example/screens/regional_payment_methods/ali_pay_screen.dart'; import 'package:stripe_example/screens/regional_payment_methods/aubecs_debit.dart'; import 'package:stripe_example/screens/regional_payment_methods/cash_app_screen.dart'; @@ -237,6 +238,12 @@ class Example extends StatelessWidget { builder: (context) => AliPayScreen(), platformsSupported: [DevicePlatform.android, DevicePlatform.ios], ), + Example( + title: 'Affirm', + leading: SizedBox(), + builder: (context) => AffirmScreen(), + platformsSupported: [DevicePlatform.android, DevicePlatform.ios], + ), Example( title: 'Cash app Pay', builder: (context) => CashAppScreen(), diff --git a/packages/stripe_platform_interface/lib/src/models/payment_methods.dart b/packages/stripe_platform_interface/lib/src/models/payment_methods.dart index ee8584690..7945e99cd 100644 --- a/packages/stripe_platform_interface/lib/src/models/payment_methods.dart +++ b/packages/stripe_platform_interface/lib/src/models/payment_methods.dart @@ -55,7 +55,7 @@ class PaymentMethod with _$PaymentMethod { @JsonKey(name: 'Upi') required Upi upi, - /// Containing additional data in case paymentmethod type is UPI. + /// Containing additional data in case paymentmethod type is Us bank account. @JsonKey(name: 'USBankAccount') required UsBankAccount usBankAccount, /// Id related to the customer to which this paymentmethod has been saved.