Flutter支付功能插件pay的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter支付功能插件pay的使用

Flutter应用程序可以通过pay插件轻松集成支付功能,支持Google Pay(Android)和Apple Pay(iOS)。本文将详细介绍如何设置、配置和使用此插件,并提供完整的示例代码。

平台支持

平台 支持的支付方式
Android Google Pay
iOS Apple Pay

开始使用

在开始之前,请确保你已经为计划支持的支付提供商创建了账户并按照其要求完成了相关设置:

Apple Pay 设置

  1. 查看集成要求
  2. 创建一个商户标识符
  3. 创建一个支付处理证书,以加密支付信息。

Google Pay 设置

  1. 查看集成要求
  2. 注册并登录商家控制台,创建账户。

使用方法

要开始使用此插件,请在pubspec.yaml文件中添加pay作为依赖项:

dependencies:
  pay: ^3.1.0

定义支付提供商的配置。请参考官方文档中的参数说明:Apple PayGoogle Pay,或者查看包内的示例配置

示例代码

以下是一个完整的示例应用,展示了如何配置和使用pay插件进行支付操作:

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

import 'payment_configurations.dart' as payment_configurations;

void main() {
  runApp(const PayMaterialApp());
}

const _paymentItems = [
  PaymentItem(
    label: 'Total',
    amount: '99.99',
    status: PaymentItemStatus.final_price,
  )
];

class PayMaterialApp extends StatelessWidget {
  const PayMaterialApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Pay for Flutter Demo',
      localizationsDelegates: [
        ...GlobalMaterialLocalizations.delegates,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''),
        Locale('es', ''),
        Locale('de', ''),
      ],
      home: PaySampleApp(),
    );
  }
}

class PaySampleApp extends StatefulWidget {
  const PaySampleApp({super.key});

  @override
  State<PaySampleApp> createState() => _PaySampleAppState();
}

class _PaySampleAppState extends State<PaySampleApp> {
  late final Future<PaymentConfiguration> _googlePayConfigFuture;

  @override
  void initState() {
    super.initState();
    _googlePayConfigFuture =
        PaymentConfiguration.fromAsset('default_google_pay_config.json');
  }

  void onGooglePayResult(paymentResult) {
    debugPrint(paymentResult.toString());
  }

  void onApplePayResult(paymentResult) {
    debugPrint(paymentResult.toString());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('T-shirt Shop'),
      ),
      backgroundColor: Colors.white,
      body: ListView(
        padding: const EdgeInsets.symmetric(horizontal: 20),
        children: [
          Container(
            margin: const EdgeInsets.symmetric(vertical: 20),
            child: const Image(
              image: AssetImage('assets/images/ts_10_11019a.jpg'),
              height: 350,
            ),
          ),
          const Text(
            "Amanda's Polo Shirt",
            style: TextStyle(
              fontSize: 20,
              color: Color(0xff333333),
              fontWeight: FontWeight.bold,
            ),
          ),
          const SizedBox(height: 5),
          const Text(
            '\$50.20',
            style: TextStyle(
              color: Color(0xff777777),
              fontSize: 15,
            ),
          ),
          const SizedBox(height: 15),
          const Text(
            'Description',
            style: TextStyle(
              fontSize: 15,
              color: Color(0xff333333),
              fontWeight: FontWeight.bold,
            ),
          ),
          const SizedBox(height: 5),
          const Text(
            'A versatile full-zip that you can wear all day long and even...',
            style: TextStyle(
              color: Color(0xff777777),
              fontSize: 15,
            ),
          ),
          // Example pay button configured using an asset
          FutureBuilder<PaymentConfiguration>(
              future: _googlePayConfigFuture,
              builder: (context, snapshot) =>
                  snapshot.hasData
                      ? GooglePayButton(
                          paymentConfiguration: snapshot.data!,
                          paymentItems: _paymentItems,
                          type: GooglePayButtonType.buy,
                          margin: const EdgeInsets.only(top: 15.0),
                          onPaymentResult: onGooglePayResult,
                          loadingIndicator: const Center(
                            child: CircularProgressIndicator(),
                          ),
                        )
                      : const SizedBox.shrink()),
          // Example pay button configured using a string
          ApplePayButton(
            paymentConfiguration: payment_configurations.defaultApplePayConfig,
            paymentItems: _paymentItems,
            style: ApplePayButtonStyle.black,
            type: ApplePayButtonType.buy,
            margin: const EdgeInsets.only(top: 15.0),
            onPaymentResult: onApplePayResult,
            loadingIndicator: const Center(
              child: CircularProgressIndicator(),
            ),
          ),
          const SizedBox(height: 15)
        ],
      ),
    );
  }
}

在这个例子中,我们首先通过PaymentConfiguration.fromAsset从资源文件加载Google Pay的配置,然后分别使用GooglePayButtonApplePayButton来展示支付按钮。当用户点击这些按钮时,会触发相应的回调函数(如onGooglePayResult),你可以在这里处理支付结果或将其发送到服务器。

高级用法

如果你需要更细粒度地控制每个请求和按钮的行为,可以创建一个Pay客户端实例,并独立地向布局中添加按钮。此外,还可以使用userCanPay方法检查用户是否能够使用特定的支付方式,以及订阅支付结果事件等高级功能。

有关更多详细信息,请参阅官方文档和其他相关资源。


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

1 回复

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


当然,以下是如何在Flutter应用中使用pay插件来实现支付功能的示例代码。pay插件是一个通用的支付插件,支持多种支付方式,但具体实现可能会因支付平台(如Stripe、PayPal等)的不同而有所差异。以下示例以Stripe支付为例进行演示。

1. 添加依赖

首先,在pubspec.yaml文件中添加pay插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  pay: ^1.0.10  # 请检查最新版本号

2. 配置Android和iOS

对于Android,你需要在android/app/src/main/AndroidManifest.xml中添加必要的权限,并配置Stripe的公钥。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 其他配置 -->

    <meta-data
        android:name="com.stripe.android.publishable_key"
        android:value="你的Stripe公钥" />

    <!-- 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

对于iOS,你需要在ios/Runner/Info.plist中添加Stripe的配置,并在Stripe Dashboard获取测试用的公钥。此外,你还需要在Xcode中配置Stripe SDK。

3. 实现支付功能

在你的Flutter代码中,你可以这样实现支付功能:

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

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

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

class PaymentScreen extends StatefulWidget {
  @override
  _PaymentScreenState createState() => _PaymentScreenState();
}

class _PaymentScreenState extends State<PaymentScreen> {
  final Pay _pay = Pay();

  Future<void> _initiatePayment() async {
    try {
      // 配置支付信息,这里以Stripe为例
      String stripePublicKey = '你的Stripe公钥';
      String paymentMethodId = 'card_1IZ68SI2eZvKYlo2CnFyfU8A'; // 示例支付方法ID,实际使用时需要动态获取
      double amount = 100.0; // 支付金额,单位为美分
      String currencyCode = 'usd'; // 货币代码

      Map<String, dynamic> paymentDetails = {
        'stripePublicKey': stripePublicKey,
        'paymentMethodId': paymentMethodId,
        'amount': amount,
        'currencyCode': currencyCode,
      };

      // 发起支付请求
      String platformResponse = await _pay.startPayment(
        context: context,
        paymentDetails: paymentDetails,
        supportedMethods: ['stripe'],
      );

      // 处理支付结果
      print('Platform response: $platformResponse');
      // 根据platformResponse进行后续处理,如验证支付状态、更新UI等

    } catch (e) {
      print('Payment failed: $e');
      // 处理支付失败的情况
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Payment Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _initiatePayment,
          child: Text('Pay $10.00'),
        ),
      ),
    );
  }
}

注意事项

  1. 测试环境:确保你在测试环境中使用测试用的公钥和私钥,以及测试用的支付卡信息。
  2. 支付方法ID:在上面的代码中,paymentMethodId是硬编码的。在实际应用中,你需要在客户端或服务器端动态获取这个ID。
  3. 安全性:不要在客户端硬编码敏感信息,如私钥。所有敏感操作应在服务器端完成。
  4. 支付回调:支付成功后,你可能需要向你的服务器发送请求以验证支付状态,并据此更新UI或执行其他逻辑。

以上代码提供了一个基本的框架,你可以根据自己的需求进行调整和扩展。

回到顶部