微信公众号开发中有时会有获取用户信息的需求。我这里是点击某个按钮直接获取用户的信息,不需要用户授权(就是所谓静默授权)。

主要分以下几步:

1.在微信公众平台,公众号设置中设置网页授权域名;

2.请求网页授权的接口获得code(获取openid必需的参数);

3.用拿到的 code 请求接口获取openid(获取用户信息必需的参数);

4.用openid 请求接口获得用户信息。

第一步:设置网页授权域名

登录微信公众平台,公众号设置->功能设置->网页授权域名,填写公众号的域名

注意:这块需要将这个 MP_verify_XoBSPwGqusD1IVzI.txt 放置在域名服务器,web项目的根目录下,放置合适之后这块才能保存。

第二步:请求接口得到code

需要请求的接口是这个

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://gshhzz.gssl.gov.cn/wechat/basAdvices/toSavePage&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

appid是你微信公众好号的appid

redirect_uri 这个是你要跳转的后台地址。

注意这里的redirect_uri必须填写成 域名+后台访问路径 的形式

这块我的需求是这样的,我在微信公众号某个页面有个添加按钮,点击按钮请求后台方法,在后台方法中获取到微信用户的信息,将用户信息传到这个后台方法要去的页面。

本来这个后台方法的请求url比如是  http://gs.gsssi.cn/wechat/addPage,那么我在点击这个按钮的 js 方法中之前是这么写的

location.href = "http://gs.gsssi.cn/wechat/addPage"

现在改成

location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的APPID&redirect_uri=http://gs.gsssi.cn/wechat/addPage&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";

那么在这个后台方法中就可以取得 获取openid所需的 code

@RequestMapping(value = "/addPage")public String addPage(Model model,HttpServletRequest request, HttpSession session){   //首先判断一下session中,是否有保存着的当前用户的信息,有的话,就不需要进行重复请求信息/*** 进行获取openId,必须的一个参数,这个是当进行了授权页面的时候,再重定向了我们自己的一个页面的时候,* 会在request页面中,新增这个字段信息,*///第一步,得到code String code = request.getParameter("code");WeixinUserInfo weixinUserInfo = null;try {if(session.getAttribute("weixinUser") != null){weixinUserInfo = (WeixinUserInfo) session.getAttribute("weixinUser");}else {//第二步  得到openIdString openId = UserInfoUtil.getOpenId(code);//第三步   得到用户信息weixinUserInfo = UserInfoUtil.getUserInfo(TokenUtil.getToken().getAccessToken(), openId);//将获取到的用户信息,放入到session中session.setAttribute("weixinUser", weixinUserInfo);}model.addAttribute("weixinUser", weixinUserInfo);} catch (Exception e) {e.printStackTrace();}return "wechat/basAdvice/adviceSave";}

第三步:得到openid

请求下面这个接口得到openid,code就是上一步已经获取到。access_token传入最新获取到的access_token。

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

第四步:得到用户信息

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID

获取openid和用户信息的我都封装在了UserInfoUtil 类中。其中用到的access_token参数就是普通的access_token。自行写方法实现。

UserInfoUtil 代码:

package com.gsww.hzz.util.wechat;import java.io.IOException;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;import net.sf.json.JSONObject;/*** 获取微信用户信息工具类*/
public class UserInfoUtil {public final static String appid = "你的appid";public final static String secret = "你的secret";//获取openId接口public final static String GET_OPEN_ID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?"+ "appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";//获取微信用户信息 接口public static final String GET_WEIXIN_USER_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";@Autowiredprivate static  RestTemplate restTemplate;/*** 获取openId* @param session* @param code* @return*/public static String getOpenId(String code){System.out.println("get openid");String requestUrl = GET_OPEN_ID_URL.replace("APPID", appid).replace("SECRET", secret).replace("CODE", code);String openId = "";try{JSONObject json = JSONObject.fromObject(sendGet(requestUrl));//System.out.println("responsejson ----"+json.toString());//JSONObject json = JSONObject.fromObject(responseJson);openId = json.get("openid").toString();} catch(Exception e){e.printStackTrace();}return openId;}/*** 获取用户信息* @param accessToken* @param openId* @return*/public static WeixinUserInfo getUserInfo(String accessToken, String openId){WeixinUserInfo userInfo = new WeixinUserInfo();String requestUrl = GET_WEIXIN_USER_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);try{JSONObject json = JSONObject.fromObject(sendGet(requestUrl));//System.out.println("---userinfo==responsejson ----"+json);//JSONObject json = JSONObject.fromObject(responseJson);// 用户的标识userInfo.setOpenId(json.getString("openid"));// 昵称userInfo.setNickname(json.getString("nickname"));// 用户的性别(1是男性,2是女性,0是未知)userInfo.setSex(json.getInt("sex"));// 用户所在国家userInfo.setCountry(json.getString("country"));// 用户所在省份userInfo.setProvince(json.getString("province"));// 用户所在城市userInfo.setCity(json.getString("city"));// 用户头像userInfo.setHeadImgUrl(json.getString("headimgurl"));} catch(Exception e){e.printStackTrace();}return userInfo;}//发送GET请求public static String sendGet(String url) {String result = "";BufferedReader in = null;try {String urlName = url;URL realUrl = new URL(urlName);URLConnection conn = realUrl.openConnection();// 打开和URL之间的连接conn.setRequestProperty("accept", "*/*");// 设置通用的请求属性conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");conn.setConnectTimeout(4000);conn.connect();// 建立实际的连接in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));// 定义BufferedReader输入流来读取URL的响应String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);} finally {// 使用finally块来关闭输入流try {if (in != null) {in.close();}} catch (IOException ex) {System.out.println("关闭流异常");}}return result;}
}

WeixinUserInfo类(微信用户信息 bean)

package com.gsww.hzz.util.wechat;/*** 类名: WeixinUserInfo </br>* 描述: 微信用户的基本信息  </br>* 开发人员: souvc </br>* 创建时间:  2015-11-27 </br>* 发布版本:V1.0  </br>*/
public class WeixinUserInfo {// 用户的标识private String openId;// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息private int subscribe;// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间private String subscribeTime;// 昵称private String nickname;// 用户的性别(1是男性,2是女性,0是未知)private int sex;// 用户所在国家private String country;// 用户所在省份private String province;// 用户所在城市private String city;// 用户的语言,简体中文为zh_CNprivate String language;// 用户头像private String headImgUrl;public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public int getSubscribe() {return subscribe;}public void setSubscribe(int subscribe) {this.subscribe = subscribe;}public String getSubscribeTime() {return subscribeTime;}public void setSubscribeTime(String subscribeTime) {this.subscribeTime = subscribeTime;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}public String getHeadImgUrl() {return headImgUrl;}public void setHeadImgUrl(String headImgUrl) {this.headImgUrl = headImgUrl;}
}

微信公众号获取用户信息相关推荐

  1. Thinkphp5下微信公众号获取用户信息

    前言 一直在用整理下tp5 开发微信公众号获取用户信息的简单笔记 废话不多说 直接贴代码如下: 正文 准备工作 在微信公众平台的开发者工具中申请公众平台测试账号如下图 在网页账号中 修改网页授权获取基 ...

  2. 通过微信公众号获取用户信息(java版)

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置 ...

  3. php公众号用户关注,微信公众号获取用户信息(用户关注公众号)

    一 获取用户基本信息 用户在关注公众号之后,你可以获取到用户的openID(加密后的微信号,每个用户对应每个公众号的openID是唯一的).通过openID可以获取到包括昵称.头像.性别.所在城市.语 ...

  4. 微信公众号获取用户信息(新)

    注意:此access_token和基础支持的access_token不同(此access_token相当于用户的token,基础的access_token相当于应用的token) 微信授权的流程: 详 ...

  5. 解决微信公众号获取用户信息报48001错误

    报错信息如下: {"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCl ...

  6. 微信公众号获取用户信息采坑指南

    1. OAuth2.0网页授权 这里一定不要在前面加上"http://"等字符,否则就会出现"redirect_uri参数错误": 2.获取code 官方说明如 ...

  7. 微信公众号获取用户位置定位信息入库asp代码

    微信公众号获取用户位置定位信息入库asp代码,可以获取微信用户的坐标和地址信息入库,代码简洁: <% if request("action")="" th ...

  8. 微信公众号获取用户头像昵称,用户信息

    1.关注了公众号,获取用户信息 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=xxx&a ...

  9. 微信公众号获取用户openId(扩展:小程序获取openId和手机号)

    微信公众号获取用户openId 拼接的参数[可以直接配菜单中]: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb2363dd ...

最新文章

  1. 深入理解计算机系统(3)
  2. 关于Vue中常用的工具函数封装
  3. connect连接oracle6,Oracle Connect By 使用实例
  4. allocator类初学的简单例子
  5. unix环境高级编程基础知识之第二篇(3)
  6. ASP.NET Core 行军记 -----第一步(艰辛的 MVC Hello World)
  7. Apollo进阶课程㊱丨Apollo ROS深入介绍
  8. jquery复选框组清空选中的值_jQuery获取复选框被选中数量及判断选择值的方法详解...
  9. JAVA方法重载与构造方法简介
  10. java13性能,Spring Boot 2.2.0,性能提升+支持Java13
  11. 读取FTP上的excel文件,并写入数据库
  12. luoguP1594 护卫队
  13. learun通用权限系统框架功能实现设计
  14. 那些年,我深爱着的PPT
  15. 网易云音乐打卡听歌300首源码
  16. 如何修复 Windows 10 中任务栏消失的问题?
  17. DBLE分库分表中间件
  18. vagrant制作box
  19. 【Redis 系列】redis 学习十五,redis sds数据结构和底层设计原理
  20. 翰麟教育|教育学人物考点梳理

热门文章

  1. 酒店无线认证平台怎么样
  2. 如何用python扒取网易云歌曲
  3. 程序员也应了解的Unity粒子系统
  4. java int型最大是多少_int型的数到底最大值是多少?
  5. java黑名单校验_短信验证码被刷怎么办?java 短信验证码防刷策略
  6. 第二期 AOSP 环境搭建、下载和编译 《手机就是开发板》
  7. 基于WEB的论坛系统的设计与实现
  8. php 代码生成rsa密钥,生成RSA密钥对
  9. 揭秘:卢国建是如何成就芯海科技“信号链芯片第一股”
  10. 服装企业信息化喝酒模式VS焦镜模式