目前跑通了应用唤起企业微信登录和分享的方案,封装了 uts 插件,特地参加鸿蒙征文活动,分享经验给大家。
插件开发背景
目前官方没有提供企业微信 sdk 的封装,工作中又需要,其实走下来不难,一通百通。大致流程如下:
- 下载离线 sdk 和 补充隐私协议
- 企业微信后台录入鸿蒙包名和 appid
- 编写 uts 代码和调用
了解 uts 插件开发之后几乎就是照搬了。
下载离线 sdk
企业微信文档上提供了一个下载链接,可以访问 企业内部开发-客户端API-移动端SDK-企业微信登录-Harmony应用 下载下来, lib_wwapi.har,这个先放好。
网页上还有隐私协议的文字部分,这个交给运营人员填写一下
SDK名称:企业微信登录/分享SDK
主要功能:通过企业微信登录/分享SDK,企业可在自建的app引入sdk,从而可使用企业微信账号登录app,并且在app中分享消息到企业微信。
使用说明:详见本接入指南
开发者:深圳市腾讯计算机系统有限公司
隐私政策:请接入企业微信登录/分享 SDK的开发者,认真阅读《企业微信登录/分享SDK个人信息保护规则》,并确保对企业微信登录/分享SDK的接入使用情况符合上述规则的相关要求。
微信后台录入应用信息
登录 企业微信的后台 ,提前创建好企业内部应用。然后找到应用管理,点击接入 企业微信授权登录
点开之后找到鸿蒙的信息部分,填写鸿蒙的 APPID 和包名,填写完成之后一个 scheme 存好。
以防你不知道,鸿蒙应用的包名,在华为后台这里获取,appid 是一串数字。
顺便把下面的参数提前准备好
- 企业 id。在 企业微信的后台 找到我的企业,最下方字符串。
ww开头 - 应用 id。在企业微信后台-应用管理-应用详情,找到 AgentId 是一串数字。数字
10开头 - scheme id。刚才企业微信后台填写鸿蒙应用时候展示的 scheme 字符串。
wwauth开头
编写 uts 插件
在 HBuilderX 工程中,创建 uts 插件,选择 uts api 插件开发,名称比如叫 hamrony-comwechat,定位到 app-harmony 文件夹。
工程配置与依赖。
引入企业微信 HAR 包
在插件目录 uni_modules/harmony-com-wechat/utssdk/app-harmony/config.json 声明依赖,确保 DevEco 构建时可打包。把第一步里的 sdk 放到 libs 文件夹内。
{
"dependencies": {
"@tencent/wecom_open_sdk": "./libs/lib_wwapi.har"
}
}
配置 scheme
在工程 module.json5 或 manifest 中补充 querySchemes,与后台登记完全一致。["wxworkapi","https"]。否则无法被企业微信识别与拉起。
在 unpackage 里找到 app-harmony 工程产物文件,找到 entry/src/main/module.json5 赋值出来,放到 harmony-configs/entry/src/main/module.json5,添加 querySchemes
UTS 代码翻译
UTS 和 ArkTS 比较相似,Harmony 侧通过企业微信 SDK 完成安装检测与认证发起。核心流程:
WWAPIFactory.createWWAPI(context)获取实例;isWWAppInstalled(WWKApiAppType.AppTypeSaaS)判断是否安装企业微信;- 构造
WWAuthMessage.Req,写入scheme/corpid/agentId/scopes; sendMessage拉起企业微信,回调中读取code,交由服务端换取登录态。
编辑 uni_modules/harmony-comwechat/utssdk/app-harmony/index.uts
大部分代码都不用变,就 context 稍微改一下。
import { WWAPIFactory, WWAuthMessage, BaseMessage, WWKApiAppType, IWWAPIEventHandler } from '@tencent/wecom_open_sdk';
export const canOpenComWechat = () => {
const context = UTSHarmony.getUIAbilityContext()
// 基本使用 导入
let wwapi = WWAPIFactory.createWWAPI(context)
return wwapi.isWWAppInstalled(WWKApiAppType.AppTypeSaaS)//是否安装了企业微信
}
export const handleLogin = (SCHEME : string, CORPID : string, agentId : string) => {
const context = UTSHarmony.getUIAbilityContext()
// 基本使用 导入
let wwapi = WWAPIFactory.createWWAPI(context)
let msg = new WWAuthMessage.Req("", SCHEME)
msg.appId = CORPID
msg.scopes = ["snsapi_base"]
msg.agentId = agentId
const cb : IWWAPIEventHandler = {
handleResp: (rsp : BaseMessage | undefined | null) : void => {
if (rsp !== null) {
console.log('res code===', rsp.code)
// 这里返回页面里调用后端接口
}
if (rsp instanceof WWAuthMessage.Resp) {
//rsp.code
console.info(JSON.stringify(rsp))
}
}
}
wwapi.sendMessage(context, msg, WWKApiAppType.AppTypeSaaS, cb)
}
说明:
UTSHarmony.getUIAbilityContext()自动获取当前 UIAbility;- 回调中仅打印日志,留给业务侧继续把
code发给后端做换票。 interface.uts与unierror.uts保持模板,后续如需统一错误码可在MyAPIErrors维护映射。- 分享和这个逻辑一样
- 页面里使用
canOpenComWechat返回 true 之后调用handleLogin
页面使用
在页面按需引入并触发登录动作,以下示例来自 pages/index/index.vue(代码不变):
<script setup>
import {canOpenComWechat,handle} from '@/uni_modules/harmony-com-wechat'
const handle1=()=>{
console.log(canOpenComWechat())
}
const share=()=>{
handle('wwauthexxx','wwe2xx','1000002')
}
</script>
调用方法即可。回调返回的 code 需要发送至后端,与企业微信服务器完成 code2session 等后续流程。
六. 调试要点与排错清单
- 未拉起企业微信:优先比对
querySchemes是否与后台登记完全一致;签名与包名也需对应。 - 已拉起但无回调:确认
agentId/scopes是否符合该企业应用权限;企业微信端可能限制。 - 回调拿到
code:务必在后端调用企业微信接口换票,不建议在端内直连。 - 多环境联调:开发/测试/生产环境的
scheme/corpid/agentid请分环境管理,避免错配。
参考文档:https://developer.work.weixin.qq.com/document/path/101021。如需扩展分享等更多能力,可沿用同一 SDK 延伸接口,有问题留言我会协助排查。



