微信第三方登录

前言:由于有很多博客都已经很详细的写过了这方面的东西就不重复了,本篇博客为了记录下自己遇到的坑,所以直接上代码.不便之处,敬请谅解!

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:错误返回码链接
返回码说明

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值