Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

时间:2022-08-23 14:53:04


-------------------------------------2017.5.18更新---------------------------------------------------------------------------------------------------------------

由于微博更新了sdk,关闭了网络请求的接口,后来微博登录的时候一直显示系统错误,微博更新sdk以后不再是jar提供使用,改成了aar提供使用,区别不是很大,修改一下你的gradle,在dependices里面加上

compile(name: 'openDefault-2.0.3', ext: 'aar'),上面还要加一个repositories。
 
然后应用一下,吧这个aar的包拷到你的libs目录下就可以了。
 

repositories{
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile 'com.android.support:support-v4:25.3.1'
    testCompile 'junit:junit:4.12'
    compile files('libs/libammsdk.jar')
    compile files('libs/classes.jar')
   // compile files('libs/weiboSDKCore_3.1.4.jar')
    compile files('libs/mta-sdk-1.6.2.jar')
    compile files('libs/open_sdk_r5756.jar')
    compile files('libs/Sunflower.jar')
    compile files('libs/okhttputils-2_6_2.jar')
    compile files('libs/okhttp-3.3.1.jar')
    compile files('libs/okio-1.8.0.jar')
    compile files('libs/commons-beanutils-1.8.0.jar')
    compile files('libs/fastjson-1.1.41.jar')
    compile files('libs/unitynotification.jar')
    compile files('libs/gson-2.8.0.jar')
    compile files('libs/unityutil.jar')
    compile(name: 'openDefault-2.0.3', ext: 'aar')
//    compile(name: 'PushSDK-debug', ext: 'aar')

}

然后在你的mainactivity里的oncreate函数里注册一下微博:

WbSdk.install(this,new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE));
把之前的WBTools这个脚本删掉,新建一个WBAuthActivity脚本,或者把新下载的微博sdk Demo里的这个脚本拷过来。

android供unity调用的微博登录函数

 //微博登录
    public void WBLogin()
    {
      // wbTools.WBLogin();
        Log.i("微博","点到微博登录了");
        startActivity(new Intent(this, WBAuthActivity.class));

    }

WBAuthActivity脚本代码:

public class WBAuthActivity extends Activity {

    private static final String TAG = "weibosdk";
    /** 显示认证后的信息,如 AccessToken */
    private TextView mTokenText;
    /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能  */
    private Oauth2AccessToken mAccessToken;
    /** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
    private SsoHandler mSsoHandler;
    /**
     * @see {@link Activity#onCreate}
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 创建微博实例
        mSsoHandler = new SsoHandler(WBAuthActivity.this);


        // SSO 授权, 仅客户端

        mSsoHandler.authorizeClientSso(new SelfWbAuthListener());

        Log.i("发起授权成功","授权成功");
        // 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
        // 第一次启动本应用,AccessToken 不可用
        mAccessToken = com.sina.weibo.sdk.auth.AccessTokenKeeper.readAccessToken(this);
        Log.i("发起授权成功11111111","授权成功");
    }

    /**
     * 当 SSO 授权 Activity 退出时,该函数被调用。
     *
     * @see {@link Activity#onActivityResult}
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("data1111",Integer.toString(requestCode));
        if(resultCode== Activity.RESULT_CANCELED)
        {
            System.out.println("用户取消了33333");
           finish();
        }
        // SSO 授权回调
        // 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResults
        if (mSsoHandler != null) {
            Log.i("sso回调","毁掉成功");
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }

    }


    private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener{
        @Override
        public void onSuccess(final Oauth2AccessToken token) {
            WBAuthActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAccessToken = token;
                    if (mAccessToken.isSessionValid()) {
                        // 显示 Token
                        //  updateTokenView(false);
                        // 保存 Token 到 SharedPreferences
                        Map m=new HashMap();
                        m.put("access_token",mAccessToken.getToken());
                        m.put("uid",mAccessToken.getUid());
                        com.sina.weibo.sdk.auth.AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
                        UnityPlayer.UnitySendMessage("ThirdLoginGameobject","WeiboCallBack", JSON.toJSONString(m));
                        Log.i("accesstoken",JSON.toJSONString(m));
                        finish();
                    }
                }
            });
        }

        @Override
        public void cancel() {
            Log.i("取消授权","取消授权成功");
        }

        @Override
        public void onFailure(WbConnectErrorMessage errorMessage) {
            Toast.makeText(WBAuthActivity.this, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

最后改一下你的Mainfest文件,之前关于微博的权限全部删掉,加上

  <!-- 授权认证 -->
        <activity android:name=".WBAuthActivity" />
        <!--<activity android:name=".WBAuthCodeActivity" />-->
        <!--<activity android:name=".WBShareMainActivity" />-->
        <meta-data
            android:name="WEIBO_APPKEY"
            android:value="你申请的微博的APPKEY" />
        <meta-data
            android:name="WEIBO_CHANNEL"
            android:value="weibo" />

---------------------------------------------------------微博登录更新结束------------------------------------------------------------------------------------------------------------------------------------------------------



对于一个不懂安卓不会java的新手程序,实现安卓三方登录开始是 一头雾水,不知道从哪下手,通过自己摸索加上多方求助终于完成了。为了自己巩固一下以及一些像我一样的新手走弯路,把详细过程记录下来。

第一次写文章,写的有点乱,希望能帮助到大家。Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

我使用的是android studio2.2.2版本开发。

一、新建安卓工程并导入jar文件

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

注意写好自己的包名,微信登录和微博登录都要用到包名获取签名,把获取到的签名上传到开放平台。

填好包名后一直点next就可以了,点击finish完成创建。

创建完成后,新建一个module类,同样写好自己的包名。

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

到这里准备工作就做好了。

二、QQ登录

QQ登录时最简单的一个,因为不需要签名。在qq开放平台下载好sdk,然后copy到libs文件夹下。

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

点击Add as Library就可以了,微信和微博的jar包导入也是一样,Unity的classes.jar也需要导入,后面就不赘述了。

通过调用Tencent类的login函数发起登录/校验登录态。
该API具有两个作用:
(1)如果开发者没有调用mTencent实例的setOpenId、setAccessToken API,则该API执行正常的登录操作;
(2)如果开发者先调用mTencent实例的setOpenId、setAccessToken API,则该API执行校验登录态的操作。如果登录态有效,则返回成功给应用,如果登录态失效,则会自动进入登录流程,将最新的登录态数据返回给应用。

建议开发者在每次应用启动时调用一次该API(先调用setOpenId、setAccessToken),以确保每次打开应用时用户都是有登录态的。

public class MainActivity extends UnityPlayerActivity {
    private Tencent mTencent;
    private BaseUiListener mBaseUiListener=new BaseUiListener();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTencent = Tencent.createInstance("你的APPID", this.getApplicationContext());
    }
  
    /**
     * qq登录代码  Unity里调用
     */
    public void QQlogin() {
        //登录代码。。。
            if (!mTencent.isSessionValid())
            {
                mTencent.login(this, "", mBaseUiListener);
            }

    }

    /**
     * qq请求回调
     */
    private class BaseUiListener implements IUiListener {

        @Override
        public void onComplete(Object o) {
            JSONObject response=(JSONObject)o;
//把请求到的参数传给unity
            UnityPlayer.UnitySendMessage("ThirdLoginGameobject","QQCallBack",o.toString());
        }

        @Override
        public void onError(UiError uiError) {
        }

        @Override
        public void onCancel() {

        }
    }

    /**
     * qq登录页面返回处理
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Tencent.onActivityResultData(requestCode,resultCode,data,mBaseUiListener);
    }
然后再mainfest里配置权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application>
<activity
android:name="com.tencent.tauth.AuthActivity" 
android:noHistory="true" 
android:launchMode="singleTask" >
<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="tencent你的AppId" />
</intent-filter>
</activity>
<application>


SDK_V2.0引入了AssistActivity,开发者需在androidManifest.xml中注册。代码如下:

<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize" 
/>

现在就可以成功拉起QQ授权页面并登陆了。

三、微信登录

新建一个名为wxapi的包和WXEntryActivity的类。

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

WXEntryActivity的代码如下:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private static final String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key";
    private static final String WEIXIN_OPENID_KEY = "wx_openid_key";
    private static final String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";
    public static WeChatCode mWeChatCode;

    public WeChatCode getWeChatCode() {
        return mWeChatCode;
    }

    public void setWeChatCode(WeChatCode weChatCode) {
        mWeChatCode = weChatCode;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 微信事件回调接口注册
        MyApplication.sApi.handleIntent(getIntent(), this);
    }

    //微信组件注册初始化

     public static IWXAPI initWeiXin(Context context, @NonNull String weixin_app_id) {
     if (TextUtils.isEmpty(weixin_app_id)) {
     Toast.makeText(context.getApplicationContext(), "app_id 不能为空", Toast.LENGTH_SHORT).show();
     }
     IWXAPI api = WXAPIFactory.createWXAPI(context, weixin_app_id, true);
     api.registerApp(weixin_app_id);
     return api;
     }

    /**
     * 登录微信
     */
    public static void loginWeixin(Context context, IWXAPI api, WeChatCode wechatCode) {
        // 判断是否安装了微信客户端
//        if (!api.isWXAppInstalled()) {
//            Toast.makeText(context.getApplicationContext(), "您还未安装微信客户端!", Toast.LENGTH_SHORT)
//                    .show();
//            return;
//        }
        mWeChatCode=wechatCode;
        // 发送授权登录信息,来获取code
        SendAuth.Req req = new SendAuth.Req();
        // 应用的作用域,获取个人信息
        req.scope = "snsapi_userinfo";
        /**
         * 用于保持请求和回调的状态,授权请求后原样带回给第三方
         * 为了防止csrf攻击(跨站请求伪造攻击),后期改为随机数加session来校验
         */
        req.state = "app_wechat";
        api.sendReq(req);
    }

    // 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq req) {
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
                break;
            default:
                break;
        }
    }

    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
    @Override
    public void onResp(BaseResp resp) {
        switch (resp.errCode) {
            // 发送成功
            case BaseResp.ErrCode.ERR_OK:
                // 获取code
                String code = ((SendAuth.Resp) resp).code;
                mWeChatCode.getResponse(code);
                break;
        }
    }

    /**
     * 返回code的回调接口
     */
    public interface WeChatCode {
        void getResponse(String code);
    }
}
MainActivity中添加如下代码:

  private static final String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key";
    private static final String WEIXIN_OPENID_KEY = "wx_openid_key";
    private static final String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";

//微信登录  unity中调用该方法
    public void weiLogin() {
        WXEntryActivity.loginWeixin(MainActivity.this, MyApplication.sApi, new WXEntryActivity.WeChatCode() {
            @Override
            public void getResponse(String code) {
                // 通过code获取授权口令access_token
                getAccessToken(code);
                Log.i("获取token成功",code.toString());
                // 从手机本地获取存储的授权口令信息,判断是否存在access_token,不存在请求获取,存在就判断是否过期
                String accessToken = (String) ShareUtils.getValue(MainActivity.this, WEIXIN_ACCESS_TOKEN_KEY,
                        "none");
                String openid = (String) ShareUtils.getValue(MainActivity.this, WEIXIN_OPENID_KEY, "");
                if (!"none".equals(accessToken)) {
                    // 有access_token,判断是否过期有效
                    isExpireAccessToken(accessToken, openid);
                } else {
                    // 没有access_token
                    getAccessToken(code);
                    Log.i("获取token成功",code.toString());
                }
            }
        });
        Log.i("登录成功","aaaaaaaaaaaaaaaaaaaaaaaaaa");

    }

  /**
     * 微信登录获取授权口令
     */
    private void getAccessToken(String code) {
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                "appid=" + AppConst.WEIXIN_APP_ID +
                "&secret=" + AppConst.WEIXIN_APP_SECRET +
                "&code=" + code +
                "&grant_type=authorization_code";
        // 网络请求获取access_token
        OkHttpUtils.get().url(url).build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(String response, int id) {
                // 判断是否获取成功,成功则去获取用户信息,否则提示失败
                processGetAccessTokenResult(response);
            }
        });

    }

    /**
     * 微信登录处理获取的授权信息结果
     *
     * @param response 授权信息结果
     */
    public void processGetAccessTokenResult(String response) {
        // 验证获取授权口令返回的信息是否成功
        if (validateSuccess(response)) {
            // 使用Gson解析返回的授权口令信息
          //  WXAccessTokenInfo tokenInfo = mGson.fromJson(response, WXAccessTokenInfo.class);
            // 保存信息到手机本地
          //  saveAccessInfotoLocation(tokenInfo);
            // 获取用户信息
          //  getUserInfo(tokenInfo.getAccess_token(), tokenInfo.getOpenid());
        } else {
            // 授权口令获取失败,解析返回错误信息
          //  WXErrorInfo wxErrorInfo = mGson.fromJson(response, WXErrorInfo.class);

        }
    }

    /**
     *微信登录获取tokenInfo的WEIXIN_OPENID_KEY,WEIXIN_ACCESS_TOKEN_KEY,WEIXIN_REFRESH_TOKEN_KEY保存到shareprephence中
     * @param tokenInfo
     */
    private void saveAccessInfotoLocation(WXAccessTokenInfo tokenInfo) {
        ShareUtils.saveValue(MyApplication.mContext,WEIXIN_OPENID_KEY,tokenInfo.getOpenid());
        ShareUtils.saveValue(MyApplication.mContext,WEIXIN_ACCESS_TOKEN_KEY,tokenInfo.getAccess_token());
        ShareUtils.saveValue(MyApplication.mContext,WEIXIN_REFRESH_TOKEN_KEY,tokenInfo.getRefresh_token());
    }

    /**
     * 验证是否成功
     *
     * @param response 返回消息
     * @return 是否成功
     */
    private boolean validateSuccess(String response) {
        String errFlag = "errmsg";
        return (errFlag.contains(response) && !"ok".equals(response))
                || (!"errcode".contains(response) && !errFlag.contains(response));
    }


    /**
     * 微信登录判断accesstoken是过期
     *
     * @param accessToken token
     * @param openid      授权用户唯一标识
     */
    private void isExpireAccessToken(final String accessToken, final String openid) {
        String url = "https://api.weixin.qq.com/sns/auth?" +
                "access_token=" + accessToken +
                "&openid=" + openid;
        OkHttpUtils.get().url(url).build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {

            }

            @Override
            public void onResponse(String response, int id) {
                if (validateSuccess(response)) {
                    // accessToken没有过期,获取用户信息
                    getUserInfo(accessToken, openid);
                   //把请求到的数据传递到unity
                    UnityPlayer.UnitySendMessage("与安卓交互的C#脚本挂载的物体名","函数名",response.toString());
                    Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_LONG).show();

                } else {
                    // 过期了,使用refresh_token来刷新accesstoken
                    refreshAccessToken();
                }
            }
        });

    }
    /**
     * 微信登录刷新获取新的access_token
     */
    private void refreshAccessToken() {
        // 从本地获取以存储的refresh_token
        final String refreshToken = (String) ShareUtils.getValue(this, WEIXIN_REFRESH_TOKEN_KEY,
                "");
        if (TextUtils.isEmpty(refreshToken)) {
            return;
        }
        // 拼装刷新access_token的url请求地址
        String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
                "appid=" + AppConst.WEIXIN_APP_ID +
                "&grant_type=refresh_token" +
                "&refresh_token=" + refreshToken;
        // 请求执行
        OkHttpUtils.get().url(url).build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                System.out.println("刷新获取新的access_token信息失败!!!");
                // 重新请求授权
                weiLogin();
            }

            @Override
            public void onResponse(String response, int id) {
                // 判断是否获取成功,成功则去获取用户信息,否则提示失败
                processGetAccessTokenResult(response);
            }
        });

    }
    /**
     * 微信token验证成功后,联网获取用户信息
     * @param access_token
     * @param openid
     */
    private void getUserInfo(String access_token, String openid) {
        String url = "https://api.weixin.qq.com/sns/userinfo?" +
                "access_token=" + access_token +
                "&openid=" + openid;
        OkHttpUtils.get().url(url).build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                System.out.println("联网获取用户信息失败!!!");
            }

            @Override
            public void onResponse(String response, int id) {
                // 解析获取的用户信息
               // WXUserInfo userInfo = mGson.fromJson(response, WXUserInfo.class);
                System.out.println("获取用户信息String是::::::"+response);

            }
        });
    }


我写了一个类来存APPID和SECRET

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

新建一个MyApplication类来初始化微信登录和网络请求

public class MyApplication extends Application {
    public static IWXAPI sApi;
    public static Context mContext;
    @Override
    public void onCreate() {
        super.onCreate();
        mContext=this;
        //初始化微信
        sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
        initOkHttp();
    }
    //封装okhttp框架的初始化配置
    private void initOkHttp() {
        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
        CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new LoggerInterceptor("TAG"))
                .cookieJar(cookieJar)
                .connectTimeout(20000L, TimeUnit.MILLISECONDS)
                .readTimeout(20000L,TimeUnit.MILLISECONDS)
                .writeTimeout(20000L,TimeUnit.MILLISECONDS)
                .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
                //其他配置
                .build();
        OkHttpUtils.initClient(okHttpClient);
    }
}

mainfest里初始化MyApplication

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

只要填写正确的APPID以及签名正确,就可以拉起微信登录页面了。

四、微博登录

微博登录不光要导入jar包,libs里面的.so文件也要导入

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

这里只讲客户端授权。

从官方demo中复制AccessTokenKeeper这个类到你的工程中。写一个Constance类来存APPKEY

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)把这三个类也从官方的demo中复制过来,下面我贴上我删减后的代码

public class WBAuthActivity extends Activity {

    private static final String TAG = "weibosdk";

    private AuthInfo mAuthInfo;

    /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能  */
    private Oauth2AccessToken mAccessToken;

    /** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
    private SsoHandler mSsoHandler;

    /**
     * @see {@link Activity#onCreate}
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
        mSsoHandler = new SsoHandler(WBAuthActivity.this, mAuthInfo);
        // SSO 授权, 仅客户端
        WBLogin();
        // 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
        // 第一次启动本应用,AccessToken 不可用
        mAccessToken = AccessTokenKeeper.readAccessToken(this);
        if (mAccessToken.isSessionValid()) {
            updateTokenView(true);
        }
    }

    /**
     * 当 SSO 授权 Activity 退出时,该函数被调用。
     *
     * @see {@link Activity#onActivityResult}
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // SSO 授权回调
        // 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResults
        // ++++++++++++++++++
        //如果是sso授权登陆,必须先执行下面的回调,然后才会执行监听器里的 回调
        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
    }

    }
    private void WBLogin()
   {
    mSsoHandler.authorizeClientSso(new AuthListener());
   }
    /**
     * 微博认证授权回调类。
     * 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
     *    该回调才会被执行。
     * 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
     * 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
     */
    class AuthListener implements WeiboAuthListener {

        @Override
        public void onComplete(Bundle values) {
            // 从 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            UnityPlayer.UnitySendMessage("ThirdLoginGameobject","WeiboCallBack",values.toString());
            //从这里获取用户输入的 电话号码信息 
          //  String phoneNum =  mAccessToken.getUid();
            if (mAccessToken.isSessionValid()) {
                // 显示 Token
                updateTokenView(false);

            } else {
                // 以下几种情况,您不会收到 Code:
                // 1. 当您未在平台上注册的应用程序的包名与签名时;
                // 2. 当您注册的应用程序包名与签名不正确时;
                // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
            }
        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onWeiboException(WeiboException e) {

        }
    }

    /**
     * 显示当前 Token 信息。
     *
     * @param hasExisted 配置文件中是否已存在 token 信息并且合法
     */
    private void updateTokenView(boolean hasExisted) {

    }
}

public class WBAuthCodeActivity extends Activity {

    private static final String TAG = "WBAuthCodeActivity";

    /**
     * WeiboSDKDemo 程序的 APP_SECRET。
     * 请注意:请务必妥善保管好自己的 APP_SECRET,不要直接暴露在程序中,此处仅作为一个DEMO来演示。
     */
    
    /** 通过 code 获取 Token 的 URL */
    private static final String OAUTH2_ACCESS_TOKEN_URL = "https://open.weibo.cn/oauth2/access_token";
    
    /** 微博 Web 授权接口类,提供登陆等功能  */
    private AuthInfo mAuthInfo;
    /** 获取到的 Code */
    private String mCode;
    /** 获取到的 Token */
    private Oauth2AccessToken mAccessToken;

    /**
     * @see {@link Activity#onCreate}
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // setContentView(R.layout.activity_auth_code);

        // 初始化微博对象
        mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
    }

    /**
     * 微博认证授权回调类。
     */
    class AuthListener implements WeiboAuthListener {
        
        @Override
        public void onComplete(Bundle values) {
            if (null == values) {
                return;
            }
            String code = values.getString("code");
            if (TextUtils.isEmpty(code)) {
                return;
            }
            mCode = code;
        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onWeiboException(WeiboException e) {

        }
    }
    
    /**
     * 异步获取 Token。
     * 
     * @param authCode  授权 Code,该 Code 是一次性的,只能被获取一次 Token
     * @param appSecret 应用程序的 APP_SECRET,请务必妥善保管好自己的 APP_SECRET,
     *                  不要直接暴露在程序中,此处仅作为一个DEMO来演示。
     */
    public void fetchTokenAsync(String authCode, String appSecret) {
        
        WeiboParameters requestParams = new WeiboParameters(Constants.APP_KEY);
        requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_ID,     Constants.APP_KEY);
        requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);
        requestParams.put(WBConstants.AUTH_PARAMS_GRANT_TYPE,    "authorization_code");
        requestParams.put(WBConstants.AUTH_PARAMS_CODE,          authCode);
        requestParams.put(WBConstants.AUTH_PARAMS_REDIRECT_URL,  Constants.REDIRECT_URL);
        
        // 异步请求,获取 Token
        new AsyncWeiboRunner(getApplicationContext()).requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams, "POST", new RequestListener() {
            @Override
            public void onComplete(String response) {
                
                // 获取 Token 成功
                Oauth2AccessToken token = Oauth2AccessToken.parseAccessToken(response);
                if (token != null && token.isSessionValid()) {
                    
                    mAccessToken = token;
                    String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
                            new java.util.Date(mAccessToken.getExpiresTime()));
                    String format = token.toString();
                } else {

                }
            }

            @Override
            public void onWeiboException(WeiboException e) {

			}
        });
    }
}

 WBShareMainActivity继承Activity为空即可。
在MainActivity的onCreate里写上
LogUtil.sIsLogEnable = true;
MainActivity里加上微博登录代码
//微博登录  Unity里调用
    public void WBLogin()
    {
        startActivity(new Intent(MainActivity.this, WBAuthActivity.class));
    }

mainfest里加上

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)即可。


把MainActivity里的代码整合到一起后,build

Unity使用官方sdk实现微信、QQ、微博三方登录(Android)Unity使用官方sdk实现微信、QQ、微博三方登录(Android)Unity使用官方sdk实现微信、QQ、微博三方登录(Android)Unity使用官方sdk实现微信、QQ、微博三方登录(Android)

把libs里的classes.jar删掉,把红框圈起来的classes.jar拖到libs文件夹里,然后把libs,res和AndroidMainfest这三个文件拖到Unity工程的Plugins/Android文件夹下。


然后在unity创建三个按钮并添加点击事件

 public void OnQQBtnClick(ButtonScript obj, object args, object param1, object param2)
    {
		#if UNITY_IPHONE
			c_thirdQQLogin();
		#elif UNITY_ANDROID
		AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
		jo.Call("QQlogin");
		#endif
    }

    public void OnWeChatBtnClick(ButtonScript obj, object args, object param1, object param2)
    {
		#if UNITY_IPHONE
			c_thirdLogin();
		#elif UNITY_ANDROID
		AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
		jo.Call("weiLogin");
		#endif
    }

    public void OnWeiboBtnClick(ButtonScript obj, object args, object param1, object param2)
    {
		#if UNITY_IPHONE
		 c_thirdWeiboLogin();
		#elif UNITY_ANDROID
		AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
		jo.Call("WBLogin");
		#endif
        
    }

发布安卓应用的时候记得签名,不然微信和微博登录会报错。


demo脚本和jar包下载地址点击打开链接