测试公众号网页授权获取用户基本信息的步骤及登录页面实现

2025-06-23
来源:万象资讯

登录至个人测试的公众号,在“网页服务”栏目下寻找“网页授权获取用户基本信息”的选项;点击进入。

2、看到接口文档的微信网页开发的步骤。

实现用户信息获取共需五个步骤,然而在实际操作过程中,我们仅采纳了其中的第一步、第二步以及第四步。

3、首页实现第一步骤,写一个单点登录的页面。

图中展示了前端页面第一步中单点登录的链接,其中包含的关键要素有两个:一是获取用户基础信息的权限,二是实现微信客户端跳转至您的登录界面,随后将携带code和特定字段信息至我们的页面。

构建登录页面核心功能涉及从地址栏中提取code字段(若存在其他必需字段,亦采用此方法提取),随后将此code传递至后端接口,通过执行后续的第二、第四步操作来获取用户资料。

4、将前端页面的登录地址配置到测试号里面。

点击上图中的“修改”,如图

观察图表可知,回调页面,即前端登录页面,允许输入域名或IP地址,但在正式运行环境中,仅接受域名作为地址,且该地址需为外网可访问的;而本地环境下,则可通过内网穿透工具来实现访问。

5、编写后台接口,实现2、4步骤。

WxUserController类

在文件路径中,位于com.example.mybaties包下的controller子目录中。 引入com.example.mybaties.service.WxUserService类; 该代码片段标注了使用Swagger进行API文档生成的注解。 引入 io.swagger.annotations.ApiImplicitParam 注解。 引入io.swagger.annotations包下的ApiImplicitParams类。 引入io.swagger.annotations包中的@ApiOperation注解。 在Spring框架中,通过使用注解方式,自动注入依赖,实现自动装配功能,具体代码如下:org.springframework.beans.factory.annotation.Autowired; 采用Spring框架的注解功能,通过@GetMapping指令,实现对HTTP GET请求的处理。 引入Spring框架的web模块中的注解,用于处理请求参数。 使用该注解表明该类是一个基于Spring框架的控制器,专门用于处理Web请求。 /** * @Description: 通过code获取用户信息 * @Author: lst * @Date 2020-08-20 */ @RestController 注解:值为"WxUserController",标签为"通过code获取用户信息",用于定义控制器。 public class 微信用户控制器 { @Autowired 拥有一个私有的WxUserService对象。 在访问路径为"/get-user"的接口时,响应内容类型被指定为"application/json; charset=utf-8"。 @方法说明:此操作旨在根据提供的code参数,成功检索并返回用户的相关信息,@备注:该功能通过code参数实现用户信息的查询,@响应状态码:当操作成功执行时,将返回状态码200,@响应格式:响应内容将以JSON格式呈现。 该参数类型为查询,数据类型为字符串,命名为"code",为必填项。它作为获取access_token的凭证,每个用户授权时携带的code均不相同,且code仅限使用一次,若5分钟内未被使用,将自动失效。") 公开方法getUser,接收名为"code"的必填参数,参数类型为字符串。 调用wxUserService类中的getUser方法,传入参数code,以获取用户信息。 } }

WxUserServiceImpl实现类

在文件路径com.example.mybaties.service.impl中,声明了一个服务实现类。 引入阿里巴巴开源库中的StringUtils类; 引入阿里巴巴的fastjson库,使用JSONObject类。 引入 com.example.mybaties.entity.User 类。 import com.example.mybaties.model.UserExcel属性类; 引入了com.example.mybaties.mapper包下的UserMapper接口; 引入 com.example.mybaties.service UserService 类。 import com.example.mybaties.service.WxUserService; 引入com.example.mybaties.utils包中的所有工具类; 采用lombok库的@Slf4j注解,实现日志记录功能。 import org.springframework.beans.factory.annotation.Autowired; 引入Spring框架的Bean工厂注解,以获取配置值;使用@Value注解进行属性值的注入。 导入org.springframework.stereotype.Service这个注解;将其应用于服务类定义中。 导入Spring框架中用于处理文件上传的MultipartFile接口。 导入 javax.servlet.http.HttpServletResponse 类。 import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; Java中,此为一种用于实现可调用接口的类,具备并发执行的能力。 引入一个用于管理并发执行任务的线程池接口。 引入Java并发工具包的Executors类; 在Java编程语言中,存在一个名为Future的并发处理工具类。 /** * @author lst * @version 1.0 * @Description: 通过code获取用户信息 * @date 2020-08-20 */ @Service @Slf4j public class WxUserServiceImpl,作为WxUserService接口的实现类,得以执行相应的服务功能。 @Value("${wx.appid}")

微信网页授权获取用户信息步骤_微信公众号获取用户信息_微信单点登录页面实现

public String appId; @Value("${wx.appsecret}") public String appSecret; @Value("${wx.lang}") public String lang; @Override 公开方法getUser,接受一个字符串类型的参数code。 //TODO 1、通过code获取access_token Map params = new HashMap<>(); 构建字符串变量url,赋值为WxUtil类中定义的获取访问令牌的URL地址。 params.put("appid",appId); 将"secret"键对应的值设为appSecret。 params.put("code",code); params字典中加入了键值对,键为"grant_type",其对应的值为"authorization_code"。 json对象是通过将HttpClientUtil执行的安全HTTP GET请求的结果,使用JSONObject.parseObject方法解析得到的。 记录信息:token的获取操作已完成,具体详情请查看jsonObject对象。 /** * { "授权令牌":"授权令牌值", * "expires_in":7200, "刷新令牌"的标识为:"REFRESH_TOKEN"。 * "openid":"OPENID", * "scope":"SCOPE" * } */ 日志信息显示,利用code参数成功获取了access_token,具体详情请见jsonObject对象。 获取到的json对象中,"access_token"键对应的值被转换成了字符串类型,并存储在accessToken变量中。 若accessToken不为空,则{ 获取微信sns用户信息接口的URL地址被赋值为url。 params = new HashMap<>(); 将"access_token"这个参数值存入到params对象中,其值为accessToken。 params中加入了"openid",其值由jsonObject中的"openid"字段提供。 params.put("lang",lang); jsonObject 等于 JSONObject 解析 HttpGetUtil 执行 HTTPS GET 请求的结果,该结果基于提供的 URL 和参数。 记录信息:“用户详情:”,随后跟随着jsonObject的内容。 执行返回操作,将json对象转换成字符串形式。 } return ""; } }

WxUtil类

在文件路径com.example.mybaties.utils中,定义了一个名为utils的包。 导入com.example.mybaties实体包中的TextMessage类; 引入了com.thoughtworks.xstream.XStream库; import org.dom4j.Document; 在DOM4J库中,存在一个名为DocumentException的异常类;此异常类用于处理文档解析过程中可能出现的错误。 import org.dom4j.Element; 引入 org.dom4j.io.SAXReader 类库; 引入 javax.servlet.http.HttpServletRequest 类。 import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Description: 微信工具类 * @Author: lst * @Date 2020-08-19 */ public class WxUtil { /** 在获取到相应的code之后,需向指定的链接发送请求,以获取access_token。 此链接指向微信API,用于获取访问令牌,其中包含了应用程序ID(APPID)、密钥(SECRET)以及授权码(CODE)。 请勿修改授权类型为授权码。 */ 定义了一个常量字符串,其值为“https://api.weixin.qq.com/sns/oauth2/access_token”,用于获取访问令牌的URL。 /** * https请求方式: GET 此链接指向微信API,用于获取访问令牌,参数包括授权类型、应用ID和密钥。 */ 定义一个常量字符串,用于获取后台生成的访问令牌的URL,该URL为:https://api.weixin.qq.com/cgi-bin/token。 /** 此链接指向微信API,用于获取用户信息,其中包含访问令牌、用户标识以及语言参数,具体格式为:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN。 */ 定义了一个常量字符串,用于获取用户信息的接口地址,该地址为“https://api.weixin.qq.com/cgi-bin/user/info”。 /**

微信公众号获取用户信息_微信网页授权获取用户信息步骤_微信单点登录页面实现

请访问以下链接以获取用户信息:https://api.weixin.qq.com/sns/userinfo,其中需包含参数access_token、openid以及lang,分别对应授权访问令牌、用户唯一标识和语言类型,具体值为zh_CN。 */ 定义一个常量字符串,表示获取社交网络用户信息的接口地址,该地址为"https://api.weixin.qq.com/sns/userinfo"。 }

HttpClientUtil工具

@Slf4j public class HttpClientUtil { 公开定义的常量FH_WH代表一个空字符串。 public static final int NUM200代表的是数字200;该常量被定义为最终常量;其值为200。 /** * 20190621 * * @param url * @param params * @return */ params) { // 读取返回内容 创建一个新的StringBuffer对象,命名为buffer。 创建的HttpURLConnection对象con尚未初始化。 // 尝试发送请求 try { 创建SSL上下文实例,名为sc,通过调用SSLContext的getInstance方法,并传入参数"SSL"。 sc初始化时,参数为null,同时配置了一个TrustManager数组,该数组中包含一个TrustAnyTrustManager实例。 new SecureRandom()); // 构建请求参数 创建一个新的StringBuffer对象sb。 if (params != null) { for(Map.Entry e : params.entrySet()) { sb.append(e.getKey()); sb.append("="); sb.append(URLEncoder对e.getValue()的字符串形式进行编码,编码后的字符串采用UTF-8字符集)。 sb.append("&"); } } if (url.indexOf(FH_WH) > 0) { url += "&"; } else { url += "?"; } 拼接的URL字符串继续延伸,通过将sb字符串从起始位置截取至倒数第二个字符,并将其转换为字符串形式,然后追加到url中。 log.info("请求url:{}",url); 连接对象con是通过将URL对象转换成HttpsURLConnection类型,并调用该URL对象的openConnection方法创建的。 con.setDoInput(true); con.setUseCaches(false); 配置连接超时时间为10分钟,即60000毫秒。 con设置读取超时时间为10分钟; 配置SSL套接字工厂时,将sc获取的套接字工厂设置为con的SSL套接字工厂。 配置对象设置了一个主机名验证器,该验证器允许信任任何主机名。 若con的响应代码等于NUM200,{ 连接成功后,我们获取了连接对象con的输入流,并将其赋值给变量in。 创建了一个BufferedReader对象,该对象是通过将InputStreamReader与输入流结合并指定编码为"utf-8"来初始化的。 String temp; 在循环过程中,只要成功读取到(temp = br.readLine())一行数据,且该数据不为空(即不等于null),则继续执行。 buffer.append(temp); } in.close(); br.close(); } } catch (Exception e) { e.printStackTrace(); } finally { if (con != null) { con.disconnect(); con = null; } } return buffer.toString(); } }

6、测试

打开微信开发工具,登录自己的微信,选择微信端。

在上图连接中输入()

然后看下后台日志

这样就获取到我的微信基本信息了。

分享