You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Flutter的预算追踪APP:UPI支付通知解析功能实现求助

UPI通知解析自动更新预算的实现方案(Flutter + Hive)

核心流程

你的思路完全可行,通过监听银行UPI转账通知提取金额来更新预算,避开了银行流水接口的权限限制。整体流程分为四步:申请通知权限 → 监听系统通知 → 解析金额 → 写入Hive数据库。

具体步骤

1. 申请通知权限

Android端需先在配置文件中声明权限,打开android/app/src/main/AndroidManifest.xml添加:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />

Flutter侧用permission_handler插件请求权限:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestNotificationPermission() async {
  final status = await Permission.notification.request();
  if (status.isDenied) {
    // 引导用户前往设置开启权限
    openAppSettings();
  }
}

2. 监听系统通知

使用flutter_notification_listener插件(封装了Android原生通知监听逻辑,新手友好),在Dart层订阅通知流:

import 'package:flutter_notification_listener/flutter_notification_listener.dart';

void setupNotificationListener() {
  NotificationListener().startListening((notification) {
    // 筛选银行UPI转账通知,可通过包名或标题关键词过滤
    if (notification.title?.contains("Money Transfer") == true || 
        notification.packageName == "com.hdfc.bank") { // 可添加多个银行包名
      parseAndSaveTransaction(notification.content ?? "");
    }
  });
}

注:iOS系统限制第三方APP监听系统通知,因此该功能仅支持Android,iOS端可补充手动录入功能作为替代。

3. 解析通知提取金额

针对UPI通知的固定格式,用正则表达式匹配金额:

double? extractUpiAmount(String content) {
  // 兼容"Rs 25.00"或"₹25.00"格式,可根据不同银行调整正则
  final regex = RegExp(r'(Rs|₹)\s*(\d+\.\d{2})');
  final match = regex.firstMatch(content);
  if (match != null) {
    return double.tryParse(match.group(1)!);
  }
  return null;
}

建议收集多银行的UPI通知样本,调整正则覆盖更多格式场景。

4. 用Hive更新预算数据

先定义Hive模型(记得运行flutter packages pub run build_runner build生成适配器):

import 'package:hive/hive.dart';

part 'budget_entry.g.dart';

@HiveType(typeId: 0)
class BudgetEntry extends HiveObject {
  @HiveField(0)
  double amount;
  @HiveField(1)
  DateTime transactionDate;
  @HiveField(2)
  String source; // 标记交易来源,如"HDFC UPI"

  BudgetEntry({
    required this.amount,
    required this.transactionDate,
    required this.source,
  });
}

解析到金额后写入Hive数据库:

Future<void> saveToBudget(double amount, String source) async {
  final box = await Hive.openBox<BudgetEntry>('budget_entries');
  await box.add(BudgetEntry(
    amount: amount,
    transactionDate: DateTime.now(),
    source: source,
  ));
}

最后将解析与保存逻辑结合:

void parseAndSaveTransaction(String content) {
  final amount = extractUpiAmount(content);
  if (amount != null) {
    saveToBudget(amount, "UPI Payment");
    // 可添加本地通知提醒用户已自动记录交易
  }
}

新手踩坑提示

  • 权限稳定性:Android 13+需主动申请POST_NOTIFICATIONS权限,用户拒绝后需引导至设置开启,否则无法监听通知。
  • 格式兼容性:不同银行的UPI通知格式可能存在差异,需多测试样本调整正则规则。
  • 数据安全:Hive是本地数据库,建议添加云备份功能(如Firebase Firestore),避免用户卸载APP丢失数据。
  • 测试方法:可通过adb命令发送测试通知,验证监听与解析逻辑是否正常。

技术栈调整建议

  • Hive无需更换,轻量易上手,非常适合本地数据存储需求。
  • 暂无更优替代方案实现自动获取UPI交易数据,银行开放API权限对个人开发者限制严格,通知解析仍是最可行的路径。

内容的提问来源于stack exchange,提问作者chetxn04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:25:27