Flutter支付集成插件stripe_intent_data的使用

Flutter支付集成插件stripe_intent_data的使用

stripe_intent_data

stripe_intent_data 是一个新的 Flutter 包,旨在减少编写与 Stripe 相关代码的工作量,例如创建客户 ID、获取支付意图数据和获取收费详情。

开始使用

创建支付意图

String stripeSecretKey =
    'sk_test_51I';

var data = await StripeIntentData(
  currency: 'EUR',
  stripeSecretKey: stripeSecretKey,
).getStripeIntent('name', 'email ID', 'amount', 'customer ID if available otherwise null');

获取支付详情

String stripeSecretKey =
    'sk_test_51I';

var data = await StripeIntentData(
  currency: 'EUR',
  stripeSecretKey: stripeSecretKey,
).getPaymentDetails(paymentIntentID);

使用案例示例

示例图 示例图 示例图

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 stripe_intent_data 插件进行支付集成。

import 'dart:developer';

import 'package:example/stripe_key.dart';
import 'package:flutter/material.dart';
import 'package:flutter_stripe/flutter_stripe.dart';
import 'package:stripe_intent_data/response/intent_data.dart';
import 'package:stripe_intent_data/stripe_intent_data.dart';
import 'package:url_launcher/url_launcher.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Stripe.publishableKey = publishableKeyTest; // 你的发布密钥
  Stripe.merchantIdentifier = '';
  await Stripe.instance.applySettings();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  IntentData? paymentIntentData;
  String? customerID;
  String? receiptURL;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: MaterialButton(
          onPressed: () async {
            checkOut();
          },
          color: Colors.blue,
          child: const Text(
            "Pay Now",
            style: TextStyle(
              color: Colors.white,
              fontSize: 17,
            ),
          ),
        ),
      ),
    );
  }

  Future<void> checkOut() async {
    /// 存储客户ID到数据库
    /// 初始时为null,Stripe会创建客户ID,并通过intentData对象获取它
    /// 当你获取到它后,保存到数据库
    /// 需要时调用

    paymentIntentData = await StripeIntentData(
      stripeSecretKey: stripeSecretKey,
      currency: 'EUR',
    ).getStripeIntent('User One', 'userone@user.com', '2000', customerID);

    await Stripe.instance.initPaymentSheet(
      paymentSheetParameters: SetupPaymentSheetParameters(
        applePay: true,
        googlePay: true,
        style: ThemeMode.dark,
        testEnv: true,
        merchantCountryCode: 'GB',
        merchantDisplayName: 'My Merchandise',
        paymentIntentClientSecret: paymentIntentData!.paymentIntentClientSecret,
        customerEphemeralKeySecret: paymentIntentData!.ephemeralKey,
        customerId: paymentIntentData!.customer,
      ),
    );

    await displayPaymentSheet();
    Uri _url = Uri.parse(receiptURL!);
    await launchUrl(_url, mode: LaunchMode.inAppWebView);
  }

  displayPaymentSheet() async {
    try {
      await Stripe.instance.presentPaymentSheet().then((newValue) async {
        /// 获取收费详情
        var data = await StripeIntentData(
          stripeSecretKey: stripeSecretKey,
          currency: 'EUR',
        ).getPaymentDetails(
          paymentIntentData!.paymentIntentId!,
        );
        setState(() {
          receiptURL = data.receiptUrl;
          // 保存客户ID到数据库(在实际应用中)
          customerID = paymentIntentData!.customer;
        });
      });
    } on StripeException catch (e) {
      log(e.error.message.toString());
    } catch (e) {
      log(e.toString());
    }
  }
}

更多关于Flutter支付集成插件stripe_intent_data的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter支付集成插件stripe_intent_data的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成Stripe支付时,stripe_intent_data 是一个非常有用的插件,它可以帮助你处理支付意图(Payment Intent)相关的数据。以下是如何使用 stripe_intent_data 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 stripe_intent_data 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  stripe_intent_data: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化Stripe

在使用 stripe_intent_data 之前,你需要初始化Stripe。通常,你会在应用的入口处(如 main.dart)进行初始化:

import 'package:stripe_intent_data/stripe_intent_data.dart';

void main() {
  StripeIntentData.initialize(
    publishableKey: 'your_publishable_key',
    stripeAccount: 'your_stripe_account_id',  // 可选
  );
  runApp(MyApp());
}

3. 创建Payment Intent

在用户发起支付时,你需要在服务器端创建一个Payment Intent,并返回客户端所需的 client_secret。假设你已经从服务器获取到了 client_secret,接下来你可以在客户端使用 stripe_intent_data 来处理支付:

import 'package:stripe_intent_data/stripe_intent_data.dart';

Future<void> handlePayment(String clientSecret) async {
  try {
    final paymentIntent = await StripeIntentData.confirmPayment(
      clientSecret: clientSecret,
      paymentMethodId: 'pm_card_visa',  // 这里使用测试卡号
    );

    if (paymentIntent.status == 'succeeded') {
      // 支付成功
      print('Payment succeeded!');
    } else {
      // 支付失败或需要进一步处理
      print('Payment failed or requires further action.');
    }
  } catch (e) {
    // 处理异常
    print('Error: $e');
  }
}

4. 处理支付结果

根据 paymentIntent 的状态,你可以处理支付成功、失败或需要进一步操作的情况。

5. 测试支付

为了确保你的集成工作正常,你可以使用Stripe提供的测试卡号来进行测试。例如:

  • 4242 4242 4242 4242 - Visa卡号,默认成功
  • 4000 0027 6000 3184 - 需要3D Secure验证

6. 处理3D Secure验证

如果你的支付需要3D Secure验证,stripe_intent_data 也支持处理这种情况。你可以在 confirmPayment 方法中传递 requiresAction 参数来触发3D Secure验证流程。

final paymentIntent = await StripeIntentData.confirmPayment(
  clientSecret: clientSecret,
  paymentMethodId: 'pm_card_threeDSecure2Required',  // 需要3D Secure验证的测试卡号
);

if (paymentIntent.status == 'requires_action') {
  // 触发3D Secure验证
  await StripeIntentData.handleNextAction(clientSecret);
}
回到顶部