From a0801ab3f16bd3d967c220c5925ad02673ce1baa Mon Sep 17 00:00:00 2001
From: 彭雪彬 <1724387007@qq.com>
Date: Tue, 15 Jul 2025 15:24:16 +0800
Subject: [PATCH] 骑手微信登录

---
 oying-system/src/main/java/com/oying/modules/security/config/WeiXinProperties.java    |    4 ++
 oying-system/src/main/resources/config/application-dev.yml                            |    4 ++
 oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java |    5 ++
 oying-system/src/main/java/com/oying/modules/system/domain/User.java                  |    4 ++
 oying-system/src/main/java/com/oying/modules/system/service/UserService.java          |    3 +
 oying-system/src/main/resources/config/application-prod.yml                           |    4 ++
 oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java            |    3 +
 oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java        |   68 ++++++++++++++++++++++++++++++++++
 oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java      |    8 ++++
 oying-system/src/main/resources/mapper/system/UserMapper.xml                          |   11 +++++
 10 files changed, 113 insertions(+), 1 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/security/config/WeiXinProperties.java b/oying-system/src/main/java/com/oying/modules/security/config/WeiXinProperties.java
index cd8eb34..23fb1a7 100644
--- a/oying-system/src/main/java/com/oying/modules/security/config/WeiXinProperties.java
+++ b/oying-system/src/main/java/com/oying/modules/security/config/WeiXinProperties.java
@@ -12,6 +12,10 @@
     private String appId;
     // APP密钥
     private String appSecret;
+    // 骑手小程序APPID
+    private String riderAppId;
+    // 骑手小程序密钥
+    private String riderAppSecret;
     // 跳转小程序类型
     private String miniProgramState;
     /*access_token的KEY*/
diff --git a/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java b/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java
index 4141c9b..67ef05d 100644
--- a/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java
+++ b/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java
@@ -224,6 +224,74 @@
         user1.setRoles(roles);
     }
 
+    @Log("骑手小程序:微信授权登录")
+    @ApiOperation("骑手小程序:微信授权登录")
+    @AnonymousPostMapping(value = "/rider/login/weixin")
+    public ResponseEntity<Object> riderLoginWeixin(@Validated @RequestBody AuthUserWeixinDto authUser, HttpServletRequest request) throws Exception {
+        JSONObject jsonObject;
+        switch (authUser.getType()) {
+            case OLD:
+                jsonObject = weiXinService.code2SessionRider(authUser.getCode());
+                String openid = jsonObject.getString("openid");
+                User userDto = userService.findByRiderOpenId(openid);
+                if (userDto == null) {
+                    return ResponseEntity.ok(R.success(openid));
+                }
+                authUser.setUsername(userDto.getUsername());
+                break;
+            case NEW:
+                jsonObject = weiXinService.getPhoneNumber(authUser.getCode());
+                String phone = jsonObject.getJSONObject("phone_info").getString("purePhoneNumber");
+                User user1 = userService.findByName(phone);
+                if (user1 == null) {
+                    //创建用户
+                    User user = new User();
+                    user.setUsername(phone);
+                    user.setNickName("OYING-" + phone);
+                    user.setUserType(ConstantsKey.RIDER);
+                    user.setPhone(phone);
+                    user.setGender("男");
+                    user.setEnabled(true);
+                    getRole(user);
+                    user.setPassword(passwordEncoder.encode(phone.substring(phone.length() - 6)));
+                    user.setOpenid(authUser.getUsername());
+                    userService.create(user);
+                } else {
+                    if (user1.getUserType().equals(ConstantsKey.RIDER)) {
+                        if (user1.getRoles() == null) {
+                            getRole(user1);
+                        }
+                    }
+                    user1.setOpenid(authUser.getUsername());
+                    userService.update(user1);
+                }
+                authUser.setUsername(phone);
+                break;
+            default:
+                throw new BadRequestException("登录类型错误");
+
+        }
+        // 获取用户信息
+        JwtUserDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername());
+        Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities());
+        SecurityContextHolder.getContext().setAuthentication(authentication);
+        // 生成令牌
+        String token = tokenProvider.createToken(jwtUser);
+        // 返回 token 与 用户信息
+        Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
+            put("token", properties.getTokenStartWith() + token);
+            put("user", jwtUser);
+        }};
+        if (loginProperties.isSingleLogin()) {
+            // 踢掉之前已经登录的token
+            onlineUserService.kickOutForUsername(authUser.getUsername());
+        }
+        // 保存在线信息
+        onlineUserService.save(jwtUser, token, request);
+        // 返回登录信息
+        return ResponseEntity.ok(R.success(authInfo));
+    }
+
     @ApiOperation("临时授权")
     @AnonymousGetMapping(value = "/token")
     public ResponseEntity<Object> loginTest(@RequestParam String username, HttpServletRequest request) {
diff --git a/oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java b/oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java
index 0c3efe8..4281552 100644
--- a/oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java
+++ b/oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java
@@ -72,6 +72,14 @@
         return JSONObject.parseObject(HttpRequest.exchangeString(HttpMethod.GET, url, null));
     }
 
+    public JSONObject code2SessionRider(String js_code) {
+        String url = weiXinProperties.getCode2Session();
+        url = url.replace("{appid}", weiXinProperties.getRiderAppId())
+                .replace("{secret}", weiXinProperties.getRiderAppSecret())
+                .replace("{js_code}", js_code);
+        return JSONObject.parseObject(HttpRequest.exchangeString(HttpMethod.GET, url, null));
+    }
+
     /**
      * POST 获取手机号 该接口用于将code换取用户手机号。 说明,每个code只能使用一次,code的有效期为5min。
      *
diff --git a/oying-system/src/main/java/com/oying/modules/system/domain/User.java b/oying-system/src/main/java/com/oying/modules/system/domain/User.java
index a35686a..7199747 100644
--- a/oying-system/src/main/java/com/oying/modules/system/domain/User.java
+++ b/oying-system/src/main/java/com/oying/modules/system/domain/User.java
@@ -77,6 +77,10 @@
     @ApiModelProperty(value = "最后修改密码的时间", hidden = true)
     private Date pwdResetTime;
 
+    @ApiModelProperty(value = "骑手openid")
+    private String riderOpenId;
+
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
diff --git a/oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java b/oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java
index 928ffcc..e978d5a 100644
--- a/oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java
+++ b/oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java
@@ -29,6 +29,8 @@
 
     User findByOpenid(@Param("openid") String openid);
 
+    User findByRiderOpenId(@Param("riderOpenId") String riderOpenId);
+
     User findByEmail(@Param("email") String email);
 
     User findByPhone(@Param("phone") String phone);
@@ -48,4 +50,5 @@
     int countByRoles(@Param("roleIds") Set<Long> roleIds);
 
     void resetPwd(@Param("userIds") Set<Long> userIds, @Param("pwd") String pwd);
+
 }
diff --git a/oying-system/src/main/java/com/oying/modules/system/service/UserService.java b/oying-system/src/main/java/com/oying/modules/system/service/UserService.java
index 20807ba..6ef8470 100644
--- a/oying-system/src/main/java/com/oying/modules/system/service/UserService.java
+++ b/oying-system/src/main/java/com/oying/modules/system/service/UserService.java
@@ -55,6 +55,8 @@
 
     User findByOpenid(String openId);
 
+    User findByRiderOpenId(String riderOpenId);
+
     /**
      * 根据用户名查询
      * @param userName /
@@ -120,4 +122,5 @@
      * @param pwd 密码
      */
     void resetPwd(Set<Long> ids, String pwd);
+
 }
diff --git a/oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java b/oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java
index 46b0cad..615e03e 100644
--- a/oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java
@@ -174,6 +174,11 @@
     }
 
     @Override
+    public User findByRiderOpenId(String riderOpenId) {
+        return userMapper.findByRiderOpenId(riderOpenId);
+    }
+
+    @Override
     public User getLoginData(String userName) {
         return userMapper.findByUsername(userName);
     }
diff --git a/oying-system/src/main/resources/config/application-dev.yml b/oying-system/src/main/resources/config/application-dev.yml
index 36ab729..e293ada 100644
--- a/oying-system/src/main/resources/config/application-dev.yml
+++ b/oying-system/src/main/resources/config/application-dev.yml
@@ -132,6 +132,10 @@
   app-id: wx2273296a5569cbad
   # AppSecret
   app-secret: 4526d72d885be322b17d0694cd6d03f1
+  # riderAppId
+  rider-app-id: wx2273296a5569cbad
+  # riderAppSecret
+  rider-app-secret: 4526d72d885be322b17d0694cd6d03f1
   # 跳转小程序类型 developer为开发版;trial为体验版;formal为正式版;默认为正式版
   mini-program-state: trial
   #  access_token的KEY
diff --git a/oying-system/src/main/resources/config/application-prod.yml b/oying-system/src/main/resources/config/application-prod.yml
index 02030c1..5818528 100644
--- a/oying-system/src/main/resources/config/application-prod.yml
+++ b/oying-system/src/main/resources/config/application-prod.yml
@@ -143,6 +143,10 @@
   app-id: wx2273296a5569cbad
   # AppSecret
   app-secret: 4526d72d885be322b17d0694cd6d03f1
+  # riderAppId
+  rider-app-id: wx2273296a5569cbad
+  # riderAppSecret
+  rider-app-secret: 4526d72d885be322b17d0694cd6d03f1
   # 跳转小程序类型 developer为开发版;trial为体验版;formal为正式版;默认为正式版
   mini-program-state: trial
   #  access_token的KEY
diff --git a/oying-system/src/main/resources/mapper/system/UserMapper.xml b/oying-system/src/main/resources/mapper/system/UserMapper.xml
index b877335..c6a3a84 100644
--- a/oying-system/src/main/resources/mapper/system/UserMapper.xml
+++ b/oying-system/src/main/resources/mapper/system/UserMapper.xml
@@ -6,6 +6,7 @@
         <result column="user_username" property="username"/>
         <result column="user_user_type" property="userType"/>
         <result column="user_openid" property="openid"/>
+        <result column="user_rider_open_id" property="riderOpenId"/>
         <result column="user_nick_name" property="nickName"/>
         <result column="user_email" property="email"/>
         <result column="user_phone" property="phone"/>
@@ -30,7 +31,7 @@
 
     <sql id="Base_Column_List">
         u.user_id as user_user_id, u.username as user_username,
-        u.user_type as user_user_type,u.openid as user_openid,
+        u.user_type as user_user_type,u.openid as user_openid,u.rider_open_id as user_rider_open_id,
            u.nick_name as user_nick_name, u.email as user_email, u.phone as user_phone,
            u.gender as user_gender, u.avatar_name as user_avatar_name, u.avatar_path as user_avatar_path,
            u.enabled as user_enabled, u.pwd_reset_time as user_pwd_reset_time, u.create_by as user_create_by,
@@ -108,6 +109,14 @@
         where u.openid = #{openid}
     </select>
 
+    <select id="findByRiderOpenId" resultMap="BaseResultMap">
+        select
+        u.password user_password, u.is_admin user_is_admin,
+        <include refid="Base_Column_List"/>
+        from sys_user u
+        where u.rider_open_id = #{riderOpenId}
+    </select>
+
     <select id="findByEmail" resultType="com.oying.modules.system.domain.User">
         select user_id as id, username from sys_user
         where email = #{email}

--
Gitblit v1.9.3