微信公众号推送模板消息(三):获取关注者列表 openid

您所在的位置:网站首页 微信openid查看 微信公众号推送模板消息(三):获取关注者列表 openid

微信公众号推送模板消息(三):获取关注者列表 openid

2023-08-16 09:14| 来源: 网络整理| 查看: 265

简单了解

openid 就是公众号的关注者,获取后可以批量向用户发消息或向指定的用户发消息。 获取 用户openid有两种方式: 1.通过微信开放的 获取用户列表的接口,获取所有的用户openid。 2.通过网页授权获取openid(当前授权的用户)。

一、通过微信开放的 获取用户列表的接口,获取所有的用户openid

微信官方文档地址:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html 微信公众平台在线接口调试工具:https://mp.weixin.qq.com/debug/

微信官方接口使用说明:

http请求方式: GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID

传递参数说明

参数是否必须说明access_token是接口调用凭证next_openid是第一个拉取的OPENID,不填默认从头开始拉取

测试代码

@Test public void testOpenid() { RestTemplate restTemplate = new RestTemplate(); // 获取 access_token String access_token = testAccessToken(); String url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN"; url = url.replace("ACCESS_TOKEN",access_token); ResponseEntity responseEntity = restTemplate.getForEntity(url, String.class); String body = responseEntity.getBody(); // 解析成JSONObject 并获取(叫data的JSON对象)JSONObject JSONObject object = JSON.parseObject(body).getJSONObject("data"); // 获取 JSONObject 中的 JSONArray JSONArray array = object.getJSONArray("openid"); System.out.println("array:"+array); // JSONArray 转成 List 集合 (注意 alibaba 的fastjson 1.2.23以下的版本 和 1.2.3 的版本不包含 toJavaList()方法 ) List lists = array.toJavaList(String.class); System.out.println(lists.get(0)); }

返回说明

正确时返回JSON数据包:

{ "total":2, "count":2, "data":{ "openid":["OPENID1","OPENID2"]}, "next_openid":"NEXT_OPENID" }

参数说明

参数说明total关注该公众账号的总用户数count拉取的OPENID个数,最大值为10000data列表数据,OPENID的列表next_openid拉取列表的最后一个用户的OPENID

错误时返回JSON数据包(示例为无效AppID错误):

{"errcode":40013,"errmsg":"invalid appid"}

附: 关注者数量超过10000时

当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求。

具体而言,就是在调用接口时,将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值。

二、网页授权获取用户 openid(和获取access_token一样,前提是获得授权code)

微信官方文档:https://developers.weixin.qq.com/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相关接口 配置JS接口安全域名 接口调用请求说明 (1.用户同意授权,获取code【需要在微信中访问】)

请求方式: GET https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

传递参数说明

参数是否必须说明appid是公众号的唯一标识redirect_uri是授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理response_type是返回类型,请填写codescope是应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )state否重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节#wechat_redirect是无论直接打开还是做页面302重定向时候,必须带此参数

测试代码

@Test public void testCode() throws UnsupportedEncodingException { // 获取你拿到的 appid 和 secret String appid = "你的APPID"; String secret = "你的secrect"; // 使用 urlEncode 对链接进行处理 [授权回调域名(xxx.com)] String encodeurl = URLEncoder.encode("http://你配置的授权回调页面域名/getCode","UTF-8"); //定义请求地址 String url = "https://open.weixin.qq.com/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(例如:http://xxx.com/getCode?code=053NvJ0w3DU3DV2rkZZv3AbSVk1NvJ0R&state=STATE) System.out.println(url); }

这样会输出一个 URL 链接,复制 到微信里进行访问;然后再复制访问成功的链接 粘贴到其他地方进行查看 或 用默认浏览器打开进行查看链接: 进行授权获取code

获取code

接口调用请求说明 (2.根据 code 获取网页授权access_token、openid 信息)

请求方式: GET https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

传递参数说明

参数是否必须说明appid是公众号的唯一标识secret是公众号的appsecretcode是填写第一步获取的code参数 (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )grant_type是填写为authorization_code

测试代码

@Test public void testWebpageAccessToken() { RestTemplate restTemplate = new RestTemplate(); // 获取你拿到的 appid 和 secret String appid = "你的APPID"; String secret = "你的secrect"; String code = "你获取到的code"; //定义请求地址 String url = "https://api.weixin.qq.com/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" }

返回参数说明

参数说明access_token网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同expires_inaccess_token接口调用凭证超时时间,单位(秒)refresh_token用户刷新access_tokenopenid用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenIDscope用户授权的作用域,使用逗号(,)分隔

错误返回说明 错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

其他或更详细的查看上面的微信官方文档!!!

说明

获取网页授权 openid 和 access_token ,只要获取到了授权的code就能一块获取到 openid和access_token !!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3