Android微信第三方登录

1.跟老大拿到审核通过的AppID和Appkey.

2.Manifest.xml中加入权限(这里有多余的权限,如果你是负责整个app的开发,放心,多出的权限的后面你也是会用到的):

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 第三方登录的权限 -->
<uses-permission-sdk-23 android:name="android.permission.aad" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission
    android:name="android.permission.WRITE_APN_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3.在Manifast.xml下的application下加入(.wxapi.WXEntryActivity前面多一个字母都不行,照搬过去就行,一定要听踩过坑的人):

<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" />

4.在工程中单独创建一个名字为wxapi的包,然后建立一个名字叫WXEntryActivity的Activity:然后检查WXEntryActivity的包名,一定是在工程包名的后面!!!比如我工程的包名是(AndroidManifest.xml的左上角):

package="com.example.administrator.yezi">

那我的新建的WXEntryActivity的包名就一定是:

package com.example.administrator.yezi.wxapi;










public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {}

5.这里分为两种登录,A:直接微信登录  B:获取用户信息登录

A1:

package com.example.administrator.yezi.wxapi;








 

public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private Retrofit retrofit;
    public static IWXAPI mWxApi;
    private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appid
    private String WX_APP_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appKey
    private String Authorization_Code = "authorization_code";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        retrofit = RetrofitManager.getInstance().getRetrofit();

        mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);//通过WXAPIFactory工厂获取IWXApI的示例
        mWxApi.registerApp(APP_ID);//将应用的appid注册到微信


        try {
            boolean result = mWxApi.handleIntent(getIntent(), this);
            if (!result) {
                Toast.makeText(WXEntryActivity.this, "参数不合法", Toast.LENGTH_SHORT).show();
                finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 动态权限
        if (Build.VERSION.SDK_INT >= 23) {
            String[] permissions = {
                    Manifest.permission.INTERNET,
                    Manifest.permission.ACCESS_NETWORK_STATE,
                    Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };

            if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(permissions, 0);
            }
        }


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mWxApi.handleIntent(data, this);
    }


    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        mWxApi.handleIntent(intent, this);
        finish();
    }


    @Override
    public void onReq(BaseReq baseReq) {
        Log.e("-------", "------req-----");

    }

    @Override
    public void onResp(BaseResp baseResp) {

        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                // 登陆获取的code
                String code = ((SendAuth.Resp) baseResp).code;
                //发送成功
                getByOkhttp(code);
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //发送取消
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //发送被拒绝
                finish();
                break;
            default:
                //发送返回/
                finish();
                break;
        }
    }

}

A2:

public class LoginActivity extends AppCompatActivity {
    @BindView(R.id.ic_qq)
    ImageView icQq;
    @BindView(R.id.ic_wechat)
    ImageView icWechat;
    @BindView(R.id.ic_sina)
    ImageView icSina;

    public static IWXAPI mWxApi;
    private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appid

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 启动activity时不自动弹出软键盘
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        //通过WXAPIFactory工厂获取IWXApI的示例
        mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
        //将应用的appid注册到微信
        mWxApi.registerApp(APP_ID);

        // 动态权限
        if (Build.VERSION.SDK_INT >= 23) {
            String[] permissions = {
                    Manifest.permission.INTERNET,
                    Manifest.permission.ACCESS_NETWORK_STATE,
                    Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };

            if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(permissions, 0);
            }
        }
    }


    @OnClick({R.id.ic_qq, R.id.ic_wechat, R.id.ic_sina})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.ic_qq:
                //QQ登录
                QQLogin();
                break;
            case R.id.ic_wechat:
                wxLogin();//微信登录  
                break;
        case R.id.ic_sina:
        break;
        }
    }


public void wxLogin() {
        //调用微信登录界面
        if (!mWxApi.isWXAppInstalled()) {
       //您还未安装微信客户端
        return;
        }
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "wechat_sdk_demo";
        mWxApi.sendReq(req);
        }

}

B1:

package com.example.administrator.yezi.wxapi;





 

public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private Retrofit retrofit;
    public static IWXAPI mWxApi;
    private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//老大给的的appid
    private String WX_APP_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//老大给的Appkey
    private String Authorization_Code = "authorization_code";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        retrofit = RetrofitManager.getInstance().getRetrofit();
        mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);//通过WXAPIFactory工厂获取IWXApI的示例
        mWxApi.registerApp(APP_ID);//将应用的appid注册到微信


        try {
            boolean result = mWxApi.handleIntent(getIntent(), this);
            if (!result) {
                Log.e("-----------", "-----参数不合法------");
                finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 动态权限
        if (Build.VERSION.SDK_INT >= 23) {
            String[] permissions = {
                    Manifest.permission.INTERNET,
                    Manifest.permission.ACCESS_NETWORK_STATE,
                    Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };

            if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(permissions, 0);
            }
        }


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mWxApi.handleIntent(data, this);
    }


    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        mWxApi.handleIntent(intent, this);
        finish();
    }


    @Override
    public void onReq(BaseReq baseReq) {
        Log.e("-------", "------req-----");

    }

    @Override
    public void onResp(BaseResp baseResp) {
        
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                // 登陆获取的code
                String code = ((SendAuth.Resp) baseResp).code;
                //发送成功
                getByOkhttp(code);
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //发送取消
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //发送被拒绝
                finish();
                break;
            default:
                //发送返回
                finish();
                break;
        }
    }


    //开始请求拿到openid和access_tokeno
    private void getByOkhttp(final String code) {
        Call<WXMode> call = retrofit.create(DataServer.class).getaccessToken(APP_ID, WX_APP_SECRET, code, Authorization_Code);
        call.enqueue(new Callback<WXMode>() {
            @Override
            public void onResponse(Call<WXMode> call, retrofit2.Response<WXMode> response) {
                String accessToken = response.body().getAccess_token();
                String openId = response.body().getOpenid();
                GetUserInfo(accessToken, openId);//获取用户信息
            }

            @Override
            public void onFailure(Call<WXMode> call, Throwable t) {
               //网络异常(5s)
            }
        });
    }

    
    
    //拿到用户信息
    private void GetUserInfo(final String accessToken, final String openId) {
        Call<WXUserInfo> call = retrofit.create(DataServer.class).getWXuserInfo(accessToken, openId);
        call.enqueue(new Callback<WXUserInfo>() {
            @Override
            public void onResponse(Call<WXUserInfo> call, retrofit2.Response<WXUserInfo> response) {
                if (response.isSuccessful()) {
                    String openid = response.body().getOpenid();
                    String nickname = response.body().getNickname();
                    String headimgurl = response.body().getHeadimgurl();
                    int sex = response.body().getSex();
                    weichatLogin(nickname, sex, headimgurl, openid);//开始登录
                } else {
                   //失败
                }
            }

            @Override
            public void onFailure(Call<WXUserInfo> call, Throwable t) {
                //网络异常
            }
        });
    }


    //拿到用户信息开始微信登录
    public void weichatLogin(String nickName, int sex, String headImg, final String openId) {
        Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
        Call<User> call = retrofit.create(DataServer.class).getweiChatuser(nickName, sex, headImg, openId, 0);
        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, retrofit2.Response<User> response) {
                    if (response.body().getStatus() == 200) {
                        app.setToken(response.body().getToken());
                        Intent intent = new Intent(WXEntryActivity.this, StartActivity.class);
                        startActivity(intent);
                    } else {
                      //失败
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
               //网络异常
            }
        });
    }



}

B2:

public class LoginActivity extends AppCompatActivity {
    @BindView(R.id.ic_qq)
    ImageView icQq;
    @BindView(R.id.ic_wechat)
    ImageView icWechat;
    @BindView(R.id.ic_sina)
    ImageView icSina;

    public static IWXAPI mWxApi;
    private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appid

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 启动activity时不自动弹出软键盘
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        //通过WXAPIFactory工厂获取IWXApI的示例
        mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
        //将应用的appid注册到微信
        mWxApi.registerApp(APP_ID);

        // 动态权限
        if (Build.VERSION.SDK_INT >= 23) {
            String[] permissions = {
                    Manifest.permission.INTERNET,
                    Manifest.permission.ACCESS_NETWORK_STATE,
                    Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };

            if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(permissions, 0);
            }
        }
    }


    @OnClick({R.id.ic_qq, R.id.ic_wechat, R.id.ic_sina})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.ic_qq:
                //QQ登录
                QQLogin();
                break;
            case R.id.ic_wechat:
                wxLogin();//微信登录  
                break;
        case R.id.ic_sina:
        break;
        }
    }


public void wxLogin() {
        //调用微信登录界面
        if (!mWxApi.isWXAppInstalled()) {
       //您还未安装微信客户端
        return;
        }
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "wechat_sdk_demo";
        mWxApi.sendReq(req);
        }

}

B3:这里用到了三个mode,1.是微信端返回openid和期限之类的mode.  2.微信端返回的用户信息   3.微信接口文档的返回示例.

mode1:

public class WXMode {

    /**
     * access_token : hSTsG7nq8e0yEFhOZFT-wAdTsjT9jC0AYvGRiqGwwR6Hko99o_mmYR8KO18kMxeDOz33d9tnBhMzu_NLsIha2HqvTm1OGPL1weBdvXZVFFc
     * expires_in : 7200
     * refresh_token : AeN69M27vttqCedxoIOSeY6cxvbt1N584HjEOclUXtNWxRaZWgmtfvn2jWIDX4tq5t-7Btlc1UkEyyFhV7HVIMXe-V6RPjoZdF525vLzev8
     * openid : olmt4wfxS21G4VeeVX16_zUhZezY
     * scope : snsapi_userinfo
     * unionid : o5aWQwAa7niCIXhAIRBOwglIJ7UQ
     */

    private String access_token;
    private int 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 int getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(int 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;
    }
}

mode2:

public class WXUserInfo {


    /**
     * openid : olmt4wfxS24VeeVX16_zUhZezY
     * nickname : 李文星
     * sex : 1
     * language : zh_CN
     * city : Shenzhen
     * province : Guangdong
     * country : CN
     * headimgurl : http://wx.qlogo.cn/mmopen/ajNVdqHZLLDickRibe5D4x2ADgSfianmA4kK9hY4esrvGhmAFCe5wjox6b6pL4ibiblKnxibzVtGdqfa2UVHACfmmUsQ/0
     * privilege : []
     * unionid : o5aWQwAa7niCIXhAIRBOwglIJ7UQ
     */

    private String openid;
    private String nickname;
    private int sex;
    private String language;
    private String city;
    private String province;
    private String country;
    private String headimgurl;
    private String unionid;
    private List<?> privilege;

    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 int getSex() {
        return sex;
    }

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

    public String getLanguage() {
        return language;
    }

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

    public String getCity() {
        return city;
    }

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

    public String getProvince() {
        return province;
    }

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

    public String getCountry() {
        return country;
    }

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

    public String getHeadimgurl() {
        return headimgurl;
    }

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

    public String getUnionid() {
        return unionid;
    }

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

    public List<?> getPrivilege() {
        return privilege;
    }

    public void setPrivilege(List<?> privilege) {
        this.privilege = privilege;
    }
}

mode3,后台给你的接口文档中返回的示例,这里是我的示例:

public class User{


    /**
     * message : 请求成功
     * status : 200
     * code : 0
     * token : hpvymDJdYxvaj2cX+vM/9Q==
     * currentTime : 1524896417273
     */

    private String message;
    private int status;
    private String code;
    private String token;
    private long currentTime;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public long getCurrentTime() {
        return currentTime;
    }

    public void setCurrentTime(long currentTime) {
        this.currentTime = currentTime;
    }


}

最后:这里用的是Retrofit请求

猜你喜欢

转载自blog.csdn.net/qq_41873558/article/details/80643009