lijilei 3 роки тому
батько
коміт
01a4908316
20 змінених файлів з 404 додано та 59 видалено
  1. 2 0
      book-dao/src/main/java/com/book/dao/cps/mapper/AdminConfigMapper.java
  2. 1 1
      book-dao/src/main/java/com/book/dao/cps/mapper/SignedRecommandMapper.java
  3. 1 1
      book-dao/src/main/java/com/book/dao/cps/mapper/UserMapper.java
  4. 3 0
      book-dao/src/main/resources/mapper/cps/AdminConfigMapper.xml
  5. 64 6
      book-push/src/main/java/com/book/push/config/WxOpenInRedisBookConfigStorage.java
  6. 1 0
      book-push/src/main/java/com/book/push/cons/UrlCons.java
  7. 125 28
      book-push/src/main/java/com/book/push/controller/BookIndexController.java
  8. 2 2
      book-push/src/main/java/com/book/push/controller/WxRedirectController.java
  9. 5 4
      book-push/src/main/java/com/book/push/handler/MenuHandler.java
  10. 1 1
      book-push/src/main/java/com/book/push/handler/SubscribeHandler.java
  11. 2 1
      book-push/src/main/java/com/book/push/service/dao/SignedRecommendService.java
  12. 3 0
      book-push/src/main/java/com/book/push/service/dao/UserService.java
  13. 10 1
      book-push/src/main/java/com/book/push/service/dao/impl/AdminConfigServiceImpl.java
  14. 2 1
      book-push/src/main/java/com/book/push/service/dao/impl/SignedRecommendServiceImpl.java
  15. 21 6
      book-push/src/main/java/com/book/push/service/dao/impl/UserServiceImpl.java
  16. 2 0
      book-push/src/main/java/com/book/push/service/dao/impl/WechatAutoreplayServiceImpl.java
  17. 7 0
      book-push/src/main/java/com/book/push/service/wx/WxThirdPartService.java
  18. 67 7
      book-push/src/main/java/com/book/push/service/wx/impl/WxThirdPartServiceImpl.java
  19. 82 0
      book-push/src/main/java/com/book/push/utils/UrlUtil.java
  20. 3 0
      book-server/pom.xml

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

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

+ 1 - 1
book-dao/src/main/java/com/book/dao/cps/mapper/SignedRecommandMapper.java

@@ -18,5 +18,5 @@ public interface SignedRecommandMapper {
     int updateByPrimaryKeySelective(SignedRecommand record);
 
     int updateByPrimaryKey(SignedRecommand record);
-    SignRecommand selectRandom(@Param("sex") String sex);
+    SignedRecommand selectRandom(@Param("sex") String sex);
 }

+ 1 - 1
book-dao/src/main/java/com/book/dao/cps/mapper/UserMapper.java

@@ -32,5 +32,5 @@ public interface UserMapper {
     List<User> selectListByPushMap(Map map);
 
 
-    void updateOperateTimeByOpenid(@Param("operateTime") String openid, @Param("operateTime") Integer operateTime);
+    void updateOperateTimeByOpenid(@Param("openid") String openid, @Param("operateTime") Integer operateTime);
 }

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

@@ -128,6 +128,9 @@
         from admin_config
         where platform_id = #{platform_id,jdbcType=INTEGER}
     </select>
+    <select id="selectLikeJson" resultMap="BaseResultMap">
+        select  * from admin_config  where json->'$.authorizer_info.user_name' = #{user_name};
+    </select>
     <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
         delete
         from admin_config

+ 64 - 6
book-push/src/main/java/com/book/push/config/WxOpenInRedisBookConfigStorage.java

@@ -13,12 +13,15 @@ import lombok.Getter;
 import lombok.NonNull;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
 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;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
 
 /**
  * created in 2021/8/25
@@ -37,13 +40,18 @@ public class WxOpenInRedisBookConfigStorage extends WxOpenInRedisConfigStorage {
     @Getter
     @Setter
     private AdminConfigService adminConfigService;
+    private  String OAUTH2_REFRESH_TOKEN_KEY = "oauth2_refresh_token:";
+    @Deprecated
+    private  String OAUTH2_ACCESS_TOKEN_KEY = "oauth2_access_token:";
+    private  String oauth2RefreshTokenKey ;
+    @Deprecated
+    private  String oauth2AccessTokenKey ;
+    public static final String PLATFORM_KEY_PREFIX = "platformId_%d";
+    private Lock oauth2RefreshTokenLockInstance;
+
+    public WxOpenInRedisBookConfigStorage(@NonNull Platform platform, @NonNull Pool<Jedis> jedisPool) {
+        super(jedisPool, String.format(PLATFORM_KEY_PREFIX, platform.getId()));
 
-    public WxOpenInRedisBookConfigStorage(@NonNull Pool<Jedis> jedisPool, String keyPrefix) {
-        super(jedisPool, keyPrefix);
-    }
-
-    public WxOpenInRedisBookConfigStorage(Platform platform, @NonNull Pool<Jedis> jedisPool, String keyPrefix) {
-        super(jedisPool, keyPrefix);
         this.platform = platform;
     }
 
@@ -241,4 +249,54 @@ public class WxOpenInRedisBookConfigStorage extends WxOpenInRedisConfigStorage {
         }
     }
 
+    @Override
+    public void setComponentAppId(String componentAppId) {
+        super.setComponentAppId(componentAppId);
+        this.oauth2RefreshTokenKey =  String.format("%s:%s:%s:",keyPrefix,OAUTH2_REFRESH_TOKEN_KEY,this.getComponentAppId());
+        this.oauth2AccessTokenKey = String.format("%s:%s:%s:",keyPrefix,OAUTH2_ACCESS_TOKEN_KEY,this.getComponentAppId());
+        lockKey = keyPrefix + LOCK_KEY.concat(componentAppId);
+    }
+
+    public String getOAuth2rRefreshTokenKey(){
+      return oauth2RefreshTokenKey ;
+    }
+    @Deprecated
+    public String getOAuth2rAccessTokenKey(){
+        return oauth2AccessTokenKey ;
+    }
+
+
+    public String getOAuth2rRefreshToken(String appid){
+      return   redisService.get(this.getKey(this.getOAuth2rRefreshTokenKey(), appid));
+
+    }
+    @Deprecated
+    public String getOAuth2rAccessToken(String appid){
+        return   redisService.get(this.getKey(this.getOAuth2rAccessTokenKey(), appid));
+
+    }
+    @Deprecated
+   public boolean isOAuth2rAccessTokenExpired(String appid){
+       Long expire = redisService.getExpiresTime(this.getKey(this.getOAuth2rAccessTokenKey(), appid));
+       return expire == null || expire < 10;
+   }
+    public boolean isOAuth2rRefreshTokenExpired(String appid){
+        Long expire = redisService.getExpiresTime(this.getKey(this.getOAuth2rRefreshTokenKey(), appid));
+        return expire == null || expire < 10;
+    }
+
+    public void updateOAuth2rRefreshToken(String appId, WxOAuth2AccessToken oAuth2rRefreshToken, int expiresInSeconds) {
+        redisService.set(this.getKey(this.oauth2RefreshTokenKey, appId), oAuth2rRefreshToken.getRefreshToken(), expiresInSeconds - 60*60);
+    }
+
+    public Lock getOAuth2rRefreshTokenLock(String appid){
+        if (this.oauth2RefreshTokenLockInstance == null) {
+            synchronized (this) {
+                if (this.oauth2RefreshTokenLockInstance == null) {
+                    this.oauth2RefreshTokenLockInstance = getLockByKey(appid+":oAuth2rRefreshTokenLock");
+                }
+            }
+        }
+        return this.oauth2RefreshTokenLockInstance;
+    }
 }

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

@@ -9,6 +9,7 @@ package com.book.push.cons;
 
 public class UrlCons {
 
+    public static final String URL_OAUTH2_REDIRECT_LOGIN = SchemeCons.default_scheme_prefix + "://" + "%s/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/wx/redirect/slient";
     public static final String FRONT_URL = SchemeCons.default_scheme_prefix + "://" + "%s.%s/%s?channelId=%d&userId=%s";

+ 125 - 28
book-push/src/main/java/com/book/push/controller/BookIndexController.java

@@ -8,22 +8,27 @@ package com.book.push.controller;
  */
 
 import com.book.dao.cps.pojo.AdminConfig;
+import com.book.dao.cps.pojo.Config;
+import com.book.dao.cps.pojo.Ophost;
+import com.book.dao.cps.pojo.User;
+import com.book.dao.polardb.pojo.UserSilent;
+import com.book.push.cons.SiteCons;
 import com.book.push.cons.UrlCons;
-import com.book.push.service.dao.AdminConfigService;
+import com.book.push.service.dao.*;
 import com.book.push.service.redis.RedisService;
 import com.book.push.service.wx.WxThirdPartService;
+import com.book.push.utils.UrlUtil;
+import com.book.push.utils.JsonUtils;
 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.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.service.WxOAuth2Service;
 import me.chanjar.weixin.open.api.WxOpenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -43,6 +48,14 @@ public class BookIndexController {
     private Boolean debug;
     @Autowired
     private RedisService redisService;
+    @Autowired
+    private OpHostService opHostService;
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private UserSilentService userSilentService;
+    @Autowired
+    private ConfigService configService;
     /**
      * //FIXME
      * <p>
@@ -52,46 +65,44 @@ public class BookIndexController {
 
 //    @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   contextUrl = request.getServerName();
+        String contextUrl = request.getServerName();
 //        contextUrl = "mp.esalary.com.cn";
         log.debug(contextUrl);
         String[] split = contextUrl.split("\\.");
         String appid = split[0];
         if (debug) {
             appid = "wxe1271417b2ff5b1c";
-        }else {
+        } else {
 
         }
-        String state ="home";
+        String state = "home";
 //        if (appid == null || !appid.startsWith("wx")) {
-            String referer = request.getHeader("referer");
-            if (referer==null){
-                referer = "http://wxe1271417b2ff5b1c.esalary.com.cn/";
-            }
-             state = Md5Util.md5(referer);
+        String referer = request.getHeader("referer");
+        if (referer == null) {
+            referer = "http://wxe1271417b2ff5b1c.esalary.com.cn/";
+        }
+        state = Md5Util.md5(referer);
 
 
-            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 "登录失败";
-            }
+        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);
+        AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
 
 
         Integer platformId = adminConfig.getPlatformId();
@@ -100,13 +111,99 @@ public class BookIndexController {
                 .buildAuthorizationUrl(redirect_url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, state + "_" + adminConfig.getAdminId());
         // 静默授权
 
-        log.info("跳转:"+auto2Url);
+        log.info("跳转:" + auto2Url);
         return "redirect:" + auto2Url;
 
 
     }
 
+    @GetMapping
+    public String login(HttpServletRequest request, @RequestParam String appid, @RequestParam String code, @RequestParam String state) {
+
+
+        WxOAuth2AccessToken oAuth2rRefreshToken = null;
+        AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
+        if (code == null) {
+
+            String domainName = request.getServerName();
+            String referer = request.getHeader("referer");
+            referer = referer == null ? "home" : referer;
+            state = Md5Util.md5(referer);
+            String replace = referer.replace("http://", "").replace("https://", "");
+            appid = replace.split("\\.")[0];
+
+            if (redisService.get(state) == null) {
+                redisService.set(state, referer);
+            }
+
+
+            oAuth2rRefreshToken = thirdPartService.getOAuth2rRefreshToken(adminConfig.getPlatformId(), appid);
+            if (oAuth2rRefreshToken == null) {
+                String redirectUrl = String.format(UrlCons.URL_OAUTH2_REDIRECT_LOGIN, domainName);
+                WxOAuth2Service oAuth2Service = thirdPartService.getWxOpenServiceByAuthorizerAppid(appid)
+                        .getWxOpenComponentService().getWxMpServiceByAppid(appid).getOAuth2Service();
+                String auto2Url = oAuth2Service.buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, state);
+                return buildRedirectUrl(auto2Url);
+            }
+
+        } else {
+            oAuth2rRefreshToken = thirdPartService.updateOAuth2rRefreshToken(adminConfig.getPlatformId(), appid, code);
+
+        }
+        if (oAuth2rRefreshToken == null) {
+            log.error("登录出错,呜呜~~");
+            return buildRedirectUrl( null);
+        }
+
+
+        User user = userService.selectByOpenId(oAuth2rRefreshToken.getOpenId());
+        if (user == null) {
+
+            user = userService.createUserByOpenid(oAuth2rRefreshToken.getOpenId(), adminConfig.getAdminId());
+            //二次静默
+        }else {
+            if(userSlientExist(user)!=null){
+                //二次静默
+
+            }else{
+                return buildRedirectUrl(getFontUlr(state,adminConfig,user));
+            }
+        }
+        return buildRedirectUrl("");
+
+    }
+
+    private String buildRedirectUrl(String fontUlr) {
+        return "redirect:" +fontUlr;
+    }
+
+    private String getFontUlr(String referer, AdminConfig adminConfig, User user) {
+        if (referer==null){
+            return "登录失败啦,请在网站里面进行登录";
+        }
+        Integer ophostId = adminConfig.getOphostId();
+        Ophost ophost = opHostService.selectById(ophostId);
+        String s = redisService.get(referer);
+        String url =UrlUtil.replaceDomain(s, adminConfig.getAppid() + "." + ophost.getHost());
+        return  UrlUtil.addParams(url,String.format(UrlCons.URL_PARAMS,adminConfig.getAdminId(),user.getOpenid()));
+    }
+
+    private UserSilent userSlientExist(User user) {
+        Config config = configService.selectByName(SiteCons.SILENT_DEFAULT_CHANNEL);
+        Integer defaultAdminId = Integer.parseInt(config.getValue());
+        AdminConfig defaultAdminConfig = adminConfigService.selectByAdminId(defaultAdminId);
 
 
+        UserSilent userSilent = new UserSilent();
+        userSilent.setUserId(user.getId());
+        userSilent.setChannelId(user.getChannelId());
+        userSilent.setOpenid(user.getOpenid());
+        userSilent.setTriAppid(defaultAdminConfig.getAppid());
+        log.debug(JsonUtils.toJsonStr(userSilent));
+        UserSilent result = userSilentService.selectByUserSlient(userSilent);
+        return result ;
+
+
+    }
 
 }

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

@@ -58,7 +58,6 @@ public class WxRedirectController {
     @Autowired
     private RedisService redisService;
 
-
     /**
      * 接收微信静默授权,获取用户信息,跳转前台页面
      *
@@ -97,7 +96,8 @@ public class WxRedirectController {
 
         WxOpenService wxOpenService = thirdPartService.getWxOpenServiceByPlatFormId(fromPlatformId);
         try {
-            WxOAuth2AccessToken accessToken = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid).getOAuth2Service().getAccessToken(code);
+            WxOAuth2AccessToken accessToken = wxOpenService.getWxOpenComponentService()
+                    .getWxMpServiceByAppid(appid).getOAuth2Service().getAccessToken(code);
             String openId = accessToken.getOpenId();
             User user = userService.selectByOpenId(openId);
             if (user == null) {

+ 5 - 4
book-push/src/main/java/com/book/push/handler/MenuHandler.java

@@ -76,7 +76,7 @@ public class MenuHandler extends AbstractHandler {
         AdminConfig adminConfig = adminConfigService.selectByAdminId(channelId);
 
         Long id = user.getId();
-        SignExample example = SignExample.newAndCreateCriteria().andUidEqualTo(id.intValue()).andCreatedateEqualTo(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD)).example();
+        SignExample example = SignExample.newAndCreateCriteria().andUidEqualTo(id.intValue()).andCreatedateEqualTo(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD_N)).example();
         Sign sign = signMapper.selectOneByExample(example);
         if ("1".equals(adminConfig.getSignTip())) {
 
@@ -85,7 +85,7 @@ public class MenuHandler extends AbstractHandler {
         if (sign == null) {
             sign = new Sign();
             sign.setUid(id.intValue());
-            sign.setCreatedate(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD));
+            sign.setCreatedate(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD_N));
             sign.setCreatetime(DateUtils.getNow());
             sign.setKandian(kandian);
             signMapper.insert(sign);
@@ -103,7 +103,8 @@ public class MenuHandler extends AbstractHandler {
     private WxMpXmlOutMessage msgAfterSing(String appid, String openid) {
         //todo 签到后回复
 
-        String msg = "<a href=\"weixin://bizmsgmenu?msgmenucontent=签到&msgmenuid=0\">点我签到</a>";
+//        String msg = "<a href=\"weixin://bizmsgmenu?msgmenucontent=签到&msgmenuid=0\">点我签到</a>";
+        String msg = "<a href=\"weixin://bizmsgmenu?msgmenucontent=签到&msgmenuid=0\">\uD83C\uDFFB点击领取免费书币</a>";
 
 
         WxMpXmlOutTextMessage wxMpXmlOutTextMessage = WxMpXmlOutMessage.TEXT().content(msg)
@@ -135,7 +136,7 @@ public class MenuHandler extends AbstractHandler {
     private void pushMessage(User user, AdminConfig adminConfig, String appid, boolean b) {
         Long bookId;
         if (b) {
-            SignRecommand signRecommand = signedRecommendService.selectRandom(user.getSex().toString());
+            SignedRecommand signRecommand = signedRecommendService.selectRandom(user.getSex().toString());
             bookId = signRecommand.getBookId();
         } else {
             SignRecommand signRecommand = signRecommendService.selectRandom(user.getSex().toString());

+ 1 - 1
book-push/src/main/java/com/book/push/handler/SubscribeHandler.java

@@ -50,7 +50,7 @@ public class SubscribeHandler extends AbstractHandler {
 
         // 获取微信用户基本信息
         WxMpUser userWxInfo ;
-        String openId = StringUtils.isEmpty(wxMessage.getOpenId())?wxMessage.getOpenId():wxMessage.getFromUser();
+        String openId = wxMessage.getFromUser();
         String appid = StringUtils.isEmpty(wxMessage.getAuthorizeAppId())?wxMessage.getToUser():wxMessage.getAuthorizeAppId();
         AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
         User user = userService.selectByOpenId(openId);

+ 2 - 1
book-push/src/main/java/com/book/push/service/dao/SignedRecommendService.java

@@ -1,6 +1,7 @@
 package com.book.push.service.dao;
 
 import com.book.dao.cps.pojo.SignRecommand;
+import com.book.dao.cps.pojo.SignedRecommand;
 
 /**
  * created in 2021/8/28
@@ -10,5 +11,5 @@ import com.book.dao.cps.pojo.SignRecommand;
  */
 
 public interface SignedRecommendService {
-    SignRecommand selectRandom(String sex);
+    SignedRecommand selectRandom(String sex);
 }

+ 3 - 0
book-push/src/main/java/com/book/push/service/dao/UserService.java

@@ -33,4 +33,7 @@ public interface UserService {
     int insertKandian(Long userId, String type, int kandian, int freeKandian);
 
     User createUserByWxOAuth2UserInfo(WxOAuth2UserInfo userInfo, Integer channelId);
+
+
+    User createUserByOpenid(String openid, Integer channelId);
 }

+ 10 - 1
book-push/src/main/java/com/book/push/service/dao/impl/AdminConfigServiceImpl.java

@@ -30,7 +30,16 @@ public class AdminConfigServiceImpl implements AdminConfigService {
 
     @Override
     public AdminConfig selectByAppid(String appid) {
-        return adminConfigMapper.selectByAppid(appid);
+        if (appid==null){
+            return null;
+        }
+        if (appid.startsWith("wx")){
+
+            return adminConfigMapper.selectByAppid(appid);
+        }else if (appid.startsWith("gh")){
+          return   adminConfigMapper.selectLikeJson(appid);
+        }
+        return null;
     }
 
     @Override

+ 2 - 1
book-push/src/main/java/com/book/push/service/dao/impl/SignedRecommendServiceImpl.java

@@ -2,6 +2,7 @@ package com.book.push.service.dao.impl;
 
 import com.book.dao.cps.mapper.SignedRecommandMapper;
 import com.book.dao.cps.pojo.SignRecommand;
+import com.book.dao.cps.pojo.SignedRecommand;
 import com.book.push.service.dao.SignedRecommendService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -17,7 +18,7 @@ public class SignedRecommendServiceImpl implements SignedRecommendService {
     @Autowired
     private SignedRecommandMapper signedRecommandMapper;
     @Override
-    public SignRecommand selectRandom(String sex) {
+    public SignedRecommand selectRandom(String sex) {
         return signedRecommandMapper.selectRandom(sex);
     }
 }

+ 21 - 6
book-push/src/main/java/com/book/push/service/dao/impl/UserServiceImpl.java

@@ -57,18 +57,19 @@ public class UserServiceImpl implements UserService {
         user.setCountry(wxMpUser.getCountry());
         user.setUnionid(wxMpUser.getUnionId());
         user.setNickname(wxMpUser.getNickname());
-        user.setSex(wxMpUser.getSex());
+        user.setSex(String.valueOf(wxMpUser.getSex()));
 //        user.setMobile(wxMpUser.getmobile);
         user.setAvatar(wxMpUser.getHeadImgUrl());
-        user.setSubscribeTime(Integer.valueOf(String.valueOf(System.currentTimeMillis() / 1000)));
-        user.setOperateTime(user.getSubscribeTime());
+        user.setSubscribeTime(wxMpUser.getSubscribeTime().intValue());
+        user.setOperateTime(wxMpUser.getSubscribeTime().intValue());
 //        user.setRegisterIp(wxMpUser.geti);
         user.setSubscriptionExtend("1");
         user.setProvince(wxMpUser.getProvince());
-        user.setCreatetime(Integer.valueOf(String.valueOf(System.currentTimeMillis() / 1000)));
+        user.setCreatetime(DateUtils.getNow());
         user.setChannelId(channel_id);
         user.setKandian(0);
         user.setFreeKandian(0);
+        user.setState("1");
 
         userMapper.insert(user);
         return user;
@@ -131,10 +132,10 @@ public class UserServiceImpl implements UserService {
         user.setCountry(wxMpUser.getCountry());
         user.setUnionid(wxMpUser.getUnionId());
         user.setNickname(wxMpUser.getNickname());
-        user.setSex(wxMpUser.getSex());
+        user.setSex(String.valueOf(wxMpUser.getSex()));
 //        user.setMobile(wxMpUser.getmobile);
         user.setAvatar(wxMpUser.getHeadImgUrl());
-        user.setSubscribeTime(Integer.valueOf(String.valueOf(System.currentTimeMillis() / 1000)));
+//        user.setSubscribeTime();
         user.setOperateTime(user.getSubscribeTime());
 //        user.setRegisterIp(wxMpUser.geti);
         user.setSubscriptionExtend("0");
@@ -147,6 +148,20 @@ public class UserServiceImpl implements UserService {
         userMapper.insert(user);
         return user;
     }
+    @Override
+    public User createUserByOpenid(String openid, Integer channelId){
+        User user = new User();
+        user.setOpenid(openid);
+        user.setSex("0");
+        user.setSubscriptionExtend("0");
+        user.setCreatetime(DateUtils.getNow());
+        user.setChannelId(channelId);
+        user.setKandian(0);
+        user.setFreeKandian(0);
+        user.setState("1");
+        userMapper.insert(user);
+        return  user;
+    }
 
     public List<Recharge> getFreeCharges(Long userId) {
         RechargeExample example = RechargeExample.newAndCreateCriteria()

+ 2 - 0
book-push/src/main/java/com/book/push/service/dao/impl/WechatAutoreplayServiceImpl.java

@@ -3,6 +3,7 @@ package com.book.push.service.dao.impl;
 import com.book.dao.cps.mapper.WechatAutoreplyMapper;
 import com.book.dao.cps.pojo.WechatAutoreply;
 import com.book.push.service.dao.WechatAutoreplayService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -13,6 +14,7 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class WechatAutoreplayServiceImpl implements WechatAutoreplayService {
+    @Autowired
     private WechatAutoreplyMapper wechatAutoreplyMapper;
 
     @Override

+ 7 - 0
book-push/src/main/java/com/book/push/service/wx/WxThirdPartService.java

@@ -1,6 +1,7 @@
 package com.book.push.service.wx;
 
 import com.book.push.service.wx.impl.WxThirdPartMessageRouter;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
 import me.chanjar.weixin.open.api.WxOpenComponentService;
 import me.chanjar.weixin.open.api.WxOpenService;
 
@@ -20,4 +21,10 @@ public interface WxThirdPartService {
 
 
     WxThirdPartMessageRouter getWxThirdPartMessageRouter();
+
+    WxOpenService getWxOpenServiceByAuthorizerAppid(String appid);
+
+    WxOAuth2AccessToken getOAuth2rRefreshToken(Integer platformId, String appid);
+
+    WxOAuth2AccessToken updateOAuth2rRefreshToken(Integer platformId, String appid, String code);
 }

+ 67 - 7
book-push/src/main/java/com/book/push/service/wx/impl/WxThirdPartServiceImpl.java

@@ -14,6 +14,10 @@ import com.book.push.utils.Md5Util;
 import com.book.push.vo.AuthorizerInfo;
 import com.book.push.vo.ComponentInfo;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxRuntimeException;
+import me.chanjar.weixin.open.api.WxOpenConfigStorage;
 import me.chanjar.weixin.open.api.WxOpenService;
 import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl;
 import org.slf4j.Logger;
@@ -28,6 +32,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
 
 import static me.chanjar.weixin.common.api.WxConsts.EventType;
 import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE;
@@ -44,10 +50,10 @@ import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY;
  * @author win7
  */
 @Service
+@Slf4j
 @RequiredArgsConstructor
 @EnableConfigurationProperties(RedisProperties.class)
 public class WxThirdPartServiceImpl implements WxThirdPartService {
-    private Logger logger = LoggerFactory.getLogger(getClass());
 
     private final LogHandler logHandler;
     private final NullHandler nullHandler;
@@ -72,19 +78,18 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
     private AdminConfigService adminConfigService;
 
     private WxThirdPartMessageRouter wxThirdPartMessageRouter;
-    public static final String PLATFORM_KEY_PREFIX = "platformId_%d";
 
 
     @PostConstruct
     public void init() {
-        logger.info("------------------------------  WxThirdPartServiceImpl  init ----------------------------------");
+        log.info("------------------------------                       WxThirdPartServiceImpl  init                       ----------------------------------");
         Map<Integer, Platform> integerPlatformMap = platformService.selectAll();
         Set<Integer> platFormIdSet = integerPlatformMap.keySet();
         platFormIdSet.stream().forEach(id -> {
             Platform platform = integerPlatformMap.get(id);
-            logger.info("platform_id:" + id + "-->" + platform.toString());
+            log.info("platform_id:" + id + "-->" + platform.toString());
             WxOpenService wxOpenService = new WxOpenServiceImpl();
-            WxOpenInRedisBookConfigStorage inRedisConfigStorage = new WxOpenInRedisBookConfigStorage(platform, jedisPool, String.format(PLATFORM_KEY_PREFIX, id));
+            WxOpenInRedisBookConfigStorage inRedisConfigStorage = new WxOpenInRedisBookConfigStorage(platform, jedisPool);
             inRedisConfigStorage.setComponentAppId(platform.getAppid());
             inRedisConfigStorage.setComponentAppSecret(platform.getSecret());
             inRedisConfigStorage.setComponentAesKey(platform.getAesKey());
@@ -146,8 +151,6 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
     }
 
 
-
-
     @Override
     public WxOpenService getWxOpenServiceByPlatFormId(Integer platFormId) {
         return wxOpenServiceMap.get(platFormId);
@@ -158,6 +161,16 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
         return this.wxThirdPartMessageRouter;
     }
 
+    @Override
+    public WxOpenService getWxOpenServiceByAuthorizerAppid(String appid) {
+        AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
+
+
+        Integer platformId = adminConfig.getPlatformId();
+        WxOpenService wxOpenService = getWxOpenServiceByPlatFormId(platformId);
+        return wxOpenService;
+    }
+
     public static void main(String[] args) {
         ComponentInfo componentInfo = new ComponentInfo("wxa6f2133192bfbcac", "a828e6b5eb87419e50826c60b9a20201"
                 , "ticket@@@qP9Pd4w50ic2Jws07j4a9qbc0YXLwWi8YLjcII08Rc0rSC0djpv_fD20AGqWlTSXgyFzmyWuPgBeNm8o8ImzfQ");
@@ -180,4 +193,51 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
         System.out.println(s1);
         System.out.println(Md5Util.md5("{\"component_appid\":\"wxa6f2133192bfbcac\",\"authorizer_appid\":\"wxe1271417b2ff5b1c\",\"authorizer_refresh_token\":\"refreshtoken@@@N0INeuo9aWT1PdFNIfSTynUm8eI5gGp9fmg_SAG69p8\"}"));
     }
+@Override
+    public WxOAuth2AccessToken getOAuth2rRefreshToken(Integer platformId, String appid) {
+        WxOpenService wxOpenService = getWxOpenServiceByPlatFormId(platformId);
+        WxOpenInRedisBookConfigStorage wxOpenConfigStorage = (WxOpenInRedisBookConfigStorage) wxOpenService.getWxOpenConfigStorage();
+
+        if (wxOpenConfigStorage.isOAuth2rRefreshTokenExpired(appid)) {
+            return null;
+        }
+        String oAuth2rRefreshToken = wxOpenConfigStorage.getOAuth2rRefreshToken(appid);
+        try {
+
+            return wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid).getOAuth2Service().refreshAccessToken(oAuth2rRefreshToken);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+@Override
+    public WxOAuth2AccessToken updateOAuth2rRefreshToken(Integer platformId, String appid, String code) {
+        WxOpenService wxOpenService = getWxOpenServiceByPlatFormId(platformId);
+        WxOpenInRedisBookConfigStorage wxOpenConfigStorage = (WxOpenInRedisBookConfigStorage) wxOpenService.getWxOpenConfigStorage();
+        Lock lock = wxOpenConfigStorage.getOAuth2rRefreshTokenLock(appid);
+        boolean locked = false;
+        try {
+            do {
+                locked = lock.tryLock(100, TimeUnit.MILLISECONDS);
+                if (getOAuth2rRefreshToken(platformId,appid)!=null) {
+                    return getOAuth2rRefreshToken(platformId,appid);
+                }
+            } while (!locked);
+            WxOAuth2AccessToken accessToken = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid).getOAuth2Service().getAccessToken(code);
+            wxOpenConfigStorage.updateOAuth2rRefreshToken(appid, accessToken, 60 * 60 * 24 * 30);
+            return accessToken;
+
+        } catch (Exception e) {
+            throw new WxRuntimeException(e);
+        } finally {
+            if (locked) {
+                lock.unlock();
+            }
+        }
+
+    }
+
+
 }

+ 82 - 0
book-push/src/main/java/com/book/push/utils/UrlUtil.java

@@ -0,0 +1,82 @@
+package com.book.push.utils;
+
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+/**
+ * created in 2021/9/6
+ * Project: book-store
+ *
+ * @author win7
+ */
+
+public class UrlUtil {
+
+
+
+
+        /**
+         * 获取网络的根域名
+         * @param url
+         * @return
+         */
+        public static String getDomainName(String url){
+            String pattern = "/(?!/)";
+            Pattern compile = Pattern.compile(pattern);
+            Matcher matcher = compile.matcher(url);
+            ArrayList<Integer> list = new ArrayList<>();
+            while (matcher.find()){
+                list.add(matcher.start());
+            }
+            return url.substring(0, list.get(1)).split("//")[1];
+        }
+
+        /**
+         *根据 index 来返回几级域名<br/>
+         * 如果 index为0,则返回顶级域名,如http://localhost:8080/。<br/>
+         * 如果index大于url所包含的最大域名级数就返回url<br/>
+         * @param url
+         * @param index  域名的级别,0为顶级域名,以此类推。
+         * @return
+         */
+        public static String getDomainName(String url,int index){
+            String pattern = "/(?!/)";
+            Pattern compile = Pattern.compile(pattern);
+            Matcher matcher = compile.matcher(url);
+            ArrayList<Integer> list = new ArrayList<>();
+            while (matcher.find()){
+                list.add(matcher.start());
+            }
+
+            try{
+                //如果index大于url所包含的最大域名级数就返回url
+                //这里面list的size减一就是这个url的最大级数,因为list包含一个/是url中http://的/。所以不应该算数
+                if(index>=list.size()-1){
+                    return url;
+                }else if (index<0){
+                    return null;
+                }else {
+                    return url.substring(0, list.get(index+1)+1);
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+                return null;
+            }
+        }
+
+        public static String replaceDomain  (String url,String domain){
+          return   url.replace(getDomainName(url),domain);
+        }
+
+        public static String addParams(String url,String params){
+            String s = url.contains("?")?"&":"?";
+            return url.concat(s).concat(params);
+        }
+
+    public static void main(String[] args) {
+        System.out.println(getDomainName("http://localhost:8080/test/session"));
+    }
+}

+ 3 - 0
book-server/pom.xml

@@ -125,6 +125,9 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+
+
+
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>