Android微信第三方登录

1.创建应用

Android微信第三方登录_第1张图片

2.进入应用详情,填写应用的签名与包名

Android微信第三方登录_第2张图片
注意

  • 1.应用签名需要通过下载APK,进行生成

https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk
Android微信第三方登录_第3张图片
填写应用相关的包名,得到相关签名

  • 2.这里必须要填写,否则导致后期调用接口出错。

3.回到应用进行相关的代码配置

  1. 首先要判断当前是否安装了微信APP
  2. 通过OAuth2.0进行授权,跳转到微信进行登录得到code
  3. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  4. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作
    Android微信第三方登录_第4张图片

4.调用接口的流程

  1. 移动授权微信登录

Android平台应用授权登录接入代码示例(请参考Android接入指南):

    // send oauth request
    Final SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = "wechat_sdk_demo_test";
    api.sendReq(req);
  1. 授权登录之后,进行回调根据code获取access_token
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 说明
appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
sercet 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code 填写第一步获取的code参数
grant_type 填authorization_code

返回说明

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 说明
access_token 接口调用凭证
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
unionid 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
  1. 刷新access_token有效期
    1.access_token过期,则进行通过refresh_token进行刷新操作
    2.access_token未过期,重新调用接口,access_token不会改变,有效期会有所变动

注意: refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

请求方法

获取第一步的code后,请求以下链接进行refresh_token:
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":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 说明
access_token 接口调用凭证
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
  1. 检验授权凭证(access_token)是否有效
    https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
参数 说明
access_token 调用接口凭证
openid 普通用户标识,对该公众帐号唯一

返回说明

{
"errcode":0,"errmsg":"ok"
}
  1. 根据access_token调用接口,获取用户个人信息(UnionID机制)
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数 说明
access_token 调用凭证
openid 普通用户的标识,对当前开发者帐号唯一
lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN

返回说明

{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 说明
openid 普通用户的标识,对当前开发者帐号唯一
nickname 普通用户昵称
sex 普通用户性别,1为男性,2为女性
province 普通用户个人资料填写的省份
city 普通用户个人资料填写的城市
country 国家,如中国为CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
privilege 用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
unionid 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

建议:

开发者最好保存unionID信息,以便以后在不同应用之间进行用户信息互通。

  • 同时需要注意的代码块
  • 1.要在Androidminfiest.xml配置
AppID:相当于包名(package)
  
  • 2.需要将WXEntryActivity放到路径名AppID.wxapi.WXEntryActivity包下
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, HttpsManager.WEIXIN_APP_ID, false);
        try {
            Intent intent = getIntent();
            api.handleIntent(intent, this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    @Override
    public void onReq(BaseReq req) {
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
//                goToGetMsg();
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
//                goToShowMsg((ShowMessageFromWX.Req) req);
                break;
            default:
                break;
        }
        finish();
    }

    @Override
    public void onResp(BaseResp resp) {
        int result = 0;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
                    SendAuth.Resp authResp = (SendAuth.Resp) resp;
                    final String code = authResp.code;
                    Observable.just(new HashMapNull())
                            .concatMap((Function>) hashMapNull -> {
                                hashMapNull.put("code", code);
                                hashMapNull.put("grant_type", "authorization_code");
                                hashMapNull.put("appid", WEIXIN_APP_ID);
                                hashMapNull.put("secret", WEIXIN_APP_SECRET);
                                return HttpsManager.getInstance().apiService.getWxAccessToken("https://api.weixin.qq.com/sns/oauth2/access_token", hashMapNull);
                            })
                            .compose(RxHelper.observableIO2Main(this))
                            .subscribe(new BaseObserver() {
                                @Override
                                public void onBaseNext(Object data) {
                                    WeiXinTokenModel weiXinTokenModel = (WeiXinTokenModel) data;
                                    Intent intent = new Intent(WXEntryActivity.this, LoginActivity.class);
                                    intent.putExtra("weiXinTokenModel", weiXinTokenModel);
                                    startActivity(intent);
                                }

                                @Override
                                public void onBaseError(String message) {

                                }

                            });
                }
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = R.string.errcode_cancel;
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = R.string.errcode_deny;
                break;
            case BaseResp.ErrCode.ERR_UNSUPPORT:
                result = R.string.errcode_unsupported;
                break;
            default:
                result = R.string.errcode_unknown;
                break;
        }
        finish();
    }

}

  • 3.当应用进行授权登录之后,应用进行回调通过WXEntryActivity类得到code值,并通过code请求接口得到access_token,再通过access_token与openid,请求用户信息接口得到用户信息,并将其保存下来

你可能感兴趣的:(android)