Android微信登录

Android微信登录

一、创建应用

1. 到微信开放平台:https://open.weixin.qq.com/

2. 点击管理中心,创建移动应用

3. 填写基本的应用信息

4. 获取应用签名:

1) APP打包安装到手机上

2) 到资源中心 -- 资源下载 -- Android资源下载,找到“签名生成工具”,下载并安装到手机上,打开输入APP包名,点击生成,获取应用签名

5. 填写平台信息

6. 提交等待审核(7个工作日审核期,一般1个工作日就审核通过了)

注:平台上填写的应用签名和APP签名必须一致,否则无法调出微信登录界面。

二、成为开发者

“个人中心”--“开发者资质认证”--“现在申请”,然后一步步按照提示填写信息,最后交钱就行(300大洋)。(7个工作日的审核期,一般2-3个工作日就能下来)

注:不申请成为开发者是无法获取登录、支付等权限的。交了钱,自动开通微信登录。而想要使用微信支付,需要额外申请开通,但必须要先是“开发者”

三、微信登录

1. 引入依赖:

build.gradledependencies中加入,并同步Gradle

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'

2. 添加权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3. 向微信注册APP,初始化微信SDK

private IWXAPI mWechatApi;

//初始化微信
mWechatApi = WXAPIFactory.createWXAPI(this,"你的APPID",false);
mWechatApi.registerApp("你的APPID");

4. 调用微信登录界面

//调用微信授权登录界面,在调用之前,最好做个微信未安装判断

final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "diandi_wx_login";
mWechatApi.sendReq(req);

5. 创建微信登录回调

WXEntryActivity实现IWXAPIEventHandler接口,重写方法onReq()onResp(),onResp()方法中处理回调信息。

WXEntryActivity必须在“包名.wxapi”包下

在清单文件中注册WXEntryActivity 

<activity android:name=".wxapi.WXEntryActivity" android:exported="true"/>

WXEntryActivity继承自Activity,实现IWXAPIEvevtHandler接口

WXEntryActivity类:

1)添加回调

private IWXAPI mWechatApi;

mWechatApi = WXAPIFactory.createWXAPI(this, "你的APPID", true);
mWechatApi.handleIntent(getIntent(), this);

2)处理回调

//应用请求微信的响应结果将通过onResp回调
@Override
public void onResp(BaseResp resp) {
    if (resp.errCode == BaseResp.ErrCode.ERR_OK) {
        Log.e("LKing", "授权登录成功");
        final String code = ((SendAuth.Resp) resp).code;

        new Thread(new Runnable() {
            @Override
            public void run() {
                //获取AccessToken
                getAccessToken(code);
            }
        }).start();
    } else {
        Log.e("LKing", "授权登录失败\n\n自动返回");
    }
}

3)获取token

/**
 * 获取openid accessToken值用于后期操作
 * @param code 请求码
 */
private void getAccessToken(final String code) {
    String path = "https://mApi.weixin.qq.com/sns/oauth2/access_token?appid="
            + "你的APPID"
            + "&secret="
            + "你的APP_SECRET"
            + "&code="
            + code
            + "&grant_type=authorization_code";
    String result = "";
    try {
        BufferedReader reader = null;
        StringBuffer sbf = new StringBuffer() ;

        URL url  = new URL(path) ;
        HttpURLConnection connection = (HttpURLConnection) url.openConnection() ;
        //设置超时时间 10s
        connection.setConnectTimeout(10000);
        //设置请求方式
        connection.setRequestMethod( "GET" ) ;
        connection.connect();
        InputStream is = connection.getInputStream() ;
        reader = new BufferedReader(new InputStreamReader(is, "UTF-8" )) ;
        String strRead = null ;
        while ((strRead = reader.readLine()) != null) {
            sbf.append(strRead);
        }
        reader.close();
        result = sbf.toString();

        JSONObject jsonObject = null;
        jsonObject = new JSONObject(result);
        final String openid = jsonObject.getString("openid").toString().trim();
        final String access_token = jsonObject.getString("access_token").toString().trim();

        new Thread(new Runnable() {
            @Override
            public void run() {
                getUserMesg(access_token, openid);
            }
        }).start();
        Log.e("LKing","基础信息 = "+result);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

4)获取用户信息

/**
 * 获取微信的个人信息
 * @param access_token
 * @param openid
 */
private void getUserMesg(final String access_token, final String openid) {
    String path =  "https://mApi.weixin.qq.com/sns/userinfo?access_token="
            + access_token
            + "&openid="
            + openid;//微信登录地址
    String result = "";
    try {
        BufferedReader reader = null;
        StringBuffer sbf = new StringBuffer() ;

        URL url  = new URL(path) ;
        HttpURLConnection connection = (HttpURLConnection) url.openConnection() ;
        //设置超时时间 10s
        connection.setConnectTimeout(10000);
        //设置请求方式
        connection.setRequestMethod( "GET" ) ;
        connection.connect();
        InputStream is = connection.getInputStream() ;
        reader = new BufferedReader(new InputStreamReader(is, "UTF-8" )) ;
        String strRead = null ;
        while ((strRead = reader.readLine()) != null) {
            sbf.append(strRead);
        }
        reader.close();
        result = sbf.toString();
        Log.e("LKing","用户信息 = "+result);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

四、神坑

1)微信回调界面,因为数据在该界面处理,回传数据时闪屏

   解决方法一:

WXEntryActivity加载一个界面,全屏并给一个TextView显示授权登录是否成功,2秒后并自动返回。如果各位大神有什么其他方式,敬请留言。

//应用请求微信的响应结果将通过onResp回调
@Override
public void onResp(BaseResp resp) {
    if (resp.errCode == BaseResp.ErrCode.ERR_OK) {//用户同意
        Log.e("LKing", "授权登录成功");
        mTxt.setText("授权登录成功\n\n自动返回");
        final String code = ((SendAuth.Resp) resp).code;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    getAccessToken(code);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    } else {
        mTxt.setText("授权登录失败");
        Log.e("LKing", "授权登录失败\n\n自动返回");
    }
}

解决方法二:

使用第三方(mob)进行授权登录,后续文章会对其进行详细描述。

2)点击微信授权登录按钮,空白或者黑屏

神坑一:没有错误码或者打印错误码-6

原因:平台上的应用签名和APP的签名不一致

解决方法:修改平台上的应用签名或者app的签名,让两端的签名一致

神坑二:确认签名一致之后还是不行?

原因:之前出现过空白界面或者黑屏界面,微信记录了原来不一致APP签名

解决方法:清除微信的缓存信息或者重新安装微信

神坑三:新下载的微信未登录过,在app中点击微信授权登录,空白或者黑屏

原因:未登录微信,微信没有获取到相应的用户权限

解决方法:微信授权登录之前,先登录微信账号。

神坑四:

原因:WXEntryActivity没有在“包名.wxapi”这个包下,或者名称不一致。

解决方法:名字必须是WXEntryActivity,位置必须在“包名.wxapi”这个包下

你可能感兴趣的:(Android,Android微信登录,第三方登录,微信登录,授权登录)