OpenFlutter / OpenFlutter/fluwx
[ohos] 冷启动后微信登录/支付回调丢失:`eventHandler` 仅在 `onNewWant` 中绑定,首次回调被静默吞掉
Nobody has claimed this yet.
- Dominant language
- Dart
- Stars
- 3.3k
- Forks
- 553
- PR merge metrics
- No merged PRs in 30d
Description
环境
| 项 | 值 |
|---|---|
| fluwx | 6.0.2(5.7.7 同样存在) |
| 平台 | HarmonyOS(ohos) |
| @tencent/wechat_open_sdk | 1.0.15 |
| Flutter | 3.41.10-ohos-1.0.1(flutter_oh 分支) |
| 微信版本 | 真机微信(HarmonyOS 版) |
问题描述
在 HarmonyOS 真机上,冷启动(进程新建或重装)后的第一次微信登录/支付,授权结果永远无法回调到 Dart 侧,表现为调用方等待直至超时。之后只要进程不死、重新进入过一次 App(触发过 onNewWant),后续登录/支付就恢复正常。
稳定的复现规律:
- 杀掉 App 进程(或卸载重装)→ 冷启动 → 微信登录 → 超时
- 不杀进程,重新进入 App → 再次微信登录 → 成功
- 再杀进程 → 又超时
即:必须先收到过一次 onNewWant,微信回调才能送达。
复现步骤
- HarmonyOS 真机安装 App(含 fluwx,已
registerApi) - 完全杀掉 App 进程,冷启动
- 立即发起
fluwx.authBy(...),跳微信完成授权 - 微信侧显示已授权并返回 App,但 Dart 侧
addSubscriber收不到WeChatAuthResponse,等待至超时 - 回到桌面重新点击图标进入 App(进程存活),再次授权 → 成功
根因分析
微信回传 App 后,@tencent/wechat_open_sdk 内部(WXAPIFactory.js)通过 openLink 回调路径分发响应,依赖 eventHandler:
// wechat_open_sdk 1.0.15 src/main/ets/open_api/WXAPIFactory.js
handleResult(...) {
...
this.eventHandler?.onResp(y5); // L201 — handler 为空时静默跳过
}
handleWant(i5, j5) {
this.eventHandler = j5; // L248 — 全库唯一赋值 eventHandler 的地方
...
}
而 fluwx 的 ohos 实现里:
// fluwx 6.0.2 ohos/src/main/ets/components/plugin/handlers/WXAPiHandler.ets
private static registerWxAPIInternal(appId: string) {
let api = wechatOpenSDK.WXAPIFactory.createWXAPI(appId) // L61 — 不绑定 eventHandler
WXAPiHandler.registered = true
WXAPiHandler.wxApi = api
}
// fluwx 6.0.2 ohos/src/main/ets/components/plugin/FluwxPlugin.ets
onNewWant(want: Want, launchParams: AbilityConstant.LaunchParam): void {
WXAPiHandler.wxApi?.handleWant(want, this); // L149-150 — 只有这里会绑定 handler
}
attemptToResumeMsgFromWx(result: MethodResult) { // L262 — 需要手动调用才补绑
WXAPiHandler.wxApi?.handleWant(this.binding?.getAbility().launchWant, this)
}
eventHandler 被赋值的唯一路径是 handleWant(),而 fluwx 只在 onNewWant 和 attemptToResumeMsgFromWx 里调用它。冷启动的进程尚未收到过任何 want,eventHandler 为空,微信回传时 this.eventHandler?.onResp(resp) 被 ?. 静默吞掉,Dart 侧永远收不到响应。
日志证据(hilog,真机)
09-13 00:40:32 xxx 55620 xxx I C01515/[wxopensdk::WXApi]: handleResult, resp: {errCode: 0, authResult: true, code: "091Q...", __type: 1}
...(此后该 PID 再无任何 fluwx / 回调相关日志)
09-13 00:41:02 xxx 55620 xxx D ...: [WeChatLogin] callback timeout
原生层已完整收到微信授权结果(code 都拿到了),但 30 秒后 Dart 侧超时——与「eventHandler 为空、onResp 被静默跳过」完全吻合。
临时解决方案(当前已在我们项目验证)
registerApi 完成后,主动调用一次官方提供的恢复接口,借 handleWant 首行赋值提前绑定 handler:
final fluwx = Fluwx();
await fluwx.registerApi(appId: appId, universalLink: ...);
if (systemInfo.isOhos) {
await fluwx.attemptToResumeMsgFromWx();
}
建议修复
冷启动场景下 onCreate/registerApp 时 handler 就应该可用,两个思路任选:
registerWxAPIInternal里创建 api 后立即绑定(例如传 eventHandler,或用空 want 调一次handleWant——空 want 不含 callerBundleName,不会误触发分发);registerApp的 method channel 处理完成后,自动调用一次attemptToResumeMsgFromWx()(等价于现在的 workaround,但不需要每个接入方自己记得调)。
另外,this.eventHandler?.onResp(...) 处如果 handler 为空,建议至少打一条 warn 日志,避免此类问题再次静默丢包、排查成本极高(我们定位这个问题花了较长时间比对真机 hilog)。
相关
- issue 提交者项目里的分析记录:升级 6.0.2 + 手动
attemptToResumeMsgFromWx()后,冷启动首次登录即可成功
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read ohos/src/main/ets/components/plugin/handlers/WXAPiHandler.ets, especially registerWxAPIInternal, and ohos/src/main/ets/components/plugin/FluwxPlugin.ets, including onNewWant and attemptToResumeMsgFromWx. Reproduce the cold-start flow on a HarmonyOS device and inspect the cited WXAPIFactory.js eventHandler path. Done means the first login or payment callback reaches Dart without requiring a manual recovery call.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- dart, typescript
- Domain
- authentication, mobile-dev, payments
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100