原生微信登录开发记录(微信开发文档太陈旧了不更新)
微信回调页面
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = “WXEntryActivity”;
private static final int RETURN_MSG_TYPE_LOGIN = 1; ///< 登录
private static final int RETURN_MSG_TYPE_SHARE = 2; ///< 分享
private IWXAPI api;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
///< 这句没有写,是不能执行回调的方法的
api = WXAPIFactory.createWXAPI(this, Constants.WeChat_APP_ID, false);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
Log.e(TAG, "onReq" + baseReq.getType());
}
@Override
public void onResp(BaseResp baseResp) {
Log.e(TAG, "onResp:------>");
Log.e(TAG, "error_code:---->" + baseResp.errCode);
int type = baseResp.getType(); //类型:分享还是登录
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_AUTH_DENIED:
///< 用户拒绝授权
finish();
case BaseResp.ErrCode.ERR_USER_CANCEL:
///< 用户取消
String message = "";
if (type == RETURN_MSG_TYPE_LOGIN) {
message = "取消了微信登录";
} else if (type == RETURN_MSG_TYPE_SHARE) {
message = "取消了微信分享";
}
finish();
break;
case BaseResp.ErrCode.ERR_OK:
if (type == RETURN_MSG_TYPE_LOGIN) {
///< 用户换取access_token的code,仅在ErrCode为0时有效
String code = ((SendAuth.Resp) baseResp).code;
String stata = ((SendAuth.Resp) baseResp).state;
///< 这里拿到了这个code,去做2次网络请求获取access_token和用户个人信息
getAccessToken(code, stata);
} else if (type == RETURN_MSG_TYPE_SHARE) {
///< "微信分享成功"
finish();
}
break;
}
}
/**
* @param code 根据code再去获取AccessToken
*/
private void getAccessToken(String code, String state) {
// String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
OkHttpClient mOkHttpClient = new OkHttpClient();
///< Post方式也可以...
// RequestBody body = new FormBody.Builder()
// .add("appid", "替换为你的appid")
// .add("secret", "替换为你的app密钥")
// .add("code", code)
// .add("grant_type", "authorization_code")
// .build();
url += "?appid=" + Constants.WeChat_APP_ID + "&secret=f886493b0656ae8125e1edc5df6e01d6"
+ "&code=" + code + "&grant_type=authorization_code";
final Request request = new Request.Builder()
.url(url)
//.post(body)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
finish();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
AccessToken accessToken = JSONObject.parseObject(json, new TypeReference<AccessToken>() {
});
getUserInfo(accessToken.getAccess_token(), accessToken.getOpenid(), state);
}
});
}
/**
* @param access_token 根据access_token再去获取UserInfo
*/
private void getUserInfo(String access_token, String openid, String state) {
// String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
String url = "https://api.weixin.qq.com/sns/userinfo";
OkHttpClient mOkHttpClient = new OkHttpClient();
RequestBody body = new FormBody.Builder()
.add("access_token", access_token)
.add("openid", openid)
.build();
final Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
finish();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
WXUserInfo wxUserInfo = JSONObject.parseObject(json, new TypeReference<WXUserInfo>() {
});
//加绑和登陆的区分(这里用state字段来区分代码里不同地方调用微信登录)
if (state.equals("jiabang")) {
// jiabangcheckType(2, wxUserInfo.getOpenid()); 我自己项目里的业务处理
} else {
// checkType(2, wxUserInfo.getOpenid()); 我自己项目里的业务处理
}
///< 发送广播到登录界面,把数据带过去; 可用EventBus
finish();
}
});
}
}
调起微信登录
private IWXAPI api;
api = WXAPIFactory.createWXAPI(this, “你自己的微信id”, true);
api.registerApp(“你自己的微信id”);
final SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo,snsapi_friend,snsapi_message,snsapi_contact”;
req.state = “none”;
api.sendReq(req);
实体类
AccessToken.java
package com.xxxxxx.app.bean;
import com.xxxxxx.app.anotation.NotProguard;
@NotProguard
public class AccessToken {
/**
* access_token : xxxx
* expires_in : xxxx
* refresh_token : xxxxx
* openid : xxxxx
* scope : xxxxx
* unionid : xxxxx
*/
private String access_token;
private int expires_in;
private String refresh_token;
private String openid;
private String scope;
private String unionid;
private AccessToken(){}
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public int getExpires_in() {
return expires_in;
}
public void setExpires_in(int expires_in) {
this.expires_in = expires_in;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
}
WXUserInfo.java
package com.xxxxxx.app.bean;
import com.xxxxxx.app.anotation.NotProguard;
@NotProguard
public class WXUserInfo {
/**
* openid : xxxxxxx
* nickname : xxxxxxx
* sex : 1
* language : zh_CN
* city : Chengdu
* province : Sichuan
* country : CN
* headimgurl :xxxxxx
* privilege : []
* unionid : xxxxxxx
*/
private String openid;
private String nickname;
private int sex;
private String language;
private String city;
private String province;
private String country;
private String headimgurl;
private String unionid;
private WXUserInfo(){}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
}
引用的库:
compile 'com.alibaba:fastjson:1.1.68.android'
结束
就一个掉起和回调。写这篇文章纯属因为微信文档陈旧看的蛋疼、