Integração do Flutter Stripe Super Fácil

Tempo de leitura: 4 minutes

Flutter é uma estrutura de desenvolvimento de aplicativos móveis de código aberto que permite aos desenvolvedores criar aplicativos móveis de alto desempenho e visualmente impressionantes para plataformas Android e iOS. O Stripe, por outro lado, é uma plataforma de processamento de pagamentos online que ajuda as empresas a aceitar pagamentos online com segurança e facilidade.

Neste artigo, veremos o processo de integração do Stripe ao Flutter.

 

Pré-requisitos

Antes de mergulharmos no processo de integração, existem alguns pré-requisitos que você precisa cumprir:

  • Um ambiente de desenvolvimento Flutter configurado em seu sistema
  • Uma conta Stripe com chaves de API
  • Conhecimento básico da linguagem de programação Flutter e Dart

Etapa 1: adicionar dependências

A primeira etapa é adicionar os pacotes Stripe e http como dependências em seu aplicativo Flutter. Você pode fazer isso adicionando as seguintes linhas no arquivo pubspec.yaml:

dependencies:
  flutter_stripe: ^9.2.2
  http: ^0.13.6

Após adicionar as dependências, execute o comando “flutter pub get” para baixá-las e instalá-las.

 

Etapa 2: configurar chaves de API Stripe

Para configurar as chaves de API do Stripe, navegue até o painel do Stripe e localize a seção de chaves de API. Você precisará das chaves pública e secreta para a integração. Copie as chaves e salve-as em algum lugar seguro, pois você precisará delas posteriormente no processo de integração.

Se você não tem uma conta stripe, não se preocupe, é grátis, você pode se inscrever facilmente.

OU estou compartilhando com você as chaves de API de teste que você pode usar para praticar. Se você estiver integrando o stripe para o seu cliente, ele fornecerá as chaves publicáveis e secretas para esse processo.

Stripe Test Credentials:

Publishable Key: pk_test_TYooMQauvdEDq54NiTphI7jx

Secret Key: sk_test_4eC39HqLyjWDarjtT1zdp7dc

Etapa 3: definir a chave publicável

Primeiro, você deve definir a chave publicável usada para identificar a conta na plataforma Stripe. Você pode configurá-lo em seu arquivo main.dart passando uma chave publicável para ele conforme fornecido abaixo.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Stripe.publishableKey = 'pk_test_TYooMQauvdEDq54NiTphI7jx';
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  runApp(MyAppView());
}

 

Etapa 4: Faça um Pagamento Stripe

Deixe-me explicar o código por partes 😃 Primeiro, crie uma variável com o tipo de dados Map como esta fora da função em qualquer lugar;

Map<String, dynamic>? paymentIntent;
paymentIntent = await createPaymentIntent(double.parse(amount).toInt().toString(), 'AED');

Neste, o que estou fazendo é apenas criar uma intenção de pagamento chamando o método createPaymentIntent, que recebe dois parâmetros posicionais, um é o valor que você deseja verificar e o segundo é a moeda. Este createPaymentIntent não é uma função interna que estou criando abaixo como;

Esta é a solicitação de postagem que leva o cabeçalho com sua chave secreta e o corpo como Mapa com seu valor e moeda. Se você ver no corpo, estamos calculando o valor chamando a função,

calculateAmount(String amount) {
    final calculatedAmount = (int.parse(amount)) * 100;
    return calculatedAmount.toString();
  }

Estamos fazendo isso porque o stripe aceita pagamento em centavos.

Após a decodificação você terá uma resposta que retornará ao Intent de pagamento onde foi chamado. Agora vamos criar uma instância stripe para processamento posterior como;

await Stripe.instance
          .initPaymentSheet(
            paymentSheetParameters: SetupPaymentSheetParameters(
              paymentIntentClientSecret: paymentIntent!['client_secret'],
              // applePay: const PaymentSheetApplePay(merchantCountryCode: '+92',),
              // googlePay: const PaymentSheetGooglePay(testEnv: true, currencyCode: "US", merchantCountryCode: "+92"),
              merchantDisplayName: 'Customer Name',
            ),
          )
          .then((value) {});

Este pedaço de código está apenas criando uma instância stripe, passando a intenção de pagamento que você acabou de criar.

Portanto, a função completa ficará assim;

Future<void> makePayment(BuildContext context, String amount) async {
    try {
      paymentIntent = await createPaymentIntent(double.parse(amount).toInt().toString(), 'AED');
      //Payment Sheet
      await Stripe.instance
          .initPaymentSheet(
            paymentSheetParameters: SetupPaymentSheetParameters(
              paymentIntentClientSecret: paymentIntent!['client_secret'],
              // applePay: const PaymentSheetApplePay(merchantCountryCode: '+92',),
              // googlePay: const PaymentSheetGooglePay(testEnv: true, currencyCode: "US", merchantCountryCode: "+92"),
              merchantDisplayName: 'Mouaz User',
            ),
          )
          .then((value) {});

      ///now finally display payment sheeet
      displayPaymentSheet(context, amount);
    } catch (e, s) {
      log('exception:$e$s');
    }
  }

Em seguida, chama o displayPaymentSheet(contexto, valor); que apresentará o processo de pagamento stripe e mostrará sucesso se o pagamento for concluído.

displayPaymentSheet(BuildContext context, String amount) async {
    try {
      await Stripe.instance.presentPaymentSheet().then((value) async {
        showCustomSnackBar(title: 'Success', message: 'Payment Successful');
        paymentIntent = null;
      }).onError((error, stackTrace) {
        log('Error is:--->$error $stackTrace');
      });
    } on StripeException catch (e) {
      log('Error is:---> $e');
    } catch (e) {
      log('$e');
    }
  }

Etapa 5: Forma de pagamento por chamada
Agora você só precisa projetar qualquer botão e, ao pressionar, basta chamar a função como;

makePayment(context, '125');

Estrondo! 🤩 Você integrou com sucesso o stripe em seu aplicativo flutter. Você pode ver como é fácil.

Estou compartilhando com você o arquivo com todas as funções escritas nele para que você possa entendê-lo facilmente. Se tiver alguma dificuldade pode entrar em contato.

// Please import all the necessary librarues and functions

class StripeController {
 
  String publishableKey = 'pk_test_TYooMQauvdEDq54NiTphI7jx';
  String secretKey = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc';

  Map<String, dynamic>? paymentIntent;

  Future<void> makePayment(BuildContext context, String amount) async {
    try {
      paymentIntent = await createPaymentIntent(double.parse(amount).toInt().toString(), 'AED');
      //Payment Sheet
      await Stripe.instance
          .initPaymentSheet(
            paymentSheetParameters: SetupPaymentSheetParameters(
              paymentIntentClientSecret: paymentIntent!['client_secret'],
              // applePay: const PaymentSheetApplePay(merchantCountryCode: '+92',),
              // googlePay: const PaymentSheetGooglePay(testEnv: true, currencyCode: "US", merchantCountryCode: "+92"),
              merchantDisplayName: 'Mouaz User',
            ),
          )
          .then((value) {});

      ///now finally display payment sheeet
      displayPaymentSheet(context, amount);
    } catch (e, s) {
      log('exception:$e$s');
    }
  }

  //  Future<Map<String, dynamic>>
  createPaymentIntent(String amount, String currency) async {
    try {
      Map<String, dynamic> body = {'amount': calculateAmount(amount), 'currency': currency, 'payment_method_types[]': 'card'};

      var response = await http.post(
        Uri.parse('https://api.stripe.com/v1/payment_intents'),
        headers: {'Authorization': 'Bearer $secretKey', 'Content-Type': 'application/x-www-form-urlencoded'},
        body: body,
      );
      // ignore: avoid_print
      print('Payment Intent Body->>> ${response.body.toString()}');
      return jsonDecode(response.body);
    } catch (err) {
      // ignore: avoid_print
      print('err charging user: ${err.toString()}');
    }
  }

  calculateAmount(String amount) {
    final calculatedAmount = (int.parse(amount)) * 100;
    return calculatedAmount.toString();
  }

  displayPaymentSheet(BuildContext context, String amount) async {
    try {
      await Stripe.instance.presentPaymentSheet().then((value) async {
        showCustomSnackBar(title: 'Success', message: 'Payment Successful');
        await orderController.createOrder(amount);

        paymentIntent = null;
      }).onError((error, stackTrace) {
        log('Error is:--->$error $stackTrace');
      });
    } on StripeException catch (e) {
      log('Error is:---> $e');
      showDialog(context: context, builder: (_) => const AlertDialog(content: Text("Cancelled ")));
    } catch (e) {
      log('$e');
    }
  }
}

Obrigado!

Bom aprendizado ☺️

Não deixe de conhecer meus Ebooks de Flutter/Dart