Kaynağa Gözat

微信登录

shiqian 3 yıl önce
ebeveyn
işleme
cca417ec01
40 değiştirilmiş dosya ile 1316 ekleme ve 10 silme
  1. 4 0
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java
  2. 23 0
      boman-api/boman-api-wechat/pom.xml
  3. 30 0
      boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java
  4. 6 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java
  5. 38 1
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/ClockOnDto.java
  6. 21 0
      boman-api/boman-domain/src/main/java/com/boman/domain/WechatEnum.java
  7. 58 0
      boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java
  8. 1 0
      boman-api/pom.xml
  9. 7 1
      boman-auth/pom.xml
  10. 37 3
      boman-auth/src/main/java/com/boman/auth/controller/TokenController.java
  11. 22 3
      boman-auth/src/main/java/com/boman/auth/form/LoginBody.java
  12. 5 0
      boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java
  13. 6 0
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java
  14. 2 0
      boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysUserMapper.java
  15. 8 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java
  16. 1 1
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java
  17. 14 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java
  18. 4 0
      boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml
  19. 36 0
      boman-web-core/src/main/java/com/boman/web/core/controller/MoveYmjzDataController.java
  20. 15 0
      boman-web-core/src/main/java/com/boman/web/core/mapper/StandardlyMapper.java
  21. 128 0
      boman-wechat/pom.xml
  22. 33 0
      boman-wechat/src/main/java/com/boman/wechat/BomanWechatApplication.java
  23. 14 0
      boman-wechat/src/main/java/com/boman/wechat/config/WechatConfiguration.java
  24. 86 0
      boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java
  25. 62 0
      boman-wechat/src/main/java/com/boman/wechat/controller/CheckPushMsgAuthController.java
  26. 50 0
      boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java
  27. 20 0
      boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java
  28. 7 0
      boman-wechat/src/main/java/com/boman/wechat/service/WxPushService.java
  29. 142 0
      boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java
  30. 105 0
      boman-wechat/src/main/java/com/boman/wechat/service/impl/WxPushServiceImpl.java
  31. 79 0
      boman-wechat/src/main/java/com/boman/wechat/utils/CheckAuthUtils.java
  32. 92 0
      boman-wechat/src/main/java/com/boman/wechat/utils/HttpClientUtils.java
  33. 8 0
      boman-wechat/src/main/resources/application.properties
  34. 19 0
      boman-wechat/src/main/resources/bootstrap-prod.yml
  35. 19 0
      boman-wechat/src/main/resources/bootstrap-test.yml
  36. 19 0
      boman-wechat/src/main/resources/bootstrap.yml
  37. 74 0
      boman-wechat/src/main/resources/logback.xml
  38. 4 0
      boman-wechat/src/main/resources/rebel-remote.xml
  39. 16 0
      boman-wechat/src/main/resources/rebel.xml
  40. 1 0
      pom.xml

+ 4 - 0
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java

@@ -1,6 +1,7 @@
 package com.boman.system.api;
 
 import com.boman.domain.SysUser;
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -45,4 +46,7 @@ public interface RemoteUserService
      */
     @GetMapping("/userListAll")
     List<SysUser> selectUserListAll();
+
+    @PostMapping("/user/updateUnionId")
+    public AjaxResult updateUnionId(@RequestBody SysUser sysUser);
 }

+ 23 - 0
boman-api/boman-api-wechat/pom.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>com.boman</groupId>
+        <artifactId>boman-api</artifactId>
+        <version>2.5.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>boman-api-wechat</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-domain</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+
+</project>

+ 30 - 0
boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java

@@ -0,0 +1,30 @@
+package com.boman.wechat.api;
+
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(contextId = "remoteObjService", value = ServiceNameConstants.WECHAT_SERVICE)
+public interface RemoteWechatService {
+
+    /**
+     * 功能描述: 根据微信登录后获取的code获取用户的授权信息
+     *
+     * @param loginBody 登录信息体
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("/wechat/p/c/wechatInfo")
+    AjaxResult getWechatInfo(@RequestBody LoginBody loginBody);
+
+    /**
+     * 发送消息
+     *
+     * @param dto
+     * @return
+     */
+//    @PostMapping("/wechat/p/c/pushMsg")
+//    public Map<String, Object> pushMsg(@RequestBody WxMsgDto dto);
+}

+ 6 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java

@@ -2,7 +2,7 @@ package com.boman.domain.constant;
 
 /**
  * 服务名称
- * 
+ *
  * @author ruoyi
  */
 public class ServiceNameConstants
@@ -36,4 +36,9 @@ public class ServiceNameConstants
      * boman-jflow
      */
     public static final String JFLOW_SERVICE = "boman-jflow";
+
+    /**
+     * boman-wechat
+     */
+    public static final String WECHAT_SERVICE = "boman-wechat";
 }

+ 38 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/dto/ClockOnDto.java

@@ -7,7 +7,6 @@ import lombok.Data;
  * @author shiqian
  * @date 2021年06月16日 10:12
  **/
-@Data
 public class ClockOnDto {
 
     /** 1(上班打卡)  2(下班打卡) **/
@@ -24,5 +23,43 @@ public class ClockOnDto {
     /** 用户id **/
     private Long userId;
 
+    public int getType() {
+        return type;
+    }
 
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(String longitude) {
+        this.longitude = longitude;
+    }
+
+    public String getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(String latitude) {
+        this.latitude = latitude;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
 }

+ 21 - 0
boman-api/boman-domain/src/main/java/com/boman/domain/WechatEnum.java

@@ -0,0 +1,21 @@
+package com.boman.domain;
+
+public enum WechatEnum {
+    /** 用户账号登录 */
+    U("u"),
+    /** 微信授权登录 */
+    W("w");
+
+
+    private String value;
+
+    private WechatEnum(String value)
+    {
+        this.value = value;
+    }
+
+    public String getValue()
+    {
+        return value;
+    }
+}

+ 58 - 0
boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java

@@ -0,0 +1,58 @@
+package com.boman.domain.form;
+
+/**
+ * 用户登录对象
+ *
+ * @author ruoyi
+ */
+public class LoginBody {
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 用户密码
+     */
+    private String password;
+
+    private String code;
+
+    private String logintype;
+
+    public String getUsername()
+    {
+        return username;
+    }
+
+    public void setUsername(String username)
+    {
+        this.username = username;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+    public void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getLogintype() {
+        return logintype;
+    }
+
+    public void setLogintype(String logintype) {
+        this.logintype = logintype;
+    }
+}

+ 1 - 0
boman-api/pom.xml

@@ -14,6 +14,7 @@
         <module>boman-domain</module>
         <module>boman-api-web-core</module>
         <module>boman-api-jflow</module>
+        <module>boman-api-wechat</module>
     </modules>
 
     <artifactId>boman-api</artifactId>

+ 7 - 1
boman-auth/pom.xml

@@ -64,7 +64,13 @@
             <groupId>com.boman</groupId>
             <artifactId>boman-common-security</artifactId>
         </dependency>
-        
+
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-wechat</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
     </dependencies>
 	
     <build>

+ 37 - 3
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -1,15 +1,23 @@
 package com.boman.auth.controller;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
+import com.boman.common.core.exception.BaseException;
+import com.boman.domain.SysUser;
+import com.boman.domain.WechatEnum;
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import com.boman.auth.form.LoginBody;
+import com.boman.domain.form.LoginBody;
 import com.boman.auth.service.SysLoginService;
 import com.boman.domain.dto.R;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.security.service.TokenService;
 import com.boman.system.api.model.LoginUser;
+import com.boman.wechat.api.RemoteWechatService ;
+
+import java.util.Map;
 
 /**
  * token 控制
@@ -25,12 +33,38 @@ public class TokenController
 
     @Autowired
     private SysLoginService sysLoginService;
+    @Resource
+    private RemoteWechatService remoteWechatService;
 
     @PostMapping("login")
-    public R<?> login(@RequestBody LoginBody form)
-    {
+    public R<?> login(@RequestBody LoginBody form) {
+        String openId = "";
+        // 验证是pc还是小程序
+        if (form.getLogintype() != null && form.getLogintype().equals(WechatEnum.W.getValue())) {
+            AjaxResult result = remoteWechatService.getWechatInfo(form);
+            if ((Integer) result.get(AjaxResult.CODE_TAG) != 0) {
+                throw new BaseException((String) result.get(AjaxResult.MSG_TAG));
+            }
+            Map<String, Object> jsonObject = (Map<String, Object>) result.get(AjaxResult.DATA_TAG);
+            if (jsonObject == null) {
+                throw new BaseException("未获取到微信鉴权相关信息!");
+            }
+            openId = (String) jsonObject.get("openId");
+        }
         // 用户登录
         LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
+        // 如果是微信登录并且获取到的用户的unionId不为空
+        if (form.getLogintype() != null
+                && form.getLogintype().equals(WechatEnum.W.getValue())
+                && StringUtils.isNotEmpty(openId)) {
+            SysUser sysUser = new SysUser();
+            sysUser.setId(userInfo.getSysUser().getId());
+            sysUser.setOpenId(openId);
+            AjaxResult updateResult = sysLoginService.updateUnionId(sysUser);
+            if((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
+                throw new BaseException("保存小程序唯一标识出错!");
+            }
+        }
         // 获取登录token
         return R.ok(tokenService.createToken(userInfo));
     }

+ 22 - 3
boman-auth/src/main/java/com/boman/auth/form/LoginBody.java

@@ -5,8 +5,7 @@ package com.boman.auth.form;
  * 
  * @author ruoyi
  */
-public class LoginBody
-{
+public class LoginBody {
     /**
      * 用户名
      */
@@ -17,6 +16,10 @@ public class LoginBody
      */
     private String password;
 
+    private String code;
+
+    private String logintype;
+
     public String getUsername()
     {
         return username;
@@ -36,4 +39,20 @@ public class LoginBody
     {
         this.password = password;
     }
-}
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getLogintype() {
+        return logintype;
+    }
+
+    public void setLogintype(String logintype) {
+        this.logintype = logintype;
+    }
+}

+ 5 - 0
boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java

@@ -1,5 +1,6 @@
 package com.boman.auth.service;
 
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.boman.domain.constant.Constants;
@@ -88,6 +89,10 @@ public class SysLoginService
         return userInfo;
     }
 
+    public AjaxResult updateUnionId(SysUser sysUser) {
+        return remoteUserService.updateUnionId(sysUser);
+    }
+
     public void logout(String loginName)
     {
         remoteLogService.saveLogininfor(loginName, Constants.LOGOUT, "退出成功");

+ 6 - 0
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java

@@ -73,6 +73,12 @@ public class SysUserController extends BaseController
         return getDataTable(list);
     }
 
+    @Log(title = "修改用户的小程序唯一标识", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateUnionId")
+    public AjaxResult updateUnionId(@RequestBody SysUser sysUser) {
+        return userService.updateUnionId(sysUser);
+    }
+
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize(hasPermi = "system:user:export")
     @PostMapping("/export")

+ 2 - 0
boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysUserMapper.java

@@ -120,4 +120,6 @@ public interface SysUserMapper
      * @return
      */
     List<SysUser> selectUserListAll();
+
+    int updateUnionId(SysUser user);
 }

+ 8 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.alibaba.fastjson.JSONObject;
 import com.boman.domain.SysUser;
+import com.boman.domain.dto.AjaxResult;
 
 /**
  * 用户 业务层
@@ -184,4 +185,11 @@ public interface ISysUserService
      * @return
      */
     List<SysUser> selectUserListAll();
+
+    /**
+     * 根据id修改用户的unionId(来自微信小程序)
+     * @param sysUser
+     * @return
+     */
+    AjaxResult updateUnionId(SysUser sysUser);
 }

+ 1 - 1
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java

@@ -210,7 +210,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
                 router.setSysTableName(menu.getSysTableName());
             }
             List<SysMenu> cMenus = menu.getChildren();
-            if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
+            if (!cMenus.isEmpty() && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
                 router.setAlwaysShow(true);
                 router.setRedirect("noRedirect");
                 router.setChildren(buildMenus(cMenus));

+ 14 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.List;
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.DateUtils;
 import com.boman.common.core.utils.obj.ObjectUtils;
+import com.boman.domain.dto.AjaxResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -511,4 +512,17 @@ public class SysUserServiceImpl implements ISysUserService
     public List<SysUser> selectUserListAll() {
         return userMapper.selectUserListAll();
     }
+
+    @Override
+    public AjaxResult updateUnionId(SysUser user) {
+        try {
+            if(userMapper.updateUnionId(user) > 0) {
+                return AjaxResult.successZero("");
+            }
+        }catch (Exception e) {
+            return AjaxResult.error(-1, "保存异常");
+        }
+
+        return AjaxResult.error(-1, "保存失败");
+    }
 }

+ 4 - 0
boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -190,5 +190,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<include refid="selectUserVo"/>
 		where u.status = '0' and del_flag = '0'
 	</select>
+
+	<update id="updateUnionId" parameterType="com.boman.domain.SysUser">
+		update sys_user set open_id = #{openId} where id = #{id}
+	</update>
 	
 </mapper> 

+ 36 - 0
boman-web-core/src/main/java/com/boman/web/core/controller/MoveYmjzDataController.java

@@ -0,0 +1,36 @@
+package com.boman.web.core.controller;
+
+import com.boman.web.core.mapper.StandardlyMapper;
+import com.google.common.collect.Lists;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author shiqian
+ * @date 2021年09月08日 10:40
+ **/
+@RestController
+public class MoveYmjzDataController {
+
+    @Resource
+    private StandardlyMapper mapper;
+
+    @GetMapping("/moveData/{limit}/{offset}")
+    public String moveYmjzData(@PathVariable("limit") int limit, @PathVariable("offset") int offset) {
+        List<String> idCardList = mapper.listIdCard(limit, offset);
+        int moveData = 0;
+        for (String idCard : idCardList) {
+            moveData += mapper.moveData(idCard);
+            System.err.println("当前是第 " + moveData + " 个");
+        }
+
+        return "成功了 " + moveData + " 条";
+    }
+}

+ 15 - 0
boman-web-core/src/main/java/com/boman/web/core/mapper/StandardlyMapper.java

@@ -28,6 +28,12 @@ public interface StandardlyMapper {
 
     Logger LOGGER = LoggerFactory.getLogger(StandardlyMapper.class);
 
+    /** {@link SqlProvider#moveData(java.util.Map)} */
+    @UpdateProvider(type = SqlProvider.class,method = "moveData")
+    int moveData(@Param("idCard") String idCard);
+
+    @Select({"select 身份证 FROM ymjz limit #{limit}, #{offset}"})
+    List<String> listIdCard(@Param("limit") int limit, @Param("offset") int offset);
 
     /** {@link SqlProvider#updateById(java.util.Map)} */
     @UpdateProvider(type = SqlProvider.class, method = "updateById")
@@ -325,6 +331,15 @@ public interface StandardlyMapper {
             return sqlStr;
         }
 
+        public String moveData(Map<String, Object> para) {
+            String idCard = (String) para.get("idCard");
+            return "UPDATE vaccine_info set " +
+                    "code = (SELECT 受种者编码 from ymjz where 身份证 = '" + idCard + "' limit 1)" +
+                    ", work_unit = (SELECT 工作单位 from ymjz where 身份证 = '" + idCard + "' limit 1)" +
+                    ", crowd_classification = (SELECT 人群分类 from ymjz where 身份证 = '" + idCard + "' limit 1) " +
+                    "where id_card = '" + idCard + "'\n";
+        }
+
         public String updateById(Map<String, Object> para) {
             String tableName = (String) para.get("tableName");
             JSONObject model = (JSONObject) para.get("model");

+ 128 - 0
boman-wechat/pom.xml

@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>boman</artifactId>
+        <groupId>com.boman</groupId>
+        <version>2.5.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>shujuju-wechat</artifactId>
+
+    <properties>
+
+    </properties>
+
+    <dependencies>
+        <!-- SpringCloud Ailibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Ailibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Ailibaba Sentinel -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <!-- SpringBoot Actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!-- Swagger UI -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.fox.version}</version>
+        </dependency>
+
+        <!-- Mysql Connector -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common DataSource -->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-datasource</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common DataScope-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-datascope</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common Log-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-log</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common Swagger-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-swagger</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+        </dependency>
+
+        <!--        远程调用 gen-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-gen</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+        <!--        远程调用 system-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-system</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-wechat</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>jiaoyuju-wechat</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 33 - 0
boman-wechat/src/main/java/com/boman/wechat/BomanWechatApplication.java

@@ -0,0 +1,33 @@
+package com.boman.wechat;
+
+import com.boman.common.security.annotation.EnableCustomConfig;
+import com.boman.common.security.annotation.EnableRyFeignClients;
+import com.boman.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * 微信对接模块
+ *
+ * @author zhong.h
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringCloudApplication
+@ComponentScan(value = "com.boman")
+public class BomanWechatApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BomanWechatApplication.class, args);
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------- boman wechat 模块启动成功------------------------------------");
+        System.out.println("----------------------------------boman wechat 模块启动成功-----------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+    }
+}

+ 14 - 0
boman-wechat/src/main/java/com/boman/wechat/config/WechatConfiguration.java

@@ -0,0 +1,14 @@
+package com.boman.wechat.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class WechatConfiguration {
+
+    @Bean
+    public RestTemplate initRestTemplate() {
+       return new RestTemplate();
+    }
+}

+ 86 - 0
boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java

@@ -0,0 +1,86 @@
+package com.boman.wechat.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@RefreshScope
+public class WechatProperties {
+
+    @Value("${auth.wechat.sessionHost}")
+    private String host;
+
+    @Value("${auth.wechat.appId}")
+    private String appId;
+
+    @Value("${auth.wechat.secret}")
+    private String secret;
+
+    @Value("${auth.wechat.grantType}")
+    private String grantType;
+
+    @Value("${auth.wechat.template_id}")
+    private String templateId;
+    @Value("${auth.wechat.access_token_url}")
+    private String accessTokenUrl;
+    @Value("${auth.wechat.msg_url}")
+    private String msgUrl;
+
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+
+    public String getGrantType() {
+        return grantType;
+    }
+
+    public void setGrantType(String grantType) {
+        this.grantType = grantType;
+    }
+
+    public String getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(String templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getAccessTokenUrl() {
+        return accessTokenUrl;
+    }
+
+    public void setAccessTokenUrl(String accessTokenUrl) {
+        this.accessTokenUrl = accessTokenUrl;
+    }
+
+    public String getMsgUrl() {
+        return msgUrl;
+    }
+
+    public void setMsgUrl(String msgUrl) {
+        this.msgUrl = msgUrl;
+    }
+}

+ 62 - 0
boman-wechat/src/main/java/com/boman/wechat/controller/CheckPushMsgAuthController.java

@@ -0,0 +1,62 @@
+//package com.boman.wechat.controller;
+//
+//import com.boman.domain.dto.WxMsgDto;
+//import com.boman.wechat.service.WxPushService;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.PrintWriter;
+//import java.util.Map;
+//import java.util.Objects;
+//
+//import static com.boman.wechat.utils.CheckAuthUtils.*;
+//
+///**
+// * 微信登录验证
+// *
+// * @author zhong.h
+// */
+//@RestController
+//@RequestMapping("/check/auth")
+//public class CheckPushMsgAuthController {
+//
+//    private static final Logger LOGGER = LoggerFactory.getLogger(CheckPushMsgAuthController.class);
+//
+//    @GetMapping
+//    public String pushMsg(HttpServletRequest request, HttpServletResponse response) {
+//        // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
+//        String signature = request.getParameter(SIGNATURE);
+//        // 时间戳
+//        String timestamp = request.getParameter(TIMESTAMP);
+//        // 随机数
+//        String nonce = request.getParameter(NONCE);
+//        // 随机字符串
+//        String echostr = request.getParameter(ECHOSTR);
+//        String authorization = request.getParameter(AUTHORIZATION);
+//        LOGGER.info("接收来自微信的消息, signature: {}, timestamp: {}, nonce: {}, echostr: {}, authorization: {}"
+//                , signature, timestamp, nonce, echostr, authorization);
+////        PrintWriter out = null;
+////        try {
+////            out = response.getWriter();
+//            if (checkSignature(signature, timestamp, nonce)) {
+////                out.print(echostr);
+////                out.flush();
+//                return echostr;
+//            }
+////        } catch (Exception e) {
+////            e.printStackTrace();
+////        } finally {
+////            if (Objects.nonNull(out)) {
+////                out.close();
+////            }
+////        }
+//
+//        return echostr;
+//    }
+//
+//
+//}

+ 50 - 0
boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java

@@ -0,0 +1,50 @@
+package com.boman.wechat.controller;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.service.WechatService;
+import com.boman.wechat.service.WxPushService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * 微信登录验证
+ *
+ * @author zhong.h
+ */
+@RequestMapping("/wechat/p/c")
+@RestController
+public class WechatInfoController {
+
+    @Resource
+    private WxPushService wxPushService;
+
+    @Autowired
+    private WechatService wechatService;
+
+    @ApiOperation(value = "小程序相关信息获取")
+    @RequestMapping(value = "/wechatInfo", method = RequestMethod.POST)
+    public AjaxResult getWechatInfo(@RequestBody LoginBody loginBody) {
+        return wechatService.getWechatInfo(loginBody);
+    }
+
+    @ApiOperation(value = "小程序模板id获取")
+    @GetMapping("/tmpIds")
+    public AjaxResult getTmpIds() {
+        return wechatService.getTmpIds();
+    }
+
+    /**
+     * 发送消息
+     *
+     * @param dto
+     * @return
+     */
+//    @PostMapping("/pushMsg")
+//    public Map<String, Object> pushMsg(@RequestBody WxMsgDto dto) {
+//        return wxPushService.pushToUser(dto);
+//    }
+}

+ 20 - 0
boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java

@@ -0,0 +1,20 @@
+package com.boman.wechat.service;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+
+/**
+ * 获取微信信息接口
+ *
+ * @author zhong.h
+ */
+public interface WechatService {
+
+    AjaxResult getWechatInfo(LoginBody loginBody);
+
+    /**
+     * 获取模板id集合
+     * @return
+     */
+    AjaxResult getTmpIds();
+}

+ 7 - 0
boman-wechat/src/main/java/com/boman/wechat/service/WxPushService.java

@@ -0,0 +1,7 @@
+package com.boman.wechat.service;
+
+public interface WxPushService {
+
+//    public Map<String, Object> pushToUser(WxMsgDto dto);
+
+}

+ 142 - 0
boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java

@@ -0,0 +1,142 @@
+package com.boman.wechat.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.redis.RedisKey;
+import com.boman.common.redis.service.RedisService;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.config.WechatProperties;
+import com.boman.wechat.service.WechatService;
+import com.boman.wechat.utils.HttpClientUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Service
+public class WechatServiceImpl implements WechatService {
+
+    private static final Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class);
+
+    @Resource
+    private RedisService redisService;
+    @Autowired
+    private WechatProperties properties;
+
+    @Override
+    public AjaxResult getWechatInfo(LoginBody loginBody) {
+        JSONObject infoJsonObject = new JSONObject();
+        String code = loginBody.getCode();
+        // 获取openId && sessionKey
+        String openId = "";
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        String sessionKey = "";
+
+        // logger报错的话,删掉就好,或者替换为自己的日志对象
+        logger.info("Start get SessionKey,loginRequest的数据为:" + JSONObject.toJSONString(loginBody));
+        JSONObject authInfo = null;
+        try {
+            authInfo = this.getSessionKeyAndOpenId(code);
+        }catch (Exception e) {
+            return AjaxResult.error(-1, "获取信息失败");
+        }
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        if(authInfo == null) {
+            return AjaxResult.error(-1, "未获取到认证");
+        }
+        logger.info("微信返回的数据:" + authInfo.toJSONString());
+        String errMsg = this.validatWechatInfo(authInfo);
+        if(StringUtils.isNotEmpty(errMsg)) {
+            return AjaxResult.error(-1, errMsg);
+        }
+        // 获取openId && sessionKey
+        openId = authInfo.getString("openid");
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        sessionKey = authInfo.getString("session_key");
+        // 根据code保存openId和sessionKey
+        JSONObject sessionObj = new JSONObject();
+        sessionObj.put("openId", openId);
+        sessionObj.put("sessionKey", sessionKey);
+        // sessionkey 保存到redis
+        redisService.setCacheObject(RedisKey.USER_OPPEN_ID_AND_SESSION_KEY_PREFIX + code, sessionObj.toJSONString(), 10L, TimeUnit.DAYS);
+        infoJsonObject.put("unionid", authInfo.get("unionid"));
+        infoJsonObject.put("openId", openId);
+        infoJsonObject.put("sessionKey", sessionKey);
+        logger.info("微信登陆验证返回的数据: " + infoJsonObject.toJSONString());
+        return AjaxResult.successZero(infoJsonObject);
+    }
+
+    @Override
+    public AjaxResult getTmpIds() {
+        String str = properties.getTemplateId();
+        String[] ids = str.split(",");
+        return AjaxResult.success(ids);
+    }
+
+    /**
+     * 解析返回的状态码对应的问题
+     *
+     * @param authInfo
+     * @return
+     */
+    private String validatWechatInfo(JSONObject authInfo) {
+        String errMsg = "";
+        Integer errcode =  (Integer) authInfo.get("errcode");
+        if(errcode == null) {
+            return errMsg;
+        }
+        switch (errcode) {
+            case -1:
+                errMsg = "系统繁忙,此时请开发者稍候再试";
+                break;
+            case 40029:
+                errMsg = "code 无效";
+                break;
+            case 41002:
+                errMsg = "appId 丢失";
+                break;
+            case 45011:
+                errMsg = "频率限制,每个用户每分钟100次";
+            case 40163:
+                errMsg = "code已经被使用";
+                break;
+            default:
+                errMsg = (String) authInfo.get("errmsg");
+                break;
+        }
+        return errMsg;
+    }
+
+    /**
+     * 获取小程序验证信息
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    private JSONObject getSessionKeyAndOpenId(String code) throws Exception {
+        Map<String, String> requestUrlParam = new HashMap<>();
+        // 小程序appId,自己补充
+        requestUrlParam.put("appid", properties.getAppId());
+        // 小程序secret,自己补充
+        requestUrlParam.put("secret", properties.getSecret());
+        // 小程序端返回的code
+        requestUrlParam.put("js_code", code);
+        // 默认参数
+        requestUrlParam.put("grant_type", properties.getGrantType());
+        // 发送post请求读取调用微信接口获取openid用户唯一标识
+        String result = HttpClientUtils.doGet(properties.getHost(), requestUrlParam);
+        if(StringUtils.isEmpty(result)) {
+            return null;
+        }
+        return JSON.parseObject(result);
+    }
+}

+ 105 - 0
boman-wechat/src/main/java/com/boman/wechat/service/impl/WxPushServiceImpl.java

@@ -0,0 +1,105 @@
+//package com.boman.wechat.service.impl;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.boman.common.core.utils.StringUtils;
+//import com.boman.domain.TemplateData;
+//import com.boman.domain.dto.AjaxResult;
+//import com.boman.domain.dto.WxMsgDto;
+//import com.boman.system.api.RemoteUserService;
+//import com.boman.wechat.config.WechatProperties;
+//import com.boman.wechat.service.WxPushService;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.http.ResponseEntity;
+//import org.springframework.stereotype.Service;
+//import org.springframework.web.client.RestTemplate;
+//
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//
+//@Service
+//public class WxPushServiceImpl implements WxPushService {
+//    private static final Logger logger = LoggerFactory.getLogger(WxPushServiceImpl.class);
+//
+//    //用来请求微信的get和post
+//    @Autowired
+//    private RestTemplate restTemplate;
+//    @Autowired
+//    private WechatProperties properties;
+//    @Autowired
+//    private RemoteUserService remoteUserService;
+//
+//    /**
+//     * 微信小程序推送给用户
+//     */
+//    @Override
+//    public Map<String, Object> pushToUser(WxMsgDto dto) {
+//        logger.info("WxMsgDto {}", JSON.toJSONString(dto));
+//        logger.info("properties {}", JSON.toJSONString(properties));
+//        List<Long> userIds = dto.getIds();
+//        Map<String, Object> params = dto.getParams();
+//        Map<String, Object> pushResult = new HashMap<>();
+//
+//        //获取access_token
+//        String accessToken = getAccessToken();
+//        if(StringUtils.isEmpty(accessToken)) {
+//            pushResult.put("msg", "获取access_token失败");
+//            return pushResult;
+//        }
+//
+//        String url = properties.getMsgUrl() + "?access_token=" + accessToken;
+//        AjaxResult result = remoteUserService.selectUserByIds(userIds);
+//        List<Map<String, Object>> users = (List<Map<String, Object>>) result.get("data");
+//        if(users == null || users.size() <= 0) {
+//            pushResult.put("msg", "推送失败,没有选择推送人员");
+//            return pushResult;
+//        }
+//
+//        WxMsgDto wxMssVo = new WxMsgDto();
+//        Map<String, String> responseResult = new HashMap<>();
+//        for(Map user : users) {
+//            String openId = (String) user.get("openId");
+//            if(StringUtils.isEmpty(openId)) {
+//                continue;
+//            }
+//            //拼接推送的模版
+////            WxMsgDto wxMssVo = new WxMsgDto();
+//            wxMssVo.setTouser(openId);//用户openid
+//            wxMssVo.setTemplate_id(properties.getTemplateId());//模版id
+//            Map<String, TemplateData> msgMap = new HashMap<>(5);
+//            for(String key : params.keySet()) {
+//                TemplateData templateData = new TemplateData();
+//                templateData.setValue(params.get(key));
+//                msgMap.put(key, templateData);
+//            }
+//            wxMssVo.setData(msgMap);
+//            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class);
+//            logger.info(" wxmssvo: " + JSON.toJSONString(wxMssVo));
+//            JSONObject resultJsonObject = JSON.parseObject(responseEntity.getBody());
+//            if((Integer) resultJsonObject.get("errcode") != 0) {
+//                responseResult.put(user.get("id").toString(), "用户 " + user.get("nickName") + " 推送失败," + resultJsonObject.get("errmsg").toString());
+//            }
+//            logger.info("result {}", responseEntity.getBody());
+//        }
+//        if(responseResult.size() > 0) {
+//            pushResult.put("msg", responseResult.toString());
+//            pushResult.put("data", responseResult);
+//        }
+//        return pushResult;
+//    }
+//
+//    /*
+//     * 获取access_token
+//     * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
+//     * */
+//    private String getAccessToken() {
+//        //获取access_token
+//        String url = properties.getAccessTokenUrl() + "&appid=" + properties.getAppId() + "&secret=" + properties.getSecret();
+//        String json = restTemplate.getForObject(url, String.class);
+//        JSONObject jsonObject = JSONObject.parseObject(json);
+//        return (String) jsonObject.get("access_token");
+//    }
+//}

+ 79 - 0
boman-wechat/src/main/java/com/boman/wechat/utils/CheckAuthUtils.java

@@ -0,0 +1,79 @@
+package com.boman.wechat.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * @author shiqian
+ * @date 2021年08月04日 13:38
+ **/
+public class CheckAuthUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CheckAuthUtils.class);
+
+    /** 定义Token 务必与服务器保持一**/
+    public static String AUTHORIZATION = "Authorization";
+
+    public static final String SIGNATURE = "signature";
+    public static final String TIMESTAMP = "timestamp";
+    public static final String NONCE = "nonce";
+    public static final String ECHOSTR = "echostr";
+    public static final String SHA_1 = "SHA-1";
+
+
+    /**
+     * 验证签名
+     *
+     * @param signature
+     * @param timestamp
+     * @param nonce
+     * @return
+     */
+    public static boolean checkSignature(String signature, String timestamp, String nonce) {
+        // 将token、timestamp、nonce三个参数进行字典排序
+        String[] arr = new String[]{AUTHORIZATION, timestamp, nonce};
+        Arrays.sort(arr);
+
+        // 将三个参数字符串拼接成一个字符串
+        StringBuilder content = new StringBuilder();
+        for (String s : arr) {
+            content.append(s);
+        }
+
+        try {
+            //获取加密工具
+            MessageDigest md = MessageDigest.getInstance(SHA_1);
+            // 对拼接好的字符串进行sha1加密
+            byte[] digest = md.digest(content.toString().getBytes());
+            String tmpStr = byteToStr(digest);
+            //获得加密后的字符串与signature对比
+            boolean result = tmpStr.equals(signature.toUpperCase());
+            LOGGER.info("method: checkSignature, tmpStr: {}, result: {}", tmpStr, result);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    private static String byteToStr(byte[] byteArray) {
+        StringBuilder strDigest = new StringBuilder();
+        for (byte b : byteArray) {
+            strDigest.append(byteToHexStr(b));
+        }
+        return strDigest.toString();
+    }
+
+    private static String byteToHexStr(byte mByte) {
+        char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+        char[] tempArr = new char[2];
+        tempArr[0] = digit[(mByte >>> 4) & 0X0F];
+        tempArr[1] = digit[mByte & 0X0F];
+        return new String(tempArr);
+    }
+
+}

+ 92 - 0
boman-wechat/src/main/java/com/boman/wechat/utils/HttpClientUtils.java

@@ -0,0 +1,92 @@
+package com.boman.wechat.utils;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class HttpClientUtils {
+
+    final static int TIMEOUT = 1000;
+    final static int TIMEOUT_MSEC = 5 * 1000;
+
+    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建参数列表
+            if (paramMap != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (Map.Entry<String, String> param : paramMap.entrySet()) {
+                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+
+            httpPost.setConfig(builderRequestConfig());
+
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw e;
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doGet(String url, Map<String, String> paramMap) throws IOException {
+        url += "?appid=" + paramMap.get("appid") + "&secret=" + paramMap.get("secret") + "&js_code=" + paramMap.get("js_code") + "&grant_type=" + paramMap.get("grant_type");
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpGet httpGet = new HttpGet(url);
+            // 执行http请求
+            response = httpClient.execute(httpGet);
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw e;
+            }
+        }
+        return resultString;
+    }
+
+    private static RequestConfig builderRequestConfig() {
+        return RequestConfig.custom()
+                .setConnectTimeout(TIMEOUT_MSEC)
+                .setConnectionRequestTimeout(TIMEOUT_MSEC)
+                .setSocketTimeout(TIMEOUT_MSEC).build();
+    }
+}

+ 8 - 0
boman-wechat/src/main/resources/application.properties

@@ -0,0 +1,8 @@
+#auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session
+#auth.wechat.msg_url=https://api.weixin.qq.com/cgi-bin/message/subscribe/send
+#auth.wechat.access_token_url=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
+#auth.wechat.appId=wxf556d2b0c34da8cf
+#auth.wechat.secret=8f90a52972268f82d5017a2ac29650c4
+#auth.wechat.grantType=authorization_code
+##auth.wechat.template_id=Dhunm8Bqy6lRDfYgJxYQnhKV6JxNIhFoov2MOJ0c6Dw
+#auth.wechat.template_id=OfdPlcfvEet4A1HZm3JXm3HyX4msme_T0vO4NdKo0xc

+ 19 - 0
boman-wechat/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,19 @@
+server:
+  port: 8094
+
+spring:
+  application:
+    name: boman-wechat
+  profiles:
+    active: prod
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+        namespace: bbba8691-596e-436f-9b72-a28e8db0da40
+      config:
+        server-addr: 127.0.0.1:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: bbba8691-596e-436f-9b72-a28e8db0da40

+ 19 - 0
boman-wechat/src/main/resources/bootstrap-test.yml

@@ -0,0 +1,19 @@
+server:
+  port: 7000
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: test
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.101.10:8848
+        namespace: 9690deba-607a-472c-9444-5a6a3b660db3
+      config:
+        server-addr: 192.168.101.10:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 9690deba-607a-472c-9444-5a6a3b660db3

+ 19 - 0
boman-wechat/src/main/resources/bootstrap.yml

@@ -0,0 +1,19 @@
+server:
+  port: 8093
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: jiaoyu
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.101.10:8848
+        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局
+      config:
+        server-addr: 192.168.101.10:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局

+ 74 - 0
boman-wechat/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/boman-wechat" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.boman" level="debug" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="debug">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 4 - 0
boman-wechat/src/main/resources/rebel-remote.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rebel-remote xmlns="http://www.zeroturnaround.com/rebel/remote">
+    <id>com.boman.boman-wechat</id>
+</rebel-remote>

+ 16 - 0
boman-wechat/src/main/resources/rebel.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  This is the JRebel configuration file. It maps the running application to your IDE workspace, enabling JRebel reloading for this project.
+  Refer to https://manuals.jrebel.com/jrebel/standalone/config.html for more information.
+-->
+<application generated-by="intellij" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://update.zeroturnaround.com/jrebel/rebel-2_3.xsd">
+
+	<id>boman-wechat</id>
+
+	<classpath>
+		<dir name="E:/jiaoyuju/boman-wechat/target/classes">
+		</dir>
+	</classpath>
+
+</application>

+ 1 - 0
pom.xml

@@ -231,6 +231,7 @@
 		<module>boman-api</module>
 		<module>boman-common</module>
 		<module>boman-web-core</module>
+		<module>boman-wechat</module>
     </modules>
     <packaging>pom</packaging>