优势:
通过微信授权来登录APP,有以下优势:
1.简化账户注册过程;
2.可以获取到微信用户的好友关系,来增强APP自身的社交功能;
整体流程:
1.客户端发送登录请求至微信;
2.用户在微信上选择是否同意授权登录;
3.若是同意授权,客户端开始向授权服务器获取授权码;
4.授权码获取成功之后,通过授权码向微信获取用户信息。
image
一、请求认证:
if (api.isWXAppInstalled())
{
final SendAuth.Req req =new SendAuth.Req();
req.scope ="snsapi_userinfo";
req.state ="wechat_sdk_demo_test";
api.sendReq(req);
} else {
showToast("请先安装微信");
}
用这段代码向微信开放平台请求授权码code,可拉起微信并打开授权登录页(前提是你安装了微信应用并已登录,未登录的会引导你先登录)
二、用户同意,返回code:
在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,
@Override
public void onResp(BaseResp resp)
{
int errorCode = resp.errCode;
switch (errorCode)
{
case BaseResp.ErrCode.ERR_OK:
//用户同意,拿到code
String code = ((SendAuth.Resp) resp).code;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//用户拒绝
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//用户取消
break;
default:
break;
}
}
三、利用code获取access token:
private void getAccess_token(final String code)
{
String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ WxData.WEIXIN_APP_ID
+ "&secret="
+ WxData.APP_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
OkHttpUtils.get().url(path).build().execute(new StringCallback()
{
@Override
public void onError(okhttp3.Call call, Exception e) {
}
@Override
public void onResponse(String response)
{
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(response);
String openid = jsonObject.getString("openid").toString().trim();
// access_token就是授权码
String access_token =
jsonObject.getString("access_token").toString().trim();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
WxData.WEIXIN_APP_ID和WxData.APP_SECRET就是你在微信开放者平台创建应用时给你的。
四、利用access token获取用户信息:
private void getUserInfo(final String access_token, final String openid)
{
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
OkHttpUtils.get().url(path).build().execute(new StringCallback()
{
@Override
public void onError(okhttp3.Call call, Exception e) {
}
@Override
public void onResponse(String response)
{
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(response);
String nickname = jsonObject.getString("nickname");
int sex = Integer.parseInt(jsonObject.get("sex").toString());
String headimgurl = jsonObject.getString("headimgurl");
String openid1 = jsonObject.getString("openid");
imageUrl(headimgurl); // 显示图片
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void imageUrl(final String url)
{
new Thread(new Runnable()
{
@Override
public void run()
{
try {
URL url1 = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection)
url1.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setReadTimeout(2000);
int responseCode = urlConnection.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = urlConnection.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
// 这个post一般用来更新UI用,post将一个Runnable对象到 消息队列
handler.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap); // UI显示
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
网友评论