您的位置:首页 > 移动开发 > 微信开发

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

2016-12-30 10:01 375 查看
微信登录官方文档地址:点击进入

一、准备工作

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

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

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



二、授权流程说明

官方文档如下:

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

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

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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 微信