首页 / 资讯中心 / 文章详情

OpenHarmony上Flutter商城App支付接入实战与避坑指南

OpenHarmony上Flutter商城App支付接入实战与避坑指南 ★ FEATURED ARTICLE
在OpenHarmony上用Flutter做商城App很多人第一反应是问选型Flutter这套跨端方案在鸿蒙生态里到底靠不靠谱。我做了一个多月的商城实战项目商品列表、购物车、订单确认这些都还好真正让我反复改版的是支付实现。订单确认页做好以后用户点了支付从Flutter页面发起请求到原生侧拉起支付渠道再到支付结果回调刷新订单状态任何一个环节没设计好就会出现钱扣了订单没改、订单改了两笔扣款、页面状态跟服务端不一致这类事故。这篇文章就记录我在Flutter for OpenHarmony商城App里做支付接入的全过程包括方案选型、桥接层设计、订单一致性、Provider状态管理以及跑测阶段踩到的一堆坑。适合正在用Flutter做OpenHarmony应用、尤其是商城或者交易类App的开发者参考也适合想了解Flutter和OpenHarmony到底怎么结合的人。1. 支付开始前先想清楚Flutter与OpenHarmony的运行边界1.1 OpenHarmony上的Flutter不是换了个壳的Android如果你在Android上做过Flutter开发初看OpenHarmony的Flutter支持会觉得挺熟悉Flutter引擎跑在原生系统上Dart层写UI和业务逻辑通过Platform Channel和原生侧通信。但OpenHarmony的Flutter并不是Android Flutter的简单移植它是OpenHarmony开源社区维护的flutter_flutter分支基于OpenHarmony的ArkUI框架和Ability体系做了引擎适配。这意味着三件事和Android完全不同。第一工程结构不同。OpenHarmony上的Flutter项目除了常规的android/、ios/目录外还有ohos/目录里面是ArkTS写的原生侧代码。跑Flutter的宿主容器不是Activity而是UIAbility。Activity生命周期和UIAbility生命周期虽然概念接近但开发接口完全不一样。第二依赖管理和构建工具链不同。OpenHarmony侧依赖管理走ohpm构建走hvigor需要配套DevEco Studio来做原生部分开发。你在Android Studio里打开Flutter项目能直接跑Android但OpenHarmony侧必须用DevEco Studio打开ohos目录配置好OpenHarmony SDK之后才能编译。第三后端技术栈不同。原生侧的业务实现用的是ArkTS而不是Kotlin或者Java。如果你只会Dart不会ArkTS桥接层基本没法写。这个边界必须在做支付之前就搞清楚。支付不可能完全在Dart层完成——你要拉起系统级支付渠道、拿到结果回调、处理各种系统异常这些都要依赖原生能力Flutter只负责UI和业务流程编排。所以支付实现本质上是两层开发Dart层负责发起支付、展示结果、刷新订单OpenHarmony原生层负责真正的渠道拉起、返回结果、处理系统事件。1.2 ArkTS与Flutter的选型博弈以及支付这种模块的特殊性很多团队在做OpenHarmony应用时会纠结到底用ArkTS还是Flutter。如果单纯从系统适配角度看ArkTS有天然优势毕竟它就是OpenHarmony的亲儿子。但商城App往往追求多端复用比如同一套代码要跑Android、iOS、Web、OpenHarmonyFlutter在这种场景下仍然有价值。但支付模块恰恰是选型博弈里最敏感的部分。最大的问题在于支付渠道对新平台的支持通常落后于主流移动平台。我最初的想法是让Flutter直接拉起第三方支付SDK结果发现OpenHarmony上根本没有现成的Flutter支付插件连官方维护的插件列表里都找不到针对OpenHarmony的支付实现。所以我的建议是混合模式页面和业务编排用Flutter支付链路用OpenHarmony原生能力。具体来说Flutter侧只负责组装订单参数和展示结果真正跟支付渠道通信的是ArkTS侧代码。这样做的好处是支付渠道未来如果提供了OpenHarmony SDK你可以直接替换原生侧实现对Dart层透明如果只用H5收银台也只需要改原生侧拉起逻辑Flutter不用动。1.3 支付模块为什么不能照搬Android实现我看到很多团队做OpenHarmony适配习惯性打开Android项目找对应代码直接移植。页面还好说支付真不能这么干原因有三。其一拉起支付渠道的机制不同。Android里用Intent调起支付App通过包名和Activity声明去绑定。OpenHarmony里拉起三方应用要走Want虽然概念上跟Intent相似但want参数、action、abilityName的写法和Android差异很大直接搬过来几乎必挂。其二回调机制不同。Android支付回调可以走onActivityResult而OpenHarmony的Ability启动结果要处理onAbilityResult或者通过回调注册来接收。这个差异直接影响你支付结果返回链路的设计。其三应用签名与验签体系不同。OpenHarmony的包签名机制和Android不完全一样如果你的支付渠道需要拿应用签名去做签名比对必须重新适配OpenHarmony侧的签名获取方式。说白了支付是一个跟系统底层强相关的业务模块。跨端框架能帮你抹平UI层的差异但抹不平系统级的支付拉起与回调差异。这一层必须老老实实在原生侧实现而且要从OpenHarmony的角度重新设计而不是复制粘贴。2. 支付方案选型自建网关、三方渠道与混合模式2.1 OpenHarmony支付生态与渠道能力盘点截至我实战的时间点OpenHarmony上能用的支付方式大概分这么几类。第一种是聚合SDK方案也就是找那种同时支持多端的支付聚合服务商看看他们有没有提供OpenHarmony版本SDK或者至少提供H5页面版。这一种最省事但需要你在选型时逐一确认渠道方对OpenHarmony的支持进度不能想当然。第二种是H5收银台方案也就是用户在App内跳到一个网页收银台完成支付。这种方案的优势是兼容性最好不管是支付宝、微信还是银行卡通道只要对方有移动网页版收银台就能用。劣势是体验略差用户会经历从App跳浏览器再跳回来的过程。第三种是自建支付网关也就是你只负责下单和回调验签真正的资金流转委托给有牌照的支付机构。这种适合有后端开发能力的团队灵活性最高但工作量也最大要自己设计签名、回调、对账、幂等。我当时选型的原则很简单谁的OpenHarmony适配最完整、文档最明确就先接谁。如果都还没有成熟的OpenHarmony SDK那H5收银台加上自建网关的组合是当下最不会卡壳的路。毕竟支付是电商的命脉不能因为等待某个SDK适配就拖住整个App的发布节奏。2.2 标准交易链路拆解下单、签名、拉起、回调、验签不管选哪种渠道支付交易链路的骨架是一样的。我建议把它明确画成五步回头写代码也按这五步来。客户端下单。用户在Flutter页面确认订单提交到服务端服务端生成商户订单号。服务端签名。服务端拿着订单号、金额、商品描述、回调地址等参数用商户私钥做签名生成支付参数。客户端拉起支付。Flutter层拿到支付参数后通过桥接层传给OpenHarmony原生侧由原生侧发起支付。支付渠道回调。用户完成支付后支付渠道异步通知你的服务端带上支付结果和签名。服务端验签与发货。服务端收到回调先验签验签通过再更新订单状态、触发发货。这里我必须强调一个点支付结果的最终确认必须依赖第4步服务端回调而不是第3步客户端的返回结果。客户端返回的成功只能用来做UI提示和乐观更新绝对不能作为发货依据。原因很好理解客户端可以被篡改可以被伪造返回值完全可以是自己构造的。服务端验签通过的回调才是可信的。2.3 密钥与商户配置容易被忽略的三个细节配置商户平台时有三个细节我实测很容易踩文档里又写得比较散。第一回调地址必须是HTTPS。支付渠道对回调地址有严格校验生产环境基本都是强制HTTPS本地调试时也要想办法处理否则服务端收不到回调用户付了钱订单却一直是待支付状态。第二商户密钥分加密密钥和签名密钥不要弄混。有些渠道用一套RSA密钥对做加签有些用HMAC-SHA256对称密钥。签名字段、密钥格式、编码方式不匹配验签怎么都不通过而且报错信息往往不太友好让你很难定位是算法问题还是密钥问题。第三金额精度问题。涉及支付金额一定不要用double要精确到分用整数存储和传输。Dart语言的double存在二进制浮点精度问题0.10.2很可能得到0.30000000000000004。商城里这种精度误差一旦传导到支付环节轻则金额对不上重则支付渠道直接拒绝请求。提示我自己的做法是客户端所有金额统一用int类型以分为单位传递服务端校验时也要求整数分值展示层再换算成元。这样可以彻底绕开浮点精度问题。3. 桥接层实现Flutter插件、MethodChannel与原生支付引擎3.1 创建Flutter插件工程并挂载OpenHarmony侧能力我采用的是Flutter插件工程的方式而不是在业务主工程里直接写桥接代码。这样有一个很明显的好处把支付能力封装成独立插件以后有新的OpenHarmony产品线要接入商城直接复用这个插件就行不需要把桥接代码从一个工程复制到另一个工程。创建一个包含OpenHarmony支持的Flutter插件工程命令是这样的flutter create --templateplugin --platformsohos tool_pay如果模板不自动生成ohos目录也可以手动在插件工程下新建ohos目录并且配置好相应的构建文件。OpenHarmony侧的核心目录结构大概是这样tool_pay/ ├── lib/ # Dart层 │ └── tool_pay.dart └── ohos/ # OpenHarmony原生侧 └── tool_pay/ └── src/main/ ├── ets/ │ └── ToolPayPlugin.ets ├── module.json5 └── oh-package.json5原生侧要做的第一件事是继承FlutterPlugin接口并且在生命周期回调里绑定UIAbility的上下文。这个上下文在拉起支付时非常重要很多系统级操作都需要它比如启动一个Ability传Want、拿应用信息等。3.2 MethodChannel的参数传递与异步结果设计Dart侧调原生侧我用的是标准MethodChannel。通道名、方法名、参数结构要在一开始就设计好后面改动会涉及双端同步比较麻烦。Dart侧的定义import package:flutter/services.dart; class PayChannel { static const _channel MethodChannel(com.shop.payment/channel); /// 发起支付 /// [payParams] 由服务端下发的支付参数 static FuturePayResult startPayment(MapString, dynamic payParams) async { try { final res await _channel.invokeMethod(startPayment, payParams); return PayResult.fromMap(res); } on PlatformException catch (e) { return PayResult(code: e.code, message: e.message ?? unknown error); } } }OpenHarmony原生侧的注册代码import MethodChannel from ohos/flutter_ohos/MethodChannel; export class ToolPayPlugin implements FlutterPlugin { private channel: MethodChannel | null null; onAttachToEngine(binding: FlutterEngineBinding): void { this.channel new MethodChannel(binding.getBinaryMessenger(), com.shop.payment/channel); this.channel.setMethodCallHandler(this.handleMethodCall.bind(this)); } private async handleMethodCall(call: MethodCall): Promiseany { if (call.method startPayment) { const params call.arguments as Recordstring, Object; return await PayService.startPayment(params); } throw new Error(Unsupported method: call.method); } }这里有一点特别重要MethodChannel的异步结果返回Dart侧通常用Future等待原生侧则返回Promise。你的支付流程越是耗时越要处理好Promise的resolve和reject时机避免用户操作还在进行、Future已经被超时中断。3.3 从MethodChannel到页面UI回调路径不能断支付结果是异步的渠道拉起之后用户要输入密码、等确认这个过程从几百毫秒到几十秒都有可能。用户支付完成之后系统回到App这段回调链路要怎么走直接决定你的UI能不能及时刷新。我的经验是分两条路径处理。路径一MethodChannel的返回值。支付渠道如果在你App内完成支付结果会通过原生侧返回PromiseDart侧await就能拿到结果。这种方式简单直接适合收银台在App内完成的情况。路径二EventChannel推送事件。如果支付渠道通过外部浏览器或者支付App跳走App可能被系统释放回来时Channel已经重建单纯靠Future拿结果并不可靠。这种情况下应该在原生侧监听支付渠道的回调再通过EventChannel主动推送给Dart层Dart侧用Stream订阅。Dart侧订阅的实现class PayEventBus { static const _eventChannel EventChannel(com.shop.payment/events); static final Streamdynamic payEvents _eventChannel.receiveBroadcastStream(); }页面监听override void initState() { super.initState(); _sub PayEventBus.payEvents.listen((event) { final result PayResult.fromMap(event); if (result.code PAY_SUCCESS) { context.readOrderProvider().refreshCurrentOrder(); } }); }这条链路必须在设计阶段就定好否则后面会出现支付成功但App没反应的经典问题。我在测试时遇到过几次用户支付完成后回到App页面还停留在待支付状态查了半天发现是原生侧回调进程被重建Channel的新实例没有注册监听事件自然就丢了。4. 订单与支付一致性状态机、幂等、分布式事务落地4.1 订单状态机与支付流水支付实现表面的难点是拉起渠道真正的难点在订单状态管理。商城的订单不是只有待支付和已支付两个状态中间还涉及支付中、支付超时、支付失败、已取消、已发货、已完成等各种状态。我设计的订单状态机如下状态含义可触发的事件CREATED订单已创建用户确认支付 - PAYING用户取消 - CANCELLED超时 - EXPIREDPAYING支付中支付回调成功 - PAID支付回调失败 - PAY_FAILED用户主动取消 - CANCELLEDPAID已支付服务端校验通过后 - 发货流程PAY_FAILED支付失败用户可重新发起支付 - PAYINGCANCELLED已取消不可再流转EXPIRED已超时不可再流转有了这张表代码逻辑才能写清楚。尤其是支付中的状态很多团队会漏掉。用户点击了支付、但支付还没回调的那段时间订单既不能算待支付也不能算已支付如果这时用户退出页面或者杀掉App再回来时要能根据支付中状态去查询真实支付结果而不是让用户重复支付。4.2 幂等处理重复回调不能重复改单支付渠道的回调可能因为网络问题重复发送也可能因为你的服务端重试机制导致重复处理。如果回调处理逻辑没有幂等订单状态就会被覆盖成一笔已支付订单多次发货这在电商里属于重大事故。幂等机制我建议从两个角度加。第一支付流水表加唯一约束。每笔支付回调都对应一个渠道流水号(transactionId)在支付流水表里这个字段设为唯一索引。处理回调时先查流水表如果已经存在直接丢弃本次通知不再走状态流转逻辑。第二订单更新加状态条件。更新订单状态时SQL加一个状态前置条件比如UPDATE orders SET statusPAID WHERE order_id? AND statusPAYING。如果影响行数为0说明订单当前状态不允许流转说明是重复回调或者异常回调直接忽略并记录日志。4.3 支付回调与订单更新的最终一致方案支付回调到服务端服务端处理完还要更新多个系统订单系统要改状态库存系统要锁定商品积分系统要发放积分有可能还有ERP发货系统。这些系统如果全部在一个本地事务里问题倒不大但很多真实公司的订单、库存、积分是独立服务那就涉及分布式事务。电商支付领域最典型的分布式事务场景就是本地事务执行一半另一个服务挂了怎么保证最终一致。我的实现方案是本地消息表 重试机制。具体做法是支付回调验签通过后先在一个本地事务里做两件事更新订单状态为PAID同时向本地消息表插入一条待发送的消息比如发送发货指令。这两个操作在同一事务里保证不会出现订单已支付但消息丢失的情况。然后有个定时任务扫描消息表把未发送的消息推送给下游服务下游处理成功才标记消息为已发送如果处理失败按指数退避重试直到成功或者达到重试上限后告警。这套方案不是最炫的要硬说的话可以用消息队列加事务消息来替代但在很多团队里简单的本地消息表反而是最容易落地、最容易排查问题的方案。那些复杂的分布式事务中间件概念听起来很好真正运维起来的复杂度你会在凌晨两点的告警电话里体会深刻。4.4 页面侧状态管理Provider与组件通信服务端订单状态对了客户端页面还有一个问题支付完成后购物车数量、订单列表、订单详情页、个人中心这些页面怎么同步刷新各个页面是独立的支付结果回来时你不能让所有路由都手动刷新一遍。这时候就需要一个全局的状态管理方案。我选的是Provider在OpenHarmony的Flutter项目里它也完全可用。核心思路是定义一个ChangeNotifier比如OrderProvider里面存放当前订单状态、支付状态、以及购物车数量等跨页面共享的数据。支付结果到达后调用refresh方法更新数据所有依赖这些数据的Widget通过Consumer或者Selector自动重建。Provider里核心代码长这样class OrderProvider extends ChangeNotifier { OrderStatus _currentStatus OrderStatus.unknown; int _cartCount 0; OrderStatus get currentStatus _currentStatus; int get cartCount _cartCount; Futurevoid refreshCurrentOrder(String orderId) async { final order await OrderApi.fetchDetail(orderId); _currentStatus order.status; notifyListeners(); } void updateCartCount(int count) { _cartCount count; notifyListeners(); } }在Widget里监听ConsumerOrderProvider( builder: (context, provider, child) { return Text(provider.currentStatus.label); }, )Provider的用法本身不难难的是组件通信链路的设计。界面上的支付成功弹窗、订单列表的已支付标签、购物车的角标数字它们分散在不同的组件树里不能各写各的setState不能各查各的接口。集中到Provider之后一次状态更新所有监听组件自动联动这是商城App在做支付状态刷新时最值得先做对的事情。5. 页面侧联动Provider状态管理与Flutter组件通信5.1 为什么选Provider而不是setState刚接触Flutter状态管理的人面向的都是setState页面简单时够用。但商城App一旦涉及支付回调刷新多个页面setState的问题就暴露了你只能在当前State类里触发局部重建没法让订单详情页和购物车角标同时更新。Provider对比setState最核心的优势是把状态提升到组件树顶层用依赖注入的方式分发。支付完成那一瞬间只需要改OrderProvider里的数据订单详情、购物车列表、个人中心里关心这些数据的Widget会自动重建。数据流是单向的状态变更的地方只有一个不会出现这里setState了、那里没setState的状态漂移。如果你有Redux经验也可以类比Provider像是轻量版的ReduxChangeNotifier对应Reducer的一部分逻辑Consumer对应connect。但配置量和心智负担比Redux低不少对商城页面的粒度是正合适的。5.2 ChangeNotifier驱动订单状态的刷新链路我实际项目里围绕订单做了一个OrderProvider里面包含当前正在查看的订单对象、订单状态枚举、以及支付结果码。支付回调走到Dart层之后经过统一入口处理class PayResultHandler { static Futurevoid handle(PayResult result) async { final provider globalNavigatorKey.currentContext!.readOrderProvider(); if (result.code PAY_SUCCESS) { await provider.refreshCurrentOrder(result.orderId); await provider.refreshCartCount(); } else if (result.code PAY_CANCELLED) { provider.markPayCancelled(result.orderId); } } }这里我特意用一个统一入口处理支付结果而不是让各个页面自己监听EventChannel。好处是逻辑收敛不管支付结果来自MethodChannel返回值、EventChannel推送还是App冷启动后的恢复查询最终都汇到这一个方法里页面层只需要消费Provider状态就够了。5.3 组件间通信与页面级状态隔离说到Flutter组件通信很多教程讲的是父子组件回调、InheritedWidget、Provider这些。但商城App里真正的痛点不是子组件通知父组件而是A页面的操作要刷新B页面。支付完成后要刷新购物车、收藏页、订单列表这些页面可能根本不在同一棵组件树里甚至不在同一个路由栈里。我的做法是全局的Provider统一挂在MultiProvider里MultiProvider( providers: [ ChangeNotifierProvider(create: (_) OrderProvider()), ChangeNotifierProvider(create: (_) CartProvider()), ChangeNotifierProvider(create: (_) UserProvider()), ], child: MaterialApp(...), )这样App里任何路由的Widget都可以通过context.read拿到同一个Provider实例。通信路径是支付结果 - PayResultHandler - OrderProvider.notifyListeners - 所有监听Widget重建。整个链路清晰也没有跨路由手动传参的脏代码。注意Provider的context.read只能在事件回调里使用不要在build方法里用read替换watch否则状态变化时组件不会自动重建。这也是Flutter Provider新手最常见的误用。6. 跑测阶段实测坑、调试技巧与安全加固6.1 环境与构建项目跑不起来的大部分原因做OpenHarmony Flutter开发第一个绕不过的坎就是跑不起来。我整理一下自己踩过的环境坑按出现频率排序。OpenHarmony SDK与IDE版本不匹配。DevEco Studio对SDK版本要求比较严格版本对不上编译时各个模块的API可能找不到。Java环境变量配置不对。Flutter本身依赖JDKOpenHarmony侧构建也依赖JDK两侧JDK版本不一致会出现莫名其妙的Gradle/Hvigor构建错误。ohpm依赖拉取失败。OpenHarmony侧依赖走ohpm仓库如果你需要配置仓库镜像或者网络环境有问题依赖下载会失败。这里一定要保持网络环境干净别让代理干扰包校验。Flutter SDK版本太旧。OpenHarmony的Flutter分支更新节奏跟上游不完全一致某些MethodChannel API、插件注册API在新旧版本里写法不同。建议直接使用社区推荐的最新稳定版本。如果遇到新建项目跑不起来这种问题我的排查思路是先跑一个纯Flutter模板工程排除Dart层问题再跑一个纯OpenHarmony原生HelloWorld排除原生工具链问题两边都正常后再合并起来跑Flutter插件工程。这个排除法能快速定位问题边界不至于一个编译错误换了半天还不知道是哪个环节出的问题。6.2 渲染引擎与产物格式的适配注意点Flutter的渲染引擎Impeller是近两年讨论度很高的关键字。它默认在iOS和部分Android版本上启用相对于之前的Skia方案有更好的渲染稳定性和抗锯齿表现。但在OpenHarmony这种定制化适配的平台上Impeller的支持并不一定默认开启也可能存在尚未解决的兼容问题。我实测的建议是如果你在OpenHarmony的Flutter页面上看到奇怪的渲染花屏、字体发虚、或者某个动画表现明显异常可以先临时关闭Impeller验证一下用命令或者配置方式设置启用Skia后端之后看是否恢复正常。这不是说Impeller不好而是新引擎在新平台上的适配节奏一定比老引擎慢商城App追求的是稳定可发布不是最新的渲染架构。另外要提一下产物格式。OpenHarmony应用打包产物通常是HAP或者HSP而Flutter的引擎和Dart层产物在OpenHarmony侧会被封装成特定格式。如果你给测试同学安装包时发现Flutter页面白屏或者引擎加载失败大概率是产物封装不完整。要检查ohos侧构建配置是否把Flutter的libflutter.so、assets、kernel_blob.bin这些关键文件都正确打包进去了。6.3 安全清单验签、金额精度、Scheme回调支付相关的安全必须当成独立的Checklist逐条过我每次上线前都会对照这份清单检查。客户端永远不做最终验签。无论客户端拿到什么支付结果都只作为UI提示服务端才做最终确认。回调验签不能省。支付渠道的通知回调必须要验签验签算法和密钥按照渠道文档要求配置不要用明文传输的交易号直接更新订单。金额使用整数分。所有接口文档里的金额字段我都强制定义成int类型、单位分为分。如果遇到返回浮点数的旧接口网关层做换算再下发。URL Scheme回调要校验来源。支付完成后通过Scheme唤起App这个入口不要直接当可信结果处理Scheme里带的订单号和结果必须去服务端二次确认真实状态。日志脱敏。支付日志里不要打印完整的商户密钥、订单号和支付渠道流水号线上排障时这些都是可以关联到用户和资金的敏感信息。我见过不少线上事故核心原因都是绕过这五条清单里的某一条。支付SDK本身没问题问题往往出在接入方对结果的处理不够严格。6.4 对账与异常补偿机制最后说一个很多商城App容易忽略的环节对账。不管你把支付流程设计得多完善线上总会出现渠道侧已扣款、服务端订单未支付的偏差。原因可能是回调丢失、网络超时、回调处理逻辑异常。这时候必须有对账机制兜底。我实现的方案是每日对账任务每天凌晨从支付渠道拉取前一天的支付流水和自己的订单流水表做比对。凡是渠道有流水、本地没有支付成功记录的自动触发一次补偿流程向服务端补发一次支付成功的通知把订单状态拉回到正确的轨道上。具体流程写清楚是这样的支付渠道后台导出前一日流水或者调用渠道的账单下载接口。服务端解析账单按渠道流水号关联本地订单。比对结果分三类完全匹配的跳过渠道有本地无的进入人工确认队列本地有渠道无的标记异常订单查询真实状态。出现偏差订单后先不要自动发货等人工或补偿流程确认后再处理。这个对账环节不用写在App代码里但它是支付闭环必不可少的一部分。没有对账机制你做再多幂等和状态机都只能保证已知事件之间的状态一致防不住你根本不知道的事件的发生。支付实现做到这里算是告一段落。我从选型开始纠结了很久最初的方案总是想着怎么在Dart层把所有事情都做了最后被现实教育了一遍又一遍才明白跨端框架的作用是让业务层最大程度复用而和系统深度绑定的能力必须老老实实交给原生侧。桥接层的设计、状态机的定义、幂等和最终一致方案、Provider的联动刷新每一样都是在踩坑之后才觉得当初应该早点想明白。如果你也在做类似的项目希望这篇实战记录能帮你少走几段弯路。尤其是那五条安全清单上线前一定要逐条核对支付无小事真等到线上出问题再排查代价就大了。
阅读完成 · 觉得有帮助?
咨询建站