在现在的应用里,登录方式不再像以前那样只是通过帐号和密码登录了,而是可以通过第三方的登录授权进行登录了,例如可以登录QQ登录、微信登陆、或者是facebook这些登录了,开发者在登录的授权信息后,然后把这些数据存放到数据库,根据里面的信息进行实时更新操作。这一节我们说一下微信的授权登录,说到微信的登录,不得不说一下Oauth了,现在目前的第三方开放平台,都是使用oauth协议的,oauth这个其实就是在第三方平台登录后,然后第三方会返回一个票据给开发者,开发者是完全不知道你的登录的密码的,所以我们有的人经常担心会不会被这个第三方应用偷看了我的密码了,其实是多余的,当然由于第三方开放平台会定义一些接口可以访问到用户的基本信息,这些信息基本是由第三方定下来,比如是昵称、年龄、性别、头像等等。

微信适配ios(android和ios使用微信登录)(1)

2、当我们获得以上的信息后,这时我们可以接入第三的登录了,就是在我们的客户端调用微信的登录,这个时候微信会弹出一个登录的页面,说授权给这个应用,然后还提示开发者可以访问到用户的哪些信息的提示的,点击同意后,开发者会拿着票据,进行访问api获得access_token

3、获取access_token后,我们知道有了这个token后,我们可以随便访问到开放平台的相应的开放接口了,哪这样被第三方窃取了,我们的应用不是很危险,放心,oauth为了让这个票据可以根据设定要生成相应的生效时间,比如微信的有效时间是7200秒。也就是说在这7200秒内这个token是不变的

4、刚才说到access_token的有效时间是7200秒会不会是太短了,我们需要更加长的时间,oauth也提供了刷新token,刷新access_token有效期,微信的有效期是30天,我们可以用这个来增长我们的token有效期。

微信适配ios(android和ios使用微信登录)(2)

5、有了token后,我们就可以利用API进行访问用户的昵称和头像等信息了。

更多关于微信的登录授权的信息,我们可以登录到微信开放平台的官网查看。

https://open.weixin.qq.com/

大概了解授权的相关信息后,我们来了解如何在客户端进行登录授权。

1、andorid客户端登录微信授权。

访问access_token会异步得到数据,获得这个数据后,我们可以对token进行refresh,

private final AsyncHttpResponseHandler wx = new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

String mString = new String(responseBody);

JSONObject jsonObject = null;

try {

jsonObject = new JSONObject(mString);

} catch (JSONException e) {

// TODO Auto-generated catch block

System.out.println("error");

e.printStackTrace();

}

if (jsonObject == null) {

Toast.makeText(WXEntryActivity.this, "数据有异常",

Toast.LENGTH_SHORT).show();// 输出提示消息

} else {

try {

final String access_token = jsonObject.getString("access_token");

final String openidString = jsonObject.getString("openid");

final String refreshtoken = jsonObject.getString("refresh_token");

final String expired = jsonObject.getLong("expires_in") "";

String https = "https://api.weixin.qq.com/sns/oauth2/refresh_token?grant_type=refresh_token" "&appid=" Constants.APP_ID "&refresh_token=" refreshtoken;

YeehotApi.WEIXIN(https,wx1);

// Toast.makeText(WXEntryActivity.this, access_token "", Toast.LENGTH_LONG).show();

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

}

};

接着会在wx1的AsyncHttpResponseHandler获得新的token,这时我们可以获取用户的数据了。

private final AsyncHttpResponseHandler wx1 = new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

String mString = new String(responseBody);

JSONObject jsonObject = null;

try {

jsonObject = new JSONObject(mString);

} catch (JSONException e) {

// TODO Auto-generated catch block

System.out.println("error");

e.printStackTrace();

}

if (jsonObject == null) {

Toast.makeText(WXEntryActivity.this, "数据有异常",

Toast.LENGTH_SHORT).show();// 输出提示消息

} else {

try {

final String access_token = jsonObject.getString("access_token");

final String refreshtoken = jsonObject.getString("refresh_token");

final String expired = jsonObject.getLong("expires_in") "";

String https = "https://api.weixin.qq.com/sns/userinfo?" "access_token=" access_token "&openid=" openidString;

YeehotApi.WEIXIN(https,wx2);

// Toast.makeText(WXEntryActivity.this, access_token "", Toast.LENGTH_LONG).show();

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

}

};

在刚才访问用户的数据后,在这里会返回昵称的

private final AsyncHttpResponseHandler wx2 = new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

String resultString=new String(responseBody);

{

String mString=resultString;

JSONObject jsonObject=null;

Log.d("DDD", resultString);

try {

jsonObject=new JSONObject(mString);

} catch (JSONException e) {

// TODO Auto-generated catch block

System.out.println("error");

e.printStackTrace();

}

if (jsonObject==null) {

Toast.makeText(WXEntryActivity.this, "数据有异常",

Toast.LENGTH_SHORT).show();// 输出提示消息

}

else

{

String nickname = null;

try {

nickname = jsonObject.getString("nickname");

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

}

};

今天就说到这里了,下一节我们会说一下IOS客户端的微信登录授权,欢迎关注我的头条号:一点热,如需了解更多的信息,欢迎留言讨论,或者关注我。

,