Flutter支付处理插件flutter_payments_stripe_sdk的使用

Flutter支付处理插件flutter_payments_stripe_sdk的使用

Stripe Flutter SDK 可以让你快速轻松地在你的Flutter应用中构建一个优秀的支付体验。我们提供了功能强大且可定制的UI屏幕和元素,可以直接使用来收集用户的支付信息。

开始使用Stripe,请参考Stripe的集成指南示例项目,或者浏览SDK的文档

特性

  • 简化安全:我们使你能够简单地收集敏感数据如信用卡号,并保持PCI合规。这意味着敏感数据会直接发送到Stripe,而不是通过你的服务器。更多详情,请参阅我们的集成安全指南
  • SCA就绪:如果需要遵守欧洲的强客户认证规定,SDK会自动执行原生的3D Secure认证
  • Stripe API:如果你想要使用低级别的API,可以使用我们的Stripe Dart
  • 原生UI:我们提供了原生屏幕和元素来收集支付和配送详情。例如,PaymentCardTextField是一个可以收集和验证卡片详细信息的Widget。

贡献

我们欢迎任何形式的贡献,包括新功能、错误修复和文档改进。如果这是一个重大更改,请先打开一个问题进行讨论。否则,对于小的更改(如拼写修正和单行代码),可以直接提交拉取请求。


完整示例Demo

以下是使用flutter_payments_stripe_sdk的一个完整示例:

import 'package:flutter/material.dart';
import 'package:flutter_payments_stripe_sdk/flutter_payments_stripe_sdk.dart';
import 'dart:convert' show json;
import 'package:http/http.dart' as http;
import 'dart:convert' as convert;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Stripe Flutter SDK Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var rows = ["创建支付意图", "创建设置意图"];
  // TODO: 插入你的API密钥
  var stripe = Stripe("pk_test_...");
  String? clientSecret = "";
  String? setupIntentClientSecret = "";
  // TODO: 插入你的后端URL
  var backendUrl = "";
  // TODO: 插入客户ID
  var customerID = "";
  //
  var testPaymentMethodID = "pm_card_threeDSecure2Required";

  startCheckout() async {
    var url = "$backendUrl/stripe/payment_intents/create";
    var body = {
      "params": {"amount": "200", "currency": "eur", "customer": customerID}
    };
    var response = await http.post(Uri.parse(url),
        headers: {'Content-Type': 'application/json'},
        body: convert.json.encode(body));
    var j = json.decode(response.body);
    if (j["data"] != null && j["data"]["clientSecret"] != null) {
      clientSecret = j["data"]["clientSecret"];
      print(clientSecret);
    } else {
      print("发生错误");
    }
  }

  startSetupIntent() async {
    var url = "$backendUrl/stripe/setup_intents/create";
    var body = {
      "params": {"customer": customerID}
    };
    var response = await http.post(Uri.parse(url),
        headers: {'Content-Type': 'application/json'},
        body: convert.json.encode(body));
    var j = json.decode(response.body);
    if (j["data"] != null && j["data"]["clientSecret"] != null) {
      setupIntentClientSecret = j["data"]["clientSecret"];
      print(setupIntentClientSecret);
    } else {
      print("发生错误");
    }
  }

  performAction(String item) async {
    if (backendUrl.isEmpty) {
      print("插入一个后端URL");
      return;
    }
    if (item == "创建支付意图") {
      await startCheckout();
      var res = await stripe.paymentIntents?.confirmPaymentIntent(clientSecret!,
          data: ConfirmPaymentIntentRequest(
              paymentMethod: testPaymentMethodID,
              returnUrl: stripe.getReturnUrlForSca(),
              useStripeSdk: false));
      if (res.runtimeType == StripeError) {
        print((res as StripeError).toJson());
      } else if (res.runtimeType == PaymentIntent) {
        print((res as PaymentIntent).toJson());
      }
    } else if (item == "创建设置意图") {
      await startSetupIntent();
      var res = await stripe.setupIntents?.confirmSetupIntent(
          setupIntentClientSecret!,
          data: ConfirmSetupIntentRequest(
              paymentMethod: PaymentMethodData(
                  type: PaymentMethodType.card,
                  card: CardMethod(
                      cvc: "555",
                      expMonth: 12,
                      expYear: 24,
                      number: "4242424242424242")),
              useStripeSdk: false,
              returnUrl: stripe.getReturnUrlForSca()));
      if (res.runtimeType == StripeError) {
        print((res as StripeError).toJson());
      } else if (res.runtimeType == SetupIntent) {
        print((res as SetupIntent).toJson());
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stripe Flutter SDK Example'),
      ),
      body: GestureDetector(
        behavior: HitTestBehavior.translucent,
        onTap: () {
          FocusScope.of(context).unfocus();
        },
        child: Padding(
            padding: EdgeInsets.all(0.0),
            child: ListView.separated(
              itemBuilder: (context, index) {
                if (index == rows.length) {
                  return Padding(
                    padding: const EdgeInsets.fromLTRB(0, 20, 0, 20),
                    child: PaymentCardTextField(
                      border: (status, card) {
                        if (card.isEmpty()) {
                          return Border.all(color: Colors.grey);
                        } else if (status ==
                            PaymentCardTextFieldStatus.success) {
                          return Border.all(color: Colors.green);
                        } else {
                          return Border.all(color: Colors.red);
                        }
                      },
                      onCardChanged: (card) {
                        print(card.toPaymentMethod());
                      },
                      showShadow: false,
                    ),
                  );
                }
                var item = rows[index];
                return TextIcon(
                  title: item,
                  shapedSelectedBackground: false,
                  tapHandler: (d) {
                    performAction(item);
                  },
                );
              },
              separatorBuilder: (context, index) {
                return SeparatorLine(margin: EdgeInsets.fromLTRB(20, 0, 0, 0));
              },
              itemCount: rows.length + 1,
            )),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter支付处理插件flutter_payments_stripe_sdk的示例代码。该插件允许你在Flutter应用中集成Stripe支付功能。

首先,确保你已经在你的Flutter项目中添加了flutter_payments_stripe_sdk依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_payments_stripe_sdk: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你需要配置Stripe的公钥和私钥。你可以在Stripe的仪表盘中生成这些密钥。将公钥(publishable key)添加到你的android/app/src/main/res/values/strings.xml(对于Android)和ios/Runner/Info.plist(对于iOS)文件中。

对于Android(strings.xml):

<resources>
    <string name="stripe_publishable_key">你的公钥</string>
</resources>

对于iOS(Info.plist):

<key>StripePublishableKey</key>
<string>你的公钥</string>

私钥(secret key)应该保存在你的服务器端,用于处理支付事务。

下面是一个简单的Flutter代码示例,展示如何使用flutter_payments_stripe_sdk来创建一个支付意图并启动支付流程:

import 'package:flutter/material.dart';
import 'package:flutter_payments_stripe_sdk/flutter_payments_stripe_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Stripe Payment Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final Stripe _stripe = Stripe();
  String _paymentStatus = 'Not Paid';

  void _initiatePayment() async {
    try {
      // 创建支付意图
      final paymentIntent = await _stripe.createPaymentIntent(
        amount: 1000,  // 金额,单位为美分(1000美分 = 10美元)
        currency: 'usd',
      );

      // 启动支付流程
      final result = await Stripe.paymentRequestWithNativePay(
        paymentIntentClientSecret: paymentIntent.clientSecret,
      );

      if (result.status == PaymentResultStatus.succeeded) {
        setState(() {
          _paymentStatus = 'Paid Successfully';
        });
      } else {
        setState(() {
          _paymentStatus = 'Payment Failed';
        });
      }
    } catch (e) {
      print('Error: $e');
      setState(() {
        _paymentStatus = 'Error: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Stripe Payment Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _paymentStatus,
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _initiatePayment,
              child: Text('Pay \$10'),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例代码展示了如何创建一个支付意图,并启动一个支付请求。支付请求的结果将更新到UI中。

请注意,为了完全集成Stripe支付,你还需要在你的服务器端处理支付意图的创建和确认,因为私钥不应该在客户端应用中使用。上面的示例仅用于展示如何在客户端启动支付流程。

此外,请确保你已经阅读并遵循了flutter_payments_stripe_sdk的官方文档和Stripe的集成指南,以获取最新的配置和最佳实践。

回到顶部