在现在的应用里,登录方式不再像以前那样只是通过帐号和密码登录了,而是可以通过第三方的登录授权进行登录了,例如可以登录QQ登录、微信登陆、或者是facebook这些登录了,开发者在登录的授权信息后,然后把这些数据存放到数据库,根据里面的信息进行实时更新操作。这一节我们说一下微信的授权登录,说到微信的登录,不得不说一下Oauth了,现在目前的第三方开放平台,都是使用oauth协议的,oauth这个其实就是在第三方平台登录后,然后第三方会返回一个票据给开发者,开发者是完全不知道你的登录的密码的,所以我们有的人经常担心会不会被这个第三方应用偷看了我的密码了,其实是多余的,当然由于第三方开放平台会定义一些接口可以访问到用户的基本信息,这些信息基本是由第三方定下来,比如是昵称、年龄、性别、头像等等。
2、当我们获得以上的信息后,这时我们可以接入第三的登录了,就是在我们的客户端调用微信的登录,这个时候微信会弹出一个登录的页面,说授权给这个应用,然后还提示开发者可以访问到用户的哪些信息的提示的,点击同意后,开发者会拿着票据,进行访问api获得access_token
3、获取access_token后,我们知道有了这个token后,我们可以随便访问到开放平台的相应的开放接口了,哪这样被第三方窃取了,我们的应用不是很危险,放心,oauth为了让这个票据可以根据设定要生成相应的生效时间,比如微信的有效时间是7200秒。也就是说在这7200秒内这个token是不变的
4、刚才说到access_token的有效时间是7200秒会不会是太短了,我们需要更加长的时间,oauth也提供了刷新token,刷新access_token有效期,微信的有效期是30天,我们可以用这个来增长我们的token有效期。
5、有了token后,我们就可以利用API进行访问用户的昵称和头像等信息了。
更多关于微信的登录授权的信息,我们可以登录到微信开放平台的官网查看。
https://open.weixin.qq.com/
大概了解授权的相关信息后,我们来了解如何在客户端进行登录授权。
1、andorid客户端登录微信授权。
-
首先,肯定是要把SDK弄进我们的程序里面了,这里我就不详细说明了,自己可以到官网申请登录授权后,然后加进到我们自己的项目去
-
其次是要将微信登录注册到我们的应用,当然这个是微信自己需要的,其实的第三方平台是不必要的
IWXAPI api = WXAPIFactory.createWXAPI(context, null);
api.registerApp(Constants.APP_ID);
-
调用客户端,微信的SDK已经提供调用客户端的代码了,前提是手机客户端已经安装了微信的,使用如下的代码
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "yeehot";
api.sendReq(req);
-
这时会弹出,登录授权的页面的,用户只需要点击登录,就可以了,在这个页面的任何操作都会回调到WXEntryActivity这个页面,所以大家经常说授权后没有反应,其实就是没有添加到这个页面。我们点击登录后,在onResp(BaseResp resp)会获得登录成功等信息,我们需要在这里进行操作,示例代码如下,注:这里我访问网络的框架是AsyncHttpClient,我在上一节已经说到的了,如果有需要的请看回上一节
-
@Override
-
public void onResp(BaseResp resp) {
-
int result = 0;
-
switch (resp.errCode) {
-
case BaseResp.ErrCode.ERR_OK:
-
result = R.string.errcode_success;
-
{
-
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
-
{
-
final Map<String, Object> param = new HashMap<String, Object>();
-
/*---以下代码用于设定接口相应参数---*/
-
param.put("code", sendResp.code);
-
param.put("secret","1111111");
-
param.put("grant_type","authorization_code"); // 当前请求时间,可选
-
param.put("appid", Constants.APP_ID);
-
String https = "https://api.weixin.qq.com/sns/oauth2/access_token?" "appid=" param.get("appid") "&secret=" param.get("secret") "&code=" param.get("code") "&grant_type=authorization_code";
-
YeehotApi.WEIXIN(https,wx);
-
}
-
}
-
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;
-
default:
-
result = R.string.errcode_unknown;
-
break;
-
}
-
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
-
}
访问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客户端的微信登录授权,欢迎关注我的头条号:一点热,如需了解更多的信息,欢迎留言讨论,或者关注我。
,