Android开发第三方登录--微信登录

QQ登录、微信登录,新浪微博登录资料获取demo下载

    http://download.csdn.net/detail/pkandroid/9903796

github地址 进入

    https://github.com/HYVincent/Login

项目有需求,需要使用微信登录,QQ登录看这里
Android端要使用微信登录,必须在微信开发平台创建APP并且审核通过

微博登录看这里

如图:
这里写图片描述
有个地方需要注意的是,在创建APP的时候最好保持名称一致,而且创建APP的时候签名是小写的,并且没有:符号 ,例如:
这里写图片描述
微信获取签名的工具:点击下载
微信登录文档地址:点击查看
微信登录相关SDK集成:点击查看
微信SDK集成:
分为包含统计功能和不包含统计功能的
包含统计功能:

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

不包含统计功能的

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

微信登录LoginActivity.java


public class LoginActivity extends BaseActivity implements ILoginView.View {

    .......
    .........

    /**
     * 微信登录相关
     */
    private IWXAPI api;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        hintTitle();
        ....
        ..........
        //通过WXAPIFactory工厂获取IWXApI的示例
        api = WXAPIFactory.createWXAPI(this,Config.APP_ID_WX,true);
        //将应用的appid注册到微信
        api.registerApp(Config.APP_ID_WX);
    }


  .....
  ........


    @OnClick({R.id.login_tv_register, R.id.login_btn_go, R.id.login_tv_forget_password,R.id.iv_other_login_qq,R.id.iv_other_login_sina,R.id.iv_other_login_wx})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            ......
            ..........
            /**
snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。
*/
            case R.id.iv_other_login_wx:
                SendAuth.Req req = new SendAuth.Req();
                req.scope = "snsapi_userinfo";//
//                req.scope = "snsapi_login";//提示 scope参数错误,或者没有scope权限
                req.state = "wechat_sdk_微信登录";
                api.sendReq(req);
                break;

                .......
        }
    }

    ..........
    ...........
}

然后编写微信登录的回调页面:WXEntryActivity.java
在包名的目录下创建wxapi子包(必须,这个包名必须是配置清单的package值),比如我的包名是:com.vincent.colud.那么WXEntryActivity.java类完整路径就是com.vincent.colud.wxapi.WXEntryActivity,
这里写图片描述
另外关于WXEntryActivity注册必须设置exported属性为true,否则无法回调,注意啦
这里写图片描述
现在来看看WXEntryActivity.java

/**
 * description :
 * project name:CCloud
 * author : Vincent
 * creation date: 2017/6/9 18:13
 *
 * @version 1.0
 */

public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler{

    /**
     * 微信登录相关
     */
    private IWXAPI api;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过WXAPIFactory工厂获取IWXApI的示例
        api = WXAPIFactory.createWXAPI(this, Config.APP_ID_WX,true);
        //将应用的appid注册到微信
        api.registerApp(Config.APP_ID_WX);
        ViseLog.d("------------------------------------");
        //注意:
        //第三方开发者如果使用透明界面来实现WXEntryActivity,需要判断handleIntent的返回值,如果返回值为false,则说明入参不合法未被SDK处理,应finish当前透明界面,避免外部通过传递非法参数的Intent导致停留在透明界面,引起用户的疑惑
        try {
            boolean result =  api.handleIntent(getIntent(), this);
            if(!result){
                ViseLog.d("参数不合法,未被SDK处理,退出");
                finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        api.handleIntent(data,this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
        finish();
    }

    @Override
    public void onReq(BaseReq baseReq) {
        ViseLog.d("baseReq:"+ JSON.toJSONString(baseReq));
    }

    @Override
    public void onResp(BaseResp baseResp) {
        ViseLog.d("baseResp:"+JSON.toJSONString(baseResp));
        ViseLog.d("baseResp:"+baseResp.errStr+","+baseResp.openId+","+baseResp.transaction+","+baseResp.errCode);
        String result = "";
        switch(baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                result ="发送成功";
                showMsg(1,result);
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "发送取消";
                showMsg(2,result);
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "发送被拒绝";
                showMsg(1,result);
                finish();
                break;
            default:
                result = "发送返回";
                showMsg(0,result);
                finish();
                break;
        }

    }
}

另外需要注意的是,以上所有的操作都是在打正式签名证书的情况下使用
现在已经完成了微信登录的授权,然后开始微信个人资料的获取
—————————–2017年6月10日08:54:03———————————
这是授权成功之后返回的数据,格式化之后如下:


{
    "code":"0712DRee0kzwiz13fUce0900feRet",
    "country":"CN",
    "errCode":0, 
    "lang":"zh_CN",
    "state":"wechat_sdk_微信登录",
    "type":1,
    "url":"wxb363a9ff53731258://oauth?code=0712DRee0kzwiz13fUce0900fe02DRet&ate=wechat_sdk_%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95"
}
解释: 
errCode:
 //ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权 ERR_USER_CANCEL = -2(用户取消)
code:用户换取access_token的code,仅在ErrCode为0时有效
state:第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
lang:微信客户端当前语言
country:微信用户当前国家信息

现在来获取微信的access_token,获取地址是:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
请求方式:GET

参数说明:
appid:应用唯一标识,在微信开放平台提交应用审核通过后获得
secret:应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code:填写第一步获取的code参数
grant_type:固定值,写authorization_code

获取WeiXin的Access_token

OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth2/access_token")
                        .addParams("appid",Config.APP_ID_WX)
                        .addParams("secret",Config.APP_SECRET_WX)
                        .addParams("code",entity.getCode())
                        .addParams("grant_type","authorization_code")
                        .build()
                        .execute(new StringCallback() {
                            @Override
                            public void onError(okhttp3.Call call, Exception e, int id) {
                                closeDialog();
                            }

                            @Override
                            public void onResponse(String response, int id) {
                                ViseLog.d("response:"+response);

                            }
                        });

响应数据:

{
    "access_token":"hSTsG7nq8e0yEFhOZFT-wAdTsjT9jC0AYvGRiqGwwR6Hko99o_mmYR8KO18kMxeDOz33d9tnBhMzu_NLsIha2HqvTm1OGPL1weBdvXZVFFc",
    "expires_in":7200,
    "refresh_token":"AeN69M27vttqCedxoIOSeY6cxvbt1N584HjEOclUXtNWxRaZWgmtfvn2jWIDX4tq5t-7Btlc1UkEyyFhV7HVIMXe-V6RPjoZdF525vLzev8",
    "openid":"olmt4wfxS21G4VeeVX16_zUhZezY",
    "scope":"snsapi_userinfo",
    "unionid":"o5aWQwAa7niCIXhAIRBOwglIJ7UQ"
}

access_token:接口调用凭证
expires_in :access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔

刷新或续期access_token使用

接口说明
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;

2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权,所以,请开发者在refresh_token即将过期时(如第29天时),进行定时的自动刷新并保存好它。

请求方法
使用/sns/oauth2/access_token接口获取到的refresh_token进行以下接口调用:

http请求方式: GET

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

参数说明
参数 是否必须 说明
appid 是 应用唯一标识
grant_type 是 填refresh_token
refresh_token 是 填写通过access_token获取到的refresh_token参数

上面的是从文档上直接复制的,刷新或续期access_token我暂时没有尝试

获取个人信息

获取个人信息的接口如下:


https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
请求方式:GET

参数就不说了,就那么样..


  //https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
        OkHttpUtils.get()
                .url("https://api.weixin.qq.com/sns/userinfo")
                .addParams("access_token",accessTokenEntity.getAccess_token())
                .addParams("openid",accessTokenEntity.getOpenid())//openid:授权用户唯一标识
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(okhttp3.Call call, Exception e, int id) {
                        closeDialog();
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        ViseLog.d("userInfo:"+response);
                    }
                });

获取个人信息响应结果格式化如下:


{
    "openid":"olmt4wfxS24VeeVX16_zUhZezY",
    "nickname":"李文星",
    "sex":1,
    "language":"zh_CN",
    "city":"Shenzhen",
    "province":"Guangdong",
    "country":"CN",
    "headimgurl":"http://wx.qlogo.cn/mmopen/ajNVdqHZLLDickRibe5D4x2ADgSfianmA4kK9hY4esrvGhmAFCe5wjox6b6pL4ibiblKnxibzVtGdqfa2UVHACfmmUsQ/0",
    "privilege":[

    ],
    "unionid":"o5aWQwAa7niCIXhAIRBOwglIJ7UQ"
}

数据已经拿到了,微信登录完成..有问题可留言..

猜你喜欢

转载自blog.csdn.net/pkandroid/article/details/72974552
今日推荐