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.gradle的dependencies中加入,并同步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”这个包下
更多相关文章
- 创建 Android(安卓)上使用的自签名证书(Creating self-signed cer
- Android之MVP模式实现登录和网络数据加载
- Android(安卓)重读官方文档 1
- Android中的权限问题
- Android(安卓)APK的数字签名的作用和意义
- Android中登录布局展示Activity
- Android登录界面开发及响应;页面跳转;传参
- Android对话框实例-注册对话框
- Android(安卓)studio 开发一个用户登录界面