diff --git a/pom.xml b/pom.xml index d385a47..b482ee3 100644 --- a/pom.xml +++ b/pom.xml @@ -118,6 +118,11 @@ spring-security-test test + + com.alibaba + fastjson + 1.2.83 + diff --git a/src/main/java/com/example/admin_server/config/SecurityConfig.java b/src/main/java/com/example/admin_server/config/SecurityConfig.java index 6068a2f..5f01e7b 100644 --- a/src/main/java/com/example/admin_server/config/SecurityConfig.java +++ b/src/main/java/com/example/admin_server/config/SecurityConfig.java @@ -38,7 +38,8 @@ public class SecurityConfig { "/swagger-ui/**", "/v3/api-docs/**", "/api/public/**", - "/api/admin/login" + "/api/admin/login", + "/api/client/wx/login" ).permitAll() .antMatchers("/api/admin/**").authenticated() .antMatchers("/api/client/**").authenticated() diff --git a/src/main/java/com/example/admin_server/config/WxConfig.java b/src/main/java/com/example/admin_server/config/WxConfig.java new file mode 100644 index 0000000..4afb85a --- /dev/null +++ b/src/main/java/com/example/admin_server/config/WxConfig.java @@ -0,0 +1,15 @@ +package com.example.admin_server.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "wx") +@Data +public class WxConfig { + private String appid; + private String secret; + private String jscode2sessionUrl; +} + diff --git a/src/main/java/com/example/admin_server/controller/client/WxLoginController.java b/src/main/java/com/example/admin_server/controller/client/WxLoginController.java new file mode 100644 index 0000000..ee2add5 --- /dev/null +++ b/src/main/java/com/example/admin_server/controller/client/WxLoginController.java @@ -0,0 +1,64 @@ +package com.example.admin_server.controller.client; + +import com.alibaba.fastjson.JSONObject; +import com.example.admin_server.common.Result; +import com.example.admin_server.config.WxConfig; +import com.example.admin_server.model.dto.WxLoginDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/api/client/wx") +@RequiredArgsConstructor +@Api(tags = {"微信登录"}) +public class WxLoginController { + + private final WxConfig wxConfig; + + @PostMapping("/login") + @ApiOperation(value = "微信登录") + public Result wxLogin(@RequestBody WxLoginDTO request) { + String code = request.getCode(); + if (code == null || code.isEmpty()) { + return Result.fail("code 参数不能为空"); + } + + // 构造请求微信的 URL + String url = wxConfig.getJscode2sessionUrl() + + "?appid=" + wxConfig.getAppid() + + "&secret=" + wxConfig.getSecret() + + "&js_code=" + code + + "&grant_type=authorization_code"; + + // 请求微信服务器 + RestTemplate restTemplate = new RestTemplate(); + String response = restTemplate.getForObject(url, String.class); + + // 解析微信响应 + JSONObject jsonObject = JSONObject.parseObject(response); + String openid = jsonObject.getString("openid"); + String sessionKey = jsonObject.getString("session_key"); + + if (openid == null) { + String errMsg = jsonObject.getString("errmsg"); + return Result.fail("微信登录失败: " + errMsg); + } + + // TODO: 你可以在这里用 openid 查数据库,创建或更新用户,生成 JWT 等 + + Map resultData = new HashMap<>(); + resultData.put("openid", openid); + resultData.put("token", "mock-token-" + openid); // 后期你可以用 JWT 替换这里 + + return Result.ok("登录成功", resultData); + } +} diff --git a/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java index 95c6a8b..3379460 100644 --- a/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java @@ -29,6 +29,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { WHITELIST.add("/api/admin/login"); WHITELIST.add("/api/client/login"); WHITELIST.add("/api/employee/login"); + WHITELIST.add("/api/client/wx/login"); // 也可以放其它公开接口 } diff --git a/src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java b/src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java new file mode 100644 index 0000000..83a8d7f --- /dev/null +++ b/src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java @@ -0,0 +1,12 @@ +package com.example.admin_server.model.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class WxLoginDTO { + + @NotBlank + private String code; +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 58bf9eb..5c31755 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -21,27 +21,11 @@ app: jwt: secret: 's9TfkPeAKJOlDw4ox3r6VhAMG7KfI0RK' expiration: 86400000 - -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee +wx: + appid: wxf204145820676bb2 + secret: 642108612e162db4edb9cf01d7f6d474 + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session knife4j: enable: true - setting: - language: zh_cn diff --git a/src/main/resources/application-prop.yml b/src/main/resources/application-prop.yml index 7772ee4..b210cf3 100644 --- a/src/main/resources/application-prop.yml +++ b/src/main/resources/application-prop.yml @@ -21,27 +21,11 @@ app: jwt: secret: '2n9g8b5TfsYLBZGFwE5ImpeQH5u0djEl' expiration: 86400000 - -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee + wx: + appid: your_app_id + secret: your_app_secret + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session knife4j: enable: true - setting: - language: zh_cn diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 4e6fafa..085a18d 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -21,27 +21,11 @@ app: jwt: secret: 'ylZS9cQ40nBvcZxJKu9zCIDt096BpZbm' expiration: 86400000 - -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee + wx: + appid: your_app_id + secret: your_app_secret + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session knife4j: enable: true - setting: - language: zh_cn diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 07b0308..f1548ac 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,7 +13,7 @@ spring: time-zone: GMT+8 # 指定当前激活环境 profiles: - active: test + active: dev datasource: url: jdbc:mysql://localhost:3306/admin_server?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai username: admin_server @@ -24,28 +24,12 @@ app: jwt: secret: 'mwsK9Ol9Ni2IyTvcdgFDVBxatw8QWx2o' expiration: 86400000 + wx: + appid: your_app_id + secret: your_app_secret + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee - knife4j: enable: true - setting: - language: zh_cn