现在都懒得注册什么账号之类的,所以微信登录成了我们偷懒的选择。
可以自己看看微信开发文档,Android传送门。
微信规定文件名和文件夹了,所以一定要命名和文档一样的,文档讲的很清楚了,自己先好好看看有用的。
好了,直接上代码吧,直接授权登录功能:
建立WXEntryActivity.java文件,关于该文件的AndroidManifest.xml配置可以看文档,讲的很清楚,这里就不再述说了:
/**
* @author 健飞
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI iwxapi;
private WxTokenInfo wxTokenInfo;
public static WxUserInfo wxUserInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iwxapi=MyApplication.iwxapi;
iwxapi.handleIntent(getIntent(), this);
}
// private void regToWx() {
// // 通过WXAPIFactory工厂,获取IWXAPI的实例
// iwxapi = WXAPIFactory.createWXAPI(this, Contanst.WX_APPID, true);
// // 将应用的appId注册到微信
// iwxapi.registerApp(Contanst.WX_APPID);
// iwxapi.handleIntent(this.getIntent(), this);
// }
/**
* Android平台应用授权登录接入代码
*/
// public void sendAutoWx() {
// final SendAuth.Req req = new SendAuth.Req();
// req.scope = "snsapi_userinfo";
// req.state = "1234";
// iwxapi.sendReq(req);
// finish();
//iwxapi.openWXApp();
//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
// }
/**
* 登录微信
* * @param api 微信服务api
*/
public static void loginWeixin(Context context, IWXAPI api) {
// 判断是否安装了微信客户端
if (!api.isWXAppInstalled()) {
Toast.makeText(context.getApplicationContext(), "您还未安装微信客户端!", Toast.LENGTH_SHORT).show();
return;
}
// 发送授权登录信息,来获取code
SendAuth.Req req = new SendAuth.Req();
// 应用的作用域,获取个人信息
req.scope = "snsapi_userinfo";
/**用于保持请求和回调的状态,授权请求后原样带回给第三方
* * 为了防止csrf攻击(跨站请求伪造攻击),后期改为随机数加session来校验
*/
req.state = "app_wechat";
api.sendReq(req);
}
/**
* 微信发送的请求到第三方应用时将回调到onReq方法
*/
@Override
public void onReq(BaseReq baseReq) {
Log.e("LoginWx.onReq", "openId:" + baseReq.openId);
switch (baseReq.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
break;
default:
break;
}
}
/**
* 应用请求微信的响应结果将通过onResp回调。
*/
@Override
public void onResp(BaseResp baseResp) {
SendAuth.Resp resp = (SendAuth.Resp) baseResp;
Log.e("LoginWx", "openId:" + resp.openId + "__errCode=" + resp.errCode
+ "__code=" + resp.code + "__state=" + resp.state);
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
//成功
sendReqToWxGetToken(resp.code);
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//取消
Toast.makeText(WXEntryActivity.this, "您已取消授权", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
Toast.makeText(WXEntryActivity.this, "您已拒绝消授权", Toast.LENGTH_SHORT).show();
//被拒绝
break;
default:
//返回
break;
}
}
/**
* 第二步:通过code获取access_token
*/
private void sendReqToWxGetToken(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Contanst.WX_APPID
+ "&secret=" + Contanst.WX_SECRET + "&code=" + code + "&grant_type=authorization_code";
OkHttpUtils.getInstance().postAsyncFoString(url, "", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e("tokenInfo", result);
if (result.contains("errcode")) {
} else {
wxTokenInfo = JSON.parseObject(result, WxTokenInfo.class);
getUserMesg(wxTokenInfo.access_token, wxTokenInfo.getOpenid());
}
}
});
}
@Override
protected void onResume() {
super.onResume();
Log.e("getininent", getIntent() + "");
if (getIntent() != null) {
boolean handle = iwxapi.handleIntent(getIntent(), this);
Log.e("handle", handle + "");
}
}
/**
* 第三步:通过access_token获取微信的个人信息
*
* @param access_token
* @param openid
*/
private void getUserMesg(final String access_token, final String openid) {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid=" + openid;
Log.e("Token", "getUserMesg:" + path);
//网络请求,根据自己的请求方式请求微信数据
OkHttpUtils.getInstance().postAsyncFoString(path, "", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
if (result.contains("openid")) {
wxUserInfo = JSON.parseObject(result, WxUserInfo.class);
SharedPreferencesUtil.getInstance(WXEntryActivity.this).putString(Contanst.HEAD_IMG_URL, wxUserInfo.headimgurl);
//将获取的微信数据存入WXManager,以便后续使用
WXManager.getInstance().setLoginInfo(WXEntryActivity.this, JSON.toJSONString(wxUserInfo));
} else {
}
Log.e("userInfo", ":" + result);
String getWXInfoSuccess="getWXInfoSuccess";
Intent intent=new Intent(WXEntryActivity.this,MyWeChatBindingActivity.class);
intent.putExtra("getWXInfoSuccess",getWXInfoSuccess);
startActivity(intent);
finish();
}
});
}
}
一些网络请求用自己常用的方法请求数据就行了,就是调用接口那数据而已,只要数据到手就行了。我这是自己封装了okhttp来请求数据的。
代码注释的第三步中请求完微信用户的一些昵称,性别等数据后,可以自己对数据做一些操作,实现自己的业务逻辑,包括对微信数据的存储、传递、调用自己需求来绑定用户信息等操作。这里我就不贴WXManager.java代码了,这文件我只是存储数据而已。
其中WxUserInfo.java文件就是自己设置的微信数据类:
public class WxUserInfo {
public String openid;
public String nickname;
/**
* 1.男,0.女
*/
public int sex;
public String language;
public String city;
public String province;
public String country;
public String headimgurl;
//public ArrayList privilege;
public String unionid;
public String getOpenid() {
return openid;
}
public String getNickname() {
return nickname;
}
public String getLanguage() {
return language;
}
public String getCity() {
return city;
}
public String getProvince() {
return province;
}
public String getCountry() {
return country;
}
public String getHeadimgurl() {
return headimgurl;
}
public String getUnionid() {
return unionid;
}
public int getSex() {
return sex;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void setSex(int sex) {
this.sex = sex;
}
public void setLanguage(String language) {
this.language = language;
}
public void setCity(String city) {
this.city = city;
}
public void setProvince(String province) {
this.province = province;
}
public void setCountry(String country) {
this.country = country;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
}
其中的MaApplication.java中初始化全局变量,可以根据自己初始化的全局变量类中添加,以便使用微信登录时IWXAPI已初始化:
public static IWXAPI iwxapi;
@Override
public void onCreate() {
super.onCreate();
regToWx();
}
private void regToWx() {
// 通过WXAPIFactory工厂,获取IWXAPI的实例
iwxapi = WXAPIFactory.createWXAPI(this, Contanst.WX_APPID, true);
// 将应用的appId注册到微信
iwxapi.registerApp(Contanst.WX_APPID);
}
你在其他activity中使用直接调用,需要传入上下文和IWXAPI,这里确保IWXAPI已经初始化:
WXEntryActivity.loginWeixin(MyWeChatBindingActivity.this, MyApplication.iwxapi);
,有什么问题请多指教,这种调用还是不够低耦合,以后再改改。