SpringBoot中获取微信用户信息的方法

  

获取微信用户信息的方法,一般分为两个步骤:

  1. 获取用户的授权凭证(code)
  2. 根据授权凭证(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_tokenopenid。在这段代码中,我们使用了微信 SDK中的HttpUtil类来发送HTTP请求,获取返回结果,再解析结果JSON来获取 access_tokenopenid。需要替换代码中的 appidsecret 为自己的应用id和secret即可。

步骤二:根据授权凭证(code)换取用户的openid和access_token

我们在获取到用户授权的 code 后,需要将这个code发送到微信服务器,以获取用户的 openidaccess_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两个步骤。同时,还分别提供了两个不同的示例,可供参考。

相关文章