微信登录后返回微信名等信息
ps:9月6日,code字段改为了token字段,文档却没改,坑啊
需求:从自己的app跳转微信登录后,返回微信名显示在自己的app上
1.将 libammsdk.jar包复制到libs
2.新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,实现IWXAPIEventHandler接口(此步非常重要,而且必须做,因为微信强制返回的就是这个类)
3.
<activity android:name=".wxapi.WXEntryActivity"
android:exported="true"></activity>
4.
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.xuehu365.xuehu.data.UserData;
import com.xuehu365.xuehu.model.Constant;
import com.xuehu365.xuehu.model.StateException;
import com.xuehu365.xuehu.model.WebUserEntity;
import com.xuehu365.xuehu.model.response.LoginResponseEntity;
import com.xuehu365.xuehu.model.response.WXUserInfoEntity;
import com.xuehu365.xuehu.model.response.WXtokenResponseEntity;
import com.xuehu365.xuehu.netinterface.LoginAPI;
import com.xuehu365.xuehu.netinterface.retrofit.BaseCallBack;
import com.xuehu365.xuehu.ui.activity.MainActivity;
import com.xuehu365.xuehu.utils.LogHelp;
import com.xuehu365.xuehu.utils.SPHelp;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by Administrator on 2016/8/22.
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
private static final String APP_ID = "wx028802dad467ba69";
private static final String SECRET = "740ad1565f540c60e50f6db646f662a8";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, APP_ID, false);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
String result = null;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = "发送成功";
String code = ((SendAuth.Resp) resp).code;
//通过code获取access_token
LoginAPI.getWXtoken(APP_ID, SECRET, code, new Callback<WXtokenResponseEntity>() {
@Override
public void onResponse(Call<WXtokenResponseEntity> call, Response<WXtokenResponseEntity> response) {
final String openid = response.body().getOpenid();
String access_token = response.body().getAccess_token();
//通过access_token,openid获取nickname
LoginAPI.getWXUserInfo(access_token, openid, new Callback<WXUserInfoEntity>() {
@Override
public void onResponse(Call<WXUserInfoEntity> call, Response<WXUserInfoEntity> response) {
String unionid = response.body().getUnionid();
final String nickname = response.body().getNickname();
String headimgurl = response.body().getHeadimgurl();
//微信登录
LoginAPI.loginByWechat(openid, unionid, nickname, headimgurl, new BaseCallBack<LoginResponseEntity>() {
@Override
public void onSuccess(Response<LoginResponseEntity> response) {
LoginResponseEntity.Data data = response.body().getData();
SPHelp.getInstance().saveDao(Constant.SP.appUser, data);
WebUserEntity entity = new WebUserEntity();
entity.setLoginType(3);
entity.setUserId(data.getUserId() + "");
SPHelp.getInstance().saveDao(Constant.SP.webUser, entity);
UserData.setUser(data);
//保存微信名到本地
UserData.setWXnickName(nickname);
finish();//这里不需要写跳转,直接finish就可以了
//startActivity(new Intent(WXEntryActivity.this, MainActivity.class));
}
@Override
public void onFailure(StateException exception) {
}
});
}
@Override
public void onFailure(Call<WXUserInfoEntity> call, Throwable t) {
}
});
}
@Override
public void onFailure(Call<WXtokenResponseEntity> call, Throwable t) {
}
});
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "发送取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "发送被拒绝";
break;
default:
result = "发送返回";
break;
}
LogHelp.i("WX","result:"+result);
}
}
5.
public class WXtokenResponseEntity {
private String access_token;
private String expires_in;
private String refresh_token;
private String openid;
private String scope;
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;
}
}
6.
public static void getWXtoken(String appId, String secret, String code, Callback<WXtokenResponseEntity> callback){
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.weixin.qq.com/").addConverterFactory(GsonConverterFactory.create()).build();
LoginByWechatService service = retrofit.create(LoginByWechatService.class);
Call<WXtokenResponseEntity> call = service.getWXtoken(appId,secret,code,"authorization_code");
call.enqueue(callback);
}
public static void getWXUserInfo(String accessToken, String openId, Callback<WXUserInfoEntity> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.weixin.qq.com/").addConverterFactory(GsonConverterFactory.create()).build();
LoginByWechatService service = retrofit.create(LoginByWechatService.class);
Call<WXUserInfoEntity> call = service.getWXUserInfo(accessToken, openId);
call.enqueue(callback);
}
7.
@GET("sns/userinfo")
Call<WXUserInfoEntity> getWXUserInfo(@Query("access_token") String access_token, @Query("openid") String openid);
@GET("sns/oauth2/access_token")
Call<WXtokenResponseEntity> getWXtoken(@Query("appid") String appid, @Query("secret") String secret, @Query("code") String code, @Query("grant_type") String grant_type);
8.LoginActivity中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
regToWx();
}
//微信登录2016-8-22
public static final String APP_ID = "wx028802dad467ba69";
private IWXAPI api;
private void regToWx(){
api = WXAPIFactory.createWXAPI(this,APP_ID,true);
api.registerApp(APP_ID);
}
点击事件
case R.id.loginByWechat:
LoadProgressView.getInstance().showLoad(this);
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "none";
api.sendReq(req);
finish();
break;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现