OpenFlutter / OpenFlutter/fluwx

[ohos] 冷启动后微信登录/支付回调丢失:`eventHandler` 仅在 `onNewWant` 中绑定,首次回调被静默吞掉

Open
#773 1 comment 0 reactions 0 assignees View on GitHub

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),后续登录/支付就恢复正常。

稳定的复现规律:

  1. 杀掉 App 进程(或卸载重装)→ 冷启动 → 微信登录 → 超时
  2. 不杀进程,重新进入 App → 再次微信登录 → 成功
  3. 再杀进程 → 又超时

即:必须先收到过一次 onNewWant,微信回调才能送达

复现步骤

  1. HarmonyOS 真机安装 App(含 fluwx,已 registerApi
  2. 完全杀掉 App 进程,冷启动
  3. 立即发起 fluwx.authBy(...),跳微信完成授权
  4. 微信侧显示已授权并返回 App,但 Dart 侧 addSubscriber 收不到 WeChatAuthResponse,等待至超时
  5. 回到桌面重新点击图标进入 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 只在 onNewWantattemptToResumeMsgFromWx 里调用它。冷启动的进程尚未收到过任何 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 就应该可用,两个思路任选:

  1. registerWxAPIInternal 里创建 api 后立即绑定(例如传 eventHandler,或用空 want 调一次 handleWant——空 want 不含 callerBundleName,不会误触发分发);
  2. 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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.