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两个步骤。同时,还分别提供了两个不同的示例,可供参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中获取微信用户信息的方法 - Python技术站

(1)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 一文吃透 Spring 中的 AOP 编程

    一文吃透 Spring 中的 AOP 编程 什么是 AOP AOP(Aspect Oriented Programming)即面向切面编程。与 OOP(面向对象编程)不同,AOP 不是关注代码的对象,而是关注在程序运行过程中“特定点”发生的一些处理。其主要作用是在不修改原有逻辑的情况下,对程序进行一些扩展操作,例如:日志记录、性能监控、事务管理等。 Spri…

    Java 2023年5月19日
    00
  • 如何在Java中创建线程通信的四种方式你知道吗

    当多个线程共同操作同一个对象时,可能会遇到竞争态况或阻塞,需要使用线程通信来实现协调和同步,以确保程序的正确性和效率。在Java中,创建线程通信的方式有以下四种: 一、wait()和notify() wait()和notify()是Java中最基本的线程通信方式。wait()的作用是使当前线程挂起,直到另一个线程调用相同对象的notify()方法唤醒它。no…

    Java 2023年5月18日
    00
  • 源码解析Spring 数据库异常抽理知识点总结

    源码解析Spring 数据库异常抽象知识点总结 异常抽象 在Java应用中处理数据库操作时,经常会出现各种数据库异常,例如连接超时、SQL语法错误等。这些异常信息通常是非常繁琐和冗长的,不利于开发者理解和处理异常。Spring提供了丰富的异常抽象支持,可以有效地降低程序员处理异常的复杂度,提升开发效率。 Spring 提供了以下几种异常: DataAcces…

    Java 2023年5月20日
    00
  • Java中的异常处理是什么?

    Java中的异常处理是指在程序执行过程中出现异常时的机制,通过捕获和处理异常来保证程序在异常情况下正常运行,避免程序崩溃和数据丢失等问题。在Java中,异常是通过Exception类及其派生类的对象来表示的,常见的异常包括NullPointerException、ArrayIndexOutOfBoundsException等。 Java中可以使用try-ca…

    Java 2023年4月27日
    00
  • JavaSpringBoot报错“HttpMessageNotReadableException”的原因和处理方法

    原因 “HttpMessageNotReadableException” 错误通常是以下原因引起的: 请求体不正确:如果请求体不正确,则可能会出现此错误。在这种情况下,您需要检查请求体并确保它们正确。 请求体格式不正确:如果请求体格式不正确,则可能会出现此错误。在这种情况下,您需要检查请求体格式并确保它们正确。 解决办法 以下是解决 “HttpMessage…

    Java 2023年5月4日
    00
  • Java实现部门员工管理

    Java实现部门员工管理攻略 1.需求分析 在进行Java实现部门员工管理之前,首先需要了解需求。具体来说,针对要建立的员工管理系统,需要明确以下几个方面的需求: 系统具有添加员工、删除员工、修改员工信息、查询员工信息等基本功能 每个员工需包含姓名、职位、手机号、邮箱、地址等信息 由于涉及到部门的管理,因此每个员工还应当分配到某个特定的部门中 在进行员工管理…

    Java 2023年5月31日
    00
  • 基于jsp+servlet实现的简单博客系统实例(附源码)

    这篇文章将会详细讲解如何通过使用JSP和Servlet来实现一个简单的博客系统。我们将会从搭建环境开始,到完成整个系统的构建。 环境搭建 工具准备 在开始之前,我们需要准备以下工具: Java SE Development Kit(JDK) Eclipse IDE for Java EE Developers Tomcat服务器 创建项目 打开Eclipse…

    Java 2023年6月15日
    00
  • 什么是共享对象?

    以下是关于共享对象的完整使用攻略: 什么是共享对象? 共享对象是指多个线程可以同时访问的对象。在多线程编程中,共享对象是非常常见的,例如共享变量、共享队列等。 共享对象的示例 以下两个示例,分别演示了共享对象的实现过程。 示例一:共享变量 public class Counter { private int count; public void increm…

    Java 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部