微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限

原创 2015年11月18日 00:57:15

微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限

写这篇文章的原因,就是自己气不过。项目需求突然要做微信公众号与App微信分享使用同个用户体系,接到任务是确认这用户体系,于是需要确认android app端获取授权用户后返回的unionid与微信公众号授权用户返回的unionid是否一致。但是,为了获取这个unionid,让我捉急了一个下午,因此,写这篇文章可以为后来的朋友带来方便。

第一步:请求CODE:

app界面可以设置一个button,在button的onClick()中填写以下代码:

   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字段的:
例如:

case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) resp).codebreak;

但是这时,你会发现找不到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}}就可以得到access_token,其中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;
}
/** 获取支持访问https的HttpClient*/
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();
    } 
}  
版权声明:本文为博主原创文章,未经博主允许不得转载。

微信公众平台开发教程(十)Scope参数错误或没有Scope权限解决方法

一 报错信息: 二 出现原因分析: 出现这种错误网上查出现有的原因是: 1. 订阅号没有相关的权限 2. 账号没有认证,没有相关的权限 那么这里遇到问题两种都...
  • zengdeqing2012
  • zengdeqing2012
  • 2015年05月12日 17:33
  • 71955

微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限

写这篇文章的原因,就是自己气不过。项目需求突然要做微信公众号与App微信分享使用同个用户体系,接到任务是确认这用户体系,于是需要在android app端获取授权用户后返回的unionid与微信公众号...
  • u012964796
  • u012964796
  • 2015年09月24日 20:27
  • 4823

微信扫码支付:此公众号并没有这些scope的权限,错误码:10005

解决方案:   后面登录微信开放平台发现是欠费了,每年需要交300元,可以开通自动续费...
  • qq_35779879
  • qq_35779879
  • 2018年01月19日 10:58
  • 570

iOS App 友盟授权登录后,如何获取微信unionid

随着公司业务的拓展,接入微信平台的情况下,微信所提供的 unionid显得越来越重要了。但用友盟授权登录后友盟并未获取到unionid这个字段,就需要我们自己想办法了。 很简单就是用微信提供的接口自...
  • sinat_31521049
  • sinat_31521049
  • 2015年10月09日 18:43
  • 2637

微信公众号开发--获取网页授权并自定义菜单点击获得openid跳转

之前做了个自定义菜单的click事件,但是订阅号升级为服务号,相应的有了网页的基础授权(需要认证的服务号) 于是我就做了这个...
  • qq_28666081
  • qq_28666081
  • 2016年03月29日 14:03
  • 22767

微信登录的openid和unionid区别

转载于http://mp.weixin.qq.com/s?__biz=NzA3OTQ2OTgw&mid=204189507&idx=1&sn=58fd3df3a8323f6b7bfb2680f222c...
  • wo849533144long
  • wo849533144long
  • 2015年12月06日 13:44
  • 12869

thinkphp 微信授权登录 以及微信实现分享

  • zscsummer
  • zscsummer
  • 2017年11月28日 15:14
  • 2195

微信授权登录基本流程(网站应用)

微信授权登录基本流程微信oauth2.0授权登录流程说明让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(...
  • yypsober
  • yypsober
  • 2016年06月20日 15:44
  • 17044

Share SDK 微信登录每次获取openId

微信登录每次都获取微信openId: >添加一下两行代码 private void authorize(Platform plat) { plat.removeAccou...
  • csdnadcode
  • csdnadcode
  • 2015年06月26日 10:27
  • 2158

Scope参数错误或没有Scope权限解决方法

一 报错信息: 二 出现原因分析: 出现这种错误网上查出现有的原因是: 1. 订阅号没有相关的权限 2. 账号没有认证,没有相关的权限 那么这里遇...
  • yiluoAK_47
  • yiluoAK_47
  • 2015年09月06日 19:43
  • 194047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限
举报原因:
原因补充:

(最多只允许输入30个字)