Flutter金融连接插件teller_connect_flutter的使用

Flutter金融连接插件teller_connect_flutter的使用

A Flutter插件用于集成Teller Connect SDK,允许与金融机构无缝连接并访问金融数据。

目录

支持平台

  • ✅ Android
  • ⏳ iOS (即将推出)

安装

在您的Flutter项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  ...
  teller_connect_flutter: ^0.9.4

使用

在您的库中添加以下导入:

import 'package:teller_connect_flutter/teller_connect_flutter.dart';

初始化

main方法中调用initialize方法以初始化SDK。

void main() {
  TellerConnectFlutter.initialize();
  runApp(MyApp());
}

稍后在应用程序中,您可以调用TellerConnectFlutter.instance上的方法来与SDK交互。

功能

启动Teller Connect

要启动Teller Connect流程,请使用startTellerConnect方法:

TellerConnectFlutter.instance.startTellerConnect(
  appId: 'your_app_id',
  saveToken: (token) async {
    // 安全保存令牌
  },
  getToken: () async {
    // 获取已保存的令牌
  },
  ...
);
参数:
属性 默认值 描述及可选值
appId (必需) - 您的Teller应用ID。从Teller控制台获取。
saveToken (必需) - 一个回调函数,根据您的选择持久化访问令牌。当接收到RegisterSuccessEvent时隐式调用。
getToken (必需) - 一个回调函数,获取已保存的访问令牌。此方法在API调用账户、交易等时被调用。此方法返回的错误值将导致其他API方法失败。
environment (可选) TellerEnvironment.development 使用的Teller环境。选项:TellerEnvironment.sandbox: 从未与真实机构通信,用于创建沙盒注册、账户和令牌,适合测试;TellerEnvironment.development: 使用实际账户凭据建立连接。与生产相同但不计费且有100个注册的硬限制;TellerEnvironment.production: 适用于发布构建。需要在Teller控制台中设置账单详情。
selectAccount (可选) TellerSelectAccount.disabled 账户选择模式。选项:TellerSelectAccount.disabled: 自动连接所有与此用户账户相关的受支持金融账户;TellerSelectAccount.single: 用户将看到受支持的金融账户列表并仅选择一个与您的应用程序共享;TellerSelectAccount.multiple: 用户将看到受支持的金融账户列表并选择一个或多个与您的应用程序共享。
products (可选) 所有产品 启用的Teller产品的列表。这控制了此注册的令牌可以访问哪些API。选项:TellerProduct.accounts: 账户详细信息如名称、账号、路由号等;TellerProduct.identity: 账户所有者的详细信息和账单地址等。不涉及余额;TellerProduct.transactions: 账户交易;TellerProduct.balance: 账户余额及其他详细信息。
debug (可选) false 启用调试模式。记录更多信息。
enrollmentId (可选) - 之前创建的注册ID。用于更新模式初始化Teller Connect,无需用户提供凭据即可修复断开或过期的注册。
userId (可选) - 您想向其添加更多注册的Teller用户的用户ID。提供它以向同一用户添加更多的银行集成。
nonce (可选) - 非常数。您的应用程序必须选择一个任意字符串以允许对成功注册收到的注册对象进行加密签名。这防止了令牌重用攻击。该值必须由服务器随机生成且对于当前会话唯一。如果客户端生成,则攻击者可以与来自另一会话的注册对象一起重用非常数,从而冒充受害者。
connectToken (可选) - 当需要用户交互完成交易时(例如,当多因素认证需要完成付款时),在Teller API响应中返回的连接令牌。使用带有连接令牌初始化Teller Connect将引导用户完成交易。当调用startTellerConnect支付API时使用。
institution (可选) - 预选机构。设置为有效机构ID时,Teller Connect将跳过其机构选择器并加载相应机构的第一步。用于构建自己的选择器体验。

事件流

TellerConnectFlutter提供了一个事件流,您可以监听Teller Connect过程的更新。您可以使用TellerConnectFlutter.instance.onTellerEvent访问此流。

监听事件
TellerConnectFlutter.instance.onTellerEvent.listen((event) {
  // 处理不同的事件类型
  switch (event) {
    case InitEvent _:
      return print('TellerConnect initialized');
    case final RegisterSuccessEvent r:
      print(
        '''TellerConnect registered successfully:
        token: ${r.accessToken},
        userId: ${r.userId},
        institution: ${r.institutionName},
        enrollmentId: ${r.enrollmentId}''',
      );
    case final FailureEvent f:
      return print(
        '''TellerConnect failed:
        ${f.message},
        code: ${f.code},
        type: ${f.type}''',
      );
    case ExitEvent _:
      return print('TellerConnect exited');
    // ...处理其他事件类型
    default:
      return print('TellerConnect event: $event');
  }
});
事件类型

该流返回以下事件类型,所有这些都继承自TellerEventModel

事件 描述 参数
InitEvent SDK已初始化。 -
RegisterSuccessEvent Teller Connect注册成功。 参数:accessToken: 访问令牌,userId: 用户ID,institutionName: 机构名,enrollmentId: 注册ID。
PaymentSuccessEvent 付款成功。 参数:id: 付款ID,type: “payment”。
PayeeSuccessEvent 收款人成功添加。 参数:id: 收款人ID,type: “payee”。
FailureEvent 注册失败。 参数:message: 错误消息,code: 错误代码,type: 错误类型。
ExitEvent 用户退出Teller Connect流程。 -
Event 通用事件类型。 参数:type: 事件类型,data: 事件数据。

数据访问

注册成功后,您可以访问金融数据。SDK提供了获取连接账户和交易的方法。

注意:仅对于在Teller Connect注册过程中选择的账户,事务和详细信息才会被返回。

final teller = TellerConnectFlutter.instance;
// 获取连接账户
List<AccountModel> accounts = await teller.getConnectedAccounts(enrollmentId);

// 获取账户详细信息
AccountModel account = await teller.getAccount(accountId: accountId, enrollmentId: enrollmentId);

// 删除所有连接账户
bool isRemoved = await teller.removeAccounts(enrollmentId);

// 删除连接账户
bool isRemoved = await teller.removeAccount(accountId: accountId, enrollmentId: enrollmentId);

// 获取账户交易
List<TransactionModel> transactions = await teller.getAccountTransactions(
  accountId: accountId,
  enrollmentId: enrollmentId,
  count: 10,
  fromId: 'LAST_TRANSACTION_ID',
);
// 或 await teller.getAccountTransactions(accountId) 获取所有交易。建议首次调用时加载所有交易,然后使用`count`和`fromId`参数在未来加载更多交易。

// 获取交易详细信息
TransactionModel transaction = await teller.getTransaction(accountId, transactionId);

示例

import 'dart:async';
import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:teller_connect_flutter/teller_connect_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 1. 初始化SDK
  TellerConnectFlutter.initialize(
    appId: 'app_ough6na3p9ve6id794000',
    certFile: (await rootBundle.load('assets/certificate.pem')).buffer.asUint8List(),
    keyFile: (await rootBundle.load('assets/private_key.pem')).buffer.asUint8List(),
  );

  runApp(
    const MyApp(),
  );
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late StreamSubscription<TellerEventModel> _subscription;
  final tokens = <String, String>{};

  [@override](/user/override)
  void initState() {
    super.initState();
    // 2. 监听Teller Connect事件
    _subscription = TellerConnectFlutter.instance.onTellerEvent.listen(_handleTellerEvent);
  }

  void _handleTellerEvent(TellerEventModel event) async {
    if (event is InitEvent) {
      log('Teller Connect initialized');
    } else if (event is RegisterSuccessEvent) {
      log('Registration successful: ${event.accessToken}');
      // 处理成功注册
      final accounts = await TellerConnectFlutter.instance.getConnectedAccounts(event.enrollmentId);
      log('Connected accounts: $accounts');

      final accountId = accounts.first.id;
      final accountDetails = await TellerConnectFlutter.instance.getAccount(
        accountId: accountId,
        enrollmentId: event.enrollmentId,
      );
      log('Account details: $accountDetails');

      final transactions = await TellerConnectFlutter.instance.getAccountTransactions(
        accountId: accountId,
        enrollmentId: event.enrollmentId,
      );
      log('Transactions: $transactions');

      final transactionId = transactions.first.id;
      final transactionDetails = await TellerConnectFlutter.instance.getTransaction(
        transactionId: transactionId,
        accountId: accountId,
        enrollmentId: event.enrollmentId,
      );
      log('Transaction details: $transactionDetails');
    } else if (event is FailureEvent) {
      log('Error: ${event.message}');
      // 处理失败
    }
  }

  Future<void> _startTellerConnect() {
    return TellerConnectFlutter.instance.startTellerConnect(
      saveToken: (token, enrollmentId) async {
        setState(() {
          tokens[enrollmentId] = token;
        });
      },
      getToken: (enrollmentId) => Future.value(
        tokens[enrollmentId]!,
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Teller Connect Example'),
        ),
        body: Center(
          child: FutureBuilder<void>(
            future: _startTellerConnect(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return const CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              }
              return ElevatedButton(
                onPressed: () {
                  setState(() {});
                }, // 3. 启动Teller Connect
                child: const Text('Start Teller Connect'),
              );
            },
          ),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _subscription.cancel();
    super.dispose();
  }
}

更多关于Flutter金融连接插件teller_connect_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter金融连接插件teller_connect_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


teller_connect_flutter 是一个用于 Flutter 的插件,它允许开发者集成 Teller 的金融连接功能到他们的应用中。Teller 是一个金融数据聚合平台,可以帮助用户连接他们的银行账户并获取交易数据。

安装

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

dependencies:
  teller_connect_flutter: ^1.0.0

然后运行 flutter pub get 来安装插件。

基本使用

  1. 初始化 Teller

    在使用 Teller 功能之前,你需要初始化 Teller SDK。通常,你可以在应用的 main 函数中进行初始化:

    import 'package:teller_connect_flutter/teller_connect_flutter.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await TellerConnectFlutter.initialize(
        apiKey: 'YOUR_API_KEY',
        environment: TellerEnvironment.sandbox, // 或者 TellerEnvironment.production
      );
      runApp(MyApp());
    }
    
  2. 创建连接

    要创建一个新的金融连接,你可以使用 TellerConnectFlutter.createConnection 方法:

    void createConnection() async {
      try {
        final connection = await TellerConnectFlutter.createConnection(
          institutionId: 'your_institution_id',
          products: [TellerProduct.transactions],
        );
        print('Connection created: ${connection.id}');
      } catch (e) {
        print('Error creating connection: $e');
      }
    }
    
  3. 获取交易数据

    一旦连接成功,你可以使用 TellerConnectFlutter.getTransactions 方法来获取交易数据:

    void fetchTransactions(String connectionId) async {
      try {
        final transactions = await TellerConnectFlutter.getTransactions(
          connectionId: connectionId,
        );
        print('Transactions: $transactions');
      } catch (e) {
        print('Error fetching transactions: $e');
      }
    }
    
  4. 监听连接状态

    你可以使用 TellerConnectFlutter.onConnectionStatusChanged 来监听连接状态的变化:

    void listenToConnectionStatus() {
      TellerConnectFlutter.onConnectionStatusChanged.listen((status) {
        print('Connection status changed: $status');
      });
    }
    

注意事项

  • API Key: 你需要从 Teller 获取一个 API Key 来进行身份验证。
  • 环境: 在开发阶段,建议使用 TellerEnvironment.sandbox,在发布到生产环境时使用 TellerEnvironment.production
  • 权限: 确保你的应用在 AndroidManifest.xmlInfo.plist 中请求了必要的权限。

示例代码

以下是一个简单的示例,展示了如何初始化 Teller,创建连接,并获取交易数据:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await TellerConnectFlutter.initialize(
    apiKey: 'YOUR_API_KEY',
    environment: TellerEnvironment.sandbox,
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Teller Connect Example')),
        body: Center(
          child: TellerConnectExample(),
        ),
      ),
    );
  }
}

class TellerConnectExample extends StatefulWidget {
  [@override](/user/override)
  _TellerConnectExampleState createState() => _TellerConnectExampleState();
}

class _TellerConnectExampleState extends State<TellerConnectExample> {
  String? connectionId;

  [@override](/user/override)
  void initState() {
    super.initState();
    listenToConnectionStatus();
  }

  void listenToConnectionStatus() {
    TellerConnectFlutter.onConnectionStatusChanged.listen((status) {
      print('Connection status changed: $status');
    });
  }

  void createConnection() async {
    try {
      final connection = await TellerConnectFlutter.createConnection(
        institutionId: 'your_institution_id',
        products: [TellerProduct.transactions],
      );
      setState(() {
        connectionId = connection.id;
      });
      print('Connection created: ${connection.id}');
    } catch (e) {
      print('Error creating connection: $e');
    }
  }

  void fetchTransactions() async {
    if (connectionId == null) return;
    try {
      final transactions = await TellerConnectFlutter.getTransactions(
        connectionId: connectionId!,
      );
      print('Transactions: $transactions');
    } catch (e) {
      print('Error fetching transactions: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: createConnection,
          child: Text('Create Connection'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: fetchTransactions,
          child: Text('Fetch Transactions'),
        ),
      ],
    );
  }
}
回到顶部