JAVA(SpringBoot)对接微信登录

这篇具有很好参考价值的文章主要介绍了JAVA(SpringBoot)对接微信登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 申请测试账号

1.1 登录测试平台

1.2 配置接口配置信息

​编辑

1.3 配置JS接口安全域名

1.4 配置网页授权获取用户基本信息

 2:接口代码

 2.1 微信登录流程

2.2 依赖导入:

2.2.1 工具类:

2.3 创建微信用户实体类

2.4 接口功能

3 测试



1 申请测试账号

1.1 登录测试平台

链接: 微信公众平台测试java对接微信登录,微信,spring,java

1.2 配置接口配置信息

在这一步,需要拥有能接入公网的服务器,或者利用内网穿透将自己的接口暴漏给微信,让微信的回调能成功访问到我们的接口

在可以将我们的接口暴漏在公网的前提下,我们可以书写接口配置接口配置信息的URL:(注意:这里只是简单配置URL,未添加验证微信服务器流程,详细配置请参考:点击进入)

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/weChat")
public class WeChatController{

    @GetMapping("/verifyToken")
    public String verifyToken(HttpServletRequest request) {
        return request.getParameter("echostr");
    }

}

比如我们的服务器地址是 119.3.248.100 ,上述服务部署在了该服务器8080端口上,那么按照上述代码的路径,URL就可配置为:http://119.3.248.100:8080/weChat/verifyToken (有域名使用域名即可)

java对接微信登录,微信,spring,java

1.3 配置JS接口安全域名

在测试公众号中,可以使用 IP + 端口 的形式设置安全域名,这里的域名填写上述服务你所部署的服务器地址即可 

java对接微信登录,微信,spring,java

1.4 配置网页授权获取用户基本信息

 这里的授权回调页面域名和JS接口安全域名保持一致即可

java对接微信登录,微信,spring,java


 2:接口代码

 2.1 微信登录流程

微信客户端发送登录请求 -> 访问微信授权接口 -> 微信回调,j将授权code发送到我们的服务器 -> 通过code,appid,appsecret获取微信针对该用户的accsess_token,openid等信息-> 通过accsess_token,openid获取用户信息

java对接微信登录,微信,spring,java

2.2 依赖导入:

在下叙代码中使用到了hutool的工具类,swagger的工具类,通过maven的pom文件导入:(注:实体类使用了一些mybatis-plus的注解,如无用删除即可)

<!--        hutool工具依赖-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.10</version>
        </dependency>

     <!-- Swagger3 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter -->
        <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>3.0.3</version>
        </dependency>

2.2.1 工具类:



import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;

/**
 * 微信登录工具类
 *
 * @author 
 * @date 2023/11/1 15:28
 */
public class WeiXinUtil {

    private static final String appId = "xxxx";
    private static final String appsecret = "xxxx";
    private static final String getCodeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize";
    private static final String redirectUrl = "http://xxxxx/v1/login/getAccessToken";
    private static final String getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
    private static final String refreshTokenUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token";
    private static final String getUserInfo = "https://api.weixin.qq.com/sns/userinfo";

    /**
     * 获取微信授权code
     * @param state 附加信息
     * @return
     */
    public static String getCode(String state) {
        try {
            StringBuffer url = new StringBuffer();
            url.append("redirect:")
                    .append(getCodeUrl)
                    .append("?appid=")
                    .append(appId)
                    .append("&redirect_uri=")
                    .append(URLEncoder.encode(redirectUrl, "UTF-8"))
                    .append("&response_type=code&scope=snsapi_userinfo&state=")
                    .append(state)
                    .append("#wechat_redirect");
            return url.toString();
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("URL格式化异常");
        }

    }

    /**
     * 获取微信AccessToken
     * @param code 用户code
     * @return
     */
    public static Map<?, ?> getAccessToken(String code) {
        StringBuffer url = new StringBuffer();
        url.append(getAccessTokenUrl)
                .append("?appid=")
                .append(appId)
                .append("&secret=")
                .append(appsecret)
                .append("&code=")
                .append(code)
                .append("&grant_type=authorization_code");
        String rs = HttpUtil.get(url.toString());
        Map map = JSONObject.parseObject(rs, Map.class);
        if (null == map.get("errcode")) {
            return map;
        } else {
            throw new RuntimeException("获取access_token出错");
        }
    }

    /**
     * 刷新AccessToken
     * @param refreshToken
     * @return
     */
    public static Map refreshToken(String refreshToken) {
        StringBuffer url = new StringBuffer();
        url.append(refreshTokenUrl)
                .append("?appid=")
                .append(appId)
                .append("&grant_type=refresh_token&refresh_token=")
                .append(refreshToken);
        String rs = HttpUtil.get(url.toString());
        Map map = JSONObject.parseObject(rs, Map.class);
        if (null == map.get("errcode")) {
            return map;
        } else {
            throw new RuntimeException("刷新access_token出错");
        }
    }

    /**
     * 获取用户信息
     * @param accessToken
     * @param openid
     * @return
     */
    public static String getUserInfo(String accessToken, String openid) {
        StringBuffer url = new StringBuffer();
        url.append(getUserInfo)
                .append("?access_token=")
                .append(accessToken)
                .append("&openid=")
                .append(openid)
                .append("&lang=zh_CN");
        String rs = HttpUtil.get(url.toString());
        return rs;
    }
}

2.3 创建微信用户实体类


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 *
 * 微信用户信息
 * @author 
 * @date 2023/11/1 16:20
 */
@TableName(value = "wx_user")
@Data
public class WXUser implements Serializable {
    private static final long serialVersionUID = -40356785423868312L;

    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 系统用户id
     */
    private Long userId;
    /**
     * 用户的唯一标识
     */
    private String openid;
    /**
     * access_token
     */
    private String accessToken;

    /**
     * refresh_token
     */
    private String refreshToken;
    /**
     * 用户昵称
     */
    private String nickname;
    /**
     * 性别(0未知,1男性,2女性)
     */
    private String sex;
    /**
     * 用户个人资料填写的省份
     */
    private String province;
    /**
     * 普通用户个人资料填写的城市
     */
    private String city;
    /**
     * 国家,如中国为CN
     */
    private String country;
    /**
     * 用户头像
     */
    private String headimgurl;
    /**
     * 用户特权信息,json 数组
     */
    private String privilege;
    /**
     *
     */
    private String unionid;

    private Date createTime;

    private Date updateTime;

    private Long createBy;

    private Long updateBy;
}

2.4 接口功能

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/weChat")
public class WeChatController{

    @ResponseBody
    @GetMapping("/verifyToken")
    @ApiOperation("微信Token验证")
    public String verifyToken(HttpServletRequest request) {
        return request.getParameter("echostr");
    }

    @GetMapping("/getCode")
    @ApiOperation("获取微信code")
    public String weiXinLogin(@RequestParam(defaultValue = "123") String state) {
        return WeiXinUtil.getCode(state);
    }

    @ResponseBody
    @GetMapping("/getAccessToken")
    @ApiOperation("获取token")
    public String getAccessToken(@RequestParam String code) {
        Map result = WeiXinUtil.getAccessToken(code);
        String accessToken = result.get("access_token").toString();
        String refreshToken = result.get("refresh_token").toString();
        String openid = result.get("openid").toString();
        WXUser wxUser = new WXUser();
        wxUser.setAccessToken(accessToken);
        wxUser.setRefreshToken(refreshToken);
        wxUser.setCreateTime(new Date());
        wxUser.setUserId(1L);
        wxUser.setOpenid(openid);
        wxUserService.save(wxUser);
        return "<h1>看样子成功了,没你事了退下吧</h1>";
    }

    @ResponseBody
    @GetMapping("/refreshToken")
    @ApiOperation("刷新token")
    public R refreshToken() {
        Long userId = 1L;
        WXUser wxUser = wxUserService.getOne(new LambdaUpdateWrapper<WXUser>().eq(WXUser::getUserId, userId));
        Map result = WeiXinUtil.refreshToken(wxUser.getRefreshToken());
        String accessToken = result.get("access_token").toString();
        String refreshToken = result.get("refresh_token").toString();
        WXUser wxUserUpdate = new WXUser();
        wxUserUpdate.setId(wxUser.getId());
        wxUserUpdate.setAccessToken(accessToken);
        wxUserUpdate.setRefreshToken(refreshToken);
        wxUserUpdate.setUpdateTime(new Date());
        wxUserService.updateById(wxUserUpdate);
        return R.data(accessToken);
    }

    @ResponseBody
    @GetMapping("/getUserInfo")
    @ApiOperation("获取用户信息")
    public R getUserInfo() {
        Long userId = 1L;
        WXUser wxUser = wxUserService.getOne(new LambdaUpdateWrapper<WXUser>().eq(WXUser::getUserId, userId));
        String accessToken = wxUser.getAccessToken();
        String openid = wxUser.getOpenid();
        String userInfoJsom = WeiXinUtil.getUserInfo(accessToken, openid);
        WXUser userInfo = JSONObject.parseObject(userInfoJsom, WXUser.class);
        userInfo.setId(wxUser.getId());
        userInfo.setUpdateTime(new Date());
        wxUserService.updateById(userInfo);
        return R.data(userInfo);
    }

}

3 测试

微信扫码关注测试公众号

java对接微信登录,微信,spring,java

生成一个二维码调用获取code的接口,百度搜索  将获取code的URL路径填入码,手机微信扫码即可 : 草料文本二维码生成器,微信通过此入口即可访问获取code的页面, 注意:一定要使用手机微信客户端扫码二维码

java对接微信登录,微信,spring,java

流程:

获取code中的 redirect_uri 参数可以配置为我们的微信登录接口,这里为了演示功能,配置成了获取access_token 的接口

1. 通过获取code的接口,微信会通过我们配置的redirect_uri参数回调我们的接口,并会携带上code参数,同时注意此接口不要添加@ResponseBody 的注解

2. 微信回调获取access_token的接口,我们可以获取到access_token,refresh_token,openid这三个重要参数,这也是获取用户个人信息的关键

3. 刷新access_token的步骤可省略,有需要时可以调用此功能

4. 获取用户信息,这里获取用户信息的前提是我们在获取code的接口中,参数中的授权范围参数写为snsapi_userinfo 文章来源地址https://www.toymoban.com/news/detail-850285.html

到了这里,关于JAVA(SpringBoot)对接微信登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Uniapp + SpringBoot 开发微信H5项目 微信公众号授权登录 JAVA后台(一、配置使用微信公众平台测试公众号)

    一、接口配置信息填写校验 这里需要填写一个URL和一个Token验证字符串 我这里是用了natapp内网穿透 将本地的后台8080端口服务映射到了 http://x7zws8.natappfree.cc https://natapp.cn/在natapp官网注册账号并且申请免费隧道 申请完了之后把域名绑定到自己的后台 后台接口: SHA1: AesExcep

    2024年03月13日
    浏览(46)
  • java对接企业微信

    一、注册企业微信 1.1 简介   企业微信与微信具有一样的体验,通过企业内部与外部客户的管理,构建出社群生态。企业微信提供丰富的api进行调用获取数据管理,也提供各种回调事件。 1.2 注册   登录官网,一键注册即可。链接: 企业微信 1.2 填写主要信息   企业微

    2023年04月09日
    浏览(29)
  • java(springboot)对接elasticsearch8+

    注:jackson包es只用到了databind,之所以全部引用是因为actuator用到了其他,只升级一个会 导致版本冲突 注:因为没有用springboot自身的es插件所以健康检查检测不到es状态,关闭es检测 上边创建索引是定制的加了特殊mapping,正常这样

    2024年02月16日
    浏览(45)
  • 微信小程序支付-java对接微信

     一共是两个方法: 一个方法后台生成预支付订单,得到预支付交易会话标识prepay_id,传给前端,让前端调起小程序支付; 一个是支付回调 目录 一、生成预支付订单  注意: 二、 支付回调         封装参数向微信发送生成预支付交易单请求,微信会返回一个prepay_id,再将

    2024年02月12日
    浏览(50)
  • Java对接微信支付(史上最详细)

    本文将介绍如何使用Java对接微信支付,包括获取支付参数、支付回调处理等步骤。本文适用于已经熟悉微信支付基本原理的读者。 JDK 1.8 Maven Spring Boot 2.x 微信支付开发文档 为了进行支付,我们需要先获取微信支付的参数信息,包括appid、商户id、支付密钥等。 配置文件 我们

    2024年02月15日
    浏览(42)
  • 微信支付-超详细java开发-小程序对接

    本文适用于有一定基础的开发者,简单易通。后台用的的是java,我用的是springBoot,其它框架基本同理,前端就是一个简单的demo。微信官方提供了V2和V3两种方式,本文基于V2版支付开发(后续更新V3)。V2和V3版本区别 1.思路介绍 本次以微信小程序开发为例,如果自己想要玩一

    2024年02月09日
    浏览(59)
  • java对接微信支付:JSAPI支付成功之“微信回调”

    承接上一篇微信支付,现在简单说一下 微信支付回调 目录 一、支付回调 二、微信回调地址问题 1.本地/上线测试 2.控制器调用接口(代码) 总结 当用户支付成功之后,支付平台会向我们指定的服务器接口发送请求传递订单支付状态数据 如果你是再本地进行测试,那就需要使用

    2024年02月12日
    浏览(41)
  • java对接微信支付:JSAPI支付(微信公众号支付)

    本文是【微信JSAPI支付】文章,主要讲解商户对接微信支付,简洁版测试 文章目录 一、JSAPI支付接入前准备 二、代码片段 1.引入Maven依赖 2.后端业务请求接口 3.前端调起支付请求方法 总结 1、JSAPI支付首先需要注册、认证一个公众号(大概300块一年) 微信公众号注册 2、申请成为

    2024年02月08日
    浏览(62)
  • Java 微信小程序-发货信息录入接口 对接代码

    微信小程序-发货信息录入接口开发文档 POST https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=ACCESS_TOKEN 参见「查询物流公司编码列表」对接代码

    2024年02月03日
    浏览(70)
  • 基于Java+SpringBoot+Vue前后端分离农商对接系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 2022-2024年

    2024年02月09日
    浏览(101)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包