ソースを参照

Merge remote-tracking branch 'origin/master'

tianyunperfect 3 年 前
コミット
dbeed72232
20 ファイル変更417 行追加142 行削除
  1. 2 0
      book-dao/src/main/java/com/book/dao/cps/mapper/AdminConfigMapper.java
  2. 5 0
      book-dao/src/main/resources/mapper/cps/AdminConfigMapper.xml
  3. 3 3
      book-push/src/main/java/com/book/push/Application.java
  4. 185 22
      book-push/src/main/java/com/book/push/config/WxOpenInRedisBookConfigStorage.java
  5. 4 1
      book-push/src/main/java/com/book/push/cons/UrlCons.java
  6. 33 9
      book-push/src/main/java/com/book/push/controller/BookIndexController.java
  7. 36 34
      book-push/src/main/java/com/book/push/controller/WxRedirectController.java
  8. 1 0
      book-push/src/main/java/com/book/push/service/dao/AdminConfigService.java
  9. 5 0
      book-push/src/main/java/com/book/push/service/dao/impl/AdminConfigServiceImpl.java
  10. 19 1
      book-push/src/main/java/com/book/push/service/redis/RedisService.java
  11. 71 0
      book-push/src/main/java/com/book/push/service/redis/impl/RedisServiceImpl.java
  12. 2 1
      book-push/src/main/java/com/book/push/service/wx/WxThirdPartService.java
  13. 21 52
      book-push/src/main/java/com/book/push/service/wx/impl/WxThirdPartServiceImpl.java
  14. 5 0
      book-push/src/main/java/com/book/push/utils/JsonUtils.java
  15. 3 0
      book-push/src/main/java/com/book/push/vo/AuthorizerInfo.java
  16. 14 14
      book-push/src/main/resources/application-dev.yml
  17. 3 3
      book-push/src/main/resources/application-pro.yml
  18. 1 1
      book-push/src/main/resources/log4j2.xml
  19. 3 0
      book-server/src/main/java/com/book/server/config/Const.java
  20. 1 1
      book-server/src/main/java/com/book/server/service/impl/WxPayServiceImpl.java

+ 2 - 0
book-dao/src/main/java/com/book/dao/cps/mapper/AdminConfigMapper.java

@@ -23,4 +23,6 @@ public interface AdminConfigMapper {
     List<AdminConfig> selectAll();
 
     AdminConfig selectByAppid(@Param("appid")String appid);
+
+    List<AdminConfig> selectByPlatformId(@Param("platform_id") Integer id);
 }

+ 5 - 0
book-dao/src/main/resources/mapper/cps/AdminConfigMapper.xml

@@ -123,6 +123,11 @@
         where appid = #{appid,jdbcType=VARCHAR}
 
     </select>
+    <select id="selectByPlatformId" resultMap="BaseResultMap">
+        select *
+        from admin_config
+        where platform_id = #{platform_id,jdbcType=INTEGER}
+    </select>
     <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
         delete
         from admin_config

+ 3 - 3
book-push/src/main/java/com/book/push/Application.java

@@ -17,8 +17,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class);
-        System.out.println("----------------------------------------------------------------------------------");
-        System.out.println("--------              application book-push run success                 ----------");
-        System.out.println("----------------------------------------------------------------------------------");
+        System.out.println("---------------------------------------------------------------------------------------------------------------");
+        System.out.println("----------------     -         application book-push run success                 ---------------------------");
+        System.out.println("------------------------------------------------------------------------------------------------------------");
     }
 }

+ 185 - 22
book-push/src/main/java/com/book/push/config/WxOpenInRedisBookConfigStorage.java

@@ -1,36 +1,59 @@
 package com.book.push.config;
 
+import com.book.dao.cps.pojo.AdminConfig;
+import com.book.dao.cps.pojo.Platform;
+import com.book.push.service.dao.AdminConfigService;
+import com.book.push.service.redis.RedisService;
 import com.book.push.service.wx.WxThirdPartService;
 import com.book.push.utils.JsonUtils;
 import com.book.push.utils.Md5Util;
 import com.book.push.vo.AuthorizerInfo;
 import com.book.push.vo.ComponentInfo;
+import lombok.Getter;
 import lombok.NonNull;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage;
+import org.apache.commons.lang3.StringUtils;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.util.Pool;
 
+import java.util.List;
+
 /**
  * created in 2021/8/25
  * Project: book-store
  *
  * @author win7
  */
-
+@Slf4j
 public class WxOpenInRedisBookConfigStorage extends WxOpenInRedisConfigStorage {
-
+    @Getter
+    @Setter
+    private Platform platform;
+    @Getter
+    @Setter
+    private RedisService redisService;
+    @Getter
+    @Setter
+    private AdminConfigService adminConfigService;
 
     public WxOpenInRedisBookConfigStorage(@NonNull Pool<Jedis> jedisPool, String keyPrefix) {
         super(jedisPool, keyPrefix);
     }
 
-    public String getVerifyTicketCacheKey(String appid) {
-        return WxThirdPartService.VERIFY_TICKET_KEY_PREFIX + appid;
+    public WxOpenInRedisBookConfigStorage(Platform platform, @NonNull Pool<Jedis> jedisPool, String keyPrefix) {
+        super(jedisPool, keyPrefix);
+        this.platform = platform;
+    }
+
+    public String getVerifyTicketCacheKey(String componentAppId) {
+        return WxThirdPartService.VERIFY_TICKET_KEY_PREFIX + componentAppId;
     }
 
     public String getVerifyTicketCacheKey() {
         if (this.getComponentAppId() == null) {
-            System.out.println("getVerifyTicketCacheKey is null,please set component appid");
+            log.error("getVerifyTicketCacheKey is null,please set component appid");
             throw new NullPointerException("ComponentAppId is null,please set component appid");
         }
         return WxThirdPartService.VERIFY_TICKET_KEY_PREFIX + this.getComponentAppId();
@@ -38,44 +61,184 @@ public class WxOpenInRedisBookConfigStorage extends WxOpenInRedisConfigStorage {
 
     public String getComponentTokenCacheKey(ComponentInfo componentInfo) {
 
-        return WxThirdPartService.TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonString(componentInfo));
+        return WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonNoSort(componentInfo));
     }
 
     public String getComponentTokenCacheKey() {
         if (this.getComponentAppId() == null || this.getComponentAppSecret() == null || this.getComponentVerifyTicket() == null) {
-            System.out.println("getVerifyTicketCacheKey is null,please set component appid");
-//            throw new NullPointerException("ComponentAppId " +
-//                    "must not be  null,please set component appid");
-        }
-        if (this.getComponentAppSecret() == null) {
-            System.out.println("ComponentAppSecret is null, please set  ComponentAppSecret");
-        }
-        if(this.getComponentVerifyTicket() == null){
-            System.out.println("ComponentVerifyTicket is null, please set  ComponentVerifyTicket");
+            log.warn("getVerifyTicketCacheKey is null,please set component appid");
+            throw new NullPointerException("verifyTicketCacheKey or ComponentAppSecret or ComponentVerifyTicket is null");
         }
+
         ComponentInfo componentInfo = new ComponentInfo(getComponentAppId(), getComponentAppSecret(), getComponentVerifyTicket());
-        return WxThirdPartService.TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonString(componentInfo));
+        System.out.println(JsonUtils.toJsonNoSort(componentInfo));
+        return WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonNoSort(componentInfo));
     }
 
 
     public String getAuthorizerTokenCacheKey(AuthorizerInfo authorizerInfo) {
-
-        return WxThirdPartService.TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonString(authorizerInfo));
+        System.out.println(JsonUtils.toJsonNoSort(authorizerInfo));
+        return WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonNoSort(authorizerInfo));
     }
 
     @Override
     public void setComponentVerifyTicket(String componentVerifyTicket) {
-        if (componentVerifyTicket==null){
-            throw new NullPointerException("componentVerifyTicket is null " );
+        if (componentVerifyTicket == null) {
+            throw new NullPointerException("componentVerifyTicket is null ");
         }
         super.setComponentVerifyTicket(componentVerifyTicket);
     }
 
     @Override
     public void setComponentAccessToken(String componentAccessToken) {
-        if (componentAccessToken==null){
-            throw new NullPointerException("componentAccessToken is null " );
+        if (componentAccessToken == null) {
+            throw new NullPointerException("componentAccessToken is null ");
         }
         super.setComponentAccessToken(componentAccessToken);
     }
+
+
+    public void updateComponentVerifyTicketFromPhp() {
+        //s:95:"ticket@@@1CdDrkNz3kKKABPA9msNC3OqfjsBELmW7vhJzo0wwti2F5xzbNK0eGyGQkx2NmHO_sBkGRFPnDbZJovXmksh9w";
+        String verifyTicketCacheKey = getVerifyTicketCacheKey();
+        String phpComponentVerifyTicket = redisService.get(verifyTicketCacheKey);
+        Long expiresTime = redisService.getExpiresTime(verifyTicketCacheKey);
+        if (phpComponentVerifyTicket == null) {
+            throw new NullPointerException("phpComponentVerifyTicket is null ");
+        }
+        int begin = phpComponentVerifyTicket.indexOf("ticket@@@");
+        int end = phpComponentVerifyTicket.indexOf(";");
+        String substring = phpComponentVerifyTicket.substring(begin, end - 1);
+        setComponentVerifyTicket(substring, expiresTime);
+
+
+    }
+
+    public void updateComponentAccessTokenFromPhp() {
+        // a:2:{s:22:"component_access_token";s:157:"48_YOUUo8XLX1_R7jUvlDsnm1oxowmYcHcRVkdw8LrSLVMRbQlfbD8dWHwobcEWmINKZM-5s6vFdr_9dDSgBALEuBQ1XyTH3VjZrDKIat-UccLXSSs4x5uVUaNIjMbW4o0m13Y8HrBBVm1pcjE-WYLaAFAEGT";s:10:"expires_in";i:7200;}
+        String componentTokenCacheKey = getComponentTokenCacheKey();
+        System.out.println(componentTokenCacheKey);
+        String phpComponentToken = redisService.get(componentTokenCacheKey);
+        if (StringUtils.isNotEmpty(phpComponentToken)) {
+            String componentToken = parsePhpAccessToken(phpComponentToken);
+            setComponentAccessToken(componentToken);
+            updateComponentAccessToken(componentToken, redisService.getExpiresTime(componentTokenCacheKey).intValue());
+        }
+
+
+    }
+
+    private String parsePhpAccessToken(String phpComponentToken) {
+        String[] split = phpComponentToken.split(";");
+        String s = split[1];
+        String[] split1 = s.split(":");
+        String s1 = split1[2];
+        String componentToken = s1.replace("\"", "");
+        return componentToken;
+    }
+
+    public static void main(String[] args) {
+        String phpComponentVerifyTicket = "s:95:\"ticket@@@1CdDrkNz3kKKABPA9msNC3OqfjsBELmW7vhJzo0wwti2F5xzbNK0eGyGQkx2NmHO_sBkGRFPnDbZJovXmksh9w\";";
+        if (phpComponentVerifyTicket == null) {
+            throw new NullPointerException("phpComponentVerifyTicket is null ");
+        }
+        int begin = phpComponentVerifyTicket.indexOf("ticket@@@");
+        int end = phpComponentVerifyTicket.indexOf(";");
+        String substring = phpComponentVerifyTicket.substring(begin, end - 1);
+        System.out.println(substring);
+    }
+
+
+    public void updateAllAuthorizerAccessToken() {
+        List<AdminConfig> list = adminConfigService.selectByPlatformId(platform.getId());
+        if (list == null) {
+            throw new NullPointerException("WxOpenInRedisBookConfigStorage adminConfigList is null,please set it first");
+        }
+        updateAllAuthorizerAccessToken(list);
+
+    }
+
+    public void updateAllAuthorizerAccessToken(List<AdminConfig> list) {
+        for (AdminConfig adminConfig : list) {
+
+            updateAuthorizerAccessTokenFromPhp(adminConfig);
+
+
+        }
+
+    }
+
+
+    public boolean isComponentVerifyTicketExpired(){
+        Long expiresTime = redisService.getExpiresTime(this.componentVerifyTicketKey);
+        return expiresTime == null || expiresTime < 10L;
+
+    }
+
+    public void setComponentVerifyTicket(String componentVerifyTicket, long second) {
+        redisService.set(this.componentVerifyTicketKey, componentVerifyTicket, second);
+    }
+
+
+    @Override
+    public String getComponentVerifyTicket() {
+        String componentVerifyTicket = super.getComponentVerifyTicket();
+
+        if (StringUtils.isEmpty(componentVerifyTicket) || isComponentVerifyTicketExpired()) {
+            updateComponentVerifyTicketFromPhp();
+        }
+        return super.getComponentVerifyTicket();
+    }
+
+
+    @Override
+    public boolean isComponentAccessTokenExpired() {
+        boolean componentAccessTokenExpired = super.isComponentAccessTokenExpired();
+        if (componentAccessTokenExpired) {
+            updateComponentAccessTokenFromPhp();
+        }
+        return super.isComponentAccessTokenExpired();
+    }
+
+    @Override
+    public boolean isAuthorizerAccessTokenExpired(String appId) {
+        boolean authorizerAccessTokenExpired = super.isAuthorizerAccessTokenExpired(appId);
+        if (authorizerAccessTokenExpired) {
+            AdminConfig adminConfig = adminConfigService.selectByAppid(appId);
+            updateAuthorizerAccessTokenFromPhp(adminConfig);
+        }
+        return super.isAuthorizerAccessTokenExpired(appId);
+    }
+
+    private void updateAuthorizerAccessTokenFromPhp(AdminConfig adminConfig) {
+        String authorizerAppid = adminConfig.getAppid();
+
+        String json = adminConfig.getJson().toString();
+        AdminConfig.Info info = JsonUtils.getObject(json, AdminConfig.Info.class);
+        AdminConfig.AuthorizationInfo authorization_info = info.getAuthorization_info();
+        String authorizer_refresh_token = authorization_info.getAuthorizer_refresh_token();
+
+        //update refresh_token
+        updateAuthorizerRefreshToken(authorizerAppid, authorizer_refresh_token);
+
+
+        //更新token
+        AuthorizerInfo authorizerInfo = new AuthorizerInfo(this.getComponentAppId(), authorizerAppid, authorizer_refresh_token);
+        String authorizerTokenCacheKey = getAuthorizerTokenCacheKey(authorizerInfo);
+        //a:2:{s:23:"authorizer_access_token";s:157:"48_7NeCGMcCP63fE7auTG3I181GaH7sNeEFWj7hRIPkGkFBo00IsrhzSlauigVUdClbNfYvpH7bdZ3Oe04_kgf8-7_QoJGEX_wvDKSWz4AFThq6idME2zjk57_9Z2HKwL-Ba7uwapgwpTPQAcsRNABiAIDQDE";s:10:"expires_in";i:7200;}
+
+        System.out.println(authorizerTokenCacheKey);
+        String tokenString = redisService.get(authorizerTokenCacheKey);
+        if (StringUtils.isEmpty(tokenString)) {
+            log.warn("authorizer_access_token is null in php redis ");
+            return;
+        }
+        String token = parsePhpAccessToken(tokenString);
+        if (token == null) {
+            log.warn("AuthorizerToken is null in redis for key :" + authorizerTokenCacheKey);
+        } else {
+            updateAuthorizerAccessToken(authorizerAppid, token, redisService.getExpiresTime(authorizerTokenCacheKey).intValue());
+        }
+    }
+
 }

+ 4 - 1
book-push/src/main/java/com/book/push/cons/UrlCons.java

@@ -9,12 +9,15 @@ package com.book.push.cons;
 
 public class UrlCons {
 
-    public static final String OAUTH2_REDIRECT_URL_LOGIN = SchemeCons.default_scheme_prefix + "://" + "%s/wx/redirect/{appid}/login";
+    public static final String OAUTH2_REDIRECT_URL_LOGIN = SchemeCons.default_scheme_prefix + "://" + "%s/wx/redirect/login";
     public static final String OAUTH2_REDIRECT_URL_SLIENT = SchemeCons.default_scheme_prefix + "://" + "%s.%s/wx/redirect/{appid}/slient";
     public static final String FRONT_URL = SchemeCons.default_scheme_prefix + "://" + "%s.%s/home.html#/%s?channelId=%d&userId=%s";
+    public static final String URL_PARAMS = "channelId=%d&userId=%s";
     public static final String MODEL_BOOK = "readDetail";
 
     public static final String BOOK_URL = SchemeCons.default_scheme_prefix + "://" + "%s.%s/%s?channelId=%d&userId=%d&bookId=%s";
 
 
+
+
 }

+ 33 - 9
book-push/src/main/java/com/book/push/controller/BookIndexController.java

@@ -10,8 +10,11 @@ package com.book.push.controller;
 import com.book.dao.cps.pojo.AdminConfig;
 import com.book.push.cons.UrlCons;
 import com.book.push.service.dao.AdminConfigService;
+import com.book.push.service.redis.RedisService;
 import com.book.push.service.wx.WxThirdPartService;
+import com.book.push.utils.Md5Util;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.open.api.WxOpenService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,9 +29,9 @@ import javax.servlet.http.HttpServletRequest;
 /**
  * @author
  */
-//@AllArgsConstructor
+@Slf4j
 @RestController
-@RequestMapping("/index")
+@RequestMapping("/login")
 public class BookIndexController {
     @Autowired
     private AdminConfigService adminConfigService;
@@ -37,7 +40,8 @@ public class BookIndexController {
 
     @Value("${book.debug}")
     private Boolean debug;
-
+    @Autowired
+    private RedisService redisService;
     /**
      * //FIXME
      * <p>
@@ -45,19 +49,39 @@ public class BookIndexController {
      */
 
 
-    @GetMapping("/{state}")
-    public String BookMain(HttpServletRequest request, @PathVariable String state) {
+//    @GetMapping("/{state}")
+//    public String BookMain(HttpServletRequest request, @PathVariable String state) {
+    @GetMapping()
+    public String BookMain(HttpServletRequest request) {
 
         StringBuffer url = request.getRequestURL();
         String contextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();
         String[] split = contextUrl.split("\\.");
         String appid = split[0];
-        if (debug){
+        if (debug) {
             appid = "wx75b8899af31a7c93";
         }
+        String referer = request.getHeader("referer");
+        String state = Md5Util.md5(referer);
+        if (appid == null || !appid.startsWith("wx")) {
+
+
+
+            redisService.set(state, referer, 60);
+            if (referer == null) {
+                log.error("非 发来源,失败 ");
+                return "登录失败";
+            }
+            String replace = referer.replace("http://", "").replace("https://", "");
+            appid = replace.split("\\.")[0];
+            if (!appid.startsWith("wx")) {
+                return "登录失败";
+            }
+
+        }
 
         AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
-        String redirect_url = String.format(UrlCons.OAUTH2_REDIRECT_URL_LOGIN,contextUrl).replace("{appid}", appid);
+        String redirect_url = String.format(UrlCons.OAUTH2_REDIRECT_URL_LOGIN, contextUrl);
 
 
         Integer platformId = adminConfig.getPlatformId();
@@ -67,12 +91,12 @@ public class BookIndexController {
         // 静默授权
 
 
-
-
         return "redirect:" + auto2Url;
 
 
     }
 
 
+
+
 }

+ 36 - 34
book-push/src/main/java/com/book/push/controller/WxRedirectController.java

@@ -11,8 +11,10 @@ import com.book.push.service.dao.AdminConfigService;
 import com.book.push.service.dao.ConfigService;
 import com.book.push.service.dao.OpHostService;
 import com.book.push.service.dao.UserService;
+import com.book.push.service.redis.RedisService;
 import com.book.push.service.wx.WxThirdPartService;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -35,9 +37,10 @@ import org.springframework.web.bind.annotation.RequestParam;
  */
 @AllArgsConstructor
 @Controller
-@RequestMapping("/wx/redirect/{appid}")
+@Slf4j
+@RequestMapping("/wx/redirect")
 public class WxRedirectController {
-    public static final Logger logger = LoggerFactory.getLogger(WxRedirectController.class);
+
     @Autowired
     private UserService userService;
     @Autowired
@@ -50,14 +53,10 @@ public class WxRedirectController {
     private OpHostService opHostService;
     @Autowired
     private UserSilentService userSilentService;
+    @Autowired
+    private RedisService redisService;
 
 
-    /**
-     * //FIXME
-     * 前端页面url
-     */
-//    private final static String FRONT_URL = "%s://%s%s?channelId=%d/userId=%d";
-
     /**
      * 接收微信静默授权,获取用户信息,跳转前台页面
      *
@@ -70,7 +69,7 @@ public class WxRedirectController {
     public String login(@PathVariable String appid, @RequestParam String code, @RequestParam String state, ModelMap map) {
 
         String[] s = state.split("_");
-        if (s.length != 2 ) {
+        if (s.length != 2) {
 //            logger.error("静默登录state错误");
 //            String frontUrl = getFrontUrl(ophost, page, userAdminId, userAdminId);
             return "error";
@@ -89,7 +88,6 @@ public class WxRedirectController {
         Integer userAdminId = adminConfig.getAdminId();
 
 
-
         Config config = configService.selectByName(SiteCons.SILENT_DEFAULT_CHANNEL);
         Integer defaultAdminId = Integer.parseInt(config.getValue());
         AdminConfig defaultAdminConfig = adminConfigService.selectByAdminId(defaultAdminId);
@@ -107,23 +105,23 @@ public class WxRedirectController {
                 WxMpUser wxMpUser = wxMpServiceByAppid.getUserService()
                         .userInfo(openId, null);
 
-               user =  userService.createUserByWxUser(wxMpUser,channelId);
+                user = userService.createUserByWxUser(wxMpUser, channelId);
 
             }
             if (userSlientExist(user, null, defaultAdminConfig.getAppid())) {
-                String frontUrl = getFrontUrl(adminConfig.getAppid(),ophost, page, userAdminId, String.valueOf(user.getId()));
+                String frontUrl = getFrontUrl(adminConfig.getAppid(), ophost, page, userAdminId, String.valueOf(user.getId()));
                 return "redirect:" + frontUrl;
             } else {
-                if (defaultAdminId.equals(channelId)){
+                if (defaultAdminId.equals(channelId)) {
                     //保存静默授权
-                    saveUserSlitent(user,openId,appid);
-                    String frontUrl = getFrontUrl(adminConfig.getAppid(),ophost, page, userAdminId, String.valueOf(user.getId()));
+                    saveUserSlitent(user, openId, appid);
+                    String frontUrl = getFrontUrl(adminConfig.getAppid(), ophost, page, userAdminId, String.valueOf(user.getId()));
                     return "redirect:" + frontUrl;
-                }else {
+                } else {
                     Integer platformId = defaultAdminConfig.getPlatformId();
                     String redirect_url = UrlCons.OAUTH2_REDIRECT_URL_SLIENT.replace("{appid}", defaultAdminConfig.getAppid());
                     Ophost menuHost = opHostService.selectById(defaultAdminConfig.getMenuophostId());
-                    redirect_url = String.format(redirect_url,appid,menuHost.getHost());
+                    redirect_url = String.format(redirect_url, appid, menuHost.getHost());
 
                     wxOpenService = thirdPartService.getWxOpenServiceByPlatFormId(platformId);
                     String auto2Url = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(defaultAdminConfig.getAppid()).getOAuth2Service()
@@ -133,22 +131,21 @@ public class WxRedirectController {
                 }
 
 
-
             }
         } catch (WxErrorException e) {
 //            logger.error(e.getMessage());
             e.printStackTrace();
-            String frontUrl = getFrontUrl(adminConfig.getAppid(),ophost, state, 0, "");
+            String frontUrl = getFrontUrl(adminConfig.getAppid(), ophost, state, 0, "");
             return "redirect:" + frontUrl;
         }
 
 
-
     }
+
     @RequestMapping("/slient")
     public String slient(@PathVariable String appid, @RequestParam String code, @RequestParam String state, ModelMap map) {
         String[] s = state.split("_");
-        if (s.length != 3 ) {
+        if (s.length != 3) {
 //            logger.error("静默登录state错误");
 //            String frontUrl = getFrontUrl(ophost, "page", userAdminId, userAdminId);
             return "error";
@@ -168,26 +165,22 @@ public class WxRedirectController {
         Integer userAdminId = adminConfig.getAdminId();
 
 
-
-
-
-
         WxOpenService wxOpenService = thirdPartService.getWxOpenServiceByPlatFormId(fromPlatformId);
         try {
             WxOAuth2AccessToken accessToken = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid).getOAuth2Service().getAccessToken(code);
             String openId = accessToken.getOpenId();
-            saveUserSlitent(user,openId,appid);
-            String frontUrl = getFrontUrl(adminConfig.getAppid(),ophost, page, userAdminId, String.valueOf(user.getId()));
+            saveUserSlitent(user, openId, appid);
+            String frontUrl = getFrontUrl(adminConfig.getAppid(), ophost, page, userAdminId, String.valueOf(user.getId()));
             return "redirect:" + frontUrl;
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
-            String frontUrl = getFrontUrl(adminConfig.getAppid(),ophost, page, 0, "");
+            String frontUrl = getFrontUrl(adminConfig.getAppid(), ophost, page, 0, "");
             return "redirect:" + frontUrl;
         }
 
 
-
     }
+
     private void saveUserSlitent(User user, String openId, String appid) {
         UserSilent userSilent = new UserSilent();
         userSilent.setUserId(user.getId());
@@ -211,9 +204,18 @@ public class WxRedirectController {
 
     }
 
-    private String getFrontUrl(String appid,Ophost ophost, String state, Integer userAdminId, String userId) {
-        String host = ophost.getHost();
-        String frontUrl = String.format(UrlCons.FRONT_URL,appid,host, state, userAdminId, userId);
-        return frontUrl;
+    private String getFrontUrl(String appid, Ophost ophost, String state, Integer userAdminId, String userId) {
+
+        String s = redisService.get(state);
+        if (s!=null && s.startsWith("http")){
+            String sp = s.contains("?") ? "&" : "?";
+            s = String.format(s + sp + UrlCons.URL_PARAMS, userAdminId, userId);
+            return  s;
+        }else {
+            String host = ophost.getHost();
+            String frontUrl = String.format(UrlCons.FRONT_URL,appid,host, state, userAdminId, userId);
+            return frontUrl;
+        }
+
     }
 }

+ 1 - 0
book-push/src/main/java/com/book/push/service/dao/AdminConfigService.java

@@ -21,4 +21,5 @@ public interface AdminConfigService {
      AdminConfig selectByAdminId(Integer adminId);
 
 
+    List<AdminConfig> selectByPlatformId(Integer id);
 }

+ 5 - 0
book-push/src/main/java/com/book/push/service/dao/impl/AdminConfigServiceImpl.java

@@ -37,4 +37,9 @@ public class AdminConfigServiceImpl implements AdminConfigService {
     public AdminConfig selectByAdminId(Integer adminId) {
         return adminConfigMapper.selectByPrimaryKey(adminId);
     }
+
+    @Override
+    public List<AdminConfig> selectByPlatformId(Integer id) {
+        return adminConfigMapper.selectByPlatformId(id);
+    }
 }

+ 19 - 1
book-push/src/main/java/com/book/push/service/redis/RedisService.java

@@ -1,14 +1,32 @@
 package com.book.push.service.redis;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * created in 2021/8/20
  * Project: book-store
- *
+ * www.cnblogs.com/liuling/p/2014-4-19-04.html
  * @author win7
  */
 
 public interface RedisService {
+
     void set(String key, String value);
 
     String get(String key);
+    Long getExpiresTime(String key);
+
+    void setMap(String key,Map<String, String> map);
+    List<String> getByMapKey(String key, String mapKey);
+    void setList(String key,String... val);
+    void setList(String key,List<String> list);
+    List<String> getList(String key,int begin,int end);
+
+    void setSet(String key, Set<String> set);
+
+    Set<String> getSet(String key);
+
+    void set(String key, String value, long second);
 }

+ 71 - 0
book-push/src/main/java/com/book/push/service/redis/impl/RedisServiceImpl.java

@@ -7,6 +7,11 @@ import org.springframework.stereotype.Service;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
 /**
  * created in 2021/8/20
  * Project: book-store
@@ -29,4 +34,70 @@ public class RedisServiceImpl implements RedisService {
         @Cleanup Jedis jedis = jedisPool.getResource();
         return jedis.get(key);
     }
+
+    @Override
+    public Long getExpiresTime(String key) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        return jedis.ttl(key);
+
+    }
+
+    @Override
+    public void setMap(String key, Map<String, String> map) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        jedis.hmset(key, map);
+    }
+
+    @Override
+    public List<String> getByMapKey(String key, String mapKey) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        return jedis.hmget(key, mapKey);
+    }
+
+    @Override
+    public void setList(String key, String... val) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        for (String s : val) {
+
+            jedis.lpush(key, s);
+        }
+    }
+
+    @Override
+    public void setList(String key, List<String> list) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        for (String s : list) {
+
+            jedis.lpush(key, s);
+        }
+    }
+
+    @Override
+    public List<String> getList(String key, int begin, int end) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        return jedis.lrange(key, begin, end);
+    }
+
+    @Override
+    public void setSet(String key, Set<String> set) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        for (String s : set) {
+
+            jedis.sadd(key, s);
+        }
+    }
+
+    @Override
+    public Set<String> getSet(String key) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        return jedis.smembers(key);
+    }
+
+    @Override
+    public void set(String key, String  value, long second) {
+        @Cleanup Jedis jedis = jedisPool.getResource();
+        jedis.psetex(key, TimeUnit.SECONDS.toMillis(second), value);
+    }
+
+
 }

+ 2 - 1
book-push/src/main/java/com/book/push/service/wx/WxThirdPartService.java

@@ -14,7 +14,8 @@ import me.chanjar.weixin.open.api.WxOpenService;
 public interface WxThirdPartService {
 
     public static final String VERIFY_TICKET_KEY_PREFIX = "easywechat.open_platform.verify_ticket.";
-    public static final String TOKEN_KEY_PREFIX = "easywechat.kernel.access_token.";
+    public static final String COMPONENT_TOKEN_KEY_PREFIX = "easywechat.kernel.access_token.";
+    public static  final String AUTHORIZER_TOKEN_KEY_PREFIX = "easywechat.kernel.access_token.";
     WxOpenService getWxOpenServiceByPlatFormId(Integer platFormId);
 
 

+ 21 - 52
book-push/src/main/java/com/book/push/service/wx/impl/WxThirdPartServiceImpl.java

@@ -82,32 +82,23 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
         Set<Integer> platFormIdSet = integerPlatformMap.keySet();
         platFormIdSet.stream().forEach(id -> {
             Platform platform = integerPlatformMap.get(id);
-            logger.info("platform_id:" + id + "-->"+platform.toString());
+            logger.info("platform_id:" + id + "-->" + platform.toString());
             WxOpenService wxOpenService = new WxOpenServiceImpl();
             WxOpenInRedisBookConfigStorage inRedisConfigStorage = new WxOpenInRedisBookConfigStorage(platform, jedisPool, String.format(PLATFORM_KEY_PREFIX, id));
             inRedisConfigStorage.setComponentAppId(platform.getAppid());
             inRedisConfigStorage.setComponentAppSecret(platform.getSecret());
+            inRedisConfigStorage.setComponentAesKey(platform.getAesKey());
+            inRedisConfigStorage.setComponentToken(platform.getToken());
+            inRedisConfigStorage.setRedisService(redisService);
+//            inRedisConfigStorage.setAdminConfigList(adminConfigService.selectByPlatformId(platform.getId()));
+            inRedisConfigStorage.setAdminConfigService(adminConfigService);
 
+            inRedisConfigStorage.updateComponentVerifyTicketFromPhp();
+            inRedisConfigStorage.updateComponentAccessTokenFromPhp();
+            inRedisConfigStorage.updateAllAuthorizerAccessToken();
 
-            logger.info("从redis 取值 ComponentVerifyTicket ,key = " + inRedisConfigStorage.getVerifyTicketCacheKey());
-            if (redisService.get(inRedisConfigStorage.getVerifyTicketCacheKey()) == null) {
-                logger.error("ComponentVerifyTicket is null in redis for key :" + inRedisConfigStorage.getVerifyTicketCacheKey());
-            } else {
-
-                inRedisConfigStorage.setComponentVerifyTicket(redisService.get(inRedisConfigStorage.getVerifyTicketCacheKey()));
-            }
-            logger.info("从redis 取值 ComponentToken ,key = " + inRedisConfigStorage.getComponentTokenCacheKey());
-            if (redisService.get(inRedisConfigStorage.getComponentTokenCacheKey()) == null) {
-                logger.error("ComponentToken is null in redis for key :" + inRedisConfigStorage.getComponentTokenCacheKey());
-            } else {
-
-                inRedisConfigStorage.setComponentToken(redisService.get(inRedisConfigStorage.getComponentTokenCacheKey()));
-            }
-
-
-            inRedisConfigStorage.setComponentAesKey(platform.getAesKey());
             wxOpenService.setWxOpenConfigStorage(inRedisConfigStorage);
-            updateAllAuthorizerAccessToken(inRedisConfigStorage);
+
             wxOpenServiceMap.put(id, wxOpenService);
         });
 
@@ -154,34 +145,7 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
 
     }
 
-    private void updateAllAuthorizerAccessToken(WxOpenInRedisBookConfigStorage wxOpenInRedisBookConfigStorage) {
-        logger.info("updateAllAuthorizerAccessToken... ");
-        Platform platform = wxOpenInRedisBookConfigStorage.getPlatform();
-        List<AdminConfig> list = adminConfigService.selectByPlatformId(platform.getId());
-        for (AdminConfig adminConfig : list) {
-            logger.info("adminConfig:" + "-->"+adminConfig.toString());
-
-            String appid = adminConfig.getAppid();
 
-            String json = adminConfig.getJson().toString();
-            AdminConfig.Info info = JsonUtils.getObject(json, AdminConfig.Info.class);
-            AdminConfig.AuthorizationInfo authorization_info = info.getAuthorization_info();
-            String authorizer_refresh_token = authorization_info.getAuthorizer_refresh_token();
-            wxOpenInRedisBookConfigStorage.updateAuthorizerRefreshToken(appid, authorizer_refresh_token);
-            AuthorizerInfo authorizerInfo = new AuthorizerInfo(wxOpenInRedisBookConfigStorage.getComponentAppId(), appid, adminConfig.getRefreshToken());
-            String authorizerTokenCacheKey = wxOpenInRedisBookConfigStorage.getAuthorizerTokenCacheKey(authorizerInfo);
-            String token = redisService.get(authorizerTokenCacheKey);
-            if (token == null) {
-                logger.error("AuthorizerToken is null in redis for key :" + authorizerTokenCacheKey);
-            } else {
-                wxOpenInRedisBookConfigStorage.updateAuthorizerAccessToken(appid, token, redisService.getExpiresTime(authorizerTokenCacheKey).intValue());
-            }
-
-
-        }
-
-
-    }
 
 
     @Override
@@ -196,19 +160,24 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
 
     public static void main(String[] args) {
         ComponentInfo componentInfo = new ComponentInfo("wxa6f2133192bfbcac", "a828e6b5eb87419e50826c60b9a20201"
-                , "ticket@@@kI-lexDGVC9dLKjHuXesqMt8sabH42EJyyRo9ben7uXISTMdDyBkxT-j53rCDZpWOkB2PuYMYiLenH6Y9FloEg");
+                , "ticket@@@qP9Pd4w50ic2Jws07j4a9qbc0YXLwWi8YLjcII08Rc0rSC0djpv_fD20AGqWlTSXgyFzmyWuPgBeNm8o8ImzfQ");
         System.out.println(JsonUtils.toJsonString(componentInfo));
-        String s =  WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonString(componentInfo));
+        String s = WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonString(componentInfo));
 
         System.out.println(s);
 
-        //
+        String r = "{\"component_appid\":\"wxa6f2133192bfbcac\",\"component_appsecret\":\"a828e6b5eb87419e50826c60b9a20201\",\"component_verify_ticket\":\"ticket@@@qP9Pd4w50ic2Jws07j4a9qbc0YXLwWi8YLjcII08Rc0rSC0djpv_fD20AGqWlTSXgyFzmyWuPgBeNm8o8ImzfQ\"}";
+        System.out.println("real=" + Md5Util.md5(r));
 
+        //
+        System.out.println("------------------------------------------------------------------------------------------");
 
 
-        AuthorizerInfo authorizerInfo = new AuthorizerInfo("wxa6f2133192bfbcac","wxe1271417b2ff5b1c","refreshtoken@@@N0INeuo9aWT1PdFNIfSTynUm8eI5gGp9fmg_SAG69p8");
-        System.out.println(JsonUtils.toJsonString(authorizerInfo));
-        String s1 =  WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonString(authorizerInfo));
+        AuthorizerInfo authorizerInfo = new AuthorizerInfo("wxa6f2133192bfbcac", "wxe1271417b2ff5b1c", "refreshtoken@@@N0INeuo9aWT1PdFNIfSTynUm8eI5gGp9fmg_SAG69p8");
+        System.out.println(JsonUtils.toJsonNoSort(authorizerInfo));
+        System.out.println("{\"component_appid\":\"wxa6f2133192bfbcac\",\"authorizer_appid\":\"wxe1271417b2ff5b1c\",\"authorizer_refresh_token\":\"refreshtoken@@@N0INeuo9aWT1PdFNIfSTynUm8eI5gGp9fmg_SAG69p8\"}");
+        String s1 = WxThirdPartService.COMPONENT_TOKEN_KEY_PREFIX + Md5Util.md5(JsonUtils.toJsonNoSort(authorizerInfo));
         System.out.println(s1);
+        System.out.println(Md5Util.md5("{\"component_appid\":\"wxa6f2133192bfbcac\",\"authorizer_appid\":\"wxe1271417b2ff5b1c\",\"authorizer_refresh_token\":\"refreshtoken@@@N0INeuo9aWT1PdFNIfSTynUm8eI5gGp9fmg_SAG69p8\"}"));
     }
 }

+ 5 - 0
book-push/src/main/java/com/book/push/utils/JsonUtils.java

@@ -31,6 +31,11 @@ public class JsonUtils {
         return gson.toJson(object);
     }
 
+    public static String toJsonNoSort(Object object) {
+        Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
+        return gson.toJson(object);
+    }
+
 
     /**
      * 将json字符串 转换为 普通类

+ 3 - 0
book-push/src/main/java/com/book/push/vo/AuthorizerInfo.java

@@ -1,5 +1,6 @@
 package com.book.push.vo;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
 
 /**
@@ -9,8 +10,10 @@ import lombok.Data;
  * @author win7
  */
 @Data
+@AllArgsConstructor
 public class AuthorizerInfo {
  private String component_appid;
  private String authorizer_appid;
  private String authorizer_refresh_token;
+
 }

+ 14 - 14
book-push/src/main/resources/application-dev.yml

@@ -1,13 +1,13 @@
 server:
-  port: 8080
+  port: 18089
 
 book:
-  debug: true
+  debug: false
   redis:
-    host: 121.41.100.198
+    host: r-bp1fhw9pqpgtfnu638pd.redis.rds.aliyuncs.com
     port: 6379
     database: 0
-    password: wrfg6OTNaXTqd96H7TK7bYIV
+    password: 5uUL$V!UBsVPf+9P$q4Y
     timeout: 1000  # 数据库连接超时时间,2.0 中该参数的类型为Duration,这里在配置的时候需要指明单位
     # 最大空闲连接数
     maxIdle: 500
@@ -24,9 +24,9 @@ spring:
     cps:
       type: com.alibaba.druid.pool.DruidDataSource
       driver-class-name: com.mysql.cj.jdbc.Driver
-      jdbc-url: jdbc:mysql://121.41.100.198:3306/test_cps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
-      username: root
-      password: root
+      jdbc-url: jdbc:mysql://rm-bp1978b18gyf7v7byzo.mysql.rds.aliyuncs.com:3306/test_cps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
+      username: test_cps
+      password: oRt+rY(7x3&kB#OQdit9
       #下面为连接池补充设置
       druid:
         initial-size: 5 # 初始化
@@ -58,9 +58,9 @@ spring:
     polar:
       type: com.alibaba.druid.pool.DruidDataSource
       driver-class-name: com.mysql.cj.jdbc.Driver
-      jdbc-url: jdbc:mysql://121.41.100.198:3306/polar?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
-      username: root
-      password: root
+      jdbc-url: jdbc:mysql://rm-bp1978b18gyf7v7byzo.mysql.rds.aliyuncs.com:3306/polardb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
+      username: test_cps
+      password: oRt+rY(7x3&kB#OQdit9
       #下面为连接池补充设置
       druid:
         initial-size: 5 # 初始化
@@ -92,9 +92,9 @@ spring:
     cpsshard:
       type: com.alibaba.druid.pool.DruidDataSource
       driver-class-name: com.mysql.cj.jdbc.Driver
-      jdbc-url: jdbc:mysql://121.41.100.198:3306/test_cps_shard_192?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
-      username: root
-      password: root
+      jdbc-url: jdbc:mysql://rm-bp1978b18gyf7v7byzo.mysql.rds.aliyuncs.com:3306/test_cps_shard?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
+      username: test_cps
+      password: oRt+rY(7x3&kB#OQdit9
       #下面为连接池补充设置
       druid:
         initial-size: 5 # 初始化
@@ -136,4 +136,4 @@ logging:
     com:
       book:
         server:
-          mapper: debug
+          mapper: error

+ 3 - 3
book-push/src/main/resources/application-pro.yml

@@ -1,8 +1,8 @@
 server:
-  port: 16063
+  port: 18089
 
 book:
-  debug: true
+  debug: false
   redis:
     host: r-bp1fhw9pqpgtfnu638.redis.rds.aliyuncs.com
     port: 6379
@@ -136,4 +136,4 @@ logging:
     com:
       book:
         server:
-          mapper: debug
+          mapper: info

+ 1 - 1
book-push/src/main/resources/log4j2.xml

@@ -57,7 +57,7 @@
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"/>
         <logger name="org.mybatis" level="INFO"/>
-        <root level="all" includeLocation="true">
+        <root level="INFO" includeLocation="true">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>

+ 3 - 0
book-server/src/main/java/com/book/server/config/Const.java

@@ -3,7 +3,10 @@ package com.book.server.config;
 public class Const {
     public static final String CacheSplit = "_";
     public static final String EDIT_BOOK_PRE = "edit_book";
+
     public static  final  String URL_PAY_CENTER = "http://{appid}.{host}/home.html#/{page}?userId={userId}&payOpenid={openid}";
+
     public static final Long bookIdMin = 110_0001L;
     public static final Long bookInMax = 110_9999L;
+
 }

+ 1 - 1
book-server/src/main/java/com/book/server/service/impl/WxPayServiceImpl.java

@@ -246,7 +246,7 @@ public class WxPayServiceImpl implements WxPayService {
             String redirectUrl = "http://" + wxpay.getPayHost() + "/api/wxpay/page?userId=" + userId;
             String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect";
             try {
-                url = String.format(url, appid, URLEncoder.encode(redirectUrl, "UTF-8"), page);
+                url = String.format(url, appid, java.net.URLEncoder.encode(redirectUrl, "UTF-8"), page);
             } catch (UnsupportedEncodingException e) {
                 e.printStackTrace();
             }