如何获取微信openId

获取微信openid

openid定义

为了识别用户,每一个用户针对每一个公众号会产生一个安全的OpenID,若是须要在多公众号、移动应用之间作用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台帐号下,绑定后,一个用户虽然对多个公众号和应用有多个不一样的OpenID。因此一个微信号在一个公众号下的openid是不变的,若是换了一个对应的公众号,那就是另外一个openid了。且只有在微信自带浏览器中打开的项目才可获取到。html

准备条件

由于一个openid对应一个微信用户一个公众号,因此首先你要有一个公众号,还有一个外网可访问的域名,个人公众号类型是企业号,这里就以企业号为例。前端

获取openid须要的公众号的 appid 和 secret(登录公众平台 开发----->基本配置中的开发者ID(AppID)和 开发者密码(AppSecret)就是)。web

5b2ca57c0c12b
5b2ca57c0c12b

其次是设置网页受权域名(登录公众平台 设置----->公众号设置------>功能设置----->网页受权域名 按步骤操做并设置就好),这个域名就是你获取openid的web项目发布的域名,这里注意服务器请必定跑在80端口ajax

基本流程:

openid做为用户信息的一部分,要获取到须要调用微信两个开放受权接口,接口遵循OAuth 2.0协议。开放受权标准容许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用,也就是咱们经常使用的微信登陆、微博登陆等等,英文好的同窗能够看看OAuth 2.0 Authorization Frameworkjson

我整理了一下总体的流程,画了一个时序图。后端

[图片上传失败...(image-88fd53-1530609529394)][图片上传失败...(image-dbf507-1530609470358)]api

其中两次调用了微信嗯验证服务器。浏览器

  1. 调用open.weixin.qq.com/connect/oau… 接口获取到code,注意这个接口只获取openid,scope参数设置为snsapi_base,这样不须要用户确认和关注公众号。

不知道你有没有疑问,为何不直接获取openId,还须要获取一个code呢?安全

是由于code至关于一个临时票据,可以验证失效时间、可获取信息的内容、微信用户、appid等等。bash

  1. 获得code做为一个参数,加上appId和appsecret,调用api.weixin.qq.com/sns/oauth2/… 接口获取到openid。

注意,appsecret是比较重要的参数要放到后台进行请求。返回的重要参数又openId和access_token,用openId和access_token能够获取用户的基本信息,位置性别等等等,咱们这里只讲获取openId,原理相似,想看参考微信网页受权

代码

前端

function openId(){
	    //测试
	    var callbackUrl = link.skip + itemId;
	    var appid = link.appid;
	    var redirect_uri = encodeURI(callbackUrl);
		var code = requestUtil.getParameter('code');
	    if (code && localStorage.getItem('code') != code) {
	      //微信回调含code调用免登录接口,不然跳转微信验证
	      $.ajax({
	        type: 'get',
	        url: link.path+"/v1/wechatUser/info?code=" + code,
	        async: false,
	        success: function (res) {
				if(res.code == 1000) {
					localStorage.setItem('code', code);
					var openId = res.data.openId;
					localStorage.setItem('openId', openId);
				}
	        }
	      });
	    } else {
	      	window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri=' + redirect_uri  + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';
	    }
	}
复制代码

后端

public void getOpenId(HttpServletRequest request, HttpServletResponse response,String code) throws UnsupportedEncodingException {
        response.setContentType("text/html");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        Map params = new HashMap();
        params.put("secret", "");
        params.put("appid", "");
        params.put("grant_type", "authorization_code");
        params.put("code", code);
        String result = HttpGetUtil.httpRequestToString(
                "https://api.weixin.qq.com/sns/oauth2/access_token", params);
        JSONObject jsonObject = JSONObject.parseObject(result);

        String openid = jsonObject.get("openid").toString();
        System.out.println("获得的openid为:"+openid);
    }
复制代码
static class HttpGetUtil {

        public static String httpRequestToString(String url,
                                                 Map params) {
            String result = null;
            try {
                InputStream is = httpRequestToStream(url,  params);
                BufferedReader in = new BufferedReader(new InputStreamReader(is,
                        "UTF-8"));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = in.readLine()) != null) {
                    buffer.append(line);
                }
                result = buffer.toString();
            } catch (Exception e) {
                return null;
            }
            return result;
        }

        private static InputStream httpRequestToStream(String url,
                                                       Map params) {
            InputStream is = null;
            try {
                String parameters = "";
                boolean hasParams = false;
                for(String key : params.keySet()){
                    String value = URLEncoder.encode(params.get(key), "UTF-8");
                    parameters += key +"="+ value +"&";
                    hasParams = true;
                }
                if(hasParams){
                    parameters = parameters.substring(0, parameters.length()-1);
                }

                url += "?"+ parameters;

                URL u = new URL(url);
                HttpURLConnection conn = (HttpURLConnection) u.openConnection();
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("Accept-Charset", "UTF-8");
                conn.setRequestProperty("contentType", "utf-8");
                conn.setConnectTimeout(50000);
                conn.setReadTimeout(50000);
                conn.setDoInput(true);
                //设置请求方式,默认为GET
                conn.setRequestMethod("GET");

                is = conn.getInputStream();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return is;
        }

    }
复制代码

问题补充

authorize接口:

  1. authorize接口,只能经过微信,或者微信开发这工具打开(须要加开发权限)。

access_token接口:

  1. 若是返回40163错误,是由于code已经被用过,code只有一次生命,用完做废。若是出现了code请检查一下接口1相关的代码,是否是对code进行了保存等等。

感谢

感谢各位看完这篇文章,若是有问题或不清楚直接留言,或者加vx34108314。

相关文章
相关标签/搜索