android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop">
在监听方法中拉起微信登录界面。
//拉起微信登录界面
/**
* 微信登录方法
*/
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口
public static final String APP_ID = "wx93f10000000 换成自己的appid";
private void weixinlogin() {
// 通过WXAPIFactory工厂,获取IWXAPI的实例
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);//向微信发送请求
}
编写WXAEntryActivity类,并将获取到的用户信息上传到自己的服务器。
/**
* Created by dell on 2017/5/22.
* 集成微信sdk的接口
*/
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
public static final String APP_ID = "
wx93f10000000 换成自己的appid";// 申请的appid
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
//注册api
api = WXAPIFactory.createWXAPI(this, APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
/**
* 发送微信授权请求的响应结果
* @param baseResp
*/
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
//如果errcode为零,表示用户同意授权
case BaseResp.ErrCode.ERR_OK:
// 得到所需的code
//此处报错检查下载的sdk是否正确
String code = ((SendAuth.Resp) baseResp).code;
Log.i("wxentry","code = "+code);
// 获取code之后携带参数获取用户信息
getToken(code);
break;
default:
break;
}
}
/**
* 携带参数获取用户信息
* @param code
*/
private void getToken(String code) {
//调用官方给的接口获取openid
RequestParams params = new RequestParams(Httpurl.OAUTH);
params.addQueryStringParameter("appid", APP_ID);
//审核通过后生成appsecret码
params.addQueryStringParameter("secret", "981cdce51a3e1d8411111111111 换成你自己申请的appsecret");
params.addQueryStringParameter("code", code);
params.addQueryStringParameter("grant_type", "authorization_code");//固定写法
x.http().get(params, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
String access_token = "";//接口调用凭证。
String expires_in = "";//接口调用凭证超时时间,单位(秒)。
String refresh_token = "";//用户刷新access_token。
String openid = "";//授权用户唯一标识。
String scope = "";//用户授权的作用域,使用逗号(,)分隔
String unionid = "";//当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。
// 解析数据,获取用户信息
try {
JSONObject job = new JSONObject(result);
access_token = job.getString("access_token");
expires_in = job.getString("expires_in");
refresh_token = job.getString("refresh_token");
openid = job.getString("openid");
scope = job.getString("scope");
unionid = job.getString("unionid");
} catch (JSONException e) {
e.printStackTrace();
}
// 判断openid是否为空
if (!openid.equals("")) {
Log.i("wxentry", access_token + "---" + openid + "---" + expires_in + "---" + refresh_token + "---" + scope + "---" + unionid);
//这个位置调用后台给的登录接口,别忘了登录成功之后finish()当前activity,不然会停留在空白页
//传参给后台,获取返回的token,UID并保存
setLogin(access_token, openid);
} else {
Log.i("wxentry","检查appsecret码是否重置");
//销毁界面
finish();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
/**
* 授权成功,获取用户信息
* @param access_token
* @param openid
*/
private void setLogin(String access_token, String openid) {
//调用官方给的接口获取用户信息
RequestParams params = new RequestParams(Httpurl.USERINFO);
params.addBodyParameter("access_token",access_token);
params.addBodyParameter("openid",openid);
x.http().get(params, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
String openid = "";
String nickname = "";//昵称
String headimgurl = "";//头像路径
try {
JSONObject object = new JSONObject(result);
openid = object.getString("openid");
nickname = object.getString("nickname");
headimgurl = object.getString("headimgurl");
} catch (JSONException e) {
e.printStackTrace();
}
// 执行联网方法,将数据传给服务器
skip(openid,nickname,headimgurl);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
/**
* 联网上传用户信息
*/
private void skip(String openid, String nickname, String headimgurl) {
//调用后台给的三方登陆的接口,上传用户信息,并获取token保存,销毁界面
RequestParams params = new RequestParams(Httpurl.THIRDLOGIN);
params.addBodyParameter("openid",openid);
params.addBodyParameter("nickname",nickname);
params.addBodyParameter("head_pic",headimgurl);
params.addBodyParameter("oauth","wx");
Log.i("wxtntry","openid:"+openid+" nickname:"+nickname+" headimgurl:"+headimgurl);
x.http().post(params, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
try {
Log.i("wxentry","result"+result);
JSONObject object = new JSONObject(result);
// 如果获取成功
if (object.getInt("status") == 1){
JSONObject data = object.getJSONObject("result");
String token = data.getString("token");
//偏好设置保存user_id
SharedPreferences.Editor editor =
getSharedPreferences("user",MODE_PRIVATE).edit();//文件名为user
editor.putString("token",token);
editor.apply();//提交
// 第一次登录需要给Application赋值
MyApplication.token = token;
Toast.makeText(WXEntryActivity.this,object.getString("msg"),Toast.LENGTH_SHORT).show();
//跳转界面
startActivity(new Intent(WXEntryActivity.this,MainActivity.class));
//销毁当前Activity
finish();
}else {
Toast.makeText(WXEntryActivity.this,"请检查您的网络",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
}
在app项目中常量类中初始化微信接口,以便代码中调用
//微信平台给出的接口
//微信登录
//获取微信token及openid
public static final String OAUTH = "https://api.weixin.qq.com/sns/oauth2/access_token";
//获取用户信息的接口
public static final String USERINFO = "https://api.weixin.qq.com/sns/userinfo";
至此微信登录就可以实现啦,如果你关于微信登录还有什么不明白的地方,欢迎留言。
文章不足之处还望指教,共同进步。谢谢!