95、分享与登录:微信登录、QQ登录、微博分享、Universal Link

说实话,做社交类App,最绕不开的就是第三方登录和分享。用户不想注册,你也不想让他流失。微信、QQ、微博这三件套,基本是标配。

我个人习惯先把登录和分享分开看。登录解决的是「你是谁」,分享解决的是「怎么传播」。但底层逻辑其实一样——都是跟平台SDK打交道,处理回调,管理Token。

嗯,今天我们就来拆解这四块内容:微信登录、QQ登录、微博分享、以及Universal Link这个坑。

核心要点:第三方SDK集成,本质上就是「注册-初始化-调接口-处理回调」四步走。但每一步都有细节,稍不注意就翻车。

一、微信登录

微信登录是我用得最多的。为什么?因为用户量大,而且微信的授权流程相对成熟。

先看流程:

  1. 在微信开放平台注册应用,拿到AppID
  2. 集成微信SDK(WXApi)
  3. 调起微信授权页面
  4. 微信回调返回code
  5. 用code换access_token和用户信息

代码示例(核心部分):

// 1. 注册到微信
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI wxApi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        wxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
        wxApi.handleIntent(getIntent(), this);
    }

    // 2. 处理微信回调
    @Override
    public void onResp(BaseResp resp) {
        if (resp instanceof SendAuth.Resp) {
            SendAuth.Resp authResp = (SendAuth.Resp) resp;
            String code = authResp.code;
            // 用code去后端换token
        }
    }
}

我的经验:WXEntryActivity这个类名不能改,包名必须跟开放平台一致。我曾经因为包名写错,调试了一下午。嗯,后来学乖了,每次先检查包名。

这里有个关键点:code换token一定要在服务端做。为什么?因为AppSecret不能暴露在客户端。我见过有人直接把AppSecret写在代码里,结果被反编译,账号被盗刷。

二、QQ登录

QQ登录跟微信类似,但有个区别:QQ的SDK更「重」一些。它自带UI,而且回调方式不同。

QQ登录用的是Tencent类,回调通过IUiListener接口。

// 初始化
Tencent mTencent = Tencent.createInstance(APP_ID, context);

// 调起登录
mTencent.login(this, "all", new BaseUiListener() {
    @Override
    protected void doComplete(JSONObject values) {
        // 登录成功,拿到openid和access_token
    }
});

// 回调处理
private class BaseUiListener implements IUiListener {
    @Override
    public void onComplete(Object response) {
        // 解析JSON
    }

    @Override
    public void onError(UiError uiError) {
        // 错误处理
    }

    @Override
    public void onCancel() {
        // 用户取消
    }
}

避坑指南:QQ登录的回调必须在主线程处理。我曾经在子线程里更新UI,直接崩溃。还有,QQ的SDK在部分国产手机上会有兼容性问题,比如华为、小米的某些系统版本。建议在onError里加个降级方案。

另外,QQ登录的「all」参数表示获取所有权限。如果你只需要基本信息,可以传「get_user_info」。别贪多,权限越多,用户拒绝的概率越大。

三、微博分享

微博分享跟登录不太一样。它更侧重内容传播。我一般用微博的SDK做图文分享、视频分享。

微博分享的核心是WeiboShareSDK,流程如下:

  1. 初始化微博SDK
  2. 构建分享内容(文本、图片、视频、网页)
  3. 调起微博客户端或Web页面
  4. 处理分享结果回调
// 构建分享内容
WeiboMultiMessage multiMessage = new WeiboMultiMessage();
multiMessage.textObject = new TextObject("分享文本");
multiMessage.imageObject = new ImageObject(bitmap);

// 发送请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.multiMessage = multiMessage;
request.transaction = String.valueOf(System.currentTimeMillis());

// 调起分享
WeiboShareSDK.createWBAPI(context).sendRequest(request);

个人经验:微博分享的图片大小有限制,超过10MB会失败。我建议先压缩再分享。还有,微博的SDK在Android 11以上需要申请MANAGE_EXTERNAL_STORAGE权限,否则图片读不出来。这个坑我踩过两次。

微博分享还有个特点:它支持多图分享。但注意,多图分享时图片数量不能超过9张,而且每张图片不能超过5MB。嗯,这些限制文档里都有,但很多人不看。

四、Universal Link

Universal Link是苹果推出的深度链接方案。说白了,就是让用户从浏览器或微信里直接打开你的App,而不是跳到App Store。

Android这边对应的叫App Links。但实际开发中,Universal Link更常见,因为微信、QQ都支持它。

配置Universal Link需要三步:

  1. 在服务器上放一个apple-app-site-association文件
  2. 在Xcode里配置Associated Domains
  3. 在App里处理传入的URL

Android端的处理方式类似:

// AndroidManifest.xml 配置
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
        android:scheme="https"
        android:host="yourdomain.com"
        android:pathPrefix="/app/" />
</intent-filter>

// 处理传入链接
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    Uri data = intent.getData();
    if (data != null) {
        // 解析链接,跳转到对应页面
    }
}

避坑指南:Universal Link在微信里经常失效。为什么?因为微信会拦截链接。我遇到过的情况是:用户点击链接,微信直接打开网页,而不是调起App。解决方案是:在微信里用scheme跳转,或者用微信的JS-SDK。嗯,这个没有完美方案,只能做兼容。

另外,Universal Link的配置有缓存。你改了服务器文件,可能要等24小时才能生效。调试时建议用测试工具,比如Branch的Universal Link验证器。

知识体系总览

下面这张图,是我自己整理的第三方登录与分享的核心逻辑。你看一眼,基本就明白整体结构了。

第三方登录与分享核心流程 App 客户端 微信 SDK QQ SDK 微博 SDK 授权/分享回调 授权/分享回调 授权/分享回调 服务端:code换token / 存储用户信息 Universal Link / App Links 作为入口补充

总结对比

功能 微信 QQ 微博
登录方式 授权码模式 授权码模式 OAuth2.0
分享类型 文本、图片、网页、小程序 文本、图片、网页 文本、图片、视频、网页
回调方式 WXEntryActivity IUiListener WBShareCallback
常见坑 包名、签名 主线程回调、兼容性 图片大小、权限
Universal Link支持 支持(但微信会拦截) 支持 支持

我的建议:如果你刚开始集成,先做微信登录和微博分享。这两个最常用,而且文档相对清晰。QQ登录可以放后面,因为它的SDK更新频率低,有些接口已经过时了。

嗯,今天就聊到这里。第三方登录和分享,说白了就是跟平台SDK打交道。你只要把注册、初始化、回调这三步走顺了,剩下的就是填坑。我踩过的坑,上面都列了,希望能帮你少走弯路。

公众号:蓝海资料掘金营,微信deep3321