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回调@Overridepublic 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回调@Overridepublic 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”这个包下

更多相关文章

  1. Android 如何在自定义界面上启用输入法 (How to enable inputmet
  2. 工作日志2015-3-20
  3. [转]Android开发者应该深入学习的10个开源项目
  4. 【转】如何成为一个android开发者
  5. Android设置全屏状态下设置 android:fitsSystemWindows="true"界
  6. 【Android 界面效果29】研究一下Android滑屏的功能的原理,及scrol
  7. Android界面编程——Android基本控件
  8. Android摄像头预览界面上画线

随机推荐

  1. Android中创建文件以及文件夹
  2. Android(安卓)保存进度对话框
  3. Android(安卓)创建单独的服务运行在后台(
  4. Android中分享功能的使用
  5. Android(安卓)BroadcasetReceiver
  6. Android重写返回按钮退回桌面(根据源码查
  7. android 获取未安装apk的icon、name等信
  8. android动态布局:用java代码实现LinearLay
  9. does not specify a android.test.Instru
  10. 短视频直播系统开发Android中常用控件