Android第三方绑定微信登录详解

微信登录官方文档地址:点击进入


一、准备工作

在进行微信登录之前,首先要在微信开放平台注册开发者账号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

微信开放平台接入地址:点击进入

创建移动应用后获得相应的AppID 和 AppSecret



二、授权流程说明

官方文档如下:

  1. 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

  2. 2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

  3. 3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

时序图如下:



下面进行代码演示。

在要进行微信登录的Activity里面发起微信登录请求。

在onCreate里面初始化IWXAPI


public static final String APP_ID="wx798XXXXXXXXX";//(这个APP_ID为在微信开放平台创建应用后获得的ID)
private IWXAPI api;//要导入微信相关包
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    api=WXAPIFactory.createWXAPI(this, APP_ID,true);
    api.registerApp(APP_ID);
}

发起登陆的代码(当点击微信登录按钮后执行这段代码)

{
    SendAuth.Req req=new SendAuth.Req();
    req.scope="snsapi_userinfo";
    req.state="wechat_sdk_demo_test";
    api.sendReq(req);
}

当这段代码执行完毕后,就会发起微信登录授权页面,等待用户授权登录。


授权成功后,SDK通过SendAuth的Resp返回数据给调用方(即我们自己的APP),此时要在WXEntryActivity中的public void onResp(BaseResp resp)方法中进行数据处理(微信、朋友圈分享成功后,此方法同样被调用)。

微信登录的返回值如下:



代码处理如下:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
	
	String access_token;
	Long expires_in;
	String refreshToken;
	String openid;
	
    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        api=WXAPIFactory.createWXAPI(this, ContentsInfo.APP_ID, false);
        api.handleIntent(getIntent(),this);
    }

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

    //在这个方法里面进行结果处理,获得CODE(微信登录,微信分享,微信朋友圈分享都会调用这个方法)
    @Override
    public void onResp(BaseResp resp){
        switch(resp.errCode){
        case BaseResp.ErrCode.ERR_OK:
            //返回成功,判断是哪种类型(如果不进行判断,当微信登录和微信分享同时存在的话,会出现异常)
            switch(resp.getType()){
            case ConstantsAPI.COMMAND_SENDAUTH:
              //登录回调,获得CODE
              String code=((SendAuth.resp)resp).code;
              //通过code获得access_token
              getAccess_token(code);
              break;
            case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
              //微信分享回调
              break;
            }
          break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            //用户取消
          break;
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            //用户拒绝授权
          break;
        }
    }
	
	//通过得到的CODE获取access_token
	void getAccess_token(String code){
		AjaxParams params=new AjaxParams();
		params.put("appid", ContentsInfo.APP_ID);
		params.put("secret", ContentsInfo.APP_SECRET);
		params.put("code", code);
		params.put("grant_type", "authorization_code");
		String url="https://api.weixin.qq.com/sns/oauth2/access_token";
		ApiClientUtil.getInstance().Post(url, params, new AjaxCallBack<Object>() {
			@Override
			public void onSuccess(Object t) {
				super.onSuccess(t);
				try {
					JSONObject resObj=new JSONObject(t.toString());
					//得到openid和access_token,调用接口登录
					access_token=resObj.getString("access_token");
					openid=resObj.getString("openid");
					refreshToken=resObj.getString("refresh_token");
					expires_in=resObj.getLong("expires_in");
					getUserInfo();
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}
	
	//通过access_token调用接口
	void getUserInfo(){
		if(isAccessTokenIsInvalid() && System.currentTimeMillis() < expires_in){
			String url="https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;
			HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(URI.create(uri));
			try {
                HttpResponse response = client.execute(get);
                if (response.getStatusLine().getStatusCode() == 200) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
                    StringBuilder builder = new StringBuilder();
                    for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
                        builder.append(temp);
                    }
                    JSONObject object = new JSONObject(builder.toString().trim());
                    String nikeName = object.getString("nickname");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } 
		}
	}
}


特别注意!!!

WXEntryActivity 这个类的包名不能乱写!

在你的工程包名相应目录下新建一个wxapi目录,并把WXEntryActivity 这个类放在该目录下,AndroidManifest中,WXEntryActivity 的name一定要写成下面的形式!

android:name="包名.wxapi.WXEntryActivity"

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值