SkillAgentSearch skills...

SocialSdkLibrary

提供微博、微信、QQ、Tim、QQ 轻聊版、钉钉的登陆分享功能支持;

Install / Use

/learn @chendongMarch/SocialSdkLibrary
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

SocialSDK

最新版本(1.2.0) Easier 、Lighter 、 More Business-Oriented

以更简单、更轻量、更加面向业务需求为设计目标,提供 微博微信QQTimQQ 轻聊版钉钉 的登陆分享功能支持;

项目地址 : GitHub - SocialSdkLibrary

博客地址 :快速接入微信微博QQ钉钉原生登录分享

<div style="width:100%;display: flex;align-items:center;height:40px;margin-bottom:20px;"> <img style="margin-right:20px;height:20px" src="https://img.shields.io/circleci/project/github/badges/shields/master.svg"/> <img style="margin-right:20px;height:20px" src="https://img.shields.io/badge/version-1.2.0-blue.svg?maxAge=2592000"/> <img style="margin-right:20px;height:20px" src="https://img.shields.io/github/stars/chendongMarch/SocialSdkLibrary.svg"/> <img style="margin-right:20px;height:20px" src="https://img.shields.io/github/forks/chendongMarch/SocialSdkLibrary.svg"/> </div> <br/>

🤔 微信\QQ\微博 SDK 版本可以进行升级了,下个版本升级,微博变动较大;

🎉 2020.1.21 有362颗 🌟 啦, 发布版本 1.2.0, 插件更新,支持最新版本的 Gradle, 采用 Gradle + APT + ASM 自动发现 Platform 类,自动注册初始化代码,内置了 json 解析和 http 请求,初始化配置更简单;

🎉 2019.6.13 支持微信扫码登录

🎉 2019.5.28 项目获得了第329颗 🌟, 对生命周期做自动管理,统一回调参数,发布 稳定版本 1.0.1 ❤️,

🎉 2019.3.28 使用 gradle plugin 自动管理依赖,重新设计版本号 稳定版本 0.1.1 ❤️

🎉 2018.12.27 完成 gradle 插件,拆分平台,自动化依赖,一个新台阶 🐶

🎉 2018.12.21 已经225颗 🌟,着手准备拆分成不同平台库,方便灵活接入 ⛽️

🎉 2018.9.26 项目获得了第202颗 🌟,感谢新同事补星 2 个 😄

🎉 2018.6.7 项目获得了第100颗 🌟,最后一颗是我问同事要的 🤦‍

🎉 2018.5.12 修复内存问题、功能扩展 稳定版本 1.1.0 ❤️

🎉 2018.2.12 支持钉钉分享 🆕

🎉 2017.12.12 对代码进行简单重构并测试 稳定版本 1.0.0 ❤️

<!--more-->

优势

🔥 开源:没有彩蛋,没有彩蛋,没有彩蛋;

🔥 简单:只需要关注登录、分享管理类和一个数据结构对象即可,不需要再关注平台之间的差异;

🔥 轻量:仅包含三方 SDK 和一个简单的异步框架(38k),网络请求、JSON 解析从外部注入,减少多余的依赖,保证与宿主项目高度统一;

🔥 全面:小程序分享、复制链接、扫码登录、推广联运等;

🔥 面向需求设计:

  • Q:微信登录本地只获取 code,服务端获取 token
    • A:配置 wxOnlyAuthCode 参数;
  • Q:又有新平台?华为、OV 联运?
    • A:支持扩展新平台实现,例如华为联运登录接入等;
  • Q:每个平台支持的类型不一致,你支持音乐,我支持视频,接入迁移困难?
    • A:封装各平台内部实现,对外暴露统一的接口,若不支持,使用 web 分享兼容;
  • Q:本地视频无法分享?QQ 不支持纯文字分享?需要兼容方案?
    • A:无法支持的数据类型,使用 Intent 唤醒分享,如支持本地视频分享,qq 的纯文字分享等等;
  • Q:网络图片还得先下载?每次分享前还需要执行下载逻辑?
    • A:支持直接使用网络图片分享,内置自动下载和图片缓存功能;
  • Q:万一图片下载不下来怎么办?分享直接失败?
    • A:图片 下载/加载 失败时降级使用资源图,避免分享被中断;
  • Q:分享过程中需要完成统一切面操作,打点?加水印?还有啥?
    • A:在分享前可统一重写数据对象,用来做分享的切面,支持图片加水印等类似需求;
  • Q:分享增加了复制链接到粘贴板的类型,单独重新写这部分逻辑,那不是不统一了?
    • A:支持短信、邮件、粘贴板等系统分享平台;
  • Q:每次都需要打开三方 App 授权登录,能直接登录进去吗?
    • A:持久化存储 token 避免多次授权,可选择有效时长,存储 token 下次授权可以直接获取数据,但是用户换了微信账号就没办法切换账号啦,这个时长要仔细斟酌;
  • Q:我遇到的这些问题,你是不是也遇到了?
    • A:试试 SocialSdk 吧;

开始接入

STEP1: 添加插件依赖路径

project / build.gradle

buildscript {
    repositories {
        maven { url "https://dl.bintray.com/zfy/maven" }
    }
    dependencies {
        // 请查看文初最新版本,这边可能忘记更新!!!
        classpath 'com.zfy.social:social-sdk-plugin:1.2.0'
    }
}

allprojects {
    repositories {
        maven { url "https://dl.bintray.com/zfy/maven" }
    }
}

STEP2: 配置参数

app / build.gralde

为了安全起见更建议在 local.properties 中配置,这样可以避免提交到远端;

// 在顶部引用插件
apply plugin: 'socialsdk'

// android 配置模块
android {
	...
}

// socialsdk 配置模块
socialsdk {
    wx {
        appId = '111xxx2222'
        appSecret = '111xxx2222'
        // 微信授权是否只返回 code, 用于服务端授权的场景
        onlyAuthCode = false
    }
    qq {
        appId = '111xxx2222'
        appSecret = '111xxx2222'
    }
    wb {
        appId = '111xxx2222'
        url = '111xxx2222'
    }
    dd {
        appId = '111xxx2222'
    }
}

以上是最简单的配置,更多配置参数参考,通常使用默认即可:

socialsdk {
	// 调试模式,默认 false, 可以在代码中开启
    debug = true
	// 分享:选择停留在微信时自动返回成功,默认返回失败
    shareSuccessIfStay = true
    // 登录:token 过期时间,单位小时,默认立即过期,有效期内可以不需要再次唤醒第三方 app,但是二次登录也没办法切换账号,这会引发问题,所以默认立即过期
    tokenExpiresHours = 100
    // 使用 gson 作为数据解析,默认 true,你如果不用 gson 就需要自己编写 JSONAdapter
    useGson = true
    // 使用 okHttp 发送请求,默认 true,你如果不用 okhttp 就需要自己编写 RequestAdapter
    useOkHttp = true
    // 配置 app 名称,默认使用 R.string.app_name
    appName = "哈哈哈"
    // 唤醒过程中的 loading 颜色
    color = "#FF0000"
    wx { }
    qq { }
    wb { }
    dd { }
}

STEP3:初始化

SocialOptions options = new SocialOptions.Builder(this)
        // 调试模式,开启 log 输出
        .debug(true)
        // 加载缩略图失败时,降级使用资源图
        .failImgRes(R.drawable.share_default_img)
        // 添加分享拦截器,重新处理分享的数据
        .addShareInterceptor((context, obj) -> {
            obj.setSummary("被重新组装" + obj.getSummary());
            return obj;
        })
        // 构建
        .build();
// 初始化
SocialSdk.init(options);

登录功能

登陆功能支持三个平台,qq,微信,微博;

// 3个平台
Target.LOGIN_QQ; // QQ 登录
Target.LOGIN_WX; // 微信 登录
Target.LOGIN_WX_SCAN; // 微信扫码 登录
Target.LOGIN_WB;  // 微博 登录

登录将会返回 LoginResult, 其中主要包括登录类型,基本用户信息,令牌信息 3 部分;

LoginResult {
    // 状态,成功,失败,取消等
    public int state;
    // 目标平台
    public int target;
    // 发生错误时使用
    public SocialError error;
    // 针对登录类型可强转为 WbUser,WxUser,QQUser 来获取更加丰富的信息
    public SocialUser socialUser;
    // 本次登陆的 token 信息,openId, unionId,token,expires_in
    public AccessToken accessToken;
    // 授权码,如果 onlyAuthCode 为 true, 将会返回它
    public String wxAuthCode;
    // 扫码登录二维码文件路径
    public String wxCodePath;
}

登录时需要设置登录回调:

new OnLoginStateListener() {
    @Override
    public void onState(Activity act, LoginResult result) {
        switch (result.state) {
            case LoginResult.STATE_START:
                // 登录开始
                break;
            case LoginResult.STATE_COMPLETE:
                // 登录完成
                break;
            case LoginResult.STATE_ACTIVE:
                // 透明 Activity 开启
                break;
            case LoginResult.STATE_SUCCESS:
                // 登录成功
                break;
            case LoginResult.STATE_FAIL:
                // 登录失败
                result.error
                break;
            case LoginResult.STATE_CANCEL:
                // 登录取消
                break;
            case LoginResult.STATE_WX_CODE_RECEIVE:
                 // 获取到微信登录二维码
                 break;
            case LoginResult.STATE_WX_CODE_SCANNED:
                 // 微信登录二维码被扫描
                 break;
        }
    }
};

获取更多用户信息:

SocialUser socialUser = loginResult.socialUser;
// 基本信息可以从 SocialUser 在获取到
String userNickName = socialUser.getUserNickName();
// 获取 openId
String openId = socialUser.getOpenId();
// 微信获取 unionId,其他平台仍旧返回 openId
String unionId = socialUser.getUnionId();
// 获取 userId,微信返回 unionId, 其他平台返回 openId
String userId = socialUser.getUserId();
// 强转为平台用户,可以拿到更多信息
int target = result.getTarget();
switch (target) {
    case Target.LOGIN_QQ:
        QQUser qqUser = (QQUser) socialUser;
        break;
    case Target.LOGIN_WB:
        WbUser wbUser = (WbUser) socialUser;
        break;
    case Target.LOGIN_WX:
        WxUser wxUser = (WxUser) socialUser;
        break;
}

发起登录:

LoginManager.login(mActivity, Target.LOGIN_QQ, listener);

带参数登录,如微信二维码扫码登录:

LoginObj obj = new LoginObj();
// 根据文档要求,以下数据应在服务端缓存获取
// 如果不设置,将会使用配置时设置的 secret
obj.setAppSecret("0a3cb00******ee3654f499171");
obj.setNonceStr("3611cdc33b******a49ca45bdfab2d");
obj.setTimestamp("15604******6904");
obj.setSignature("b28f69426******18c8ba792caa4a0a1bcc");
// 如果不设置,将会使用 SocialValues.WX_SCOPE
obj.setScope(SocialValues.WX_SCOPE);
LoginManager.login(mActivity, Target.LOGIN_WX_SCAN, obj, listener);

关于 token 时效,可以在初始化时设置 tokenExpiresHours 来控制,也同样提供清除授权 token 的方法。

// 清除全部平台的 token
LoginManager.clearAllToken(context);
// 清除指定平台的 token
LoginManager.clearToken(context, Target.LOGIN_QQ);

分享功能

重要:请仔细查看平台和数据类型中间的支持能力

当 微博 使用 openApi 形式去分享时,可能有较长的延时,建议在生命周期中增加进度条显示,避免用户等待很久没有响应。

划分分享数据类型

针对业务逻辑和 SDK 设计,将分享数据类型划分为 7 种类型,他们能涵盖大多数业务场景,分别是:

开启 App 类型,打开渠道应用;
文字类型,纯文本分享;
图片类型(jpg, png, gif(要求能动));
App 推广类型;
网页链接类型;
音频分享类型;
视频分享类型;

为了保证每个平台都有封闭且统一的外观,如果某个平台不兼容某种类型的分享,将会使用 web 分享的方式代替;比如微信不支持 app 分享,分享出去之后时 web 分享的模式。

划分分享渠道

// 支持的分享渠道
Target.SHARE_DD; // 钉钉好友
Target.SHARE_QQ_FRIENDS; // qq好友
Target.SHARE_QQ_ZONE; // qq空间
Target.SHARE_WX_FRIENDS; // 微信好友
Target.SHARE_WX_ZONE; // 微信朋友圈
Target.SHARE_WX_FAVORITE; // 微信收藏
Target.SHARE_WB; // 新浪微博
Target.SHARE_SMS; // 短信分享
Target.SHARE_EMAIL; // 邮件分享
Target.SHARE_CLIPBOARD; // 粘贴板分享

创建分享数据

分享时,我们首先要构造分享用的数据,ShareObj 对象提供了多种静态方法用来快速创建对应分享的类型的对象;

// 测试用的路径
localImagePath = new File(Environment.getExternalStorageDirectory(), "1.jpg").getAbsolutePath();
localVideoPath = new File(Environment.getExternalStorageDirectory(), "video.mp4").getAbsolutePath();
localGifPath = new File(Environment.getExternalStorageDirectory(), "3.gif").getAbsolutePath();
netVideoPath = "http://7xtjec.com1.z0.glb.clouddn.com/export.mp4";
netImagePath = "http://7xtjec.com1.z0.glb.clouddn.com/token.png";
netMusicPath = "http://7xtjec.com1.z0.glb.clouddn.com/test_music.mp3";
netMusicPath = "http://mp3.haoduoge.com/test/2017-05-19/1495207225.mp3";
targetUrl = "http://bbs.csdn.net/topics/391545021";


// 打开渠道对应app
ShareObj shareMediaObj = ShareObj.buildOpenAppObj();
// 分享文字
ShareObj textObj = ShareObj.buildTextObj("分享文字", "summary");
// 分享图片
ShareObj imageObj = ShareObj.buildImageObj("分享图片", "summary", localImagePath);
// 分享gif
ShareObj imageGifObj = ShareObj.buildImageObj("分享图片", "summary", localGifPath);
// 分享app
ShareObj appObj = ShareObj.buildAppObj("分享app", "summary", localImagePath, targetUrl);
// 分享web
ShareObj webObj = ShareObj.buildWebObj("分享web", "summary", localImagePath, targetUrl);
// 分享视频
ShareObj videoObj = ShareObj.buildVideoObj("分享视频", "summary", localImagePath, targetUrl, localVideoP
View on GitHub
GitHub Stars419
CategoryDevelopment
Updated2mo ago
Forks70

Languages

Java

Security Score

100/100

Audited on Jan 13, 2026

No findings