Jelajahi Sumber

feat: "TODO: 微信登录"
fix: "logo定制"

ritchie 2 tahun lalu
induk
melakukan
255aa4745d

+ 1 - 1
src/main/java/com/szwl/aspect/MyWebMvcConfigurer.java

@@ -22,7 +22,7 @@ public class MyWebMvcConfigurer extends WebMvcConfigurationSupport {
         String[] myExcludes= {"/tAdmin/login","/tAdmin/save","/tAdmin/**","/tAdmin/updatePassword","/tMessageCode/**","/tJoinpayMch/**","/tLogo/**",
                 "/tProportion/**","/tProduct/**","/tPromoCode/**", "/tApkInfo/**", "/tProduct/selectProductList",  "/tApkInfo/**","/tJoinpayMchCheck/**","/tTimeRule/**","/sysRoleMenu/**",
                 "/tEquipmentApply/**","/tEquipment/**","/api/**","/tOrder/**","/tAlarmClock/**","/tNotice/**","/tParameters/**","/tAdmin/setRole",
-                "/tLabel/**","/tArea/**","/error","/tEquipmentDeleted/delOneDevice"};
+                "/tLabel/**","/tArea/**","/error","/tEquipmentDeleted/delOneDevice","/tWechat/**","/wxLogin/**"};
         registry.addInterceptor(headTokenInterceptor).addPathPatterns("/**")
                 // swagger
                 .excludePathPatterns(swaggerExcludes)

+ 56 - 23
src/main/java/com/szwl/controller/TLogoController.java

@@ -1,12 +1,19 @@
 package com.szwl.controller;
 
 
+import cn.com.sand.third.com.fasterxml.jackson.core.type.TypeReference;
+import cn.com.sand.third.com.fasterxml.jackson.databind.JsonNode;
+import cn.com.sand.third.com.fasterxml.jackson.databind.ObjectMapper;
+import com.gexin.fastjson.JSON;
+import com.gexin.fastjson.JSONObject;
 import com.mysql.cj.util.StringUtils;
+import com.szwl.model.bo.JsonMessage;
 import com.szwl.model.bo.R;
 import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.entity.IDRequest;
 import com.szwl.model.entity.TEquipment;
 import com.szwl.model.entity.TLogo;
+import com.szwl.model.utils.PushUtils;
 import com.szwl.service.TAdminService;
 import com.szwl.service.TEquipmentService;
 import com.szwl.service.TLogoService;
@@ -18,6 +25,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.jws.Oneway;
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
 import static com.szwl.constant.ResponseCodesEnum.P0001;
 
 /**
@@ -41,35 +55,54 @@ public class TLogoController {
     @Autowired
     TLogoService tLogoService;
 
+//    @ApiOperation(value = "定制logo")
+//    @PostMapping("/customLogo")
+//    public ResponseModel<?> customLogo(@RequestBody TEquipment equipment) {
+//
+//        // 根据id找到当前设备
+//        TEquipment tEquipment = tEquipmentService.getById(equipment.getId());
+//        if (tEquipment == null) {
+//            return R.fail("设备为空");
+//        }
+//        // 当前设备的用户id
+//        Long adminId = tEquipment.getAdminId();
+//        // 根据用户id查看用户类型
+//        Integer userType = tAdminService.getById(adminId).getType();
+//        // 仅管理员可修改logo
+//        if (userType != null && (userType == 0 || userType == 1)) {
+//            // 获取当前logo信息
+//            TLogo tLogo = tLogoService.getById(adminId);
+//            System.out.println(tLogo);
+//            // 修改logo
+//            tLogoService.updateById(tLogo);
+//            return R.ok(null,"logo已修改");
+//        }
+//        return R.fail(P0001,"仅管理员可修改logo");
+//    }
+
     @ApiOperation(value = "定制logo")
     @PostMapping("/customLogo")
-    public ResponseModel<?> customLogo(@RequestBody TEquipment equipment) {
+    public JsonMessage customLogo(@RequestBody Map<String, Object> body) {
+        Long deviceId = Long.parseLong(String.valueOf(body.get("deviceId")));
+        Object logoNumber = body.get("logoNumber");
+        LinkedHashMap<String, Object> map = new LinkedHashMap<>();
+        map.put("logoNumber", logoNumber);
+        String logoNumberJson = JSON.toJSONString(map);
 
+//        ObjectMapper objectMapper = new ObjectMapper();
+//                    JsonNode logoNumberNode = objectMapper.readTree(logoNumberJson);
+//            String logoNumberStr = logoNumberNode.path("logoNumber").path("_value").asText();
 
-        // 获取当前设备id
-//        Long equipmentId = idRequest.getEquipmentId();
-//        String adminId = idRequest.getAdminId();
-//        TEquipment equipment = tEquipmentService.getById(equipmentId);
+        JSONObject jsonObject = JSON.parseObject(logoNumberJson);
+        String logoNumberStr = jsonObject.getJSONObject("logoNumber").getString("_value");
 
-        // 根据id找到当前设备
-        TEquipment tEquipment = tEquipmentService.getById(equipment.getId());
-        if (tEquipment == null) {
-            return R.fail("设备为空");
+        TEquipment equipment = tEquipmentService.getById(deviceId);
+        if (Objects.isNull(equipment)) {
+            return JsonMessage.error("该设备不存在");
         }
-        // 当前设备的用户id
-        Long adminId = tEquipment.getAdminId();
-        // 根据用户id查看用户类型
-        Integer userType = tAdminService.getById(adminId).getType();
-        // 仅管理员可修改logo
-        if (userType != null && (userType == 0 || userType == 1)) {
-            // 获取当前logo信息
-            TLogo tLogo = tLogoService.getById(adminId);
-            System.out.println(tLogo);
-            // 修改logo
-            tLogoService.updateById(tLogo);
-            return R.ok(null,"logo已修改");
-        }
-        return R.fail(P0001,"仅管理员可修改logo");
+        tEquipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("customLogo", logoNumberStr).toString());
+        return JsonMessage.success("发送成功");
     }
+
 }
 

+ 178 - 0
src/main/java/com/szwl/controller/TWechatController.java

@@ -0,0 +1,178 @@
+package com.szwl.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.sun.org.apache.regexp.internal.RE;
+import com.szwl.constant.ResponseCodesEnum;
+import com.szwl.model.bo.R;
+//import com.szwl.model.dto.WechatDTO;
+import com.szwl.model.entity.TAdmin;
+import com.szwl.model.entity.TWechat;
+import com.szwl.model.utils.DateUtils;
+import com.szwl.model.utils.HttpClientUtils;
+import com.szwl.service.TAdminService;
+import com.szwl.service.TWechatService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHeaders;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.LaxRedirectStrategy;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-05-19
+ */
+@Api(value = "/WeChatController", tags = {"微信绑定接口"})
+@RestController
+@RequestMapping("/tWechat")
+public class TWechatController {
+
+    @Autowired
+    private TAdminService tAdminService;
+
+    @Autowired
+    private TWechatService tWechatService;
+
+    // 从 yml 文件中获取
+    @Value("${oauth.wx.appid}")
+    private String appid;
+
+    @Value("${oauth.wx.appsecret}")
+    private String appsecret;
+
+    @Value("${oauth.callback.http}")
+    private String http;
+
+
+    @ApiOperation(value = "绑定微信")
+    @CrossOrigin(value = "https://open.weixin.qq.com/")
+    @GetMapping("/bindWechat")
+    public R oauth(HttpServletResponse response, @RequestParam Long adminId) throws IOException {
+
+        if (adminId==null) {
+            return R.fail(ResponseCodesEnum.A0001, "参数为空");
+        }
+        TAdmin tAdmin = tAdminService.getById(adminId);
+        TWechat tWechat = new TWechat();
+        if (tAdmin != null) {
+            List<TWechat> list = tWechatService
+                    .lambdaQuery()
+                    .eq(TWechat::getAdminId, adminId)
+                    .list();
+            if (!list.isEmpty()) {
+                tWechat = list.get(0);
+                tWechatService.updateById(tWechat);
+            } else {
+                tWechat.setAdminId(String.valueOf(adminId));
+                tWechatService.save(tWechat);
+            }
+        } else {
+            return R.fail("用户不存在!");
+        }
+        String path = http + "/tWechat/callback?";
+
+        try {
+            path = URLEncoder.encode(path, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+
+        // 第一步:用户同意授权,获取code
+        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"
+                + "appid=" + appid
+                + "&redirect_uri=" + path
+                + "&response_type=code"
+                + "&scope=snsapi_userinfo"
+                + "&state=" + adminId +
+                "#wechat_redirect";
+        response.sendRedirect(url);
+
+        return R.ok();
+    }
+
+
+    // 绑定微信回调
+    @GetMapping("/callback")
+    @CrossOrigin(value = "https://api.weixin.qq.com/")
+    public JSONObject oauthCallback(HttpServletRequest request) throws IOException {
+        // 获取code
+        String code = request.getParameter("code");
+        String adminId = request.getParameter("state");
+
+        // 第二步:通过code换取网页授权access_token
+        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
+                "appid=" + appid +
+                "&secret=" + appsecret +
+                "&code=" + code +
+                "&grant_type=authorization_code";
+        JSONObject jsonObject = HttpClientUtils.get(url);
+        String openid = jsonObject.getString("openid");
+        String accessToken = jsonObject.getString("access_token");
+        // 第三步:刷新access_token(如果需要)
+        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
+        url = "https://api.weixin.qq.com/sns/userinfo?" +
+                "access_token=" + accessToken +
+                "&openid=" + openid +
+                "&lang=zh_CN";
+        JSONObject userInfo = HttpClientUtils.get(url);
+
+        List<TWechat> list = tWechatService.lambdaQuery()
+                .eq(TWechat::getAdminId, adminId)
+                .list();
+
+        if (Objects.nonNull(list)) {
+            TWechat tWechat = list.get(0);
+            tWechat.setOpenId(userInfo.getString("openid"));
+            tWechat.setNickName(userInfo.getString("nickname"));
+            tWechat.setAvatarUrl(userInfo.getString("headimgurl"));
+            tWechat.setModifyDate(new Date());
+            tWechatService.updateById(tWechat);
+        } else {
+            TWechat tWechat = new TWechat();
+            tWechat.setOpenId(userInfo.getString("openid"));
+            tWechat.setNickName(userInfo.getString("nickname"));
+            tWechat.setAvatarUrl(userInfo.getString("headimgurl"));
+            tWechat.setCreateDate(new Date());
+            tWechatService.save(tWechat);
+        }
+
+        return userInfo;
+    }
+
+
+}
+

+ 216 - 0
src/main/java/com/szwl/controller/WxLoginController.java

@@ -0,0 +1,216 @@
+package com.szwl.controller;
+
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.bo.UserDetailBO;
+import com.szwl.model.entity.TAdmin;
+import com.szwl.model.entity.TWechat;
+import com.szwl.model.utils.HttpClientUtils;
+import com.szwl.service.TAdminService;
+import com.szwl.service.TWechatService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.*;
+
+@Api(value = "/WxLoginController", tags = {"微信登录接口"})
+@RestController
+@RequestMapping("/wxLogin")
+public class WxLoginController {
+
+    @Autowired
+    private TAdminService tAdminService;
+
+    @Autowired
+    private TWechatService tWechatService;
+
+    // 从 yml 文件中获取
+    @Value("${oauth.wx.appid}")
+    private String appid;
+
+    @Value("${oauth.wx.appsecret}")
+    private String appsecret;
+
+    @Value("${oauth.callback.http}")
+    private String http;
+
+    @ApiOperation(value = "用户默认授权")
+    @CrossOrigin(value = "https://open.weixin.qq.com/")
+    @GetMapping("/menuOauth")
+    public void menuOauth(HttpServletResponse response) throws IOException {
+        String path = http + "/wxLogin/callback?";
+
+        try {
+            path = URLEncoder.encode(path, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        // 第一步:用户同意授权,获取code
+        // 静默授权,只能获取用户openid
+        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"
+                + "appid=" + appid
+                + "&redirect_uri=" + path
+                + "&response_type=code"
+                + "&scope=snsapi_base"
+                + "&state=STATE" +
+                "#wechat_redirect";
+        response.sendRedirect(url);
+    }
+
+    @ApiOperation(value = "微信登录回调")
+    @CrossOrigin(value = "https://api.weixin.qq.com/")
+    @GetMapping("/callback")
+    public void callback(HttpServletRequest request) throws IOException {
+        // code 只能用一次,5分钟过期
+        String code = request.getParameter("code");
+
+        // 第二步:通过code换取网页授权access_token
+        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
+                "appid=" + appid +
+                "&secret=" + appsecret +
+                "&code=" + code +
+                "&grant_type=authorization_code";
+        JSONObject jsonObject = HttpClientUtils.get(url);
+
+        String openid = jsonObject.getString("openid");
+        String accessToken = jsonObject.getString("access_token");
+
+        // snsapi_base式的网页授权流程即到此为止。
+        // 根据 openid 去查找已绑定的用户信息
+        TWechat tWechat = tWechatService.getById(openid);
+        if (Objects.nonNull(tWechat)) {
+            String adminId = tWechat.getAdminId();
+            TAdmin tAdmin = tAdminService.getById(adminId);
+            String username = tAdmin.getUsername();
+            String password = tAdmin.getPassword();
+            // 然后根据 username 和 password 去登录
+            TAdminController tAdminController = new TAdminController();
+            ResponseModel<UserDetailBO> login = tAdminController.login(username, password);
+
+        } else {
+            // 说明未绑定
+
+        }
+
+    }
+
+
+    /**
+     * 前往微信开发平台申请,根据 code 获取 openid
+     * @param code
+     * @return
+     * @throws IOException
+     */
+    @CrossOrigin(value = "https://api.weixin.qq.com/")
+    private String getOpenidByCode(String code) throws IOException {
+
+        String grantType = "authorization_code";
+
+        // 拼接请求地址
+        String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
+                "appid=" + appid +
+                "&secret=" + appsecret +
+                "&code=" + code +
+                "&grant_type=" + grantType;
+
+        JSONObject jsonObject = HttpClientUtils.get(requestUrl);
+        String accessToken = jsonObject.getString("access_token");
+        String openId = jsonObject.getString("openid");
+
+        // 拉取用户信息(需scope为 snsapi_userinfo)
+//        String userinfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
+//        JSONObject object = HttpClientUtils.get(userinfoUrl);
+
+
+//        String s = JSON.toJSONString(object);
+        return openId;
+    }
+
+    @ApiOperation(value = "获取微信签名")
+    @GetMapping("/wx/signature")
+    public Map<String, String> getSignature(@RequestParam String url) throws IOException {
+        HashMap<String, String> signatureMap = new HashMap<>();
+
+        String nonceStr = UUID.randomUUID().toString();
+        String timestamp = Long.toString(System.currentTimeMillis() / 1000);
+        String jsapiTicket = getJsapiTicket();
+        String signature = "";
+
+        // 按照微信官方要求构造含有 nonceStr、timestamp、jsapi_ticket 和 url 的字符串
+        String rawString = "jsapi_ticket=" + jsapiTicket +
+                "&noncestr=" + nonceStr +
+                "&timestamp=" + timestamp +
+                "&url=" + url;
+
+        try {
+            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+            crypt.reset();
+            crypt.update(rawString.getBytes("UTF-8"));
+            signature = byteToHex(crypt.digest());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        signatureMap.put("signature", signature);
+        signatureMap.put("appId", appid);
+        signatureMap.put("timestamp", timestamp);
+        signatureMap.put("nonceStr", nonceStr);
+
+        return signatureMap;
+    }
+
+    /**
+     * 获取授权页ticket ticket 有效期,一般为 7200 秒
+     * @return
+     * @throws IOException
+     */
+    @CrossOrigin(value = "https://api.weixin.qq.com/")
+    private String getJsapiTicket() throws IOException {
+        // 获取 jsapi_ticket 的逻辑,向微信服务器发送 GET 请求
+        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket"
+                + "?access_token=" + getAccessToken()  // 先获取 access_token
+                + "&type=jsapi";  // 指定获取 jsapi_ticket
+
+        JSONObject jsonObject = HttpClientUtils.get(url);
+        String ticket = jsonObject.getString("ticket");
+        // 返回获取到的 jsapi_ticket
+        return ticket;
+    }
+
+    /**
+     * 获取接口调用凭据 token 有效期: 7200s
+     * @return
+     * @throws IOException
+     */
+    @CrossOrigin(value = "https://api.weixin.qq.com/")
+    private String getAccessToken() throws IOException {
+        // 构造 GET 请求,获取 access_token
+        String url = "https://api.weixin.qq.com/cgi-bin/token"
+                + "?grant_type=client_credential"
+                + "&appid=" + appid
+                + "&secret=" + appsecret;
+
+        JSONObject jsonObject = HttpClientUtils.get(url);
+        return jsonObject.getString("access_token");
+    }
+
+    private static String byteToHex(final byte[] hash) {
+        Formatter formatter = new Formatter();
+        for (byte b : hash) {
+            formatter.format("%02x", b);
+        }
+        String result = formatter.toString();
+        formatter.close();
+        return result;
+    }
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/TWechatMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.TWechat;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-05-22
+ */
+public interface TWechatMapper extends BaseMapper<TWechat> {
+
+}

+ 21 - 0
src/main/java/com/szwl/mapper/xml/TWechatMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.TWechatMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TWechat">
+        <id column="id" property="id" />
+        <result column="admin_id" property="adminId" />
+        <result column="open_id" property="openId" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="nick_name" property="nickName" />
+        <result column="avatar_url" property="avatarUrl" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, admin_id, open_id, create_date, modify_date, nick_name, avatar_url
+    </sql>
+
+</mapper>

+ 24 - 0
src/main/java/com/szwl/model/dto/WechatDTO.java

@@ -0,0 +1,24 @@
+//package com.szwl.model.dto;
+//
+//import io.swagger.annotations.ApiModelProperty;
+//import lombok.Getter;
+//import lombok.NoArgsConstructor;
+//import lombok.Setter;
+//import lombok.ToString;
+//import lombok.experimental.Accessors;
+//
+//@Accessors(chain = true)
+//@NoArgsConstructor
+//@Getter
+//@Setter
+//@ToString
+//public class WechatDTO {
+//    @ApiModelProperty(value = "用户名")
+//    private String username;
+//
+//    @ApiModelProperty(value = "密码")
+//    private String password;
+//
+//    @ApiModelProperty(value = "adminId")
+//    private Long adminId;
+//}

+ 43 - 0
src/main/java/com/szwl/model/entity/TWechat.java

@@ -0,0 +1,43 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-05-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TWechat对象", description="")
+public class TWechat implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String adminId;
+
+    private String openId;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    private String nickName;
+
+    private String avatarUrl;
+
+
+}

+ 16 - 0
src/main/java/com/szwl/service/TWechatService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.TWechat;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-05-22
+ */
+public interface TWechatService extends IService<TWechat> {
+
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/TWechatServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.TWechat;
+import com.szwl.mapper.TWechatMapper;
+import com.szwl.service.TWechatService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-05-22
+ */
+@Service
+public class TWechatServiceImpl extends ServiceImpl<TWechatMapper, TWechat> implements TWechatService {
+
+}

+ 1 - 0
src/main/resources/MP_verify_zthjeKsyPpYA7KME.txt

@@ -0,0 +1 @@
+zthjeKsyPpYA7KME

+ 15 - 0
src/main/resources/bootstrap.yml

@@ -23,6 +23,21 @@ management:
       exposure:
         include: refresh
 
+oauth:
+  wx:
+#    appid: wx6959f112e9ffbfa3
+#    appsecret: 32f6fdf12bc25361110e1786f386eaab
+    appid: wxcd5b1b2636c9f611
+    appsecret: e2854aa99f8279f33b4f065b2ffb75b1
+
+  callback:
+#    个人测试
+#    http: https://ab.free.svipss.top
+#    系统测试
+#    http: http://szwl.sunzee.com.cn
+#    正式服务
+#    http: https://szwlh.sunzee.com.cn
+
 mybatis-plus:
   mapper-locations: classpath:com/szwl/mapper/xml/*.xml