当我们进行微信平台相关内容开发时,如果想做一些针对微信用户进行一些信息获取及消息推送,那我们第一步先要拿到微信用户的OPENID(用户唯一标识,建立在一个公众号与一个微信用户之间,即针对一个公众号,所有的微信用户都享有一个独立不变的标识);


1 . 如果微信用户已经关注自己的公众号, 那可以通过微信接口里面的用户管理模板直接获取到对应公众号的所有已关注用户OPENID的列表;
1). 在调用所有的微信接口之前,我们先要请求授权,拿到access_token

    @Getter@Config("wechat.appid")private static String WECHATAPPID;@Getter@Config("wechat.appsecret")private static String WECHATAPPSECRET;public static final String ACCESS_TOKEN = "access_token";public final static String WECHATACCESSTOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=";/*** <p>* 成功: {"access_token":"ACCESS_TOKEN","expires_in":7200}* </p>* <p>* 失败: {"errcode":40013,"errmsg":"invalid appid"}* </p>* @return 如果没有获取到有效的凭据,就返回 null*/private static Map getWechatAPPAccessTokenFromWeChat() {StringBuilder accessTokenUrl = new StringBuilder().append(WECHATACCESSTOKEN).append(WECHATAPPID).append("&secret=").append(WECHATAPPSECRET);Map result = HttpClientUtil.readHttpContent(accessTokenUrl.toString());if (result != null && result.get(ACCESS_TOKEN) != null)return result;return null;}//HttpClientUtil.class static method/*** get json content and transform to Map from the urlStr* If occuer one error just return null.* @param urlStr* @return*/public static Map<String,Object> readHttpContent(String urlStr){Map<String, Object> result = null;HttpEntity httpEntity = null;try {HttpResponse response = Request.Get(urlStr).execute().returnResponse();httpEntity = response.getEntity();}catch (IOException e) {logger.error("Get resouse from {} had occurred an error: {}", urlStr, e.toString());return result;}try (InputStream in = httpEntity.getContent();){ObjectMapper mapper = new ObjectMapper();result = mapper.readValue(in, HashMap.class);}catch (IOException e) {logger.error("Get json content from {} had occurred an error: {}", urlStr, e.toString());return result;}return result;}

2). 使用前面得到的access_token获取公众号的微信关注用户列表

    public static final String ERRMSG = "errmsg";public final static String WECHATUSERLISTURL = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=";/***<p>* 获取成功:{*  "total":23000,*  "count":10000,*  "data":{"*    openid":[*      "OPENID1",*      "OPENID2",*      ...,*      "OPENID10000"*    ]*  },*  "next_openid":"OPENID10000"*  }*</p>**<p>* 获取失败:{"errcode":40013,"errmsg":"invalid appid"}*</p>*** 获取微信公众帐号的关注者列表(wechat user openID),每次最多10000个** @param accessToken* @param next_openid: 没有此参数,则默认从关注列表的第一个开始获取* @return*/public static Map getWechatUserOpenIDList(String accessToken, String next_openid) {StringBuilder urlB = new StringBuilder().append(WECHATUSERLISTURL).append(accessToken);if (!Strings.isBlank(next_openid))urlB.append("&next_openid=").append(next_openid);Map result = HttpClientUtil.readHttpContent(urlB.toString());if (result != null && result.get(ERRMSG) == null)return result;return null;}
采用方法一,到此便得到了用户openID列表,可以进行后面获取微信用户信息及向用户推送模板消息等;

2 . 无论微信用户是否关注自己的公众号, 当微信用户访问我们的web站点时(通过微信内置浏览器),我们可以通过页面授权的方式拿到微信用户的OpendID(页面授权需要跳转到微信服务器拿到oauth_code然后再换取access_token及OpendID);
1). 为我们的web站点服务添加一个filter,拦截来自微信浏览器的请求,进行302跳转到微信站点,拿到授权码再回调回来;

public class WechatFilter implements Filter {private static final Logger logger             = LoggerFactory.getLogger(WechatFilter.class);@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;if (response.isCommitted()) {chain.doFilter(request, response);return;}//判断请求是否来自微信浏览器if (!WebUtil.isWechatRequest(httpRequest)) {chain.doFilter(request, response);return;}String requestURL = WebUtil.getRequsetUrl(httpRequest, true, true);logger.debug("Request from wechat client:{}", requestURL);HttpSession session = httpRequest.getSession();String weChatOpenId = (String) session.getAttribute(WeChatManager.WECHATOPENID);if (weChatOpenId == null) {if (httpRequest.getParameter(WeChatManager.CODE) == null) {StringBuilder url = new StringBuilder("http://").append(WebUtil.getRequsetUrl(httpRequest, true, true));response.reset();((HttpServletResponse) response).sendRedirect(url.toString());return;} else {String oauthCode = httpRequest.getParameter(WeChatManager.CODE);if (!Strings.isBlank(oauthCode)) {Map<String, Object> oauth_data = WeChatPageInterface.getWechatPageAccessToken(oauthCode);weChatOpenId = oauthCode != null && oauth_data.get(WeChatManager.OPENID) != null ? (String) oauth_data.get(WeChatManager.OPENID) : null;session.setAttribute(WeChatManager.WECHATOPENID, weChatOpenId);} else {logger.warn("The oauth_code is empty!");}}}chain.doFilter(request, response);}@Overridepublic void destroy() {}}//WeChatPageInterface.class static method/*** <p>* 微信获取授权成功:{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN",* "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }* </p>* <p>* 微信获取授权失败:{"errcode":40029,"errmsg":"invalid code"}* </p>** 请求微信公众号的网页授权,得到用户OpenID和access_token* 微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证( 网页授权access_token),* 通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;** @return 如果没有获取到有效的凭据,就返回 null*/public static Map<String, Object> getWechatPageAccessToken(String oauthCode) {StringBuilder accessTokenUrl = new StringBuilder().append(WeChatManager.weChatAuthAccessTokenPage).append(WeChatManager.getWECHATAPPID()).append("&secret=").append(WeChatManager.getWECHATAPPSECRET()).append("&code=").append(oauthCode).append("&grant_type=").append("authorization_code");Map<String, Object> accessToken = HttpClientUtil.readHttpContent(accessTokenUrl.toString());if (accessToken != null && accessToken.get(WeChatManager.ACCESS_TOKEN) != null) {return accessToken;}return null;}

至此,我们通过两种方式都可以获取微信用户的OpenID了,至于采用哪一种可以根据实际业务环境;

PS: OpenID是介于微信用户与公众账号之间恒定不变的,所以可以进行三方持久化存储;

微信平台开发获取微信用户的OPENID相关推荐

  1. 微信平台开发与微信营销

    一个二维码,一个商家在线商城,一套管理系统及平台,一个营销渠道,一个时机 1998年马化腾开QQ,让你注册,你不注册,现在一个5位数的QQ好几万: 2003年马云说开淘宝店不要钱,让你开店,你不开,1 ...

  2. java获取微信用户源码_Java微信公众平台开发(十)--微信用户信息的获取

    前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...

  3. 从微信服务器获取用户信息,微信小程序Ⅴ [获取登陆用户信息,重点openID(详解)]...

    ♩ 背景 其实这篇文章几个月前就写完了,可是这段时间,微信小程序官方文档有了更新,同事在我本身的实际操做过程当中,发现以前写的过于繁杂,因此如今进行简化梳理,欢迎指摘. 语言框架:ThinkPHP3. ...

  4. php拉取公众号所有关注的人,微信公众平台开发获取关注者列表

    本文介绍在微信公众平台上如何使用高级接口开发获取关注者列表的功能. 一.接口介绍 公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的Open ...

  5. 微信小程序Ⅴ [获取登录用户信息,重点openID(详解)]

    ♩ 背景 其实这篇文章几个月前就写完了,但是这段时间,微信小程序官方文档有了更新,同事在我自己的实际操作过程中,发现之前写的过于繁杂,所以现在进行简化梳理,欢迎指摘. 语言框架:ThinkPHP3.2 ...

  6. 微信昵称乱码 mysql_微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...

    微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案如下: 问题产生原因:由于数据库及属性一致设为utf8,而utf8只支持1-3个字节.当用户昵称为emoji表情时,获取用户基本信 ...

  7. springboot+h5页面+微信公众号获取微信用户信息

    springboot项目,h5页面通过微信公众号获取微信用户信息 最近本人有一个项目需求,微信公众号里点击一个菜单进入一个商城购物系统. 对于在微信公众号还是小白的我来说难度有点大,但是做完后发现也就 ...

  8. 微信小程序中的用户ID(openid和unionid)

    前沿 做过微信开发的同学,多多少少都会涉及到用户的唯一标示的问题.由于微信牢牢把控着用户的信息,因此当你需要在微信平台中获取用户的标示信息,必然要通过微信的平台接口来获取(当然,你可以通过你自己的平台 ...

  9. php 微信公众平台开发之微信群发信息

    这篇文章主要为大家详细介绍了php微信公众平台开发之微信群发信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片 ...

  10. 视频教程-微信公众平台开发入门-微信开发

    微信公众平台开发入门 订阅后,请点击此处观看大牛全套视频课程:课程播放页链接 价格可能因活动略有浮动 刘运强 ¥39.00 立即订阅视频课 订阅后:请点击此处观看视频课程 视频教程-微信公众平台开发入 ...

最新文章

  1. WCF实现RESTFul Web Service
  2. tf.keras.losses.KLDivergence KL散度 损失函数 示例
  3. Python学习教程实用技法:通过公共键对字典列表排序—itemgetter
  4. 严格模式 华为_华为千元机虽然好,但是千万别乱选,这三款才是内行人的最爱...
  5. 软件项目风险管理介绍
  6. Oracle - 临时表(GLOBAL TEMPORARY TABLE)
  7. 技术 | Python从零开始系列连载(二十九)
  8. SAP Kyma和SAP云平台上的Service instance
  9. 计算机音乐奔跑,跑起来!100首最适合跑步的音乐
  10. python图像人类检测_OpenCV人类行为识别(3D卷积神经网络)
  11. 聊一聊 java8 中的 Optional
  12. 月入10w+的offer,变成了整容、传销、网红届的韭菜
  13. redis的简单安装和配置文件的参数
  14. Leetcode 79.单词搜索
  15. 算法总结之 将单链表的每K个节点之间逆序
  16. 转 VSS 2005 使用详解
  17. python分支和循环的思维导图_思维导图的绘制步骤【PDCA管理循环】
  18. 安国U盘量产无法识别芯片处理
  19. 《30天自制操作系统》第一天
  20. i.MX283开发板第一个Linux驱动-LED驱动

热门文章

  1. spring mvc 404 报错记录
  2. Dynamical Isometry and a Mean Field Theory of CNNs
  3. java中如何表达sin_在Java中使用“sincos”
  4. SSL单向认证和双向认证
  5. 使用Mono.Cecil改变访问级别
  6. UNreal 创建一个简单的玻璃材质+金属材质+创建材质实例
  7. Linux Namespace Veth虚拟网卡
  8. 使用google的jib, 发布Docker镜像到阿里云
  9. SQL对象名无效的解决
  10. Justinmind_Prototyper官网下载、破解、汉化