Fancy
2024-12-26 2c5f5e7091330a748257baab82e81038a0d22816
JWT have some error
3个文件已修改
1个文件已添加
81 ■■■■■ 已修改文件
pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/daoMp/MpOpenIdMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pms-parent/pms-global/src/main/resources/mapper/MpOpenIdMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/daoMp/MpOpenIdMapper.java
@@ -24,4 +24,5 @@
    int updateByPrimaryKey(MpOpenId record);
    MpOpenId getInfoByOpenId(String openid);
}
pms-parent/pms-global/src/main/resources/mapper/MpOpenIdMapper.xml
@@ -28,6 +28,12 @@
        from mp_open_id
        where  id = #{id,jdbcType=BIGINT} 
    </select>
    <select id="getInfoByOpenId" parameterType="java.lang.String" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from mp_open_id
        where  open_id = #{open_id,jdbcType=VARCHAR}
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
        delete from mp_open_id
pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java
@@ -1,7 +1,10 @@
package com.dy.pmsWechat.login;
import com.alibaba.fastjson2.JSONObject;
import com.dy.pmsGlobal.daoMp.MpOpenIdMapper;
import com.dy.pmsGlobal.pojoMp.MpOpenId;
import com.dy.pmsWechat.util.RestTemplateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -22,9 +25,15 @@
    private String loginUrl;
    private final RestTemplateUtil restTemplateUtil;
    private MpOpenIdMapper mpOpenIdDao;
    public WeChatService(RestTemplateUtil restTemplateUtil) {
        this.restTemplateUtil = restTemplateUtil;
    }
    @Autowired
    private void setMpOpenIdDao(MpOpenIdMapper mpOpenIdDao) {
        this.mpOpenIdDao = mpOpenIdDao;
    }
    public JSONObject login(String code) throws IOException {
@@ -34,7 +43,22 @@
        queryParams.put("js_code", code);
        queryParams.put("grant_type", "authorization_code");
        Map<String, String> headerParams = new HashMap<>();
        return restTemplateUtil.get(loginUrl, queryParams, headerParams);
        JSONObject  wxMpUser = restTemplateUtil.get(loginUrl, queryParams, headerParams);
        //获取微信信息添加到数据库  //先根据openid查询用户信息
        MpOpenId userInfo = mpOpenIdDao.getInfoByOpenId(wxMpUser.get("openid").toString());
        if(userInfo == null){ //数据库没有时添加到数据库中
            userInfo = new MpOpenId();
            userInfo.setOpenId(wxMpUser.get("openid").toString());
            mpOpenIdDao.insert(userInfo);
        }
        //授权完成之后,跳转到具体的功能页面
        //生成token,按照一定规则生成字符串,可以包含用户信息
        String token= JwtHelper.createToken(userInfo.getId(),userInfo.getNickName());
        //localhost:8080/weixin?a=1&token=222
        if(returnUrl.indexOf("?")==-1){//若returnUrl中没有参数
            return "redirect:"+returnUrl+"?token="+token;
        }else{
            return "redirect:"+returnUrl+"&token="+token;
        }
    }
}
pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java
New file
@@ -0,0 +1,46 @@
package com.dy.pmsWechat.util;
import cn.hutool.jwt.Claims;
import com.alibaba.druid.util.StringUtils;
public class JwtUtil {
    //token字符串有效时间
    private static long tokenExpiration = 24*60*60*1000;
    //加密编码秘钥
    private static String tokenSignKey = "123456";
    //根据userid  和  username 生成token字符串
    public static String createToken(Long userId, String userName) {
        String token = Jwts.builder()
                //设置token分类
                .setSubject("GGKT-USER")
                //token字符串有效时长
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                //私有部分(用户信息)
                .claim("userId", userId)
                .claim("userName", userName)
                //根据秘钥使用加密编码方式进行加密,对字符串压缩
                .signWith(SignatureAlgorithm.HS512, tokenSignKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }
    //从token字符串获取userid
    public static Long getUserId(String token) {
        if(StringUtils.isEmpty(token)) return null;
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer userId = (Integer)claims.get("userId");
        return userId.longValue();
    }
    //从token字符串获取getUserName
    public static String getUserName(String token) {
        if(StringUtils.isEmpty(token)) return "";
        Jws<Claims> claimsJws
                = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return (String)claims.get("userName");
    }
}