Android APP集成企业微信登录:拉起APP授权 vs 扫码登录,一篇讲透

21 阅读5分钟

两种登录方式,适用场景完全不同,别选错了

企业微信开放了移动端登录能力,让第三方APP可以用企业微信账号完成登录。但很多人搞不清“拉起APP授权”和“扫码登录”到底有什么区别,甚至以为是一回事。今天一次性讲清楚。

先搞清楚一个核心限制

在动手之前,有个前提必须先说:企业微信的移动端SDK登录,仅支持企业内部成员调用,不允许跨企业使用

也就是说,你的APP要接入企业微信登录,用户必须是你们公司的企业微信成员。这个限制是硬性的,跟用哪种方式无关。

方式一:拉起企业微信APP授权登录

这是最常规的方式,体验类似微信登录——用户在你的APP里点“企业微信登录”,直接跳转到企业微信APP完成授权,再返回你的APP。

实现步骤

第一步:去企业微信后台创建应用

登录企业微信管理后台,在“企业应用”里添加或选择一个应用,找到“企业微信授权登录”设置项,填写Android的APP签名和包名。保存后系统会生成一个schema,类似于wwauth1e933be11645237c000012这种格式。

第二步:引入SDK

下载企业微信提供的lib_wwapi-3.0.0.7.aar,放到项目的libs目录下。

第三步:注册APP

在APP入口Activity的onCreate里注册:

private static final String APPID = "WW1e933be11645237c";
private static final String AGENTID = "1000012";
private static final String SCHEMA = "wwauth1e933be11645237c000012";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    iwwapi = WWAPIFactory.createWWAPI(this);
    iwwapi.registerApp(SCHEMA);
}

第四步:发起登录请求

final WWAuthMessage.Req req = new WWAuthMessage.Req();
req.sch = SCHEMA;
req.appId = APPID;
req.agentId = AGENTID;
req.state = "你的自定义参数";

iwwapi.sendMessage(req, new IWWAPIEventHandler() {
    @Override
    public void handleResp(BaseMessage resp) {
        if (resp instanceof WWAuthMessage.Resp) {
            WWAuthMessage.Resp rsp = (WWAuthMessage.Resp) resp;
            if (rsp.errCode == WWAuthMessage.ERR_OK) {
                // 授权成功,拿到code传给服务端换用户信息
                String code = rsp.code;
            }
        }
    }
});

关键点:登录成功后你拿到的是一个授权码(code),需要把这个code传给自己的服务端,由服务端调用企业微信API去换取用户信息。用户敏感信息(手机号、邮箱等)通过这种方式是拿不到的,只能通过OAuth2手动授权获取。

方式二:扫码登录

扫码登录的逻辑是:在你的APP里展示一个二维码,用户用另一台设备上的企业微信扫码确认,完成登录。

实现思路

核心结论:企业微信官方Android SDK本身不直接提供“被扫码”的能力。也就是说,你不能像微信支付那样直接生成一个二维码让企微来扫。

那怎么实现?通过WebView嵌套H5的网页授权页面

具体做法

  1. 在你的APP里嵌入一个WebView,加载企业微信的网页授权登录地址
  2. 这个H5页面会展示一个二维码
  3. 用户用另一台手机上的企业微信扫码
  4. 扫码确认后,H5页面拿到授权结果
  5. 通过WebView的JSBridge把结果传回原生层

这个方案的实质是把PC端的网页扫码登录能力移植到了APP里,只不过展示二维码的载体从PC网页变成了APP里的WebView。

注意:这种方式本质上还是走OAuth2网页授权流程,跟拉起APP授权在数据获取上是一样的——拿到的也是code,敏感信息同样拿不到。

两种方式的对比

对比项拉起APP授权扫码登录(WebView方案)
实现复杂度低,直接调SDK中等,涉及WebView和JS交互
用户体验一键跳转,返回即登录需要另一台设备扫码
适用场景手机端APP内登录平板、TV、或同一设备无法安装企微的场景
是否需要另一台设备不需要需要
官方支持官方SDK原生支持官方无直接支持,需绕道实现
数据获取拿code换用户信息同样拿code换用户信息

最关键的区别:核心机制不同

两种方式的本质区别在于谁发起的认证

  • 拉起APP授权:认证发生在企业微信APP内部,通过SDK的SSO(单点登录)机制完成。APP和企微APP之间通过schema通信,企微APP把授权结果直接回传给调用方。

  • 扫码登录:认证发生在Web端。用户扫码后,授权服务器给Web页面颁发code,再通过WebView桥接传回APP。整个过程走的是OAuth2的授权码模式。

简单说:一个走应用间通信,一个走网页授权

到底选哪种?

选拉起APP授权:绝大多数情况。用户已经在手机上,APP里点一下就能完成登录,体验最顺滑,实现也最简单。

选扫码登录:特殊场景。比如你的APP跑在平板或电视盒子上,没法安装企业微信,但又需要用企业微信账号登录。这时候只能展示二维码让用户拿手机扫。

踩坑提醒

  1. 签名必须匹配:后台填写的APP签名MD5必须跟实际打包的一致,否则调不起企微。

  2. code只能使用一次:服务端拿到code换取用户信息后,code立即失效。

  3. 没法拿到手机号和邮箱:通过移动端SDK授权拿到的code,换不到用户敏感信息。如果业务必须依赖手机号或邮箱,需要走网页授权流程获取。

  4. 必须是内部成员:再次强调,非企业内部成员调不动这个SDK。

总结

两种方式各有各的用途,搞清楚适用场景就不会选错。大多数APP直接用拉起授权就行,简单省事。只有那些没法装企微APP的设备,才需要考虑扫码登录方案。按照上面的步骤一步步配置,应该能顺利跑通。