From 09ebdea2f9408a43a9062cbfca45c83583d57a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=AF=E8=88=AA=E8=80=81=E9=BD=90?= <280645618@qq.com> Date: Mon, 29 Dec 2025 14:38:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96pdd=E6=8E=88=E6=9D=83url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/qihangerp/gateway/TokenFilter.java | 1 + .../JwtAuthenticationTokenFilter.java | 13 +- .../cn/qihangerp/security/SecurityConfig.java | 1 + .../pdd/controller/PddOAuthController.java | 118 ++++++++++++++++-- .../src/main/resources/application.yml | 3 +- 5 files changed, 118 insertions(+), 18 deletions(-) diff --git a/api/gateway/src/main/java/cn/qihangerp/gateway/TokenFilter.java b/api/gateway/src/main/java/cn/qihangerp/gateway/TokenFilter.java index 31237f8b..21ec7928 100644 --- a/api/gateway/src/main/java/cn/qihangerp/gateway/TokenFilter.java +++ b/api/gateway/src/main/java/cn/qihangerp/gateway/TokenFilter.java @@ -29,6 +29,7 @@ public class TokenFilter implements GlobalFilter, Ordered { if(url.equals("/api/sys-api/login") || url.equals("/api/sys-api/getInfo") || url.equals("/api/sys-api/logout") || url.contains("/system/config") || url.contains("/captchaImage") + || url.contains("/oauth_callback") ) { // 登录页面 放行 diff --git a/core/security/src/main/java/cn/qihangerp/security/JwtAuthenticationTokenFilter.java b/core/security/src/main/java/cn/qihangerp/security/JwtAuthenticationTokenFilter.java index 6834abc9..20e20d6f 100644 --- a/core/security/src/main/java/cn/qihangerp/security/JwtAuthenticationTokenFilter.java +++ b/core/security/src/main/java/cn/qihangerp/security/JwtAuthenticationTokenFilter.java @@ -45,14 +45,15 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { // String token = exchange.getRequest().getHeaders().getFirst(TOKEN_HEADER); String token = request.getHeader("Authorization"); String url = request.getRequestURI(); - log.info("intercept " + url); +// log.info("intercept " + url); // log.info("token: " + token); || request.getRequestURI().equals("/getInfo") || request.getRequestURI().equals("/logout") if (request.getRequestURI().equals("/login") - || request.getRequestURI().contains("/login") - || request.getRequestURI().contains("/captchaImage") - || request.getRequestURI().contains("/order/get_detail") - || request.getRequestURI().contains("/refund/get_detail") - || request.getRequestURI().contains("/system/config") + || url.contains("/login") + || url.contains("/captchaImage") + || url.contains("/order/get_detail") + || url.contains("/refund/get_detail") + || url.contains("/system/config") + || url.contains("/oauth_callback") ) { // 登录页面,放行 || request.getRequestURI().equals("/order/get_detail") chain.doFilter(request, response); diff --git a/core/security/src/main/java/cn/qihangerp/security/SecurityConfig.java b/core/security/src/main/java/cn/qihangerp/security/SecurityConfig.java index fe51340c..b5b58355 100644 --- a/core/security/src/main/java/cn/qihangerp/security/SecurityConfig.java +++ b/core/security/src/main/java/cn/qihangerp/security/SecurityConfig.java @@ -67,6 +67,7 @@ public class SecurityConfig { .requestMatchers(HttpMethod.GET, "/system/config/**").permitAll() .requestMatchers(HttpMethod.GET, "/captchaImage").permitAll() .requestMatchers(HttpMethod.GET, "/api/sys-api/system/config/**").permitAll() + .requestMatchers("/pdd/oauth_callback").permitAll() // 允许直接访问授权登录接口 .requestMatchers(HttpMethod.POST, "/login").permitAll() .requestMatchers(HttpMethod.POST, "/api/sys-api/login").permitAll() diff --git a/microservices/pdd-api/src/main/java/cn/qihangerp/api/pdd/controller/PddOAuthController.java b/microservices/pdd-api/src/main/java/cn/qihangerp/api/pdd/controller/PddOAuthController.java index 5814d322..1adbc351 100644 --- a/microservices/pdd-api/src/main/java/cn/qihangerp/api/pdd/controller/PddOAuthController.java +++ b/microservices/pdd-api/src/main/java/cn/qihangerp/api/pdd/controller/PddOAuthController.java @@ -1,10 +1,9 @@ package cn.qihangerp.api.pdd.controller; - - import cn.qihangerp.api.pdd.PddTokenCreateBo; import cn.qihangerp.common.AjaxResult; import cn.qihangerp.common.enums.EnumShopType; +import cn.qihangerp.model.entity.OShop; import cn.qihangerp.model.entity.OShopPlatform; import cn.qihangerp.module.service.OShopPlatformService; import cn.qihangerp.module.service.OShopService; @@ -12,25 +11,36 @@ import cn.qihangerp.open.common.ApiResultVo; import cn.qihangerp.open.pdd.PddTokenApiHelper; import cn.qihangerp.open.pdd.model.Token; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import java.io.IOException; +import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; -@AllArgsConstructor +@Slf4j @RequestMapping("/pdd") @RestController public class PddOAuthController { - private final OShopService shopService; - private final OShopPlatformService platformService; -// @Autowired -// private IShopService shopService; -// @Autowired -// private ServerConfig serverConfig; - private static Logger log = LoggerFactory.getLogger(PddOAuthController.class); + @Autowired + private OShopService shopService; + @Autowired + private OShopPlatformService platformService; + + @Value("${qihangerp.auth-redirect-url:''}") + private String authRedirectUrl; + @GetMapping("/getOauthUrl") public AjaxResult oauth(@RequestParam Integer shopId) { @@ -40,7 +50,7 @@ public class PddOAuthController { String appKey = platform.getAppKey(); String appSercet = platform.getAppSecret(); - String url = "https://mms.pinduoduo.com/open.html?response_type=code&client_id=" + appKey + "&redirect_uri=" + URLEncoder.encode(platform.getRedirectUri()); + String url = "https://mms.pinduoduo.com/open.html?response_type=code&client_id=" + appKey + "&redirect_uri=" + URLEncoder.encode(platform.getRedirectUri())+"&state="+shopId; return AjaxResult.success("SUCCESS",url); } @@ -74,5 +84,91 @@ public class PddOAuthController { // } + /** + * 授权返回 + * @param request + * @return + * @throws IOException + */ + @GetMapping("/oauth_callback") + public void oauthCallback(HttpServletRequest request, HttpServletResponse response) throws IOException { + log.info("================Pdd授权返回=========="); + String shopId = request.getParameter("state"); + String code = request.getParameter("code"); + // 打印查询参数(URL中的参数) + request.getParameterMap().forEach((key, value) -> { + log.info("Request param: {} = {}", key, String.join(", ", value)); + }); + OShop shop = shopService.getById(shopId); + log.info("========获取店铺"); + if(shop==null) { + log.error("============店铺不存在========"); + sendJsonResponse(response, 500, "店铺不存在"); + return; + } + else if(shop.getType()!=EnumShopType.PDD.getIndex()) { + log.error("============非PDD店铺========"); + sendJsonResponse(response, 500, "非PDD店铺"); + return; + } + String appKey=""; + String appSecret=""; + if(StringUtils.hasText(shop.getAppKey())){ + appKey = shop.getAppKey(); + appSecret = shop.getAppSecret(); + + }else { + OShopPlatform oShopPlatform = platformService.selectById(EnumShopType.PDD.getIndex()); + appKey = oShopPlatform.getAppKey(); + appSecret = oShopPlatform.getAppSecret(); + + } + if (!StringUtils.hasText(appKey)) { + log.error("============平台参数设置错误,没有找到AppKey========"); + sendJsonResponse(response, 500, "平台参数设置错误,没有找到AppKey"); + return; + } + if (!StringUtils.hasText(appSecret)) { + log.error("============平台参数设置错误,没有找到AppSecret========"); + sendJsonResponse(response, 500, "平台参数设置错误,没有找到AppSecret"); + return; + } +// log.info("========获取平台参数:{}",appKey); +// PopAccessTokenClient accessTokenClient = new PopAccessTokenClient(appKey, appSecret); + + // 生成AccessToken + try { + ApiResultVo token = PddTokenApiHelper.getToken(appKey, appSecret, code); +// log.info("==========获取拼多多授权token:{}", JSONObject.toJSONString(token)); + if (token.getCode() != 0) { + log.error("===========获取拼多多授权token错误:" + token.getMsg()); + sendJsonResponse(response, 500, token.getMsg()); + return; + } + + //保存accessToken + shopService.updateSessionKey(shop.getId(),token.getData().getAccess_token()); + log.info("===========获取拼多多授权token成功=====SAVE===="); + } catch (Exception e) { + e.printStackTrace(); + log.error("=======获取拼多多AccessToken异常:{}",e.getMessage()); + sendJsonResponse(response, 500, e.getMessage()); + return; + } + log.info("======拼多多AccessToken获取成功========="); + response.sendRedirect(StringUtils.hasText(authRedirectUrl)?authRedirectUrl:"https://erp.qihangerp.cn/"); // 跳转到新页面 + } + + // 返回JSON响应 + private void sendJsonResponse(HttpServletResponse response, int code, String msg) throws IOException { + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + Map map = new HashMap<>(); + map.put("code", code); + map.put("msg", URLDecoder.decode(msg, "UTF-8")); + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(map); + response.getWriter().write(json); + } } diff --git a/microservices/pdd-api/src/main/resources/application.yml b/microservices/pdd-api/src/main/resources/application.yml index 35bc8f62..9bce237d 100644 --- a/microservices/pdd-api/src/main/resources/application.yml +++ b/microservices/pdd-api/src/main/resources/application.yml @@ -1,4 +1,5 @@ qihangerp: name: 启航电商ERP goods: - version: 2.4.21 \ No newline at end of file + version: 2.4.21 + auth-redirect-url: http://erp.qihangerp.cn:88 \ No newline at end of file