微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限
2015-09-24 20:27
1291 查看
写这篇文章的原因,就是自己气不过。项目需求突然要做微信公众号与App微信分享使用同个用户体系,接到任务是确认这用户体系,于是需要确认android app端获取授权用户后返回的unionid与微信公众号授权用户返回的unionid是否一致。但是,为了获取这个unionid,让我捉急了一个下午,因此,写这篇文章可以为后来的朋友带来方便。
第一步:请求CODE:
app界面可以设置一个button,在button的onClick()中填写以下代码:
其中:
scope代表你应用的权限,下图展示某个应用的权限:
snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。 snsapi_userinfo:这个属性权限比snsapi_base高,使用此属性,可以让移动端网页授权跳转授权登录页请求(本篇文章就是采用这个属性,所以下面可以看到示例的跳往京东授权登录页请求)
倘若微信号还没申请微信登录功能,那么将出现错误页面:
若正确:
第二步 获取code
微信的回调都是在WXEntryActivity中的public void onResp(BaseResp resp)函数中得到的,也就是说,我们的code可以在resp中获取到。
按照微信官方文档:
点击第一步事例中京东商城“确认登录”按钮按道理说是可以从SendAuth的Resp获取到code字段的:
例如:
但是这时,你会发现找不到code这个属性。也就是说,按照官网说的去获取是获取不到code的。那该怎么获取呢?下面给你讲解超级坑爹的方法;
没错,你没看错,真正的code放在了属性为”token”字段中;
第三步 获取登录授权后的信息,包含openid、unionid等
根据微信官网提到,这个步骤叫通过code获取access_token,需要用get方式请求
https://api.weixin.qq.com/sns/oauth2/access_token?appid=
(你的Appid)&secret=(你的app secret)&code=(第二步中获取到的code)&grant_type=authorization_code,其中appid 和 app secret就是你在微信开放平台申请移动应用后,在应用界面可以找到。
上面的链接是https链接,Android app要访问https需要构造一个新的HttpClient,
以下附上第三步所需用到的代码:
第一步:请求CODE:
app界面可以设置一个button,在button的onClick()中填写以下代码:
<pre class="java" name="code">final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wxdemo"; api.sendReq(req);
其中:
scope代表你应用的权限,下图展示某个应用的权限:
snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。 snsapi_userinfo:这个属性权限比snsapi_base高,使用此属性,可以让移动端网页授权跳转授权登录页请求(本篇文章就是采用这个属性,所以下面可以看到示例的跳往京东授权登录页请求)
倘若微信号还没申请微信登录功能,那么将出现错误页面:
若正确:
第二步 获取code
微信的回调都是在WXEntryActivity中的public void onResp(BaseResp resp)函数中得到的,也就是说,我们的code可以在resp中获取到。
按照微信官方文档:
点击第一步事例中京东商城“确认登录”按钮按道理说是可以从SendAuth的Resp获取到code字段的:
例如:
<span style="font-size:18px;">case BaseResp.ErrCode.ERR_OK: String code = ((SendAuth.Resp) resp).code; Break</span>
但是这时,你会发现找不到code这个属性。也就是说,按照官网说的去获取是获取不到code的。那该怎么获取呢?下面给你讲解超级坑爹的方法;
case BaseResp.ErrCode.ERR_OK: result = R.string.errcode_success; String code = ((SendAuth.Resp) resp).token; break;
没错,你没看错,真正的code放在了属性为”token”字段中;
第三步 获取登录授权后的信息,包含openid、unionid等
根据微信官网提到,这个步骤叫通过code获取access_token,需要用get方式请求
https://api.weixin.qq.com/sns/oauth2/access_token?appid=
(你的Appid)&secret=(你的app secret)&code=(第二步中获取到的code)&grant_type=authorization_code,其中appid 和 app secret就是你在微信开放平台申请移动应用后,在应用界面可以找到。
上面的链接是https链接,Android app要访问https需要构造一个新的HttpClient,
以下附上第三步所需用到的代码:
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法 @Override public void onResp(BaseResp resp) { int result = 0; switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: result = R.string.errcode_success; String code = ((SendAuth.Resp) resp).token; String url = "https://api.weixin.qq.com/sns/oauth2/access_token" + "?appid=" + Constants.APP_ID + "&secret=" +Constants.APP_SECRET + "&code=" + code + "&grant_type=authorization_code"; String result1 = new String(httpGet(url)); Log.d("WXEntryActivity", result1); break; case BaseResp.ErrCode.ERR_USER_CANCEL: result = R.string.errcode_cancel; break; case BaseResp.ErrCode.ERR_AUTH_DENIED: result = R.string.errcode_deny; break; default: result = R.string.errcode_unknown; break; } Toast.makeText(this, result, Toast.LENGTH_LONG).show(); } public static byte[] httpGet(final String url) { if (url == null || url.length() == 0) { return null; } HttpClient httpClient = getNewHttpClient(); HttpGet httpGet = new HttpGet(url); try { HttpResponse resp = httpClient.execute(httpGet); if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { return null; } return EntityUtils.toByteArray(resp.getEntity()); } catch (Exception e) { e.printStackTrace(); return null; } } private static HttpClient getNewHttpClient() { try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", sf, 443)); ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); return new DefaultHttpClient(ccm, params); } catch (Exception e) { return new DefaultHttpClient(); } } private static class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } }; sslContext.init(null, new TrustManager[] { tm }, null); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } }
相关文章推荐
- 模仿微信语音聊天功能(4) 音频播放实现以及项目结束
- 仿微信通讯录滑动定位ListView功能
- 模仿微信语音聊天功能(3) 核心部分,录音功能的实现
- 模仿微信语音聊天功能(2)对话框的实现
- weiphp微信支付开发教程
- ios9适配 微信支付/支付宝支付
- 模仿微信语音聊天功能(1)项目介绍及自定义按钮实现
- iOS 9系统策略更新,使用微信SDK的开发者注意升级
- 免费课程《微信公众号开发》开讲啦!!!
- Nagios 安装及微信短信提醒
- JSSDK,微信JS接口,分享朋友圈狀態捕獲,項目實例
- ios9适配中的分享(微信、新浪微博、QQ、QQ空间、支付宝)
- 微信开发的资料
- iOS 9系统策略更新,使用微信SDK的开发者注意升级
- java编写的九九乘法表小程序
- 自定义控件--CircleImageView(类似于QQ、微信圆形头像自定义控件)
- Nagios 安装及微信短信提醒
- 爱快云微信连wifi3.1用户前期准备工作
- 微信红包体系设计分析
- 一个c#即时监控小程序