197 lines
7.6 KiB
Kotlin
197 lines
7.6 KiB
Kotlin
package com.gh.common.util
|
||
|
||
import android.app.Activity
|
||
import android.content.Intent
|
||
import android.widget.Toast
|
||
import com.gh.common.constant.Config
|
||
import com.gh.gamecenter.R
|
||
import com.gh.gamecenter.user.LoginTag
|
||
import com.halo.assistant.HaloApp
|
||
import com.lightgame.utils.RuntimeUtils
|
||
import com.lightgame.utils.Utils
|
||
import com.sina.weibo.sdk.WbSdk
|
||
import com.sina.weibo.sdk.auth.AuthInfo
|
||
import com.sina.weibo.sdk.auth.Oauth2AccessToken
|
||
import com.sina.weibo.sdk.auth.WbAuthListener
|
||
import com.sina.weibo.sdk.auth.WbConnectErrorMessage
|
||
import com.sina.weibo.sdk.auth.sso.SsoHandler
|
||
import com.tencent.mm.opensdk.modelmsg.SendAuth
|
||
import com.tencent.mm.opensdk.openapi.IWXAPI
|
||
import com.tencent.mm.opensdk.openapi.WXAPIFactory
|
||
import com.tencent.tauth.IUiListener
|
||
import com.tencent.tauth.Tencent
|
||
import com.tencent.tauth.UiError
|
||
import org.json.JSONException
|
||
import org.json.JSONObject
|
||
import java.lang.ref.WeakReference
|
||
|
||
/**
|
||
* 第三方登录辅助类
|
||
*/
|
||
object LoginHelper {
|
||
|
||
const val WEIBO_SCOPE = (
|
||
"email,direct_messages_read,direct_messages_write,"
|
||
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
|
||
+ "follow_app_official_microblog," + "invitation_write") // weiboCode
|
||
|
||
private var mTencent: Tencent // QQ
|
||
private var mIWXAPI: IWXAPI // 微信
|
||
private var mSsoHandler: WeakReference<SsoHandler>? = null // 微博
|
||
|
||
private var mQqLoginListener: IUiListener
|
||
|
||
private var mAccessToken: Oauth2AccessToken? = null // weibo
|
||
private var mLoginCallback: WeakReference<LoginCallback>? = null
|
||
|
||
init {
|
||
val context = HaloApp.getInstance().application.applicationContext
|
||
mTencent = Tencent.createInstance(Config.TENCENT_APPID, context) //初始化QQ分享
|
||
mIWXAPI = WXAPIFactory.createWXAPI(context, Config.WECHAT_APPID, true) //初始化微信分享
|
||
|
||
mQqLoginListener = object : IUiListener {
|
||
override fun onComplete(o: Any?) {
|
||
Utils.log("QQ 登录成功")
|
||
if (o is JSONObject) {
|
||
val s = o.toString()
|
||
Utils.log("QQLoginComplete::$s")
|
||
try {
|
||
mTencent.openId = o.getString("openid")
|
||
mTencent.setAccessToken(o.getString("access_token"), o.getString("expires_in"))
|
||
|
||
val content = JSONObject()
|
||
content.put("openid", o.getString("openid"))
|
||
content.put("access_token_expire", Utils.getTime(context) + o.getLong("expires_in"))
|
||
content.put("access_token", o.getString("access_token"))
|
||
|
||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功
|
||
} catch (e: JSONException) {
|
||
val errorString = "QQ登录数据回调异常::$e"
|
||
|
||
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败
|
||
|
||
Utils.log(errorString)
|
||
e.printStackTrace()
|
||
}
|
||
}
|
||
}
|
||
|
||
override fun onCancel() {
|
||
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录取消")
|
||
Utils.log("QQ 登录取消")
|
||
}
|
||
|
||
override fun onError(p0: UiError?) {
|
||
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录失败")
|
||
Utils.log("QQ 登录失败")
|
||
}
|
||
}
|
||
|
||
WbSdk.install(context, AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE))
|
||
|
||
Utils.log("LoginHelper initialization")
|
||
}
|
||
|
||
@JvmStatic
|
||
fun onQQLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) {
|
||
Tencent.onActivityResultData(requestCode, resultCode, data, mQqLoginListener);
|
||
}
|
||
|
||
@JvmStatic
|
||
fun onWechatLoginSuccess(content: JSONObject) {
|
||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.wechat, content)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun onWechatLoginFailure(error: String) {
|
||
mLoginCallback?.get()?.onLoginFailure(LoginTag.wechat, error)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun onWeiboLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) {
|
||
mSsoHandler?.get()?.authorizeCallBack(requestCode, resultCode, data)
|
||
}
|
||
|
||
// QQ登录
|
||
@JvmStatic
|
||
fun loginWithQQ(loginCallback: LoginCallback, activity: Activity) {
|
||
mLoginCallback = WeakReference(loginCallback)
|
||
if (!mTencent.isSessionValid) {
|
||
Utils.log("QQLogin")
|
||
mTencent.login(activity, "all", mQqLoginListener)
|
||
}
|
||
}
|
||
|
||
@JvmStatic
|
||
fun logoutWithQQ() {
|
||
if (mTencent.isSessionValid) {
|
||
mTencent.logout(HaloApp.getInstance().application.applicationContext)
|
||
}
|
||
}
|
||
|
||
// 微信登录
|
||
@JvmStatic
|
||
fun loginWithWechat(loginCallback: LoginCallback) {
|
||
mLoginCallback = WeakReference(loginCallback)
|
||
val register = mIWXAPI.registerApp(Config.WECHAT_APPID)
|
||
|
||
val req = SendAuth.Req()
|
||
req.scope = "snsapi_userinfo"
|
||
req.state = HaloApp.getInstance().application.getString(R.string.app_name)
|
||
val b = mIWXAPI.sendReq(req)
|
||
Utils.log("微信注册状态::$register\n 发送状态::$b")
|
||
if (!register || !b) {
|
||
loginCallback.onLoginFailure(LoginTag.wechat, "请检查是否安装微信客户端")
|
||
Utils.toast(HaloApp.getInstance().application, "请检查是否安装微信客户端")
|
||
}
|
||
}
|
||
|
||
// 微博登录
|
||
@JvmStatic
|
||
fun loginWithWeibo(loginCallback: LoginCallback, context: Activity) {
|
||
mLoginCallback = WeakReference(loginCallback)
|
||
mSsoHandler = WeakReference(SsoHandler(context))
|
||
mSsoHandler?.get()?.authorizeClientSso(object : WbAuthListener {
|
||
override fun onSuccess(token: Oauth2AccessToken?) {
|
||
token?.let {
|
||
RuntimeUtils.getInstance().runOnUiThread {
|
||
mAccessToken = token
|
||
if (mAccessToken?.isSessionValid == true) {
|
||
// 保存 Token 到 SharedPreferences
|
||
AccessTokenKeeper.writeAccessToken(context, mAccessToken)
|
||
Utils.toast(context, "授权成功")
|
||
}
|
||
}
|
||
|
||
val content = JSONObject()
|
||
tryWithDefaultCatch {
|
||
content.put("uid", token.uid)
|
||
content.put("access_token", token.token)
|
||
content.put("access_token_expire", Utils.getTime(context) + token.expiresTime)
|
||
content.put("refresh_token", token.refreshToken)
|
||
// content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天
|
||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调
|
||
}
|
||
}
|
||
}
|
||
|
||
override fun onFailure(p0: WbConnectErrorMessage?) {
|
||
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博")
|
||
}
|
||
|
||
override fun cancel() {
|
||
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权")
|
||
}
|
||
})
|
||
// 第一次启动本应用,AccessToken 不可用
|
||
mAccessToken = AccessTokenKeeper.readAccessToken(context)
|
||
}
|
||
|
||
interface LoginCallback {
|
||
fun onLoginSuccess(loginType: LoginTag, jsonContent: JSONObject)
|
||
|
||
fun onLoginFailure(loginType: LoginTag, error: String)
|
||
}
|
||
|
||
}
|