两种登录方式,适用场景完全不同,别选错了
企业微信开放了移动端登录能力,让第三方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的网页授权页面。
具体做法:
- 在你的APP里嵌入一个WebView,加载企业微信的网页授权登录地址
- 这个H5页面会展示一个二维码
- 用户用另一台手机上的企业微信扫码
- 扫码确认后,H5页面拿到授权结果
- 通过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跑在平板或电视盒子上,没法安装企业微信,但又需要用企业微信账号登录。这时候只能展示二维码让用户拿手机扫。
踩坑提醒
-
签名必须匹配:后台填写的APP签名MD5必须跟实际打包的一致,否则调不起企微。
-
code只能使用一次:服务端拿到code换取用户信息后,code立即失效。
-
没法拿到手机号和邮箱:通过移动端SDK授权拿到的code,换不到用户敏感信息。如果业务必须依赖手机号或邮箱,需要走网页授权流程获取。
-
必须是内部成员:再次强调,非企业内部成员调不动这个SDK。
总结
两种方式各有各的用途,搞清楚适用场景就不会选错。大多数APP直接用拉起授权就行,简单省事。只有那些没法装企微APP的设备,才需要考虑扫码登录方案。按照上面的步骤一步步配置,应该能顺利跑通。