获取微信用户信息的方法,一般分为两个步骤:
- 获取用户的授权凭证(code)
- 根据授权凭证(code)换取用户的openid和access_token
SpringBoot已经整合了微信的SDK,可直接使用。
步骤一:获取用户的授权凭证(code)
用户在访问我们的网站或应用时,需要先登录微信,然后授权给我们的应用。这时我们就可以得到用户的code。
用如下代码可以获取用户的code:
@RestController
public class WeixinController {
@GetMapping("/wxLogin")
public String wxLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
String callBackUrl = "http://yourdomain.com/callBack";
// 重定向到微信的登录授权页面
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxXXX&redirect_uri="+ URLEncoder.encode(callBackUrl, "UTF-8") +"&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect";
response.sendRedirect(url);
return null;
}
@GetMapping("/callBack")
public String callBack(HttpServletRequest request, HttpServletResponse response) throws Exception {
String code = request.getParameter("code");
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxXXX&secret=xxx&code=" + code + "&grant_type=authorization_code";
String result = HttpUtil.get(url);
JSONObject json = JSON.parseObject(result);
String openid = json.getString("openid");
String accessToken = json.getString("access_token");
return "openid:"+openid+", access_token:"+accessToken;
}
}
详解:
-
首先,我们定义了一个RestController,并提供了两个请求方法,一个是用来跳转到微信登录授权页面的
wxLogin()
,另一个是回调方法callBack()
,用来获取code。 -
wxLogin()
方法是用来跳转到微信登录授权页面的。我们将构造好的授权地址作为参数,通过response.sendRedirect()
方法重定向到微信的授权页面。需要注意的是,redirect_uri
参数需要用URLEncoder进行编码。 -
另外,我们指定了
scope=snsapi_userinfo
表示我们要获取用户授权后的微信用户信息。 -
callBack()
方法是用户授权后,微信回调到我们定义的地址,并携带code的。我们可以在回调方法中获取code,并通过code
参数和微信服务器交换access_token
和openid
。在这段代码中,我们使用了微信 SDK中的HttpUtil类来发送HTTP请求,获取返回结果,再解析结果JSON来获取access_token
和openid
。需要替换代码中的appid
和secret
为自己的应用id和secret即可。
步骤二:根据授权凭证(code)换取用户的openid和access_token
我们在获取到用户授权的 code
后,需要将这个code发送到微信服务器,以获取用户的 openid
和 access_token
。这一步需要调用微信SDK提供的方法进行获取。
String code = "your authorization code";
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
String openid = wxMpOAuth2AccessToken.getOpenId();
String accessToken = wxMpOAuth2AccessToken.getAccessToken();
需要引入的maven依赖如下:
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.4.0</version>
</dependency>
其中,wxMpService.oauth2getAccessToken(code)
方法就是微信 SDK中提供的用于换取用户openid和access_token的方法。需要替换代码中的 code
参数为第一步获得的code。
示例
以下是两个具体的示例,用于演示如何获取微信用户的openid和access_token。
实例一:
@RestController
@RequestMapping("/wx")
public class WxTestController {
private final WxMpService wxMpService;
public WxTestController(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}
@GetMapping("login")
public String login(HttpServletRequest request) {
String callBackUrl = "http://domain.com/wx/callBack";
// 重定向到微信的登录授权页面
String url = wxMpService.oauth2buildAuthorizationUrl(callBackUrl, WxConsts.OAuth2Scope.SNSAPI_USERINFO, "state");
return "redirect:" + url;
}
@GetMapping("/callBack")
public String callBack(HttpServletRequest request) throws Exception {
String code = request.getParameter("code");
//使用授权码获取access_token
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
//获取用户openid
String openid = wxMpOAuth2AccessToken.getOpenId();
//获取用户基本信息
WxMpUser wxMpUser = wxMpService.getUserService().userInfo(openid,"zh_CN");
return wxMpUser.toString();
}
}
实例二:
@RestController
@RequestMapping("/wx")
public class WxTestController {
private final WxMpService wxMpService;
public WxTestController(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}
@GetMapping("login")
public String login(HttpServletRequest request) {
String callBackUrl = "http://domain.com/wx/callBack";
// 重定向到微信的登录授权页面
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(request.getParameter("code"));
} catch (WxErrorException e) {
e.printStackTrace();
}
//获取用户openid
String openid = wxMpOAuth2AccessToken.getOpenId();
//获取用户基本信息
WxMpUser wxMpUser = null;
try {
wxMpUser = wxMpService.getUserService().userInfo(openid,"zh_CN");
} catch (WxErrorException e) {
e.printStackTrace();
}
return wxMpUser.toString();
}
}
以上就是获取微信用户信息的完整攻略,包括获取用户的授权凭证(code)、根据授权凭证(code)换取用户的openid和access_token两个步骤。同时,还分别提供了两个不同的示例,可供参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中获取微信用户信息的方法 - Python技术站