简单了解
openid 就是公众号的关注者,获取后可以批量向用户发消息或向指定的用户发消息。
获取 用户openid有两种方式:
1.通过微信开放的 获取用户列表的接口,获取所有的用户openid。
2.通过网页授权获取openid(当前授权的用户)。
一、通过微信开放的 获取用户列表的接口,获取所有的用户openid
微信官方文档地址:https://developers./doc/offiaccount/User_Management/Getting_a_User_List.html
微信公众平台在线接口调试工具:https://mp./debug/
微信官方接口使用说明:
http请求方式: GET(请使用https协议)
https://api./cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
传递参数说明
测试代码
@Testpublic void testOpenid() {RestTemplate restTemplate = new RestTemplate();// 获取 access_tokenString access_token = testAccessToken();String url = "https://api./cgi-bin/user/get?access_token=ACCESS_TOKEN";url = url.replace("ACCESS_TOKEN",access_token);ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);String body = responseEntity.getBody();// 解析成JSONObject 并获取(叫data的JSON对象)JSONObjectJSONObject object = JSON.parseObject(body).getJSONObject("data");// 获取 JSONObject 中的 JSONArrayJSONArray array = object.getJSONArray("openid");System.out.println("array:"+array);// JSONArray 转成 List<Strig> 集合 (注意 alibaba 的fastjson 1.2.23以下的版本 和 1.2.3 的版本不包含 toJavaList()方法 )List<String> lists = array.toJavaList(String.class);System.out.println(lists.get(0));}
返回说明
正确时返回JSON数据包:
{"total":2,"count":2,"data":{"openid":["OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
参数说明
错误时返回JSON数据包(示例为无效AppID错误):
{"errcode":40013,"errmsg":"invalid appid"}
附:关注者数量超过10000时
当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求。
具体而言,就是在调用接口时,将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值。
二、网页授权获取用户 openid(和获取access_token一样,前提是获得授权code)
微信官方文档:https://developers./doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
具体而言,网页授权流程大体分为四步:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token 和 openid(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
首先配置回调域名,回调域名是用来获取 code 的返回值,下图是在微信测试号配置回调域名,类似于设置一个白名单
如果没有配置 或 配置错误会出现:scope参数错误或没有scope权限 的错误,需要配置正确的回调域名。
配置JS接口安全域名 可在该域名下调用微信开放的JS相关接口
接口调用请求说明 (1.用户同意授权,获取code【需要在微信中访问】)
请求方式: GET https://open./connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
传递参数说明
测试代码
@Testpublic void testCode() throws UnsupportedEncodingException {// 获取你拿到的 appid 和 secretString appid = "你的APPID";String secret = "你的secrect";// 使用 urlEncode 对链接进行处理 [授权回调域名()]String encodeurl = URLEncoder.encode("http://你配置的授权回调页面域名/getCode","UTF-8");//定义请求地址String url = "https://open./connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";url = url.replace("APPID",appid).replace("REDIRECT_URI",encodeurl);// 获得拼接后的访问链接 复制到微信访问; 访问后的地址会含有code和state(例如:/getCode?code=053NvJ0w3DU3DV2rkZZv3AbSVk1NvJ0R&state=STATE)System.out.println(url);}
这样会输出一个 URL 链接,复制到微信里进行访问;然后再复制访问成功的链接 粘贴到其他地方进行查看 或 用默认浏览器打开进行查看链接:
接口调用请求说明 (2.根据 code 获取网页授权access_token、openid 信息)
请求方式: GET https://api./sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
传递参数说明
测试代码
@Testpublic void testWebpageAccessToken() {RestTemplate restTemplate = new RestTemplate();// 获取你拿到的 appid 和 secretString appid = "你的APPID";String secret = "你的secrect";String code = "你获取到的code";//定义请求地址String url = "https://api./sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";url = url.replace("APPID",appid).replace("SECRET",secret).replace("CODE",code);//发送请求 得到返回结果JSONObject obj = JSON.parseObject(restTemplate.getForObject(url,String.class));String access_token = obj.getString("access_token");String refresh_token = obj.getString("refresh_token");String openid = obj.getString("openid");String scope = obj.getString("scope");String expires_in = obj.getString("expires_in");System.out.println(obj);System.out.println("openid"+openid);}
正确返回说明
正确时返回的JSON数据包如下:
{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE" }
返回参数说明
错误返回说明
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
其他或更详细的查看上面的微信官方文档!!!
说明
获取网页授权 openid 和 access_token ,只要获取到了授权的code就能一块获取到 openid和access_token !!