基于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
相关产品推荐
相关产品推荐

