From 2c5f5e7091330a748257baab82e81038a0d22816 Mon Sep 17 00:00:00 2001
From: Fancy <Fancy.fx@outlook.com>
Date: 星期四, 26 十二月 2024 10:25:30 +0800
Subject: [PATCH] JWT have some error

---
 pms-parent/pms-global/src/main/resources/mapper/MpOpenIdMapper.xml                |    6 +++
 pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/daoMp/MpOpenIdMapper.java    |    1 
 pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java |   28 +++++++++++++-
 pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java        |   46 +++++++++++++++++++++++
 4 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/daoMp/MpOpenIdMapper.java b/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/daoMp/MpOpenIdMapper.java
index ad2844c..f0b1c1e 100644
--- a/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/daoMp/MpOpenIdMapper.java
+++ b/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);
 }
diff --git a/pms-parent/pms-global/src/main/resources/mapper/MpOpenIdMapper.xml b/pms-parent/pms-global/src/main/resources/mapper/MpOpenIdMapper.xml
index 6cea7d0..ce6fba1 100644
--- a/pms-parent/pms-global/src/main/resources/mapper/MpOpenIdMapper.xml
+++ b/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
diff --git a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java
index ecc98e2..f912145 100644
--- a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java
+++ b/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);
+        //鑾峰彇寰俊淇℃伅娣诲姞鍒版暟鎹簱  //鍏堟牴鎹畂penid鏌ヨ鐢ㄦ埛淇℃伅
+        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){//鑻eturnUrl涓病鏈夊弬鏁�
+            return "redirect:"+returnUrl+"?token="+token;
+        }else{
+            return "redirect:"+returnUrl+"&token="+token;
+        }
     }
 }
\ No newline at end of file
diff --git a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java
new file mode 100644
index 0000000..9d74256
--- /dev/null
+++ b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java
@@ -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;
+    }
+
+    //浠巘oken瀛楃涓茶幏鍙杣serid
+    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();
+    }
+
+    //浠巘oken瀛楃涓茶幏鍙杇etUserName
+    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");
+    }
+}

--
Gitblit v1.8.0