HarmonyOS鸿蒙Next中WelinkH5无法自动登录

HarmonyOS鸿蒙Next中WelinkH5无法自动登录 welink轻应用嵌入了H5,企业已经进行了第三方对接,首页地址、接口权限和后台管理地址均已配置,client_id也是正确的,在H5上引入了 https://open-doc.welink.huaweicloud.com/docs/jsapi/2.0.12/hwh5-cloudonline.js,但是调用获取code方法时提示没有对应的方法,代码如下

async isWeLinkLogin(companyCode) {
    const companyInfo = await getCompanyInfo(companyCode)
    if (companyInfo && companyInfo.wlClientId) {
        const ua = navigator.userAgent.toLowerCase();
        if (ua.indexOf('welink') === -1) {
            console.log('非 WeLink 环境,展示普通登录');
            return;
        }
        try {
            // ✅ 先加载 SDK
            const HWH5Instance = await this.loadWeLinkSDK()
            console.log('SDK 加载成功:', HWH5Instance)
            const H = HWH5Instance || (typeof HWH5 !== 'undefined' ? HWH5 : undefined) || (typeof window !== 'undefined' ? window.HWH5 : undefined)
            if (!H) {
                console.log('WeLink SDK 对象不存在')
                return
            }
            console.log('HWH5 对象方法:', Object.keys(H))
            let data
            if (H && H.getAuthorizationCode) {
                data = await H.getAuthorizationCode()
            } else if (H && H.getAuthCode) {
                const maybe = H.getAuthCode()
                if (maybe && maybe.then) {
                    data = await maybe
                } else {
                    data = await new Promise((resolve, reject) => {
                        try {
                            H.getAuthCode(res => resolve(res))
                        } catch (e) {
                            reject(e)
                        }
                    })
                }
            } else {
                console.log('WeLink SDK 对象不包含 getAuthorizationCode/getAuthCode', H)
                return
            }
            const authCode = data && (data.code || data.authCode || data.authorizationCode)
            if (authCode) {
                let res = await scanLogin({
                    companyCode: companyInfo?.companyCode || this.companyCode.code,
                    code: authCode
                })
                this.handleLogin(res)
            } else {
                console.log('未获取到授权码,无法进行自动登录')
            }
        } catch (error) {
            console.log('获取异常', error)
        }
    } else {
        return
    }
},
loadWeLinkSDK() {
    return new Promise((resolve, reject) => {
        // 如果已经存在,直接返回
        if (window.HWH5 || (typeof HWH5 !== 'undefined')) {
            resolve(window.HWH5 || HWH5)
            return
        }
        // 如果没有通过 script 标签引入,才动态加载
        const existingScript = document.querySelector('script[src*="hwh5-cloudonline"]')
        if (existingScript) {
            existingScript.addEventListener('load', () => {
                resolve(window.HWH5 || HWH5)
            })
            return
        }
        const script = document.createElement('script')
        script.src = 'https://open-doc.welink.huaweicloud.com/docs/jsapi/2.0.12/hwh5-cloudonline.js'
        script.onload = () => {
            console.log('WeLink SDK 动态加载完成')
            resolve(window.HWH5 || (typeof HWH5 !== 'undefined' ? HWH5 : undefined))
        }
        script.onerror = () => {
            reject(new Error('WeLink SDK 加载失败'))
        }
        document.head.appendChild(script)
    })
},

执行代码一直提示WeLink SDK 对象不包含 getAuthorizationCode/getAuthCode


更多关于HarmonyOS鸿蒙Next中WelinkH5无法自动登录的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

开发者您好,WeLink是华为的企业协作平台,H5自动登录可能涉及到单点登录或鉴权机制。建议参考WeLink开放平台的相关文档,了解H5应用的登录鉴权方式和配置要求。

更多关于HarmonyOS鸿蒙Next中WelinkH5无法自动登录的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个报“没有对应的方法”,优先怀疑不是 client_id,而是当前页面没有运行在支持该 JSAPI 的 WeLink 轻应用容器里,或者 JSAPI 还没注入完成。

可以按顺序查:

  1. 确认页面是从 WeLink 工作台/轻应用入口打开,不是普通浏览器或外部 WebView 打开。
  2. hwh5-cloudonline.js 加载成功后,再在 ready/初始化完成回调里调用获取 code 的方法,不要在脚本刚引入后立即调用。
  3. 区分免鉴权基础 API 和需要鉴权的业务 API,自动登录/获取 code 往往需要后台应用配置、可信域名、接口权限和签名鉴权都生效。
  4. 打印 window 上实际注入的对象和方法名,确认文档版本 2.0.12 与当前容器版本匹配。

如果同一 URL 在 WeLink 内没有方法、在普通浏览器也没有,那就是容器注入或入口配置问题。

从描述看,企业后台、首页地址和 client_id 已配置,缺口主要在 H5 运行容器、JSAPI 注入时机和接口权限生效范围。我给您举几个常见场景,您可以对照排查:

  1. 如果页面不是在 WeLink 轻应用容器内打开,UA 不匹配时 JSAPI 不会注入;
  2. 如果脚本已加载但未等 JSBridge ready 就调用,获取 code 方法可能还不存在;
  3. 如果租户/应用权限未对当前轻应用生效,也可能表现为方法不可用。

建议补充 WeLink 客户端版本、UA、实际方法名、完整报错堆栈和后台权限截图。

轻应用的 JSAPI主要分为两类:

  • 调用获取应用或者设备的基础信息,该类 JSAPI 的调用不需要鉴权。
  • 轻应用业务相关的部分API,需要开发者先进行鉴权然后再调用。
  • 页面加载后,需要鉴权的JSAPI要放到ready中。

可以先判断JS API在当前客户端是否可用
排查下开发前必读。用WeLink开放平台JSAPI提供的示例试试。

常见原因:ArkWeb对第三方Cookie和DOM存储默认限制,导致Welink H5的登录态无法持久化。检查WebView是否启用了“允许JavaScript”和“DOM Storage”,并配置了用户代理(User-Agent)适配。鸿蒙Next的隐私策略可能拦截了跨域请求,需确认WebView的网络安全配置已放行Welink域名。

getAuthorizationCode 在鸿蒙Next版WeLink的JSAPI中已不是标准方法。新版统一使用 HWH5.getAuthCode()。但根据您的打印日志,连这个方法都不存在,说明加载的 hwh5-cloudonline.js 并未真正与WeLink客户端桥接成功。

原因通常是:外部动态加载该JS在鸿蒙Next的WebView中不可靠。WeLink容器本身会向页面注入 window.HWH5 对象,不需要自己再script引入。您可以这样排查:

  1. 在页面加载后直接打印 window.HWH5Object.getOwnPropertyNames(window.HWH5),确认客户端是否已注入。
  2. 鸿蒙Next版WeLink的UA可能不包含 welink 关键词,导致您的环境判断提前返回,自动登录逻辑根本没执行。
  3. 若确认 window.HWH5 存在但确实没有 getAuthCode,说明当前WeLink客户端版本未适配该能力,需要改用普通登录兜底,等待WeLink侧更新。
回到顶部