Android微信登录

现在都懒得注册什么账号之类的,所以微信登录成了我们偷懒的选择。

可以自己看看微信开发文档Android传送门

微信规定文件名和文件夹了,所以一定要命名和文档一样的,文档讲的很清楚了,自己先好好看看有用的。

好了,直接上代码吧,直接授权登录功能:

建立WXEntryActivity.java文件,关于该文件的AndroidManifest.xml配置可以看文档,讲的很清楚,这里就不再述说了:

/**
 * @author 健飞
 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI iwxapi;
    private WxTokenInfo wxTokenInfo;
    public static WxUserInfo wxUserInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        iwxapi=MyApplication.iwxapi;
        iwxapi.handleIntent(getIntent(), this);
    }

//    private void regToWx() {
//        // 通过WXAPIFactory工厂,获取IWXAPI的实例
//        iwxapi = WXAPIFactory.createWXAPI(this, Contanst.WX_APPID, true);
//        // 将应用的appId注册到微信
//        iwxapi.registerApp(Contanst.WX_APPID);
//        iwxapi.handleIntent(this.getIntent(), this);
//    }

    /**
     * Android平台应用授权登录接入代码
     */
//    public void sendAutoWx() {
//        final SendAuth.Req req = new SendAuth.Req();
//        req.scope = "snsapi_userinfo";
//        req.state = "1234";
//        iwxapi.sendReq(req);
//        finish();
        //iwxapi.openWXApp();
        //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
//    }

    /**
     * 登录微信
     * * @param api 微信服务api
     */
    public static void loginWeixin(Context context, IWXAPI api) {
        // 判断是否安装了微信客户端
        if (!api.isWXAppInstalled()) {
            Toast.makeText(context.getApplicationContext(), "您还未安装微信客户端!", Toast.LENGTH_SHORT).show();
            return;
        }
        // 发送授权登录信息,来获取code
        SendAuth.Req req = new SendAuth.Req();
        // 应用的作用域,获取个人信息
        req.scope = "snsapi_userinfo";
        /**用于保持请求和回调的状态,授权请求后原样带回给第三方
         * * 为了防止csrf攻击(跨站请求伪造攻击),后期改为随机数加session来校验
         */
        req.state = "app_wechat";
        api.sendReq(req);
    }

    /**
     * 微信发送的请求到第三方应用时将回调到onReq方法
     */
    @Override
    public void onReq(BaseReq baseReq) {
        Log.e("LoginWx.onReq", "openId:" + baseReq.openId);
        switch (baseReq.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
                break;
            default:
                break;
        }
    }

    /**
     * 应用请求微信的响应结果将通过onResp回调。
     */
    @Override
    public void onResp(BaseResp baseResp) {
        SendAuth.Resp resp = (SendAuth.Resp) baseResp;
        Log.e("LoginWx", "openId:" + resp.openId + "__errCode=" + resp.errCode
                + "__code=" + resp.code + "__state=" + resp.state);

        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                //成功
                sendReqToWxGetToken(resp.code);
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //取消
                Toast.makeText(WXEntryActivity.this, "您已取消授权", Toast.LENGTH_SHORT).show();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                Toast.makeText(WXEntryActivity.this, "您已拒绝消授权", Toast.LENGTH_SHORT).show();
                //被拒绝
                break;
            default:
                //返回
                break;
        }
    }

    /**
     * 第二步:通过code获取access_token
     */
    private void sendReqToWxGetToken(String code) {
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Contanst.WX_APPID
                + "&secret=" + Contanst.WX_SECRET + "&code=" + code + "&grant_type=authorization_code";
        OkHttpUtils.getInstance().postAsyncFoString(url, "", new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();
                Log.e("tokenInfo", result);
                if (result.contains("errcode")) {

                } else {
                    wxTokenInfo = JSON.parseObject(result, WxTokenInfo.class);
                    getUserMesg(wxTokenInfo.access_token, wxTokenInfo.getOpenid());
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("getininent", getIntent() + "");
        if (getIntent() != null) {
            boolean handle = iwxapi.handleIntent(getIntent(), this);
            Log.e("handle", handle + "");
        }
    }

    /**
     * 第三步:通过access_token获取微信的个人信息
     *
     * @param access_token
     * @param openid
     */
    private void getUserMesg(final String access_token, final String openid) {
        String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
                + access_token
                + "&openid=" + openid;
        Log.e("Token", "getUserMesg:" + path);
        //网络请求,根据自己的请求方式请求微信数据
        OkHttpUtils.getInstance().postAsyncFoString(path, "", new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();
                if (result.contains("openid")) {
                    wxUserInfo = JSON.parseObject(result, WxUserInfo.class);
                    SharedPreferencesUtil.getInstance(WXEntryActivity.this).putString(Contanst.HEAD_IMG_URL, wxUserInfo.headimgurl);

                    //将获取的微信数据存入WXManager,以便后续使用
                    WXManager.getInstance().setLoginInfo(WXEntryActivity.this, JSON.toJSONString(wxUserInfo));
                } else {

                }
                Log.e("userInfo", ":" + result);
                String getWXInfoSuccess="getWXInfoSuccess";
                Intent intent=new Intent(WXEntryActivity.this,MyWeChatBindingActivity.class);
                intent.putExtra("getWXInfoSuccess",getWXInfoSuccess);
                startActivity(intent);
                finish();
            }
        });
    }
}

一些网络请求用自己常用的方法请求数据就行了,就是调用接口那数据而已,只要数据到手就行了。我这是自己封装了okhttp来请求数据的。

代码注释的第三步中请求完微信用户的一些昵称,性别等数据后,可以自己对数据做一些操作,实现自己的业务逻辑,包括对微信数据的存储、传递、调用自己需求来绑定用户信息等操作。这里我就不贴WXManager.java代码了,这文件我只是存储数据而已。

其中WxUserInfo.java文件就是自己设置的微信数据类:

public class WxUserInfo {
    public String openid;
    public String nickname;
    /**
     * 1.男,0.女
     */
    public int sex;
    public String language;
    public String city;
    public String province;
    public String country;
    public String headimgurl;
    //public ArrayList privilege;
    public String unionid;

    public String getOpenid() {
        return openid;
    }

    public String getNickname() {
        return nickname;
    }


    public String getLanguage() {
        return language;
    }

    public String getCity() {
        return city;
    }

    public String getProvince() {
        return province;
    }

    public String getCountry() {
        return country;
    }

    public String getHeadimgurl() {
        return headimgurl;
    }

    public String getUnionid() {
        return unionid;
    }

    public int getSex() {
        return sex;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public void setHeadimgurl(String headimgurl) {
        this.headimgurl = headimgurl;
    }

    public void setUnionid(String unionid) {
        this.unionid = unionid;
    }
}

其中的MaApplication.java中初始化全局变量,可以根据自己初始化的全局变量类中添加,以便使用微信登录时IWXAPI已初始化:

 public static IWXAPI iwxapi;

  @Override
    public void onCreate() {
        super.onCreate();

        regToWx();
    }

 private void regToWx() {
        // 通过WXAPIFactory工厂,获取IWXAPI的实例
        iwxapi = WXAPIFactory.createWXAPI(this, Contanst.WX_APPID, true);
        // 将应用的appId注册到微信
        iwxapi.registerApp(Contanst.WX_APPID);
    }

你在其他activity中使用直接调用,需要传入上下文和IWXAPI,这里确保IWXAPI已经初始化:

WXEntryActivity.loginWeixin(MyWeChatBindingActivity.this, MyApplication.iwxapi);

,有什么问题请多指教,这种调用还是不够低耦合,以后再改改。

猜你喜欢

转载自blog.csdn.net/qq_31622345/article/details/88667164