微信登录后返回微信名等信息

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;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值