springboot公众号授权登录并获取用户昵称头像等信息

效果如下图:

 准备工作:

首先我们要申请一个公众号测试账号,公众号平台这里进入并登录即可看到测试账号。

关注公众号,如果不关注授权登录时会提示你关注。

修改网页授权回调域名

 主要流程:

1 第一步:用户同意授权,获取code

2 第二步:通过code换取网页授权access_token

第三步:拉取用户信息(需scope为 snsapi_userinfo)

参考官方文档:

微信开放文档

具体代码:

新建一个常量类存放微信公众号相关常量

package com.jch.mng.constant;

/**
 * 微信小程序常量
 * Created by xxs on 2021/7/9 8:45
 */
public class WeChatConstants {

    //xxs测试公众号
    public static final String appId = "wx8d1eab965e66105a";
    public static final String secret = "8e9bc82ce46195795a8a5950859679b4";

    /**获取access_token地址*/
    public static final String getAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?";
    /**根据code获取access_token地址*/
    public static final String getAccessTokenByCodeUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?";
    /**刷新token地址*/
    public static final String getRefreshTokenUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?";
    /**获取用户信息地址*/
    public static final String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?";
    /**授权回调地址
     *请求获取code的回调地址
     * 用线上环境的域名或者用内网穿透,不能用ip*/
    public static final String callBackUrl = "http://xxs.free.idcfengye.com/author/api/wxAuth/callBack";
//    public static final String callBackUrl = "http%3A%2F%2Fwuruyang.free.idcfengye.com%2FwxFunction%2Fcallback";
    /**授权获取到用户信息后重定向回公众号页面*/
    public static final String redirectPageUrl = "http://xxs.free.idcfengye.com/";

}

调试公众号用到的接口



/**
 * TODO
 * Created by xxs on 2021/7/8 11:50
 */
public class WXAuthUtil {


    private static Logger logger = LoggerFactory.getLogger(WXAuthUtil.class);
    /**
    * @Description: 获取access_token
    * @Param: []
    * @Author: xxs
    * @Date: 2021/7/8 17:19
    */
    public static String getAccessToken(){
      String result= HttpUtil.get(WeChatConstants.getAccessTokenUrl+"grant_type=client_credential&appid="+ WeChatConstants.appId+"&secret="+ WeChatConstants.secret);
        System.out.println(result);
        JSONObject json = JSONObject.parseObject(result);
        return result;
    }

    /**
    * @Description: 根据code获取access_token
    * @Param: [code]
    * @Author: xxs
    * @Date: 2021/7/8 18:27
    */
    public static WxGetAccessTokenByCode getAccessTokenByCode(String code){
        String result= HttpUtil.get(WeChatConstants.getAccessTokenByCodeUrl+"appid=" + WeChatConstants.appId + "&secret="
                        + WeChatConstants.secret + "&code=" + code + "&grant_type=authorization_code");
        logger.info("获取access_token结果:"+result);
        WxGetAccessTokenByCode wx = JSON.parseObject(result, WxGetAccessTokenByCode.class);
        return wx;
    }



    /**
    * @Description: 获取用户信息
    * @Param: [access_token, openid]
    * @Author: xxs
    * @Date: 2021/7/8 17:19
    */
    public static WxGetUserInfo getUserInfo(String access_token, String openid){
        String result= HttpUtil.get(WeChatConstants.getUserInfoUrl+"access_token="+access_token+"&openid="+openid+"&lang=zh_CN");
        logger.info("获取userInfo结果:"+result);
        WxGetUserInfo userInfo = JSON.parseObject(result, WxGetUserInfo.class);
        return userInfo;
    }
}
package io.lease.modules.weixin.wxlogin;

import lombok.Data;

/**
 * Created by xxs on 2021/11/30 10:22
 *
 * @Description
 * {"access_token":"51_NsknBdrilaR5m5vXlxFZQ0Xda6iqKYiT2lLWHqzeHkaJ5Dm38pxuvMf_T9bK5p00rm29F3qYZvNAqV9bA87uYU2_Br7MfjxBTJ7cNRn98ZU",
 * "expires_in":7200,
 * "refresh_token":"51_11cz9rjjEtSCDpdW1-wNDDsjTkMlaFGLxeTJrbJnP6n5grzcz_IyctpHpwV0WJraVxXfiXf-xCPO4144UwEAi_g1hUAsXNLqLM4xE30x0-w",
 * "openid":"oEMNh6tMYW39MQo4BNIgqhzHpYHs",
 * "scope":"snsapi_userinfo"}
 */
@Data
public class WxGetAccessTokenByCode {

    private String access_token;

    private long expires_in;

    private String refresh_token;

    private String openid;

    private String scope;
}
package io.lease.modules.weixin.wxlogin;

import lombok.Data;

import java.util.List;

/**
 * Created by xxs on 2021/11/30 10:24
 *
 * @Description
 * {"openid":"oEMNh6tMYW39MQo4BNIgqhzHpYHs",
 * "nickname":"小小舍",
 * "sex":0,
 * "language":"",
 * "city":"",
 * "province":"",
 * "country":"",
 * "headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTJ9pZUKIXDQa4EGRzfGv0SooVKQoRy467Wr6C828UT3cwblic5yuVQqXUcQ08VFO8sJ580FPxz8PvQ\/132",
 * "privilege":[]}
 */
@Data
public class WxGetUserInfo {

    private String openid;
    private String nickname;
    private int sex;
    private String language;
    private String city;
    private String province;
    private String country;
    private String headimgurl;
    private List<String> privilege;


}

 编写授权登录和授权回调接口



/**
 * Created by xxs on 2021/7/8 17:55
 * @Description: 公众号登录
 * @Version: 2.9
 */
@RestController
@RequestMapping("/wxAuth")
public class GzhLoginController {


    @Autowired
    private GzhUserService gzhUserService;
    private static Logger logger = LoggerFactory.getLogger(GzhLoginController.class);


    /**
    * @Author: xxs
    * @Param: [response]
    * @Date: 2021/7/9 8:56
    * @Description:  授权登录方法
    * @Version: 2.9
    */
    @RequestMapping("/login")
    public void wxLogin(HttpServletResponse response) throws IOException {
        String redirect_uri =URLEncoder.encode(WeChatConstants.callBackUrl,"UTF-8");
        //请求地址
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize" +
                "?appid=" + WeChatConstants.appId + "&redirect_uri=" + redirect_uri +
                "&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";

        System.out.println(url);
        //重定向
        response.sendRedirect(url);
    }

    /**
    * @Author: xxs
    * @Param: [request, response]
    * @Date: 2021/7/9 8:56
    * @Description:  授权登录回调方法
    * @Version: 2.9
    */
    @RequestMapping("/callBack")
    public String wxCallBack(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String code = request.getParameter("code");
        logger.info("获取到code:"+code);
        //获取access_token
        WxGetAccessTokenByCode wx = WXAuthUtil.getAccessTokenByCode(code);
        //请求获取userInfo
        WxGetUserInfo userInfo = WXAuthUtil.getUserInfo(wx.getAccess_token(), wx.getOpenid());
        //获取到userInfo,根据业务进行处理
        GzhUser u = gzhUserService.insert(userInfo);
        //重定向回公众号页面
        String str = "openid="+u.getOpenid()+"&nickname="+u.getNickName()+"&headImgUrl="+u.getHeadImgUrl()+"&userId="+u.getUserId();
        String param = (StrUtil.CheckNotNull(u.getPhone()))? str+"&phone="+u.getPhone():str;
//        response.sendRedirect(WeChatConstants.redirectPageUrl+param);
        return "success";
    }


}

掉登录接口即可。

### 回答1: Spring Boot 是一个用于快速构建基于 Java 的应用程序的开源框架。微信公众号微信平台提供的一种服务,允许开发者在微信上创建自己的公众号,从而能够与用户进行交互、提供信息、进行营销等。 使用 Spring Boot 构建微信公众号意味着我们可以利用 Spring Boot 的优势快速开发和部署我们的公众号应用。Spring Boot 提供了丰富的特性和功能,例如自动配置、快速启动、内嵌 Servlet 容器等,使得我们能够以更高效的方式开发微信公众号应用程序。 在使用 Spring Boot 构建微信公众号时,我们可以利用微信公众平台提供的开发接口和 SDK,与微信服务器进行交互。该接口和 SDK 提供了丰富的功能,例如接收和回复消息、获取用户信息、上传素材、推送模板消息等。我们可以通过编写相应的代码,与微信服务器进行通信,并实现自定义的业务逻辑。 使用 Spring Boot 构建微信公众号还可以结合其他技术和框架,例如 Spring MVC、Spring Data JPA 等,来实现更复杂的功能。我们可以利用 Spring MVC 来处理微信服务器的请求,使用 Spring Data JPA 来操作数据库存储用户信息等。这些技术和框架的集成可以提高开发效率和代码质量。 总之,使用 Spring Boot 构建微信公众号能够帮助我们快速开发和部署应用,同时利用 Spring Boot 提供的特性和功能,使得开发过程更加高效和简化。 ### 回答2: Spring Boot是一个用于构建独立的、生产级的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了许多默认配置,让开发者可以专注于业务逻辑的实现。 微信公众号是基于微信开放平台的一种应用,开发者可以通过微信公众号来与用户进行交互。使用微信公众号可以实现发送消息、接收消息、拉取用户信息等功能。通过集成Spring Boot框架,可以更加方便地开发和管理微信公众号应用。 使用Spring Boot开发微信公众号,可以通过Spring框架的依赖注入和控制反转等功能,更加灵活地管理公众号的业务逻辑和组件。开发者可以定义不同的Controller来处理用户的请求,并通过注解来实现自动装配和依赖管理。此外,Spring Boot还提供了许多自动配置的功能,使得开发者可以快速构建、测试和部署微信公众号应用。 Spring Boot还支持与微信公众平台的API进行交互,开发者可以通过SDK或自定义开发来实现微信公众号的各种功能。例如,可以使用SDK提供的API来发送消息、获取用户信息、创建菜单等。 总之,通过使用Spring Boot框架,开发者可以更加高效地开发和管理微信公众号应用,减少了繁琐的配置和部署过程,提高了开发效率和代码质量。 ### 回答3: Spring Boot 是一个基于 Spring 框架的开源项目,用于快速构建、运行和部署应用程序。微信公众号是基于微信平台的一种社交媒体营销工具,被广泛用于企业的宣传推广、客户互动等方面。那么,Spring Boot 如何与微信公众号结合呢? 首先,我们可以通过 Spring Boot 提供的 Web 应用程序开发框架,结合微信公众号的开发文档和接口,编写实现微信公众号功能的后端代码。通过使用 Spring Boot 的 MVC 架构,我们可以定义处理微信公众号各种请求的控制器,并利用 Spring 的依赖注入特性,调用微信公众号提供的接口实现相关功能。 其次,Spring Boot 提供了丰富的开箱即用的插件和组件,可以方便地集成第三方库和工具。我们可以利用 Spring Boot 的插件,快速集成微信公众号的 SDK 或 API,简化开发过程。同时,Spring Boot 还提供了很多自动配置选项,可以减少开发者的配置工作,提高开发效率。 另外,通过使用 Spring Boot 的自动化部署特性,我们可以将微信公众号后端应用程序快速打包为可执行的 JAR 文件,并使用常用的部署或容器工具(如 Docker、Tomcat 等)进行部署和运行。这样,我们可以轻松地将微信公众号应用程序部署到云端,实现高可用性和扩展性。 总之,Spring Boot 提供了一个便捷、快速、可靠的开发框架,可以与微信公众号无缝结合,帮助开发者快速构建和部署功能丰富的微信公众号应用程序。无论是小型企业还是大型企业,利用 Spring Boot 可以极大地简化微信公众号的开发和运维工作,提升开发效率和用户体验。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值