微信登录官方文档地址:点击进入
一、准备工作
在进行微信登录之前,首先要在微信开放平台注册开发者账号,并拥有一个已审核通过的移动应用,并获得相应的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;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);api=WXAPIFactory.createWXAPI(this, ContentsInfo.APP_ID, false);api.handleIntent(getIntent(),this);}@Overrideprotected void onNewIntent(Intent intent){super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent,this);}//在这个方法里面进行结果处理,获得CODE(微信登录,微信分享,微信朋友圈分享都会调用这个方法)@Overridepublic void onResp(BaseResp resp){switch(resp.errCode){case BaseResp.ErrCode.ERR_OK://返回成功,判断是哪种类型(如果不进行判断,当微信登录和微信分享同时存在的话,会出现异常)switch(resp.getType()){case ConstantsAPI.COMMAND_SENDAUTH://登录回调,获得CODEString code=((SendAuth.resp)resp).code;//通过code获得access_tokengetAccess_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_tokenvoid 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>() {@Overridepublic 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 blocke.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"