Flutter支付集成插件xpay_element_flutter_stage的使用

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

Flutter支付集成插件xpay_element_flutter_stage的使用

XPay Element for Flutter 是一个嵌入式支付系统,允许你在Flutter应用程序内直接从用户处收取付款。此包高度可定制,使你可以根据应用的主题和风格来调整支付表单的外观和功能。

特性

无缝支付集成

轻松地将支付功能集成到你的Flutter应用中,而无需重定向用户到外部应用程序或页面。

自定义样式

使用自定义标签、占位符等,根据你的应用主题来样式化支付SDK。

嵌入式认证

在应用内部进行OTP认证,确保顺畅且安全的用户体验。

事件处理

利用内置事件(如onBinDiscountonReady)动态管理更改并验证输入。

开始使用

要将XPay嵌入式支付系统集成到你的Flutter应用中,请首先在pubspec.yaml文件中添加以下依赖:

dependencies:
  xpay_element_flutter_stage: ^3.0.1

使用方法

要使用XPay SDK,你需要遵循以下步骤:

导入包

import 'package:xpay_element_flutter_stage/xpay_element_flutter_stage.dart';

初始化元素控制器

创建一个带有XPay仪表板上可用的必要凭证的XPayElementController实例:

final XPayElementController controller = XPayElementController(
  publicKey: "your_account_public_key",
  hmacKey: "your_account_hmac_key",
  accountId: "your_account_id"
);

嵌入支付小部件

XPayElementWidget集成到你的应用的widget树中,并用控制器配置它:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('XPay支付示例')),
    body: XPayElementWidget(controller: controller),
  );
}

自定义样式

为了使SDK的外观与你的应用主题无缝集成,你可以修改元素的样式和外观,使其适应各种设计需求。

初始化和应用自定义样式

初始化XPayElementCustomStyle并传递自定义样式配置给其构造函数。以下是如何定制支付元素外观的一个示例:

@override
XPayElementCustomStyle elementCustomStyle =
    XPayElementCustomStyle.configureCustomStyle({
  "inputConfiguration": {
    "cardNumber": {
      "label": "卡号",
      "placeholder": "请输入卡号"
    },
    "expiry": {"label": "有效期", "placeholder": "MM/YY"},
    "cvc": {"label": "CVC", "placeholder": "请输入CVC"}
  },
  "inputStyle": {
    "height": 40,
    "textColor": 0xff000000,
    "textSize": 16,
    "fontWeight": 400,
    "borderColor": 0xffe6e6e6,
    "borderRadius": 5,
    "borderWidth": 1
  },
  "inputLabelStyle": {
    "textSize": 16,
    "fontWeight": 400,
    "textColor": 0xff000000
  },
  "onFocusInputStyle": {
    "textColor": 0xff000000,
    "textSize": 16,
    "fontWeight": 400,
    "borderColor": 0xffc8dbf9,
    "borderWidth": 1
  },
  "invalidStyle": {
    "borderColor": 0xffff0000,
    "borderWidth": 1,
    "textColor": 0xffff0000,
    "textSize": 14,
    "fontWeight": 400
  },
  "errorMessageStyle": {
    "textColor": 0xffff0000,
    "textSize": 14,
    "fontWeight": 400
  }
});

应用自定义样式

配置好样式后,将其应用到XPayElementWidget以增强用户界面:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('自定义样式的XPay元素')),
    body: XPayElementWidget(style: elementCustomStyle, controller: controller)
  );
}

上述样式属性都是可选的;你只需定义所需的部分,以确保灵活性和定制化符合特定的设计需求。

元素事件

处理元素特定事件以增强用户体验:

onReady事件

当所有表单字段有效且表单准备提交时触发此事件。

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('自定义样式的XPay元素')),
    body: XPayElementWidget(
            controller: controller,
            onReady: (bool isReady) {
                // 更新状态以启用支付提交
            },
        )
    );
}

onBinDiscount事件

当用户输入卡号时接收与卡BIN相关的数据,可用于实现折扣或促销活动。

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('自定义样式的XPay元素')),
    body: XPayElementWidget(
            controller: controller,
            onBinDiscount: (dynamic binDiscountData) {
                // 处理并应用基于BIN的折扣
            },
        )
    );
}

确认支付

当所有表单字段有效且onReady事件返回true时,你应该执行一些必要的步骤来进行支付确认。首先,确保你已经发起了一次服务器端的API调用来创建支付意向。此创建意向API负责生成clientSecretencryptionKey,这对安全支付确认至关重要。

服务器端支付意向创建

在客户端调用支付确认之前,你的后端应该调用创建意向API以获得:

  • clientSecret:用于安全启动支付过程的秘密密钥。
  • encryptionKey:用于在传输前加密敏感信息。

确认支付

一旦从后端获取了必要的密钥,使用早期初始化的XPayElementController调用confirmPayment方法。以下是你的Flutter应用中如何实现这一操作的方法:

void confirmPayment() async {
  try {
    // 假设'controller'是你的XPayElementController实例
    var paymentResponse = await controller.confirmPayment(
      customerName: "客户名称",
      clientSecret: "来自intent API的client_secret",
      encryptionKeys: "来自intent API的encryption_keys"
    );

    if (paymentResponse.error) {
      // 处理支付失败
      print("支付失败: ${paymentResponse.message}");
    } else {
      // 处理支付成功
      print("支付成功: ${paymentResponse.message}");
    }
  } catch (e) {
    // 处理异常
    print("支付错误: $e");
  }
}

确认支付响应

confirmPayment的响应包含两个键:

  • error:一个布尔值,指示支付是否不成功。如果为真,则表示支付失败。
  • message:一个包含服务器消息的字符串。该消息提供了支付结果的详细信息或错误信息。

清除方法

clear方法用于重置支付表单。如果你有一个按钮用于清除表单或重置结账流程,这特别有用。

// 假设'controller'是你的XPayElementController实例
controller.clear();

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中集成xpay_element_flutter_stage插件来进行支付的示例代码。请注意,实际使用时需要根据具体支付平台的要求进行配置和调整。

首先,确保你的Flutter项目已经创建,并且在pubspec.yaml文件中添加了xpay_element_flutter_stage依赖:

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

然后运行flutter pub get来安装依赖。

接下来,在Flutter项目的lib目录下创建一个新的Dart文件,比如payment_screen.dart,并在其中实现支付界面和逻辑。

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

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

class _PaymentScreenState extends State<PaymentScreen> {
  final XpayElementFlutterStageController _controller =
      XpayElementFlutterStageController();

  @override
  void initState() {
    super.initState();
    // 初始化Xpay配置,这里只是示例,具体参数需要参考Xpay的文档
    _controller.initialize(
      publicKey: '你的公钥', // 替换为你的公钥
      environment: 'sandbox', // 设置为'production'用于生产环境
      onPaymentSuccess: (data) {
        // 支付成功后的回调处理
        print('Payment successful: $data');
        Navigator.pop(context); // 支付成功后返回
      },
      onPaymentError: (error) {
        // 支付失败后的回调处理
        print('Payment error: $error');
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('支付页面'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 创建支付订单信息,这里只是示例,具体参数需要参考Xpay的文档
                final paymentData = {
                  'amount': '100', // 支付金额
                  'currency': 'USD', // 货币类型
                  'description': 'Test payment', // 支付描述
                };

                try {
                  // 发起支付请求
                  await _controller.startPayment(paymentData);
                } catch (e) {
                  print('Error starting payment: $e');
                }
              },
              child: Text('发起支付'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 释放资源
    _controller.dispose();
    super.dispose();
  }
}

在上面的代码中,我们创建了一个PaymentScreen页面,其中包含了初始化XpayElementFlutterStageController、设置支付回调以及发起支付请求的逻辑。

最后,在你的主页面(通常是main.dart)中导航到这个支付页面:

import 'package:flutter/material.dart';
import 'payment_screen.dart'; // 导入支付页面

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Payment Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Payment Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => PaymentScreen()),
              );
            },
            child: Text('前往支付页面'),
          ),
        ),
      ),
    );
  }
}

现在,当你运行这个Flutter应用并点击“前往支付页面”按钮时,将会导航到支付页面,点击“发起支付”按钮将会触发支付流程。

请注意,上述代码仅作为示例,实际使用时需要根据你的具体业务逻辑和Xpay平台的要求进行调整。特别是支付相关的敏感信息(如公钥、私钥等)应妥善保管,不要硬编码在客户端代码中。

回到顶部