Переглянути джерело

登录优化,签到优化,消息优化

lijilei 3 роки тому
батько
коміт
6a945778d3
21 змінених файлів з 478 додано та 186 видалено
  1. 4 0
      book-push/src/main/java/com/book/push/Application.java
  2. 3 3
      book-push/src/main/java/com/book/push/config/WxOpenInRedisBookConfigStorage.java
  3. 62 20
      book-push/src/main/java/com/book/push/controller/BookIndexController.java
  4. 186 0
      book-push/src/main/java/com/book/push/controller/LoginController.java
  5. 4 1
      book-push/src/main/java/com/book/push/handler/AbstractHandler.java
  6. 4 2
      book-push/src/main/java/com/book/push/handler/LocationHandler.java
  7. 3 1
      book-push/src/main/java/com/book/push/handler/LogHandler.java
  8. 12 99
      book-push/src/main/java/com/book/push/handler/MenuHandler.java
  9. 134 19
      book-push/src/main/java/com/book/push/handler/MsgHandler.java
  10. 6 4
      book-push/src/main/java/com/book/push/handler/SubscribeHandler.java
  11. 3 1
      book-push/src/main/java/com/book/push/handler/UnsubscribeHandler.java
  12. 1 1
      book-push/src/main/java/com/book/push/service/dao/impl/BookServiceImpl.java
  13. 22 13
      book-push/src/main/java/com/book/push/service/dao/impl/UserServiceImpl.java
  14. 3 0
      book-push/src/main/java/com/book/push/service/redis/RedisService.java
  15. 5 1
      book-push/src/main/java/com/book/push/service/redis/impl/RedisServiceImpl.java
  16. 2 2
      book-push/src/main/java/com/book/push/service/wx/WxThirdPartService.java
  17. 14 16
      book-push/src/main/java/com/book/push/service/wx/impl/WxThirdPartServiceImpl.java
  18. 1 1
      book-push/src/main/java/com/book/push/task/KefuTask.java
  19. 1 1
      book-push/src/main/java/com/book/push/task/NoPayTask.java
  20. 1 1
      book-push/src/main/java/com/book/push/task/RecentReadTask.java
  21. 7 0
      book-push/src/main/resources/log4j2.xml

+ 4 - 0
book-push/src/main/java/com/book/push/Application.java

@@ -16,6 +16,10 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @ComponentScan({"com.book.dao","com.book.push"})
 public class Application {
     public static void main(String[] args) {
+
+        //下面语句使得日志输出使用异步处理,减小输出日志对性能的影响
+        System.setProperty("Log4jContextSelector",
+                "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
         SpringApplication.run(Application.class);
         System.out.println("---------------------------------------------------------------------------------------------------------------");
         System.out.println("----------------     -         application book-push run success                 ---------------------------");

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

@@ -267,7 +267,7 @@ public class WxOpenInRedisBookConfigStorage extends WxOpenInRedisConfigStorage {
 
 
     public String getOAuth2rRefreshToken(String appid){
-      return   redisService.get(this.getKey(this.getOAuth2rRefreshTokenKey(), appid));
+      return   redisService.get(this.getKey(this.oauth2RefreshTokenKey, appid));
 
     }
     @Deprecated
@@ -285,8 +285,8 @@ public class WxOpenInRedisBookConfigStorage extends WxOpenInRedisConfigStorage {
         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 void updateOAuth2rRefreshToken(String appId, String  oAuth2rRefreshToken, int expiresInSeconds) {
+        redisService.set(this.getKey(this.oauth2RefreshTokenKey, appId), oAuth2rRefreshToken, expiresInSeconds - 60*60);
     }
 
     public Lock getOAuth2rRefreshTokenLock(String appid){

+ 62 - 20
book-push/src/main/java/com/book/push/controller/BookIndexController.java

@@ -17,18 +17,21 @@ import com.book.push.cons.UrlCons;
 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 com.book.push.utils.UrlUtil;
 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.apache.commons.lang3.StringUtils;
 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.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -37,7 +40,7 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Slf4j
 @Controller
-@RequestMapping("/login")
+@RequestMapping("/oldlogin")
 public class BookIndexController {
     @Autowired
     private AdminConfigService adminConfigService;
@@ -56,6 +59,7 @@ public class BookIndexController {
     private UserSilentService userSilentService;
     @Autowired
     private ConfigService configService;
+
     /**
      * //FIXME
      * <p>
@@ -117,27 +121,29 @@ public class BookIndexController {
 
     }
 
-    @GetMapping
+    @GetMapping("/new")
     public String login(HttpServletRequest request, @RequestParam String appid, @RequestParam String code, @RequestParam String state) {
 
 
         WxOAuth2AccessToken oAuth2rRefreshToken = null;
         AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
+        String domainName = request.getServerName();
         if (code == null) {
 
-            String domainName = request.getServerName();
+
             String referer = request.getHeader("referer");
-            referer = referer == null ? "home" : referer;
+            if (referer == null) {
+                return buildRedirectUrl(null);
+            }
             state = Md5Util.md5(referer);
-            String replace = referer.replace("http://", "").replace("https://", "");
-            appid = replace.split("\\.")[0];
+            appid = UrlUtil.getDomainName(referer).split("\\.")[0];
 
             if (redisService.get(state) == null) {
                 redisService.set(state, referer);
             }
 
 
-            oAuth2rRefreshToken = thirdPartService.getOAuth2rRefreshToken(adminConfig.getPlatformId(), appid);
+            oAuth2rRefreshToken = thirdPartService.getOAuth2AccessTokenByRefreshToken(adminConfig.getPlatformId(), appid);
             if (oAuth2rRefreshToken == null) {
                 String redirectUrl = String.format(UrlCons.URL_OAUTH2_REDIRECT_LOGIN, domainName);
                 WxOAuth2Service oAuth2Service = thirdPartService.getWxOpenServiceByAuthorizerAppid(appid)
@@ -147,12 +153,14 @@ public class BookIndexController {
             }
 
         } else {
-            oAuth2rRefreshToken = thirdPartService.updateOAuth2rRefreshToken(adminConfig.getPlatformId(), appid, code);
+            oAuth2rRefreshToken = thirdPartService.getOAuth2AccessTokenByCode(adminConfig.getPlatformId(), appid, code);
 
         }
+
+
         if (oAuth2rRefreshToken == null) {
             log.error("登录出错,呜呜~~");
-            return buildRedirectUrl( null);
+            return buildRedirectUrl(null);
         }
 
 
@@ -161,31 +169,65 @@ public class BookIndexController {
 
             user = userService.createUserByOpenid(oAuth2rRefreshToken.getOpenId(), adminConfig.getAdminId());
             //二次静默
-        }else {
-            if(userSlientExist(user)!=null){
+
+            return defaultUserSlient(appid, state, domainName) == null ?
+                    buildRedirectUrl(getFontUlr(state, adminConfig, user)) : defaultUserSlient(appid, state, domainName);
+
+
+        } else {
+            if (userSlientExist(user) != null) {
                 //二次静默
 
-            }else{
-                return buildRedirectUrl(getFontUlr(state,adminConfig,user));
+            } else {
+                return buildRedirectUrl(getFontUlr(state, adminConfig, user));
             }
         }
         return buildRedirectUrl("");
 
     }
 
+    private String defaultUserSlient(String appid, String state, String domainName) {
+        Config config = configService.selectByName(SiteCons.SILENT_DEFAULT_CHANNEL);
+        if (config == null || StringUtils.isEmpty(config.getValue())) {
+            return null;
+        }
+        Integer value = Integer.valueOf(config.getValue());
+        AdminConfig adminConfig = adminConfigService.selectByAdminId(value);
+
+        WxOAuth2AccessToken oAuth2rRefreshToken = thirdPartService.getOAuth2AccessTokenByRefreshToken(adminConfig.getPlatformId(), adminConfig.getAppid());
+        if (oAuth2rRefreshToken == null) {
+
+            String redirectUrl = String.format(UrlCons.URL_OAUTH2_REDIRECT_LOGIN, domainName);
+            WxOAuth2Service oAuth2Service = thirdPartService.getWxOpenServiceByAuthorizerAppid(adminConfig.getAppid())
+                    .getWxOpenComponentService().getWxMpServiceByAppid(adminConfig.getAppid()).getOAuth2Service();
+            String auto2Url = oAuth2Service.buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, state);
+            return buildRedirectUrl(auto2Url);
+        } else {
+
+
+        }
+        return null;
+    }
+
+
     private String buildRedirectUrl(String fontUlr) {
-        return "redirect:" +fontUlr;
+        if (fontUlr == null || !fontUlr.toLowerCase().startsWith("http")) {
+
+            String msg = fontUlr == null ? "登陆失败,请在网页内登录" : fontUlr;
+            return msg;
+        }
+        return "redirect:" + fontUlr;
     }
 
     private String getFontUlr(String referer, AdminConfig adminConfig, User user) {
-        if (referer==null){
+        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()));
+        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) {
@@ -201,7 +243,7 @@ public class BookIndexController {
         userSilent.setTriAppid(defaultAdminConfig.getAppid());
         log.debug(JsonUtils.toJsonStr(userSilent));
         UserSilent result = userSilentService.selectByUserSlient(userSilent);
-        return result ;
+        return result;
 
 
     }

+ 186 - 0
book-push/src/main/java/com/book/push/controller/LoginController.java

@@ -0,0 +1,186 @@
+package com.book.push.controller;
+
+/**
+ * created in 2021/8/17
+ * Project: book-store
+ *
+ * @author win7
+ */
+
+import com.book.dao.cps.pojo.AdminConfig;
+import com.book.dao.cps.pojo.Ophost;
+import com.book.dao.cps.pojo.User;
+import com.book.push.cons.UrlCons;
+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.Md5Util;
+import com.book.push.utils.UrlUtil;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.service.WxOAuth2Service;
+import org.apache.commons.lang3.StringUtils;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ *
+ * @author
+ */
+@Slf4j
+@Controller
+@RequestMapping("/login")
+public class LoginController {
+    @Autowired
+    private AdminConfigService adminConfigService;
+    @Autowired
+    private WxThirdPartService thirdPartService;
+
+    @Value("${book.debug}")
+    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>
+     * 重定向urL,需要改
+     */
+
+
+    @GetMapping
+    public String userLogin(HttpServletRequest request, @RequestParam(required=false) String appid, @RequestParam(required=false) String code, @RequestParam(required=false) String state) {
+
+
+        WxOAuth2AccessToken oAuth2rRefreshToken = null;
+        String domainName = request.getServerName();
+        if (code == null) {
+
+            return fromFront(request, domainName);
+
+        } else {
+            AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
+            oAuth2rRefreshToken = thirdPartService.getOAuth2AccessTokenByCode(adminConfig.getPlatformId(), appid, code);
+            log.info(oAuth2rRefreshToken.toString());
+            User user = null;
+            try {
+                WxOAuth2Service oAuth2Service = thirdPartService.getWxOpenServiceByAuthorizerAppid(adminConfig.getAppid())
+                        .getWxOpenComponentService().getWxMpServiceByAppid(adminConfig.getAppid()).getOAuth2Service();
+                user = userService.selectByOpenId(oAuth2rRefreshToken.getOpenId());
+                if (user==null){
+                    WxOAuth2UserInfo userInfo = oAuth2Service.getUserInfo(oAuth2rRefreshToken, "");
+                    log.info(userInfo.toString());
+                    user = userService.createUserByWxOAuth2UserInfo(userInfo,adminConfig.getAdminId());
+
+                }
+            } catch (WxErrorException e) {
+                e.printStackTrace();
+                user = userService.createUserByOpenid(oAuth2rRefreshToken.getOpenId(), adminConfig.getAdminId());
+            }
+            return buildRedirectUrl(getFontUlr(redisService.get(state),adminConfig,user.getId()));
+        }
+
+
+
+
+    }
+
+    private String fromFront(HttpServletRequest request, String domainName) {
+        WxOAuth2AccessToken oAuth2rRefreshToken=null;
+        String referer = request.getHeader("referer");
+        if (referer == null) {
+            return buildRedirectUrl(null);
+        }
+        String state = Md5Util.md5(referer);
+
+
+
+        String appid = getAppIdByReferer(referer);
+        AdminConfig adminConfig = adminConfigService.selectByAppid(appid);
+//        oAuth2rRefreshToken = thirdPartService.getOAuth2AccessTokenByRefreshToken(adminConfig.getPlatformId(), adminConfig.getAppid());
+        WxOAuth2Service oAuth2Service = thirdPartService.getWxOpenServiceByAuthorizerAppid(adminConfig.getAppid())
+                .getWxOpenComponentService().getWxMpServiceByAppid(adminConfig.getAppid()).getOAuth2Service();
+        if (oAuth2rRefreshToken == null) {
+            if (redisService.get(state) == null) {
+                redisService.set(state, referer);
+            }
+            String redirectUrl = String.format(UrlCons.URL_OAUTH2_REDIRECT_LOGIN, domainName);
+
+            String auto2Url = oAuth2Service.buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_USERINFO, state);
+            return buildRedirectUrl(auto2Url);
+        } else {
+
+            //todo 废弃
+            User user = null;
+            try {
+                log.info(oAuth2rRefreshToken.toString());
+                user = userService.selectByOpenId(oAuth2rRefreshToken.getOpenId());
+                if (user==null){
+                    WxOAuth2UserInfo userInfo = oAuth2Service.getUserInfo(oAuth2rRefreshToken, "");
+                    log.info(userInfo.toString());
+                    user = userService.createUserByWxOAuth2UserInfo(userInfo,adminConfig.getAdminId());
+
+                }
+
+            } catch (WxErrorException e) {
+                e.printStackTrace();
+                user = userService.createUserByOpenid(oAuth2rRefreshToken.getOpenId(), adminConfig.getAdminId());
+            }
+            return buildRedirectUrl(getFontUlr(referer,adminConfig,user.getId()));
+        }
+    }
+
+
+    private String getAppIdByReferer(String referer) {
+        if (referer == null) {
+            return null;
+        }
+        String domainName = UrlUtil.getDomainName(referer);
+        return domainName.split("\\.")[0];
+
+    }
+
+
+
+
+    private String buildRedirectUrl(String fontUlr) {
+        if (fontUlr == null || !fontUlr.toLowerCase().startsWith("http")) {
+
+            String msg = (fontUlr == null ? "登陆失败,请在网页内登录" : fontUlr);
+            return msg;
+        }
+        log.info("跳转:" +fontUlr);
+        return "redirect:" + fontUlr;
+    }
+
+    private String getFontUlr(String referer, AdminConfig adminConfig, Long userId) {
+        if (referer == null) {
+            return "登录失败啦,请在网站里面进行登录";
+        }
+        Integer ophostId = adminConfig.getOphostId();
+        Ophost ophost = opHostService.selectById(ophostId);
+//        String s = redisService.get(referer);
+        String url = UrlUtil.replaceDomain(referer, adminConfig.getAppid() + "." + ophost.getHost());
+        return UrlUtil.addParams(url, String.format(UrlCons.URL_PARAMS, adminConfig.getAdminId(), userId));
+    }
+
+
+
+}

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

@@ -1,5 +1,6 @@
 package com.book.push.handler;
 
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.mp.api.WxMpMessageHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory;
 /**
  * @author
  */
+@Slf4j
 public abstract class AbstractHandler implements WxMpMessageHandler {
-    protected Logger logger = LoggerFactory.getLogger(getClass());
+    public static final String MESSAGE_TYPE_NEWS = "news";
+    public static final String MESSAGE_TYPE_TEXT = "text";
 }

+ 4 - 2
book-push/src/main/java/com/book/push/handler/LocationHandler.java

@@ -1,6 +1,7 @@
 package com.book.push.handler;
 
 import com.book.push.builder.TextBuilder;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.session.WxSessionManager;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
@@ -14,6 +15,7 @@ import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType;
 /**
  * @author
  */
+@Slf4j
 @Component
 public class LocationHandler extends AbstractHandler {
 
@@ -27,13 +29,13 @@ public class LocationHandler extends AbstractHandler {
                 String content = "感谢反馈,您的的地理位置已收到!";
                 return new TextBuilder().build(content, wxMessage, null);
             } catch (Exception e) {
-                this.logger.error("位置消息接收处理失败", e);
+               log.error("位置消息接收处理失败", e);
                 return null;
             }
         }
 
         //上报地理位置事件
-        this.logger.info("上报地理位置,纬度 : {},经度 : {},精度 : {}",
+        log.info("上报地理位置,纬度 : {},经度 : {},精度 : {}",
             wxMessage.getLatitude(), wxMessage.getLongitude(), String.valueOf(wxMessage.getPrecision()));
 
         //TODO  可以将用户地理位置信息保存到本地数据库,以便以后使用

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

@@ -1,6 +1,7 @@
 package com.book.push.handler;
 
 import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.session.WxSessionManager;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
@@ -14,13 +15,14 @@ import java.util.Map;
 /**
  * @author
  */
+@Slf4j
 @Component
 public class LogHandler extends AbstractHandler {
     @Override
     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
                                     Map<String, Object> context, WxMpService wxMpService,
                                     WxSessionManager sessionManager) {
-        this.logger.info("\n接收到请求消息,内容:{}", JSON.toJSONString(wxMessage));
+        log.info("\n接收到请求消息,内容:{}", JSON.toJSONString(wxMessage));
         return null;
     }
 

+ 12 - 99
book-push/src/main/java/com/book/push/handler/MenuHandler.java

@@ -33,31 +33,12 @@ import static me.chanjar.weixin.common.api.WxConsts.EventType;
  */
 @Component
 public class MenuHandler extends AbstractHandler {
-    @Autowired
-    private PushService pushService;
+
     @Autowired
     private UserService userService;
     @Autowired
     private AdminConfigService adminConfigService;
 
-    @Lazy
-    @Autowired
-    private WxThirdPartService wxThirdPartService;
-    @Autowired
-    private SignRecommendService signRecommendService;
-    @Autowired
-    private SignedRecommendService signedRecommendService;
-    @Autowired
-    private ManageTitleService manageTitleService;
-    @Autowired
-    private ManageCoverService manageCoverService;
-    @Autowired
-    private ConfigService configService;
-    @Autowired
-    private BookService bookService;
-
-    @Autowired
-    private SignMapper signMapper;
 
     @Override
     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
@@ -70,102 +51,34 @@ public class MenuHandler extends AbstractHandler {
 
         String appid = wxMessage.getToUser();
         User user = userService.selectByOpenId(wxMessage.getFromUser());
-        Config config = configService.selectByName(SiteCons.SIGN_KANDIAN);
-        int kandian = Integer.valueOf(config.getValue());
+
         Integer channelId = user.getChannelId();
         AdminConfig adminConfig = adminConfigService.selectByAdminId(channelId);
 
         Long id = user.getId();
-        SignExample example = SignExample.newAndCreateCriteria().andUidEqualTo(id.intValue()).andCreatedateEqualTo(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD_N)).example();
-        Sign sign = signMapper.selectOneByExample(example);
-        if ("1".equals(adminConfig.getSignTip())) {
-
-            pushMessage(user, adminConfig, appid, sign != null);
-        }
-        if (sign == null) {
-            sign = new Sign();
-            sign.setUid(id.intValue());
-            sign.setCreatedate(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD_N));
-            sign.setCreatetime(DateUtils.getNow());
-            sign.setKandian(kandian);
-            signMapper.insert(sign);
-
-
-            addKandian(user, kandian);
-        }
 
 
-        return msgAfterSing(appid, user.getOpenid());
+        return msgAfterSing(wxMessage, appid, user.getOpenid());
 
 
     }
 
-    private WxMpXmlOutMessage msgAfterSing(String appid, String openid) {
+    private WxMpXmlOutMessage msgAfterSing(WxMpXmlMessage wxMessage, String appid, String openid) {
         //todo 签到后回复
-
+        String msg = "";
 //        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)
-                .fromUser(appid).toUser(openid)
-                .build();
-       return wxMpXmlOutTextMessage;
-
-    }
-
-
-    /**
-     * 添加看点
-     *
-     * @param user
-     * @param kandian
-     */
-    private void addKandian(User user, int kandian) {
-        //TODO
-        userService.insertKandian(user.getId(),"5",0,kandian);
-    }
-
+        if ("签到".equals(wxMessage.getEventKey())) {
+            msg = "<a href=\"weixin://bizmsgmenu?msgmenucontent=签到&msgmenuid=0\">\uD83D\uDC49\uD83D\uDC49点击领取免费书币</a>";
 
-    /**
-     * 签到推送
-     *
-     * @param user
-     * @param b    是否已经签到
-     */
-    private void pushMessage(User user, AdminConfig adminConfig, String appid, boolean b) {
-        Long bookId;
-        if (b) {
-            SignedRecommand signRecommand = signedRecommendService.selectRandom(user.getSex().toString());
-            bookId = signRecommand.getBookId();
-        } else {
-            SignRecommand signRecommand = signRecommendService.selectRandom(user.getSex().toString());
-            bookId = signRecommand.getBookId();
+            WxMpXmlOutTextMessage wxMpXmlOutTextMessage = WxMpXmlOutMessage.TEXT().content(msg)
+                    .fromUser(appid).toUser(openid)
+                    .build();
+            return wxMpXmlOutTextMessage;
 
         }
-        ManageTitle manageTitle = manageTitleService.selectRandom(user.getSex().toString());
-        ManageCover manageCover = manageCoverService.selectRandom("1", user.getSex().toString());
-        WxMpKefuMessage.WxArticle wxArticle = new WxMpKefuMessage.WxArticle();
-        wxArticle.setTitle(manageTitle.getTitle());
-        wxArticle.setPicUrl(manageCover.getImage());
-        wxArticle.setUrl(createUrl(bookId, adminConfig, user));
-        WxMpKefuMessage build = new NewsBuilder().toUser(user.getOpenid()).addArticle(wxArticle).build();
-
-
-        Integer platformId = adminConfig.getPlatformId();
-        WxOpenService wxOpenService = wxThirdPartService.getWxOpenServiceByPlatFormId(platformId);
-        WxOpenMpService wxMpService = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid);
-        long second = 10 * 60 * 60;
-        pushService.addWxKefuMessagePushTask(wxMpService, build, second, TimeUnit.SECONDS);
-
-        System.out.println("发送失败");
+        return null;
 
     }
 
-    private String createUrl(Long bookId, AdminConfig adminConfig, User user) {
-
-        return bookService.createBookUrl(bookId, adminConfig, user);
-
-    }
 
 }

+ 134 - 19
book-push/src/main/java/com/book/push/handler/MsgHandler.java

@@ -1,34 +1,40 @@
 package com.book.push.handler;
 
-import com.alibaba.fastjson.JSON;
-import com.book.dao.cps.pojo.AdminConfig;
-import com.book.dao.cps.pojo.User;
-import com.book.dao.cps.pojo.WechatAutoreply;
+import com.book.dao.cps.pojo.*;
+import com.book.dao.cpsshard.entity.Sign;
+import com.book.dao.cpsshard.mapper.SignMapper;
+import com.book.dao.cpsshard.pojo.example.SignExample;
+import com.book.dao.utils.DateUtils;
+import com.book.dao.utils.TimeUtil;
 import com.book.push.builder.TextBuilder;
 import com.book.push.builder.TuWenBuilder;
+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.OpHostService;
-import com.book.push.service.dao.UserService;
-import com.book.push.service.dao.WechatAutoreplayService;
+import com.book.push.service.dao.*;
+import com.book.push.service.push.PushService;
+import com.book.push.service.redis.RedisService;
+import com.book.push.service.wx.WxThirdPartService;
 import com.book.push.utils.JsonUtils;
 import com.book.push.vo.NewsMsgContent;
 import com.book.push.vo.TextMsgContent;
-import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.session.WxSessionManager;
 import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage;
+import me.chanjar.weixin.mp.builder.kefu.NewsBuilder;
+import me.chanjar.weixin.open.api.WxOpenMpService;
+import me.chanjar.weixin.open.api.WxOpenService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-
-import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author
@@ -43,7 +49,27 @@ public class MsgHandler extends AbstractHandler {
     private UserService userService;
     @Autowired
     private OpHostService opHostService;
-
+    @Autowired
+    private SignMapper signMapper;
+    @Autowired
+    private SignRecommendService signRecommendService;
+    @Autowired
+    private SignedRecommendService signedRecommendService;
+    @Autowired
+    private ManageTitleService manageTitleService;
+    @Autowired
+    private ManageCoverService manageCoverService;
+    @Autowired
+    private PushService pushService;
+    @Autowired
+    private ConfigService configService;
+    @Autowired
+    private BookService bookService;
+    @Autowired
+    private RedisService redisService;
+    @Lazy
+    @Autowired
+    private WxThirdPartService wxThirdPartService;
     @Override
     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
                                     Map<String, Object> context, WxMpService weixinService,
@@ -53,15 +79,45 @@ public class MsgHandler extends AbstractHandler {
         AdminConfig adminConfig = adminConfigService.selectByAppid(wxMessage.getToUser());
         WechatAutoreply wechatAutoreply = wechatAutoreplayService.selectByAdminIdAndText(adminConfig.getAdminId(), wxMessage.getContent());
         User user = userService.selectByOpenId(wxMessage.getFromUser());
+        if ("签到".equals(wxMessage.getContent())){
+            SignExample example = SignExample.newAndCreateCriteria().andUidEqualTo(user.getId().intValue()).andCreatedateEqualTo(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD_N)).example();
+            Sign sign = signMapper.selectOneByExample(example);
+            if ("1".equals(adminConfig.getSignTip())) {
+
+                pushMessage(user, adminConfig, adminConfig.getAppid(), sign != null);
+            }
+            Config config = configService.selectByName(SiteCons.SIGN_KANDIAN);
+            int kandian = Integer.valueOf(config.getValue());
+
+            if (sign == null) {
+                sign = new Sign();
+                sign.setUid(user.getId().intValue());
+                sign.setCreatedate(TimeUtil.getCurrentIntDate(TimeUtil.YYYYMMDD_N));
+                sign.setCreatetime(DateUtils.getNow());
+                sign.setKandian(kandian);
+                signMapper.insert(sign);
+
+
+                addKandian(user, kandian);
+            }
+
+        }
+
+
         String host = opHostService.selectById(adminConfig.getOphostId()).getHost();
         if (wechatAutoreply != null) {
             String type = wechatAutoreply.getType();
-            if ("text".equals(type)) {
+            if (MESSAGE_TYPE_TEXT.equals(type)) {
                 String textContent = wechatAutoreply.getTextContent();
-                List<TextMsgContent> textMsgContents = JsonUtils.getList(textContent, TextMsgContent.class);
+               TextMsgContent[] textMsgContents = JsonUtils.getArray(textContent, TextMsgContent.class);
                 StringBuilder sb = new StringBuilder();
                 for (TextMsgContent textMsgContent : textMsgContents) {
-                    sb.append(String.format("<a href='%s'>%s</a>\n", textMsgContent.getUrl().replace("{$ophost}", host), textMsgContent.getTitle()));
+                    String url = (textMsgContent.getUrl() !=null?textMsgContent.getUrl():textMsgContent.getReferral_url());
+                    if (url==null){
+                        url = String.format(UrlCons.FRONT_URL, adminConfig.getAppid(), host, UrlCons.MODEL_BOOK, adminConfig.getAdminId(), user.getId() + "")
+                                .concat("&bookId=").concat(textMsgContent.getBook_id()).concat("&").concat(textMsgContent.getChapter_id());
+                    }
+                    sb.append("\n\r").append(String.format("<a href='%s'>%s</a>\n", url.replace("{$ophost}", host), textMsgContent.getTitle()));
                 }
                 String nickname = user.getNickname();
                 String json = adminConfig.getJson().toString();
@@ -70,9 +126,9 @@ public class MsgHandler extends AbstractHandler {
                 String msg = "@%s,欢迎关注 [%s],点击下方继续阅读 %s\n\r为了方便下次阅读,请置顶公众号";
                 msg = String.format(msg, nickname, nick_name, sb.toString());
                 return new TextBuilder().build(msg, wxMessage, weixinService);
-            } else if ("news".equals(type)) {
+            } else if (MESSAGE_TYPE_NEWS.equals(type)) {
 
-                List<NewsMsgContent> newsMsgContents = JsonUtils.getList(wechatAutoreply.getNewsContent(), NewsMsgContent.class);
+                NewsMsgContent[] newsMsgContents = JsonUtils.getArray(wechatAutoreply.getNewsContent(), NewsMsgContent.class);
                 List<WxMpXmlOutNewsMessage.Item> items = new ArrayList<>();
                 for (NewsMsgContent newsMsgContent : newsMsgContents) {
                     WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
@@ -85,16 +141,75 @@ public class MsgHandler extends AbstractHandler {
                                 .concat("&bookId=").concat(newsMsgContent.getBook_id()).concat("&").concat(newsMsgContent.getChapter_id());
                     }
                     item.setUrl(url);
+                    items.add(item);
                 }
 
-                new TuWenBuilder().build(items, wxMessage, weixinService);
+            return     new TuWenBuilder().build(items, wxMessage, weixinService);
             }
 
         }
 
 
-        return new TextBuilder().build("success", wxMessage, weixinService);
+        return null;
+
+    }
+    /**
+     * 添加看点
+     *
+     * @param user
+     * @param kandian
+     */
+    private void addKandian(User user, int kandian) {
+        //TODO
+        userService.insertKandian(user.getId(),"5",0,kandian);
+        redisService.del("freeCoin_"+user.getId());
+    }
+
+
+    /**
+     * 签到推送
+     *
+     * @param user
+     * @param b    是否已经签到
+     */
+    private void pushMessage(User user, AdminConfig adminConfig, String appid, boolean b) {
+        Long bookId;
+        if (b) {
+            SignedRecommand signRecommand = signedRecommendService.selectRandom(user.getSex().toString());
+            bookId = signRecommand.getBookId();
+        } else {
+            SignRecommand signRecommand = signRecommendService.selectRandom(user.getSex().toString());
+            bookId = signRecommand.getBookId();
+
+        }
+        ManageTitle manageTitle = manageTitleService.selectRandom(user.getSex().toString());
+        ManageCover manageCover = manageCoverService.selectRandom("1", user.getSex().toString());
+        WxMpKefuMessage.WxArticle wxArticle = new WxMpKefuMessage.WxArticle();
+        wxArticle.setTitle(manageTitle.getTitle());
+        wxArticle.setPicUrl(manageCover.getImage());
+        wxArticle.setUrl(createUrl(bookId, adminConfig, user));
+        WxMpKefuMessage build = new NewsBuilder().toUser(user.getOpenid()).addArticle(wxArticle).build();
+
+
+        Integer platformId = adminConfig.getPlatformId();
+        WxOpenService wxOpenService = wxThirdPartService.getWxOpenServiceByPlatFormId(platformId);
+        WxOpenMpService wxMpService = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid);
+        long second = 10 * 60 * 60;
+        pushService.addWxKefuMessagePushTask(wxMpService, build, second, TimeUnit.SECONDS);
+
+        System.out.println("发送失败");
+
+    }
+    private String createUrl(Long bookId, AdminConfig adminConfig, User user) {
+
+        return bookService.createBookUrl(bookId, adminConfig, user);
+
+    }
 
+    public static void main(String[] args) {
+        String s = "[{\"book_id\":3584,\"chapter_id\":\"\",\"title\":\"曾经是雇佣兵王的他,退役归来,横行都市,左拥右抱..\",\"description\":\"我噢噢噢噢噢噢噢噢\",\"image_type\":3,\"activity_url\":\"\",\"referral_url\":\"http:\\/\\/wxe1271417b2ff5b1c.{$ophost}\\/t\\/1175\",\"give_activity_url\":\"\",\"url\":\"http:\\/\\/wxe1271417b2ff5b1c.{$ophost}\\/t\\/1175\",\"image\":\"https:\\/\\/cpsn.zsjwaw.cn\\/uploads\\/20180601\\/e14a04e6ffe3ab0464cd965b6f34e6f2.jpg\"}]";
+        NewsMsgContent[] newsMsgContents = JsonUtils.getArray(s, NewsMsgContent.class);
+        System.out.println(newsMsgContents);
     }
 
 }

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

@@ -11,6 +11,7 @@ import com.book.push.service.dao.*;
 import com.book.push.utils.JsonUtils;
 import com.book.push.vo.NewsMsgContent;
 import com.book.push.vo.TextMsgContent;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.session.WxSessionManager;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -29,6 +30,7 @@ import java.util.Map;
 /**
  * @author
  */
+@Slf4j
 @Component
 public class SubscribeHandler extends AbstractHandler {
     @Autowired
@@ -46,7 +48,7 @@ public class SubscribeHandler extends AbstractHandler {
                                     Map<String, Object> context, WxMpService weixinService,
                                     WxSessionManager sessionManager) throws WxErrorException {
 
-        this.logger.info("新关注用户 OPENID: " + wxMessage.getFromUser());
+       log.info("新关注用户 OPENID: " + wxMessage.getFromUser());
 
         // 获取微信用户基本信息
         WxMpUser userWxInfo ;
@@ -71,7 +73,7 @@ public class SubscribeHandler extends AbstractHandler {
             }
         } catch (WxErrorException e) {
             if (e.getError().getErrorCode() == 48001) {
-                this.logger.info("该公众号没有获取用户信息权限!");
+                log.info("该公众号没有获取用户信息权限!");
             }
         }
 
@@ -80,7 +82,7 @@ public class SubscribeHandler extends AbstractHandler {
         try {
             responseResult = this.handleSpecial(wxMessage);
         } catch (Exception e) {
-            this.logger.error(e.getMessage(), e);
+           log.error(e.getMessage(), e);
         }
 
         if (responseResult != null) {
@@ -142,7 +144,7 @@ public class SubscribeHandler extends AbstractHandler {
 
 
         } catch (Exception e) {
-            this.logger.error(e.getMessage(), e);
+            log.error(e.getMessage(), e);
         }
 
            return new TextBuilder().build(String.format("@%s,感谢关注啦",user.getNickname()), wxMessage, weixinService);

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

@@ -1,5 +1,6 @@
 package com.book.push.handler;
 
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.session.WxSessionManager;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
@@ -11,6 +12,7 @@ import java.util.Map;
 /**
  * @author
  */
+@Slf4j
 @Component
 public class UnsubscribeHandler extends AbstractHandler {
 
@@ -19,7 +21,7 @@ public class UnsubscribeHandler extends AbstractHandler {
                                     Map<String, Object> context, WxMpService wxMpService,
                                     WxSessionManager sessionManager) {
         String openId = wxMessage.getFromUser();
-        this.logger.info("取消关注用户 OPENID: " + openId);
+       log.info("取消关注用户 OPENID: " + openId);
         // TODO 可以更新本地数据库为取消关注状态
         return null;
     }

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

@@ -27,7 +27,7 @@ public class BookServiceImpl implements BookService {
 
     @Override
     public String createBookUrl(Long bookId, AdminConfig adminConfig, User user) {
-      return   String.format(UrlCons.BOOK_URL,adminConfig.getAppid(),opHostService.selectById(adminConfig.getOphostId()),UrlCons.MODEL_BOOK,
+      return   String.format(UrlCons.BOOK_URL,adminConfig.getAppid(),opHostService.selectById(adminConfig.getOphostId()).getHost(),UrlCons.MODEL_BOOK,
                 adminConfig.getAdminId(),user.getId(),String.valueOf(bookId));
     }
 

+ 22 - 13
book-push/src/main/java/com/book/push/service/dao/impl/UserServiceImpl.java

@@ -124,7 +124,8 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public User createUserByWxOAuth2UserInfo(WxOAuth2UserInfo wxMpUser, Integer channelId) {
-
+      /*  User user = selectByOpenId(wxMpUser.getOpenid());
+        if (user == null) {*/
         User user = new User();
         user.setOpenid(wxMpUser.getOpenid());
         user.setArea(wxMpUser.getCity());
@@ -147,20 +148,28 @@ public class UserServiceImpl implements UserService {
         user.setState("1");
         userMapper.insert(user);
         return 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 User createUserByOpenid(String openid, Integer channelId) {
+        User user = selectByOpenId(openid);
+        if (user == null) {
+            user = new User();
+            user.setOpenid(openid);
+            user.setNickname("");
+            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) {

+ 3 - 0
book-push/src/main/java/com/book/push/service/redis/RedisService.java

@@ -29,4 +29,7 @@ public interface RedisService {
     Set<String> getSet(String key);
 
     void set(String key, String value, long second);
+
+
+    Long del(String key);
 }

+ 5 - 1
book-push/src/main/java/com/book/push/service/redis/impl/RedisServiceImpl.java

@@ -99,5 +99,9 @@ public class RedisServiceImpl implements RedisService {
         jedis.psetex(key, TimeUnit.SECONDS.toMillis(second), value);
     }
 
-
+    @Override
+    public Long del(String key){
+        @Cleanup Jedis jedis = jedisPool.getResource();
+      return jedis.del(key);
+    }
 }

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

@@ -24,7 +24,7 @@ public interface WxThirdPartService {
 
     WxOpenService getWxOpenServiceByAuthorizerAppid(String appid);
 
-    WxOAuth2AccessToken getOAuth2rRefreshToken(Integer platformId, String appid);
+    WxOAuth2AccessToken getOAuth2AccessTokenByRefreshToken(Integer platformId, String appid);
 
-    WxOAuth2AccessToken updateOAuth2rRefreshToken(Integer platformId, String appid, String code);
+    WxOAuth2AccessToken getOAuth2AccessTokenByCode(Integer platformId, String appid, String code);
 }

+ 14 - 16
book-push/src/main/java/com/book/push/service/wx/impl/WxThirdPartServiceImpl.java

@@ -193,8 +193,9 @@ 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) {
+
+    @Override
+    public WxOAuth2AccessToken getOAuth2AccessTokenByRefreshToken(Integer platformId, String appid) {
         WxOpenService wxOpenService = getWxOpenServiceByPlatFormId(platformId);
         WxOpenInRedisBookConfigStorage wxOpenConfigStorage = (WxOpenInRedisBookConfigStorage) wxOpenService.getWxOpenConfigStorage();
 
@@ -203,8 +204,8 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
         }
         String oAuth2rRefreshToken = wxOpenConfigStorage.getOAuth2rRefreshToken(appid);
         try {
-
-            return wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid).getOAuth2Service().refreshAccessToken(oAuth2rRefreshToken);
+            log.info("查询oauth2 refresh token:" + oAuth2rRefreshToken);
+            return wxOpenService.getWxOpenComponentService().oauth2refreshAccessToken(appid,oAuth2rRefreshToken);
         } catch (Exception e) {
             log.error(e.getMessage());
             e.printStackTrace();
@@ -212,29 +213,26 @@ public class WxThirdPartServiceImpl implements WxThirdPartService {
         return null;
 
     }
-@Override
-    public WxOAuth2AccessToken updateOAuth2rRefreshToken(Integer platformId, String appid, String code) {
+
+    @Override
+    public WxOAuth2AccessToken getOAuth2AccessTokenByCode(Integer platformId, String appid, String code) {
         WxOpenService wxOpenService = getWxOpenServiceByPlatFormId(platformId);
         WxOpenInRedisBookConfigStorage wxOpenConfigStorage = (WxOpenInRedisBookConfigStorage) wxOpenService.getWxOpenConfigStorage();
         Lock lock = wxOpenConfigStorage.getOAuth2rRefreshTokenLock(appid);
         boolean locked = false;
+        lock.lock();
         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);
+            wxOpenConfigStorage.updateOAuth2rRefreshToken(appid, accessToken.getRefreshToken(), 60 * 60 * 24 * 30);
+            log.info("更新oauth2 refresh token:" + accessToken.getRefreshToken());
             return accessToken;
 
         } catch (Exception e) {
             throw new WxRuntimeException(e);
         } finally {
-            if (locked) {
-                lock.unlock();
-            }
+            lock.unlock();
         }
 
     }

+ 1 - 1
book-push/src/main/java/com/book/push/task/KefuTask.java

@@ -58,7 +58,7 @@ public class KefuTask {
             String appid = adminConfig.getAppid();
             Integer platformId = adminConfig.getPlatformId();
             String userJsonStr = custom.getUserJson().toString();
-            userJsonStr = userJsonStr.replace("\\","").substring(1,userJsonStr.length()-1);
+            userJsonStr = userJsonStr.substring(1,userJsonStr.length()-1).replace("\\","");
             Custom.UserJson userJson = JsonUtils.getObject(userJsonStr, Custom.UserJson.class);
             List<User> userList = getListByjson(userJson, adminId);
             String messageJson = custom.getMessageJson().toString().replace("\\","");

+ 1 - 1
book-push/src/main/java/com/book/push/task/NoPayTask.java

@@ -63,7 +63,7 @@ public class NoPayTask {
             Integer platformId = adminConfig.getPlatformId();
             WxOpenService wxOpenService = wxThirdPartService.getWxOpenServiceByPlatFormId(platformId);
             WxOpenMpService wxMpService = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid);
-            String msg = "亲,你上次看的书还在等着你呐~ 点击继续阅读%n>%s&n首冲50元即可畅读90万字,365元年份会员更可全年无线畅读。%n%n为了下次方便阅读,请置顶公众号";
+            String msg = "亲,你上次看的书还在等着你呐~ 点击继续阅读%n>%s%n首冲50元即可畅读90万字,365元年份会员更可全年无线畅读。%n%n为了下次方便阅读,请置顶公众号";
             UserRecentlyRead userRecentlyRead = userRecentReadService.selectLastByUserId(userId);
             Long bookId = userRecentlyRead.getBookId();
             String url =bookService.createBookUrl(bookId,adminConfig,user);

+ 1 - 1
book-push/src/main/java/com/book/push/task/RecentReadTask.java

@@ -59,7 +59,7 @@ public class RecentReadTask {
             Book book = bookService.selectById(userRecentlyRead.getBookId());
             WxOpenService wxOpenService = wxThirdPartService.getWxOpenServiceByPlatFormId(platformId);
             WxOpenMpService wxMpService = wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appid);
-            String msg = "亲,你上次看的书还在等着你呐~ 点击继续阅读%n>%s&n首冲50元即可畅读90万字,365元年份会员更可全年无线畅读。%n%n为了下次方便阅读,请置顶公众号";
+            String msg = "亲,你上次看的书还在等着你呐~ 点击继续阅读%n>%s%n首冲50元即可畅读90万字,365元年份会员更可全年无线畅读。%n%n为了下次方便阅读,请置顶公众号";
             Long bookId = userRecentlyRead.getBookId();
             String url = bookService.createBookUrl(bookId, adminConfig, user);
             String link = "<a href='" + url + "'>《" + book.getName() + "》</a>";

+ 7 - 0
book-push/src/main/resources/log4j2.xml

@@ -54,6 +54,13 @@
     </appenders>
     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
     <loggers>
+        <!-- com.example 包下日志采用异步模式 -->
+        <AsyncLogger name="com.book" level="info" additivity="false" includeLocation="true">
+            <AppenderRef ref="Console" />
+            <AppenderRef ref="RollingFileInfo" />
+            <AppenderRef ref="RollingFileWarn" />
+            <AppenderRef ref="RollingFileError" />
+        </AsyncLogger>
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"/>
         <logger name="org.mybatis" level="INFO"/>