zoukankan      html  css  js  c++  java
  • 微信登录后返回微信名等信息

    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;

     

  • 相关阅读:
    不使用动态sql语句,正确书写case when中的null处理
    VC项目配置详解(转)
    JAXWS 访问SSL 的WebService 老是HTTP transport error: Connection refused错误的解决办法。
    [转]为什么开发人员工作10多年了还会迷茫?没有安全感?
    Tomcat 6.0.24 不兼容的APR版本问题
    WPF滚动条嵌套,响应鼠标滑轮事件的处理
    SqlServer无备份下误删数据恢复
    今天发现竟然有一个粉丝!!!
    好用的开源轻量级DHCP和DNS服务软件“Dual DHCP DNS Server”
    Windows下源码获取
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5795821.html
Copyright © 2011-2022 走看看