前言:由于有很多博客都已经很详细的写过了这方面的东西就不重复了,本篇博客为了记录下自己遇到的坑,所以直接上代码.不便之处,敬请谅解!
WXEntryActivity 类
package com.xxxx.wxapi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.Toast;
import com.xxxx.R;
import com.xxxx.activity.MainActivity;
import com.xxxx.application.App;
import com.xxxx.bean.result.BaseResult;
import com.xxxx.bean.result.UserResult;
import com.xxxx.constant.APIConstant;
import com.xxxx.constant.UserConstant;
import com.xxxx.sp.UserSP;
import com.xxxx.utils.LogUtil;
import com.xxxx.utils.StringUtil;
import com.google.gson.Gson;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
/**
* Created by Adminis on 2018/4/3.
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "WXEntryActivity";
private static final int RETURN_MSG_TYPE_LOGIN = 1;
private Context mContext;
private ProgressDialog progress;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注意在WXEntryActivity类里面onCreate方法里面不能初始化ProgressDialog否则无法执行回调方法
mContext = this;
//这句没有写,是不能执行回调的方法的
App.mWxApi.handleIntent(getIntent(), this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq baseReq) {
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
//app发送消息给微信,处理返回消息的回调
@Override
public void onResp(BaseResp baseResp) {
progress = new ProgressDialog(mContext);
progress.show();
LogUtil.i(TAG,"error_code:---->" + baseResp.errCode);
int type = baseResp.getType();//类型:分享还是登录
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//用户拒绝授权
Toast.makeText(mContext, "拒绝授权微信登录", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//用户取消
String message = "";
if (type == RETURN_MSG_TYPE_LOGIN) {
message = "取消了微信登录";
}
Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_OK:
//用户同意
if (type == RETURN_MSG_TYPE_LOGIN) {
//用户换取access_token的code,仅在ErrCode为0时有效
String code = ((SendAuth.Resp) baseResp).code;
LogUtil.i(TAG,"code:前------>" + code);
// code = code.toLowerCase();注意这里获取的code有大写是正常的不用转化成小写
LogUtil.i(TAG,"code:后------>" + code);
//这里拿到了这个code,去做2次网络请求获取access_token和用户个人信息
getAccessToken(code);
}
break;
}
}
/**
* 获取access_token:
*
* @param code 用户或取access_token的code,仅在ErrCode为0时有效
*/
private void getAccessToken(String code) {
String url = UserConstant.URL + code + "&grant_type=authorization_code";
LogUtil.i(TAG,"url="+url);
RequestParams params = new RequestParams(url);
LogUtil.i(TAG,"params="+params);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String response) {
LogUtil.i(TAG, response);
Gson gson = new Gson();
LogUtil.i(TAG,"getAccessToken result="+response);
AccessTokenBean mAccessToken = gson.fromJson(response, AccessTokenBean.class);
String access_token = mAccessToken.getAccess_token(); //接口调用凭证
String openid = mAccessToken.getOpenid(); //授权用户唯一标识
// 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
String unionid = mAccessToken.getUnionid();
getUserInfo(access_token, openid);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
if (progress != null) {
progress.dismiss();
}
}
@Override
public void onCancelled(CancelledException cex) {
Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
if (progress != null) {
progress.dismiss();
}
}
@Override
public void onFinished() {
if (progress != null) {
progress.dismiss();
}
}
});
}
/**
* 获取微信登录,用户授权后的个人信息userinfo
* @param access_token
* @param openid
*/
private void getUserInfo(String access_token, String openid) {
String url=UserConstant.USERINFO_URL+access_token+"&openid="+openid;
LogUtil.i(TAG,"getUserInfo URL="+url);
RequestParams params = new RequestParams(url);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String response) {
Gson gson = new Gson();
LogUtil.i(TAG,"result="+response);
AccessTokenInfoBean mAccessToken = gson.fromJson(response, AccessTokenInfoBean.class);
//数据返回成功后调用自己后台接口登录
RequestParams params = new RequestParams(APIConstant.THIRDLOGIN);
// 用户名 + 1 微信;2 QQ;3 微博 + 第三方账号ID + 昵称 + 头像地址
params.addQueryStringParameter("type", UserConstant.TYPE_WEIXIN);
params.addQueryStringParameter("id",mAccessToken.getOpenid());
params.addQueryStringParameter("nickname",mAccessToken.getNickname() );
params.addQueryStringParameter("headImg",mAccessToken.getHeadimgurl());
params.addQueryStringParameter("token", StringUtil.getEncryptionContent(params));
LogUtil.i(TAG, params.toString());
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
LogUtil.i(TAG, result);
Gson gson = new Gson();
UserResult userResult = gson.fromJson(result, UserResult.class);
String msg = StringUtil.getErrorMessage(mContext, userResult.getCode());
switch (userResult.getCode()) {
case BaseResult.SUCCESS:
UserSP.setUserInfo(getBaseContext(), gson.toJson(userResult.getData()));
App.refreshUserInfo(getBaseContext());
setResult(Activity.RESULT_OK);
Toast.makeText(x.app(), getString(R.string.login_succee), Toast.LENGTH_LONG).show();
Intent intent1 = new Intent(mContext, MainActivity.class);
startActivity(intent1);
finish();
break;
default:
Toast.makeText(x.app(), msg, Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
if (progress != null) {
progress.dismiss();
}
}
@Override
public void onCancelled(CancelledException cex) {
Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
if (progress != null) {
progress.dismiss();
}
}
@Override
public void onFinished() {
if (progress != null) {
progress.dismiss();
}
}
});
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
if (progress != null) {
progress.dismiss();
}
}
@Override
public void onCancelled(CancelledException cex) {
Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
if (progress != null) {
progress.dismiss();
}
}
@Override
public void onFinished() {
if (progress != null) {
progress.dismiss();
}
}
});
}
}
AccessTokenBean 类
package com.xxxx.wxapi;
/**
* Created by Adminis on 2018/4/3.
*/
public class AccessTokenBean {
private String access_token;
private String expires_in;
private String refresh_token;
private String openid;
private String scope;
private String unionid;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String 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;
}
@Override
public String toString() {
return "WeiXinLoginBean [access_token=" + access_token
+ ", expires_in=" + expires_in + ", refresh_token="
+ refresh_token + ", openid=" + openid + ", scope=" + scope
+ ", unionid=" + unionid + "]";
}
}
AccessTokenInfoBean 类
package com.xxxx.wxapi;
/**
* Created by Adminis on 2018/4/3.
*/
public class AccessTokenInfoBean {
private String openid;
private String nickname;
private String headimgurl;
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 String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
@Override
public String toString() {
return "WeiXinLoginGetUserinfoBean{" +
"openid='" + openid + '\'' +
", nickname='" + nickname + '\'' +
", headimgurl='" + headimgurl + '\'' +
'}';
}
}
ps:错误返回码链接
返回码说明