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日

相关文章

  • Java将Object转换为数组的代码

    要将Java中的Object类型转换成数组,可以使用Java的反射机制来实现。具体的步骤如下: 1. 获取Object的Class对象 通过Object的getClass()方法获取一个Class对象,然后调用Class类的getComponentType()方法获取数组元素的类型,最后调用java.lang.reflect.Array的newInstanc…

    Java 2023年5月26日
    00
  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    首先需要明确的是,BeanFactoryPostProcessor是在Spring容器实例化Bean之后,在Bean实例化之前处理BeanFactory中的BeanDefinition的接口。 一、BeanFactoryPostProcessor的使用场景 通常,在开发中,我们会利用BeanFactoryPostProcessor来修改或扩展BeanDefi…

    Java 2023年5月31日
    00
  • layui的数据表格+springmvc实现搜索功能的例子

    下面是详细讲解“layui的数据表格+springmvc实现搜索功能的例子”的完整攻略: 一、前置条件 确定使用的IDE是IntelliJ IDEA; 确保已经创建了一个Spring MVC的web工程; 确保已经配置好了Layui相关的静态资源。 二、添加依赖 添加spring-data-jpa、MySQL JDBC驱动、Spring Web MVC等依赖…

    Java 2023年6月18日
    00
  • 浅谈java二进制、十进制、十六进制、字符串之间的相互转换

    Java进制转换攻略 Java中提供了十进制、二进制、八进制、十六进制的进制表示,同时也支持将不同进制之间进行转换,并提供字符串和数字之间的转换方法。 十进制转换为其他进制 十进制转二进制 Java中可以使用 Integer 类的 toBinaryString 方法将十进制数转换为二进制字符串,例如: int decimalNum = 123; String…

    Java 2023年5月27日
    00
  • JavaMail实现发送超文本(html)格式邮件的方法

    JavaMail是一个用于处理电子邮件的Java API,可发送和接收邮件。要发送HTML格式的邮件,可以按照以下步骤进行: 步骤1: 导入包 import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.P…

    Java 2023年6月15日
    00
  • Springboot如何通过yml配置文件为静态成员变量赋值

    在Spring Boot应用程序中,我们可以使用yml配置文件为静态成员变量赋值。在本文中,我们将详细讲解如何使用yml配置文件为静态成员变量赋值,并提供两个示例来说明这个过程。 步骤 要使用yml配置文件为静态成员变量赋值,我们需要遵循以下步骤: 在yml配置文件中定义静态成员变量的值。 在Java类中定义静态成员变量,并使用@Value注解将其与yml配…

    Java 2023年5月18日
    00
  • SpringBoot应用启动流程源码解析

    SpringBoot应用启动流程源码解析 SpringBoot是一款基于Spring框架的快速开发脚手架,具有很高的灵活性和可扩展性。在深入学习SpringBoot应用时,我们需要了解SpringBoot的启动流程。本文将进行“SpringBoot应用启动流程源码解析”的详细讲解,包括SpringBoot应用启动的主要流程、常用的启动方式和相关的代码分析。 …

    Java 2023年5月15日
    00
  • jsp获得本地及serverIP的简单方法

    关于获取本地及server IP的方法,我们可以采用Java Web应用中的Java Server Pages(JSP)进行实现。 以下是获取本地IP地址的步骤: 在JSP页面中引入Java的网络类库。 <%@ page import="java.net.*"%> 使用该类库的 InetAddress 类创建一个实例。 &lt…

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