Selaa lähdekoodia

推荐码验证

Althars123 2 vuotta sitten
vanhempi
commit
58ba6ce5ae
41 muutettua tiedostoa jossa 2571 lisäystä ja 26 poistoa
  1. 56 0
      sdjk-admin/src/main/java/com/miaxis/app/controller/vip/RecommendCodeController.java
  2. 97 0
      sdjk-admin/src/main/java/com/miaxis/gzh/controller/WxMenuController.java
  3. 96 0
      sdjk-admin/src/main/java/com/miaxis/gzh/controller/WxgzhController.java
  4. 1 3
      sdjk-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java
  5. 6 0
      sdjk-admin/src/main/resources/application-dev.yml
  6. 4 1
      sdjk-admin/src/main/resources/application-prod.yml
  7. 4 1
      sdjk-admin/src/main/resources/application-prodtest.yml
  8. 12 0
      sdjk-common/src/main/java/com/miaxis/common/core/domain/entity/UserInfo.java
  9. 161 0
      sdjk-common/src/main/java/com/miaxis/common/utils/XmlUtil.java
  10. 75 4
      sdjk-common/src/main/java/com/miaxis/common/utils/http/HttpUtils.java
  11. 101 0
      sdjk-common/src/main/java/com/miaxis/common/utils/wx/MessageUtil.java
  12. 29 0
      sdjk-common/src/main/java/com/miaxis/common/utils/wx/SHA1Util.java
  13. 74 0
      sdjk-common/src/main/java/com/miaxis/common/utils/wx/SignUtil.java
  14. 14 0
      sdjk-service/src/main/java/com/miaxis/feign/dto/WxGzhBatchUser.java
  15. 22 0
      sdjk-service/src/main/java/com/miaxis/feign/dto/WxMessageCusom.java
  16. 19 0
      sdjk-service/src/main/java/com/miaxis/feign/dto/WxMessageTemplate.java
  17. 22 0
      sdjk-service/src/main/java/com/miaxis/feign/dto/WxQrTicket.java
  18. 111 14
      sdjk-service/src/main/java/com/miaxis/feign/service/IWxSendService.java
  19. 102 0
      sdjk-service/src/main/java/com/miaxis/wx/domain/WxExtract.java
  20. 103 0
      sdjk-service/src/main/java/com/miaxis/wx/domain/WxExtractBank.java
  21. 108 0
      sdjk-service/src/main/java/com/miaxis/wx/domain/WxForeverCode.java
  22. 69 0
      sdjk-service/src/main/java/com/miaxis/wx/domain/WxMenu.java
  23. 23 0
      sdjk-service/src/main/java/com/miaxis/wx/mapper/WxExtractBankMapper.java
  24. 23 0
      sdjk-service/src/main/java/com/miaxis/wx/mapper/WxExtractMapper.java
  25. 23 0
      sdjk-service/src/main/java/com/miaxis/wx/mapper/WxMenuMapper.java
  26. 22 0
      sdjk-service/src/main/java/com/miaxis/wx/service/IWxExtractBankService.java
  27. 22 0
      sdjk-service/src/main/java/com/miaxis/wx/service/IWxExtractService.java
  28. 29 0
      sdjk-service/src/main/java/com/miaxis/wx/service/IWxGzhService.java
  29. 53 0
      sdjk-service/src/main/java/com/miaxis/wx/service/IWxMenuService.java
  30. 36 0
      sdjk-service/src/main/java/com/miaxis/wx/service/IWxMessageEvenService.java
  31. 25 3
      sdjk-service/src/main/java/com/miaxis/wx/service/WxService.java
  32. 33 0
      sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxExtractBankServiceImpl.java
  33. 33 0
      sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxExtractServiceImpl.java
  34. 328 0
      sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxGzhServiceImpl.java
  35. 208 0
      sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxMenuServiceImpl.java
  36. 189 0
      sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxMessageEvenServiceImpl.java
  37. 71 0
      sdjk-service/src/main/java/com/miaxis/wx/vo/WxMenuVo.java
  38. 74 0
      sdjk-service/src/main/java/com/miaxis/wx/vo/WxSchoolOrder.java
  39. 31 0
      sdjk-service/src/main/resources/mapper/wx/WxExtractBankMapper.xml
  40. 30 0
      sdjk-service/src/main/resources/mapper/wx/WxExtractMapper.xml
  41. 32 0
      sdjk-service/src/main/resources/mapper/wx/WxMenuMapper.xml

+ 56 - 0
sdjk-admin/src/main/java/com/miaxis/app/controller/vip/RecommendCodeController.java

@@ -0,0 +1,56 @@
+package com.miaxis.app.controller.vip;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.common.utils.StringUtils;
+import com.miaxis.user.service.IUserInfoService;
+import com.miaxis.vip.domain.VipCode;
+import com.miaxis.vip.service.IVipCodeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ */
+@RestController
+@RequestMapping(Constants.STUDENT_PREFIX+"/recommend/code")
+@Api(tags={"【app-推荐码】"})
+public class RecommendCodeController extends BaseController{
+
+
+    @Autowired
+    private IUserInfoService userInfoService;
+    @GetMapping
+    @ApiOperation("验证推荐码是否有效")
+    public Response<Integer> validateRecommendCode(String recommendCode){
+
+        if (StringUtils.isEmpty(recommendCode)){
+            throw new CustomException("推荐码不能为空");
+        }
+        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
+        queryWrapper.eq("recommend_code", recommendCode);
+        UserInfo userInfo = userInfoService.getOne(queryWrapper);
+        if (userInfo == null){
+            throw new CustomException("该推荐码不存在");
+        }
+        //当前学员更新绑定推荐码
+        UserInfo student = SecurityUtils.getLoginUser().getStudent();
+        student.setBindRecommendCode(recommendCode);
+        userInfoService.updateById(userInfo);
+        return Response.success();
+    }
+
+
+
+}

+ 97 - 0
sdjk-admin/src/main/java/com/miaxis/gzh/controller/WxMenuController.java

@@ -0,0 +1,97 @@
+package com.miaxis.gzh.controller;
+
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.wx.service.IWxMenuService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/3 9:18
+ */
+@RestController
+@RequestMapping("/pc/menu")
+@Api(tags={"【H5-微信公众号菜单】"})
+@AllArgsConstructor
+public class WxMenuController extends BaseController {
+
+    private final IWxMenuService wxMenuService;
+
+
+//    /**
+//     * 查询微信公众号菜单列表
+//     */
+//    @PreAuthorize("@ss.hasPermi('menu:info:list')")
+//    @GetMapping("/list")
+//    @ApiOperation("查询微信公众号菜单列表")
+//    public Response<List<WxMenuVo>> list(){
+//        return wxMenuService.selectWxMenuTreeList();
+//    }
+//
+//
+//    /**
+//     * 获取微信公众号菜单详细信息
+//     */
+//    @PreAuthorize("@ss.hasPermi('menu:info:query')")
+//    @GetMapping(value = "/{id}")
+//    @ApiOperation("获取微信公众号菜单详细信息")
+//    public Response<WxMenu> getInfo(
+//            @ApiParam(name = "id", value = "微信公众号菜单参数", required = true)
+//            @PathVariable("id") Long id
+//    ){
+//        return Response.success(wxMenuService.getById(id));
+//    }
+//
+//    /**
+//     * 新增微信公众号菜单
+//     */
+//    @PreAuthorize("@ss.hasPermi('menu:info:add')")
+//    @Log(title = "微信公众号菜单", businessType = BusinessTypeEnum.INSERT)
+//    @PostMapping
+//    @ApiOperation("新增微信公众号菜单")
+//    public Response add(@RequestBody WxMenu wxMenu){
+//        return wxMenuService.saveMenu(wxMenu);
+//    }
+//
+//    /**
+//     * 修改微信公众号菜单
+//     */
+//    @PreAuthorize("@ss.hasPermi('menu:info:edit')")
+//    @Log(title = "微信公众号菜单", businessType = BusinessTypeEnum.UPDATE)
+//    @PutMapping
+//    @ApiOperation("修改微信公众号菜单")
+//    public Response edit(@RequestBody WxMenu wxMenu){
+//        return wxMenuService.updateMenuById(wxMenu);
+//    }
+//
+//    /**
+//     * 删除微信公众号菜单
+//     */
+//    @PreAuthorize("@ss.hasPermi('menu:info:remove')")
+//    @Log(title = "微信公众号菜单", businessType = BusinessTypeEnum.DELETE)
+//    @DeleteMapping("/{ids}")
+//    @ApiOperation("删除微信公众号菜单")
+//    public  Response remove(
+//            @ApiParam(name = "ids", value = "微信公众号菜单ids参数", required = true)
+//            @PathVariable Long[] ids
+//    ){
+//        return wxMenuService.removeMenuByIds(ids);
+//    }
+
+    /**
+     * 一键更新公众号菜单
+     */
+    @GetMapping("/sendMenu")
+    @ApiOperation("一键更新公众号菜单--手动修改数据库操作")
+    public Response sendMenu(){
+        return wxMenuService.sendMenuBySql();
+    }
+
+
+}

+ 96 - 0
sdjk-admin/src/main/java/com/miaxis/gzh/controller/WxgzhController.java

@@ -0,0 +1,96 @@
+package com.miaxis.gzh.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.utils.wx.SignUtil;
+import com.miaxis.wx.service.IWxGzhService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 微信公众号相关
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/26 9:28
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.OPEN_PREFIX + "/wx/gzh")
+@Api(tags={"【H5-wx微信公众号相关】"})
+@Slf4j
+public class WxgzhController {
+
+    private final IWxGzhService wxGzhService;
+
+
+    private final HttpServletRequest request;
+
+
+
+
+    /**
+     * 获取微信验签
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/notifyMsg")
+    @ApiOperation("获取微信验签")
+    public String checkSign(HttpServletRequest request) {
+        log.info("-----------进入---------");
+        try {
+            String signature = request.getParameter("signature");
+            String timestamp = request.getParameter("timestamp");
+            String nonce = request.getParameter("nonce");
+            String echostr = request.getParameter("echostr");
+            log.info("本身" + signature);
+            log.info("-----------微信验签---------");
+            return SignUtil.checkSignature(signature, timestamp, nonce) == true ? echostr : null;
+        } catch (Exception e) {
+            log.error("验证公众号token失败", e);
+        }
+        return null;
+    }
+
+
+    /**
+     * 处理服务器推送消息
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/notifyMsg")
+    @ApiOperation("处理服务器推送消息")
+    public String dealNotify(HttpServletRequest request) {
+        log.info("-----------进入---------");
+        try {
+            log.info("-----------推送消息处理---------");
+            return wxGzhService.handlePublicMsg(request);
+        } catch (Exception e) {
+            log.error("处理推送消息失败", e);
+        }
+        return null;
+    }
+
+    /**
+     * 获取公众号访问jspapi 需要的参数
+     * @return
+     */
+    @GetMapping(value = "/jspapi")
+    @ApiOperation("获取jspapi参数")
+    public Response<JSONObject> getJspapi(String url) {
+
+        return Response.success(wxGzhService.getJspapi(url));
+
+
+    }
+
+
+}

+ 1 - 3
sdjk-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java

@@ -12,7 +12,6 @@ import com.miaxis.common.enums.StudentLoginTypeEnum;
 import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.SecurityUtils;
 import com.miaxis.common.utils.ServletUtils;
-import com.miaxis.framework.security.handle.LogoutSuccessHandlerImpl;
 import com.miaxis.framework.web.service.SysLoginService;
 import com.miaxis.framework.web.service.SysPermissionService;
 import com.miaxis.framework.web.service.TokenService;
@@ -26,9 +25,8 @@ import com.miaxis.feign.dto.DyUserInfoDTO;
 import com.miaxis.feign.dto.ToutiaoTokenDTO;
 import com.miaxis.feign.service.DyService;
 import com.miaxis.feign.service.ToutiaoService;
-import com.miaxis.feign.service.WxService;
 import com.miaxis.user.service.IUserInfoService;
-import com.miaxis.user.service.impl.UserInfoServiceImpl;
+import com.miaxis.wx.service.WxService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;

+ 6 - 0
sdjk-admin/src/main/resources/application-dev.yml

@@ -99,6 +99,12 @@ spring:
                 #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
                 debug: true
 
+# 中振科技微信公众号
+zzgzh:
+    appId: wx3043c2c1decb01ed
+    appSecret: 8ae5d448d9b0778142d38d551c221ad3
+
+
 # 微信支付app端
 app:
     appId: wxc439503456129660

+ 4 - 1
sdjk-admin/src/main/resources/application-prod.yml

@@ -97,7 +97,10 @@ spring:
                 #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
                 debug: true
 
-
+# 中振科技微信公众号
+zzgzh:
+    appId: wx3043c2c1decb01ed
+    appSecret: 8ae5d448d9b0778142d38d551c221ad3
 
 # 微信支付app端
 app:

+ 4 - 1
sdjk-admin/src/main/resources/application-prodtest.yml

@@ -98,7 +98,10 @@ spring:
                 #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
                 debug: true
 
-
+# 中振科技微信公众号
+zzgzh:
+    appId: wx3043c2c1decb01ed
+    appSecret: 8ae5d448d9b0778142d38d551c221ad3
 
 # 微信支付app端
 app:

+ 12 - 0
sdjk-common/src/main/java/com/miaxis/common/core/domain/entity/UserInfo.java

@@ -93,5 +93,17 @@ public class UserInfo extends BaseBusinessEntity{
     @ApiModelProperty(value = "第三方平台")
     private String thirdPlatform;
 
+    /** app昵称 */
+    @Excel(name = "自身推荐码")
+    @TableField("recommend_code")
+    @ApiModelProperty(value = "自身推荐码")
+    private String recommendCode;
+
+    /** app昵称 */
+    @Excel(name = "绑定推荐码")
+    @TableField("bind_recommend_code")
+    @ApiModelProperty(value = "绑定推荐码")
+    private String bindRecommendCode;
+
 
 }

+ 161 - 0
sdjk-common/src/main/java/com/miaxis/common/utils/XmlUtil.java

@@ -0,0 +1,161 @@
+package com.miaxis.common.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * xml util
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/26 14:55
+ */
+public class XmlUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);
+
+    /**
+     * 将Map转换为XML格式的字符串
+     *
+     * @param data Map类型数据
+     * @return XML格式的字符串
+     * @throws Exception
+     */
+    public static String mapToXml(Map<String, String> data) throws Exception {
+        log.info("----mapToXml-----"+data);
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        org.w3c.dom.Document document = documentBuilder.newDocument();
+        org.w3c.dom.Element root = document.createElement("xml");
+        document.appendChild(root);
+        for (String key: data.keySet()) {
+            String value = data.get(key);
+            if (value == null) {
+                value = "";
+            }
+            value = value.trim();
+            org.w3c.dom.Element filed = document.createElement(key);
+            filed.appendChild(document.createTextNode(value));
+            root.appendChild(filed);
+        }
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer transformer = tf.newTransformer();
+        DOMSource source = new DOMSource(document);
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        StringWriter writer = new StringWriter();
+        StreamResult result = new StreamResult(writer);
+        transformer.transform(source, result);
+        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+        try {
+            writer.close();
+        } catch (Exception ex) {
+
+        }
+        log.info("----mapToXml-return-----"+output);
+        return output;
+    }
+
+
+    /**
+     * 微信回复图片 map转换xml
+     * @param data
+     * @return
+     * @throws Exception
+     */
+    public static String mapToXmlSpecial(Map<String, String> data) throws Exception {
+        log.info("----mapToXml-----"+data);
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        org.w3c.dom.Document document = documentBuilder.newDocument();
+        org.w3c.dom.Element root = document.createElement("xml");
+        document.appendChild(root);
+
+        org.w3c.dom.Element toUserName = document.createElement("ToUserName");
+        toUserName.setTextContent(data.get("ToUserName"));
+        root.appendChild(toUserName);
+        org.w3c.dom.Element fromUserName = document.createElement("FromUserName");
+        fromUserName.setTextContent(data.get("FromUserName"));
+        root.appendChild(fromUserName);
+        org.w3c.dom.Element createTime = document.createElement("CreateTime");
+        createTime.setTextContent(data.get("CreateTime"));
+        root.appendChild(createTime);
+        org.w3c.dom.Element msgType = document.createElement("MsgType");
+        msgType.setTextContent(data.get("MsgType"));
+        root.appendChild(msgType);
+        org.w3c.dom.Element image = document.createElement("Image");
+        root.appendChild(image);
+        org.w3c.dom.Element mediaId = document.createElement("MediaId");
+        mediaId.setTextContent(data.get("MediaId"));
+        image.appendChild(mediaId);
+
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer transformer = tf.newTransformer();
+        DOMSource source = new DOMSource(document);
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        StringWriter writer = new StringWriter();
+        StreamResult result = new StreamResult(writer);
+        transformer.transform(source, result);
+        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+        try {
+            writer.close();
+        } catch (Exception ex) {
+
+        }
+        log.info("----mapToXml-return-----"+output);
+        return output;
+    }
+
+
+    /**
+     * XML格式字符串转换为Map
+     *
+     * @param strXML XML字符串
+     * @return XML数据转换后的Map
+     * @throws Exception
+     */
+    public static Map<String, String> xmlToMap(String strXML) throws Exception {
+        log.info("4....");
+        try {
+            Map<String, String> data = new HashMap<>();
+            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+            InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
+            org.w3c.dom.Document doc = documentBuilder.parse(stream);
+            doc.getDocumentElement().normalize();
+            NodeList nodeList = doc.getDocumentElement().getChildNodes();
+            for (int idx = 0; idx < nodeList.getLength(); ++idx) {
+                Node node = nodeList.item(idx);
+                if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;
+                    data.put(element.getNodeName(), element.getTextContent());
+                }
+            }
+            try {
+                stream.close();
+            } catch (Exception ex) {
+                // do nothing
+            }
+            return data;
+        } catch (Exception ex) {
+            throw ex;
+        }
+    }
+
+
+}

+ 75 - 4
sdjk-common/src/main/java/com/miaxis/common/utils/http/HttpUtils.java

@@ -6,10 +6,7 @@ import org.slf4j.LoggerFactory;
 
 import javax.net.ssl.*;
 import java.io.*;
-import java.net.ConnectException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.net.URLConnection;
+import java.net.*;
 import java.security.cert.X509Certificate;
 
 /**
@@ -251,4 +248,78 @@ public class HttpUtils
             return true;
         }
     }
+
+    public static  String connectHttpsByPost(String path, File file) throws Exception{
+        URL urlObj = new URL(path);
+        //连接
+        HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
+        String result = null;
+        con.setDoInput(true);
+        con.setDoOutput(true);
+        con.setUseCaches(false); // post方式不能使用缓存
+
+        // 设置请求头信息
+        con.setRequestProperty("Connection", "Keep-Alive");
+        con.setRequestProperty("Charset", "UTF-8");
+        // 设置边界
+        String BOUNDARY = "----------" + System.currentTimeMillis();
+        con.setRequestProperty("Content-Type",
+                "multipart/form-data; boundary="
+                        + BOUNDARY);
+
+        // 请求正文信息
+        // 第一部分:
+        StringBuilder sb = new StringBuilder();
+        sb.append("--"); // 必须多两道线
+        sb.append(BOUNDARY);
+        sb.append("\r\n");
+        sb.append("Content-Disposition: form-data;name=\"media\";filelength=\"" + file.length() + "\";filename=\""
+                + file.getName() + "\"\r\n");
+        sb.append("Content-Type:application/octet-stream\r\n\r\n");
+        byte[] head = sb.toString().getBytes("utf-8");
+        // 获得输出流
+        OutputStream out = new DataOutputStream(con.getOutputStream());
+        // 输出表头
+        out.write(head);
+
+        // 文件正文部分
+        // 把文件已流文件的方式 推入到url中
+        DataInputStream in = new DataInputStream(new FileInputStream(file));
+        int bytes = 0;
+        byte[] bufferOut = new byte[1024];
+        while ((bytes = in.read(bufferOut)) != -1) {
+            out.write(bufferOut, 0, bytes);
+        }
+        in.close();
+        // 结尾部分
+        byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
+        out.write(foot);
+        out.flush();
+        out.close();
+        StringBuffer buffer = new StringBuffer();
+        BufferedReader reader = null;
+        try {
+            // 定义BufferedReader输入流来读取URL的响应
+            reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
+            String line = null;
+            while ((line = reader.readLine()) != null) {
+                buffer.append(line);
+            }
+            if (result == null) {
+                result = buffer.toString();
+            }
+        } catch (IOException e) {
+            System.out.println("发送POST请求出现异常!" + e);
+            e.printStackTrace();
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+        return result;
+    }
+
+
+
+
 }

+ 101 - 0
sdjk-common/src/main/java/com/miaxis/common/utils/wx/MessageUtil.java

@@ -0,0 +1,101 @@
+package com.miaxis.common.utils.wx;
+
+import com.miaxis.common.utils.XmlUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信消息工具
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/25 13:19
+ */
+@Slf4j
+public class MessageUtil {
+
+    public static final String MESSAGE_TEXT="text";//文本消息
+    public static final String MESSAGE_IMAGE="image";//图片消息
+    public static final String MESSAGE_VOICE="voice";//语音消息
+    public static final String MESSAGE_VIDEO="video";//视频消息
+    public static final String MESSAGE_LOCATION="LOCATION";//地理位置消息
+    public static final String MESSAGE_EVENT="event";//事件消息
+    public static final String MESSAGE_SUBSCRIBE="subscribe";//关注
+    public static final String MESSAGE_UNSUBSCRIBE="unsubscribe";//取消关注
+    public static final String MESSAGE_SCAN="SCAN";//已关注扫码消息
+    public static final String MESSAGE_CLICK="CLICK";//点击菜单拉取消息
+    public static final String MESSAGE_VIEW="VIEW";//点击菜单跳转链接消息
+    public static final String MESSAGE_VIEW_MINIPROGRAM="view_miniprogram";//点击菜单跳转小程序的消息
+
+
+
+    /**
+     * 回复文本消息
+     * @param fromUserName
+     * @param toUserName
+     * @param content 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
+     * @return
+     */
+    public static String initText(String fromUserName, String toUserName, String content) throws Exception{
+        // 返回消息时ToUserName的值与FromUserName的互换
+        Map<String, String> returnMap = new HashMap<>();
+        returnMap.put("ToUserName", fromUserName);
+        returnMap.put("FromUserName", toUserName);
+        returnMap.put("CreateTime", new Date().getTime()+"");
+        returnMap.put("MsgType", "text");
+        returnMap.put("Content", content);
+        log.info("content占用长度为:"+content.getBytes("utf-8").length);
+        return XmlUtil.mapToXml(returnMap);
+    }
+
+
+    /**
+     * 回复图片消息
+     * @param fromUserName
+     * @param toUserName
+     * @param mediaId 通过素材管理中的接口上传多媒体文件,得到的id。
+     * @return
+     */
+    public static String initImage(String fromUserName, String toUserName, String mediaId) throws Exception{
+        // 返回消息时ToUserName的值与FromUserName的互换
+        Map<String, String> returnMap = new HashMap<>();
+        returnMap.put("ToUserName", fromUserName);
+        returnMap.put("FromUserName", toUserName);
+        returnMap.put("CreateTime", new Date().getTime()+"");
+        returnMap.put("MsgType", "image");
+        returnMap.put("MediaId", mediaId);
+        return XmlUtil.mapToXmlSpecial(returnMap);
+    }
+
+
+    /**
+     * 回复图文消息
+     * @param fromUserName 开发者微信号
+     * @param toUserName 接收方帐号(收到的OpenID)
+     * @param articles 图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数
+     * @param title 图文消息标题
+     * @param description 图文消息描述
+     * @param picUrl 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
+     * @param url 点击图文消息跳转链接
+     * @return
+     */
+    public static String initNews(String fromUserName, String toUserName, String articles, String title, String description, String picUrl, String url)  throws Exception{
+        // 返回消息时ToUserName的值与FromUserName的互换
+        Map<String, String> returnMap = new HashMap<>();
+        returnMap.put("ToUserName", fromUserName);
+        returnMap.put("FromUserName", toUserName);
+        returnMap.put("CreateTime", new Date().getTime()+"");
+        returnMap.put("MsgType", "news");
+        returnMap.put("ArticleCount", "1");
+        returnMap.put("Content", articles);
+        returnMap.put("Title", title);
+        returnMap.put("Description", description);
+        returnMap.put("PicUrl", picUrl);
+        returnMap.put("Url", url);
+        return XmlUtil.mapToXml(returnMap);
+    }
+
+
+}

+ 29 - 0
sdjk-common/src/main/java/com/miaxis/common/utils/wx/SHA1Util.java

@@ -0,0 +1,29 @@
+package com.miaxis.common.utils.wx;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class SHA1Util {
+    public static String SHA1(String decript) {
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA-1");
+            digest.update(decript.getBytes());
+            byte messageDigest[] = digest.digest();
+            // Create Hex String
+            StringBuffer hexString = new StringBuffer();
+            // 字节数组转换为 十六进制 数
+            for (int i = 0; i < messageDigest.length; i++) {
+                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
+                if (shaHex.length() < 2) {
+                    hexString.append(0);
+                }
+                hexString.append(shaHex);
+            }
+            return hexString.toString();
+
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+}

+ 74 - 0
sdjk-common/src/main/java/com/miaxis/common/utils/wx/SignUtil.java

@@ -0,0 +1,74 @@
+package com.miaxis.common.utils.wx;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/21 16:20
+ */
+public class SignUtil {
+
+    private static String token = "jpcj";// 与微信公众号上的token一致,是服务器令牌(token),这里写什么。服务器就填什么
+
+    /**
+     * 校验签名
+     *
+     * @param signature 签名
+     * @param timestamp 时间戳
+     * @param nonce     随机数
+     * @return 布尔值
+     */
+    public static boolean checkSignature(String signature, String timestamp, String nonce) {
+        String checktext = null;
+        if (null != signature) {
+            //对ToKen,timestamp,nonce 按字典排序
+            String[] paramArr = new String[]{token, timestamp, nonce};
+            Arrays.sort(paramArr);
+            //将排序后的结果拼成一个字符串
+            String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
+            try {
+                MessageDigest md = MessageDigest.getInstance("SHA-1");
+                //对接后的字符串进行sha1加密
+                byte[] digest = md.digest(content.toString().getBytes());
+                checktext = byteToStr(digest);
+            } catch (NoSuchAlgorithmException e) {
+                e.printStackTrace();
+            }
+        }
+        //将加密后的字符串与signature进行对比
+        return checktext != null ? checktext.equals(signature.toUpperCase()) : false;
+    }
+
+    /**
+     * 将字节数组转化我16进制字符串
+     *
+     * @param byteArrays 字符数组
+     * @return 字符串
+     */
+    private static String byteToStr(byte[] byteArrays) {
+        String str = "";
+        for (int i = 0; i < byteArrays.length; i++) {
+            str += byteToHexStr(byteArrays[i]);
+        }
+        return str;
+    }
+
+    /**
+     * 将字节转化为十六进制字符串
+     *
+     * @param myByte 字节
+     * @return 字符串
+     */
+    private static String byteToHexStr(byte myByte) {
+        char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+        char[] tampArr = new char[2];
+        tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
+        tampArr[1] = Digit[myByte & 0X0F];
+        String str = new String(tampArr);
+        return str;
+    }
+
+}

+ 14 - 0
sdjk-service/src/main/java/com/miaxis/feign/dto/WxGzhBatchUser.java

@@ -0,0 +1,14 @@
+package com.miaxis.feign.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class WxGzhBatchUser {
+
+
+    private List<JSONObject> user_list;
+
+}

+ 22 - 0
sdjk-service/src/main/java/com/miaxis/feign/dto/WxMessageCusom.java

@@ -0,0 +1,22 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/29 14:00
+ */
+@Data
+public class WxMessageCusom {
+
+    private String touser; //是	接收者(用户)的 openid
+    private String msgtype; //消息类型(text、image、voice、video、music)
+    private Map text; //文本
+    private Map image; //图片
+    private Map voice; //语音
+    private Map video; //视频
+
+}

+ 19 - 0
sdjk-service/src/main/java/com/miaxis/feign/dto/WxMessageTemplate.java

@@ -0,0 +1,19 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/29 13:29
+ */
+@Data
+public class WxMessageTemplate {
+
+    private String touser; //是	接收者(用户)的 openid
+    private String template_id;  // 是	所需下发的订阅模板id
+    private String url; // 否 模板跳转链接(海外帐号没有跳转能力)
+    private WxGzhMini miniprogram; //否	跳小程序所需数据,不需跳小程序可不用传该数据
+    private Object data; //是 模板数据
+
+}

+ 22 - 0
sdjk-service/src/main/java/com/miaxis/feign/dto/WxQrTicket.java

@@ -0,0 +1,22 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/20 15:08
+ */
+@Data
+public class WxQrTicket {
+
+    private Integer expire_seconds;  //该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为60秒。
+    private String action_name;  //二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值
+
+    /**
+     * 二维码详细信息
+     *      参数:scene_id:场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
+     *            scene_str:场景值ID(字符串形式的ID),字符串类型,长度限制为1到64
+     */
+    private Object action_info;  //二维码详细信息
+}

+ 111 - 14
sdjk-service/src/main/java/com/miaxis/feign/service/IWxSendService.java

@@ -1,40 +1,137 @@
 package com.miaxis.feign.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.miaxis.common.config.FeignConfig;
-import com.miaxis.feign.dto.WxGzhSend;
-import com.miaxis.feign.dto.WxSend;
+import com.miaxis.feign.dto.WxGzhBatchUser;
+import com.miaxis.feign.dto.WxMessageCusom;
+import com.miaxis.feign.dto.WxMessageTemplate;
+import com.miaxis.feign.dto.WxQrTicket;
+import feign.Headers;
+import feign.Param;
+import feign.form.FormData;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
 
 /**
- *
- * 微信接口
+ * 微信公众号接口
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/20 14:59
  */
 @FeignClient(name="wxSendService",
         url = "https://api.weixin.qq.com/cgi-bin",configuration = FeignConfig.class)
 public interface IWxSendService {
 
-    @PostMapping(value = "/message/subscribe/send")
-    String sendMessage(@RequestParam("access_token") String accessToken, WxSend wxSend);
 
-    @PostMapping(value = "/message/template/send")
-    String sendGzhMessage(@RequestParam("access_token") String accessToken, WxGzhSend wxGzhSend);
 
+
+
+    /**
+     *  获取token
+     * @param grant_type
+     * @param appid 第三方用户唯一凭证
+     * @param secret 第三方用户唯一凭证密钥,即appsecret
+     * @return
+     */
     @GetMapping(value = "/token")
     String getAccessToken(@RequestParam("grant_type") String grant_type,
                           @RequestParam("appid") String appid,
                           @RequestParam("secret") String secret);
 
-    @GetMapping(value = "/user/get")
-    String getUser(@RequestParam("access_token") String access_token,
-                   @RequestParam("next_openid") String next_openid);
 
+    /**
+     * 生成带参数二维码接口
+     *      -文档链接:https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html
+     * @param accessToken
+     * @param wxQrTicket:二维码参数
+     * @return
+     */
+    @PostMapping(value = "/qrcode/create")
+    String generateTicket(@RequestParam("access_token") String accessToken, WxQrTicket wxQrTicket);
+
+
+    /**
+     * 创建菜单接口
+     *      -文档链接:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html
+     * @param accessToken
+     * @param jsonObject json
+     * @return
+     */
+    @PostMapping(value = "/menu/create")
+    @ResponseBody
+    String createMenu(@RequestParam("access_token") String accessToken, JSONObject jsonObject);
+
+
+    /**
+     * 新增永久图文素材
+     *      -文档链接:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
+     * @param accessToken
+     * @param jsonObject json
+     * @return
+     */
+    @PostMapping(value = "/material/add_news")
+    @ResponseBody
+    String materialAddNews(@RequestParam("access_token") String accessToken, JSONObject jsonObject);
+
+
+    /**
+     * 新增其他类型永久素材
+     *      -文档链接:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
+     * @param accessToken
+     * @param type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
+     * @param media form-data中媒体文件标识,有filename、filelength、content-type等信息
+     * @return
+     */
+    @PostMapping(value = "/material/add_material")
+    @Headers("Content-Type: multipart/form-data")
+    String materialAddByType(@RequestParam("access_token") String accessToken, @RequestParam("type") String type, @Param("photo") FormData media);
+
+
+    /**
+     * 获取用户信息
+     * @param token 调用接口凭证
+     * @param openid 普通用户的标识,对当前公众号唯一
+     * @param lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
+     * @return
+     */
     @GetMapping(value = "/user/info")
-    String getUserInfo(@RequestParam("access_token") String access_token,
-                       @RequestParam("openid") String openid,
-                       @RequestParam("lang") String lang);
+    String userInfo(@RequestParam("access_token") String token,
+                    @RequestParam("openid") String openid,
+                    @RequestParam("lang") String lang);
+
+
+    /**
+     * 批量获取用户信息
+     * @param token 调用接口凭证
+     * @return
+     */
+    @PostMapping(value = "/user/info/batchget")
+    String batchUserInfo(@RequestParam("access_token") String token, WxGzhBatchUser batchUser);
+
+    /**
+     * 发送客服消息
+     * @param accessToken
+     * @param messageCusom
+     * @return
+     */
+    @PostMapping(value = "/message/custom/send")
+    String messageCustomSend(@RequestParam("access_token") String accessToken,
+                             WxMessageCusom messageCusom);
+
+    /**
+     * 发送模板消息
+     * @param accessToken
+     * @param messageTemplate
+     * @return
+     */
+    @PostMapping(value = "/message/template/send")
+    String messageTemplateSend(@RequestParam("access_token") String accessToken,
+                               WxMessageTemplate messageTemplate);
+
 
 
 }

+ 102 - 0
sdjk-service/src/main/java/com/miaxis/wx/domain/WxExtract.java

@@ -0,0 +1,102 @@
+package com.miaxis.wx.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 微信提现对象 wx_extract
+ *
+ * @author miaxis
+ * @date 2022-01-24
+ */
+@Data
+@TableName("wx_extract")
+@ApiModel(value = "WxExtract", description = "微信提现对象 wx_extract")
+public class WxExtract extends BaseBusinessEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    /** 用户唯一标识(微信) */
+    @Excel(name = "用户唯一标识(微信)")
+    @TableField("openid")
+    @ApiModelProperty(value = "用户唯一标识(微信)")
+    private String openid;
+
+    /** 商户订单号 */
+    @Excel(name = "商户订单号")
+    @TableField("partner_trade_no")
+    @ApiModelProperty(value = "商户订单号")
+    private String partnerTradeNo;
+
+    /** 用户唯一标识(微信) */
+    @Excel(name = "备注")
+    @TableField("remark")
+    @ApiModelProperty(value = "备注)")
+    private String remark;
+
+    /** 提现金额(分) */
+    @Excel(name = "提现金额(分)")
+    @TableField("extract_price")
+    @ApiModelProperty(value = "提现金额(分)")
+    private Integer extractPrice;
+
+    /** 状态  1:提现成功、2:提现失败 */
+    @Excel(name = "状态  1:提现成功、2:提现失败")
+    @TableField("status")
+    @ApiModelProperty(value = "状态  1:提现成功、2:提现失败")
+    private String status;
+
+    public void setId(Long id){
+        this.id = id;
+    }
+
+    public Long getId(){
+        return id;
+    }
+    public void setOpenid(String openid){
+        this.openid = openid;
+    }
+
+    public String getOpenid(){
+        return openid;
+    }
+    public void setExtractPrice(Integer extractPrice){
+        this.extractPrice = extractPrice;
+    }
+
+    public Integer getExtractPrice(){
+        return extractPrice;
+    }
+    public void setStatus(String status){
+        this.status = status;
+    }
+
+    public String getStatus(){
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("openid", getOpenid())
+            .append("extractPrice", getExtractPrice())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("status", getStatus())
+            .toString();
+    }
+}

+ 103 - 0
sdjk-service/src/main/java/com/miaxis/wx/domain/WxExtractBank.java

@@ -0,0 +1,103 @@
+package com.miaxis.wx.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 微信提现银行卡对象 wx_extract_bank
+ *
+ * @author miaxis
+ * @date 2022-03-07
+ */
+@Data
+@TableName("wx_extract_bank")
+@ApiModel(value = "WxExtractBank", description = "微信提现银行卡对象 wx_extract_bank")
+public class WxExtractBank extends BaseBusinessEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    /** 用户唯一标识(微信) */
+    @Excel(name = "用户唯一标识(微信)")
+    @TableField("openid")
+    @ApiModelProperty(value = "用户唯一标识(微信)")
+    private String openid;
+
+    /** 真实姓名 */
+    @Excel(name = "真实姓名")
+    @TableField("enc_true_name")
+    @ApiModelProperty(value = "真实姓名")
+    private String encTrueName;
+
+    /** 银行编号 */
+    @Excel(name = "银行编号")
+    @TableField("bank_code")
+    @ApiModelProperty(value = "银行编号")
+    private Integer bankCode;
+
+    /** 银行卡号 */
+    @Excel(name = "银行卡号")
+    @TableField("enc_bank_no")
+    @ApiModelProperty(value = "银行卡号")
+    private String encBankNo;
+
+    public void setId(Long id){
+        this.id = id;
+    }
+
+    public Long getId(){
+        return id;
+    }
+    public void setOpenid(String openid){
+        this.openid = openid;
+    }
+
+    public String getOpenid(){
+        return openid;
+    }
+    public void setEncTrueName(String encTrueName){
+        this.encTrueName = encTrueName;
+    }
+
+    public String getEncTrueName(){
+        return encTrueName;
+    }
+    public void setBankCode(Integer bankCode){
+        this.bankCode = bankCode;
+    }
+
+    public Integer getBankCode(){
+        return bankCode;
+    }
+    public void setEncBankNo(String encBankNo){
+        this.encBankNo = encBankNo;
+    }
+
+    public String getEncBankNo(){
+        return encBankNo;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("openid", getOpenid())
+            .append("encTrueName", getEncTrueName())
+            .append("bankCode", getBankCode())
+            .append("encBankNo", getEncBankNo())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 108 - 0
sdjk-service/src/main/java/com/miaxis/wx/domain/WxForeverCode.java

@@ -0,0 +1,108 @@
+package com.miaxis.wx.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 微信永久二维码口令对象 wx_forever_code
+ *
+ * @author miaxis
+ * @date 2022-01-17
+ */
+@Data
+@TableName("wx_forever_code")
+@ApiModel(value = "WxForeverCode", description = "微信永久二维码口令对象 wx_forever_code")
+public class WxForeverCode extends BaseBusinessEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    /** 用户唯一标识(微信) */
+    @Excel(name = "用户唯一标识(微信)")
+    @TableField("openid")
+    @ApiModelProperty(value = "用户唯一标识(微信)")
+    private String openid;
+
+    /** 6位口令 */
+    @Excel(name = "6位口令")
+    @TableField("code")
+    @ApiModelProperty(value = "6位口令")
+    private String code;
+
+    /** 微信昵称 */
+    @Excel(name = "微信昵称")
+    @TableField("nick_name")
+    @ApiModelProperty(value = "微信昵称")
+    private String nickName;
+
+
+    @TableField("url")
+    @ApiModelProperty(value = "url")
+    private String url;
+
+    /** 状态  1:有效(默认) 0:失效  */
+    @Excel(name = "状态  1:有效(默认) 0:失效 ")
+    @TableField("status")
+    @ApiModelProperty(value = "状态  1:有效(默认) 0:失效 ")
+    private Integer status;
+
+    public void setId(Long id){
+        this.id = id;
+    }
+
+    public Long getId(){
+        return id;
+    }
+    public void setOpenid(String openid){
+        this.openid = openid;
+    }
+
+    public String getOpenid(){
+        return openid;
+    }
+    public void setCode(String code){
+        this.code = code;
+    }
+
+    public String getCode(){
+        return code;
+    }
+    public void setNickName(String nickName){
+        this.nickName = nickName;
+    }
+
+    public String getNickName(){
+        return nickName;
+    }
+    public void setStatus(Integer status){
+        this.status = status;
+    }
+
+    public Integer getStatus(){
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("openid", getOpenid())
+            .append("code", getCode())
+            .append("nickName", getNickName())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("status", getStatus())
+            .toString();
+    }
+}

+ 69 - 0
sdjk-service/src/main/java/com/miaxis/wx/domain/WxMenu.java

@@ -0,0 +1,69 @@
+package com.miaxis.wx.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 微信公众号菜单对象 wx_menu
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/26 10:06
+ */
+@Data
+@TableName("wx_menu")
+@ApiModel(value = "WxMenu", description = "微信公众号菜单对象 wx_menu")
+public class WxMenu extends BaseBusinessEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("parent_id")
+    @ApiModelProperty(value = "父节点")
+    private Integer parentId;
+
+    @TableField("type")
+    @ApiModelProperty(value = "菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型")
+    private String type;
+
+    @TableField("menu_name")
+    @ApiModelProperty(value = "菜单标题")
+    private String menuName;
+
+    @TableField("click_key")
+    @ApiModelProperty(value = "click等点击类型必须,菜单KEY值,用于消息接口推送,不超过128字节")
+    private String clickKey;
+
+    @TableField("url")
+    @ApiModelProperty(value = "view、miniprogram类型必须,网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。")
+    private String url;
+
+    @TableField("media_id")
+    @ApiModelProperty(value = "media_id类型和view_limited类型必须,调用新增永久素材接口返回的合法media_id")
+    private String mediaId;
+
+    @TableField("appid")
+    @ApiModelProperty(value = "miniprogram类型必须,小程序的appid(仅认证公众号可配置)")
+    private String appid;
+
+    @TableField("page_path")
+    @ApiModelProperty(value = "miniprogram类型必须,小程序的页面路径")
+    private String pagePath;
+
+    @TableField("article_id")
+    @ApiModelProperty(value = "发布后获得的合法 article_id")
+    private String articleId;
+
+    @TableField("sort")
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+}

+ 23 - 0
sdjk-service/src/main/java/com/miaxis/wx/mapper/WxExtractBankMapper.java

@@ -0,0 +1,23 @@
+package com.miaxis.wx.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.wx.domain.WxExtractBank;
+
+import java.util.List;
+
+/**
+ * 微信提现银行卡Mapper接口
+ *
+ * @author miaxis
+ * @date 2022-03-07
+ */
+public interface WxExtractBankMapper extends BaseMapper<WxExtractBank> {
+    /**
+     * 查询微信提现银行卡列表
+     *
+     * @param wxExtractBank 微信提现银行卡
+     * @return 微信提现银行卡集合
+     */
+    public List<WxExtractBank> selectWxExtractBankList(WxExtractBank wxExtractBank);
+
+}

+ 23 - 0
sdjk-service/src/main/java/com/miaxis/wx/mapper/WxExtractMapper.java

@@ -0,0 +1,23 @@
+package com.miaxis.wx.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.wx.domain.WxExtract;
+
+import java.util.List;
+
+/**
+ * 微信提现Mapper接口
+ *
+ * @author miaxis
+ * @date 2022-01-24
+ */
+public interface WxExtractMapper extends BaseMapper<WxExtract> {
+    /**
+     * 查询微信提现列表
+     *
+     * @param wxExtract 微信提现
+     * @return 微信提现集合
+     */
+    public List<WxExtract> selectWxExtractList(WxExtract wxExtract);
+
+}

+ 23 - 0
sdjk-service/src/main/java/com/miaxis/wx/mapper/WxMenuMapper.java

@@ -0,0 +1,23 @@
+package com.miaxis.wx.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.vo.WxMenuVo;
+
+import java.util.List;
+
+/**
+ * 微信公众号菜单Mapper接口
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/26 10:12
+ */
+public interface WxMenuMapper extends BaseMapper<WxMenu> {
+
+    /**
+     * 查询微信公众号菜单列表
+     * @return 微信公众号菜单集合
+     */
+    List<WxMenuVo> selectWxMenuList();
+
+}

+ 22 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/IWxExtractBankService.java

@@ -0,0 +1,22 @@
+package com.miaxis.wx.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.wx.domain.WxExtractBank;
+
+import java.util.List;
+
+/**
+ * 微信提现银行卡Service接口
+ *
+ * @author miaxis
+ * @date 2022-03-07
+ */
+public interface IWxExtractBankService extends IService<WxExtractBank> {
+    /**
+     * 查询微信提现银行卡列表
+     *
+     * @param wxExtractBank 微信提现银行卡
+     * @return 微信提现银行卡集合
+     */
+    public List<WxExtractBank> selectWxExtractBankList(WxExtractBank wxExtractBank);
+}

+ 22 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/IWxExtractService.java

@@ -0,0 +1,22 @@
+package com.miaxis.wx.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.wx.domain.WxExtract;
+
+import java.util.List;
+
+/**
+ * 微信提现Service接口
+ *
+ * @author miaxis
+ * @date 2022-01-24
+ */
+public interface IWxExtractService extends IService<WxExtract> {
+    /**
+     * 查询微信提现列表
+     *
+     * @param wxExtract 微信提现
+     * @return 微信提现集合
+     */
+    public List<WxExtract> selectWxExtractList(WxExtract wxExtract);
+}

+ 29 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/IWxGzhService.java

@@ -0,0 +1,29 @@
+package com.miaxis.wx.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 微信公众号服务
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/20 14:56
+ */
+public interface IWxGzhService {
+
+    /**
+     * 获取微信公众号token
+     * @return
+     */
+    String getGzhToken();
+
+
+    /**
+     * 微信推送消息处理
+     */
+    String handlePublicMsg(HttpServletRequest request);
+
+
+    JSONObject getJspapi(String url);
+}

+ 53 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/IWxMenuService.java

@@ -0,0 +1,53 @@
+package com.miaxis.wx.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.vo.WxMenuVo;
+
+import java.util.List;
+
+/**
+ * 微信公众号菜单Service接口
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/3 9:23
+ */
+public interface IWxMenuService extends IService<WxMenu> {
+
+    /**
+     * 查询微信公众号菜单列表
+     *
+     * @return 微信公众号菜单集合
+     */
+    Response<List<WxMenuVo>> selectWxMenuTreeList();
+
+    /**
+     * 新增微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    Response saveMenu(WxMenu wxMenu);
+
+
+    /**
+     * 修改微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    Response updateMenuById(WxMenu wxMenu);
+
+    /**
+     * 删除微信公众号菜单
+     * @param ids
+     * @return
+     */
+    Response removeMenuByIds(Long[] ids);
+
+    /**
+     * 一键发送数据库菜单
+     * @return
+     */
+    Response sendMenuBySql();
+
+}

+ 36 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/IWxMessageEvenService.java

@@ -0,0 +1,36 @@
+package com.miaxis.wx.service;
+
+import com.miaxis.wx.domain.WxForeverCode;
+
+/**
+ * 微信消息事件处理
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/27 14:33
+ */
+public interface IWxMessageEvenService {
+
+    //关注事件
+//    String subscribeEvent();
+
+    /**
+     * 扫码关注事件
+     * @param fromUserName 发送方帐号(一个OpenID)
+     * @param token 凭证
+     * @param userName 微信名称
+     * @return
+     */
+    String scanSubscribeEvent(String fromUserName, String eventKey, String token, String userName);
+
+    /**
+     * click获取分销二维码事件
+     * @param fromUserName 发送方帐号(一个OpenID)
+     * @param token 凭证
+     * @param isForever 是否是永久二维码
+     * @param wxForeverCode
+     * @return
+     */
+    String gainTicketEvent(String fromUserName, String token, boolean isForever, WxForeverCode wxForeverCode);
+
+
+}

+ 25 - 3
sdjk-service/src/main/java/com/miaxis/feign/service/WxService.java → sdjk-service/src/main/java/com/miaxis/wx/service/WxService.java

@@ -1,4 +1,4 @@
-package com.miaxis.feign.service;
+package com.miaxis.wx.service;
 
 
 import com.miaxis.common.config.FeignConfig;
@@ -31,9 +31,8 @@ public interface WxService {
             @RequestParam("grant_type") String grantType);
 
 
-
     /**
-     * 获取用户信息
+     * 公众号获取用户信息
      */
     @GetMapping(value = "/sns/userinfo")
     String getUserInfo(
@@ -42,5 +41,28 @@ public interface WxService {
             @RequestParam("openid") String openid
     );
 
+    /**
+     *  小程序获取openid
+     * @param appid
+     * @param secret
+     * @param jsCode
+     * @param grantType
+     * @return
+     */
+    @GetMapping(value = "/sns/jscode2session")
+    String getWxInfo(
+            @RequestParam("appid") String appid,
+            @RequestParam("secret") String secret,
+            @RequestParam("js_code") String jsCode,
+            @RequestParam("grant_type") String grantType);
+
+    /**
+     * 获取jsapi_ticket
+     */
+    @GetMapping(value = "/cgi-bin/ticket/getticket")
+    String getticket(
+            @RequestParam("access_token") String accessToken,
+            @RequestParam("type") String type
+    );
 
 }

+ 33 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxExtractBankServiceImpl.java

@@ -0,0 +1,33 @@
+package com.miaxis.wx.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.miaxis.wx.domain.WxExtractBank;
+import com.miaxis.wx.mapper.WxExtractBankMapper;
+import com.miaxis.wx.service.IWxExtractBankService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 微信提现银行卡Service业务层处理
+ *
+ * @author miaxis
+ * @date 2022-03-07
+ */
+@Service
+public class WxExtractBankServiceImpl extends ServiceImpl<WxExtractBankMapper, WxExtractBank> implements IWxExtractBankService {
+    @Autowired
+    private WxExtractBankMapper wxExtractBankMapper;
+
+    /**
+     * 查询微信提现银行卡列表
+     *
+     * @param wxExtractBank 微信提现银行卡
+     * @return 微信提现银行卡
+     */
+    @Override
+    public List<WxExtractBank> selectWxExtractBankList(WxExtractBank wxExtractBank){
+        return wxExtractBankMapper.selectWxExtractBankList(wxExtractBank);
+    }
+}

+ 33 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxExtractServiceImpl.java

@@ -0,0 +1,33 @@
+package com.miaxis.wx.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.miaxis.wx.domain.WxExtract;
+import com.miaxis.wx.mapper.WxExtractMapper;
+import com.miaxis.wx.service.IWxExtractService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 微信提现Service业务层处理
+ *
+ * @author miaxis
+ * @date 2022-01-24
+ */
+@Service
+public class WxExtractServiceImpl extends ServiceImpl<WxExtractMapper, WxExtract> implements IWxExtractService {
+    @Autowired
+    private WxExtractMapper wxExtractMapper;
+
+    /**
+     * 查询微信提现列表
+     *
+     * @param wxExtract 微信提现
+     * @return 微信提现
+     */
+    @Override
+    public List<WxExtract> selectWxExtractList(WxExtract wxExtract){
+        return wxExtractMapper.selectWxExtractList(wxExtract);
+    }
+}

+ 328 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxGzhServiceImpl.java

@@ -0,0 +1,328 @@
+package com.miaxis.wx.service.impl;
+
+import cn.hutool.json.XML;
+import com.alibaba.fastjson.JSONObject;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.utils.StringUtils;
+import com.miaxis.common.utils.wx.MessageUtil;
+import com.miaxis.feign.dto.WxMessageCusom;
+import com.miaxis.feign.service.IWxSendService;
+import com.miaxis.system.service.ISysUserService;
+import com.miaxis.user.service.IUserInfoService;
+import com.miaxis.wx.service.IWxGzhService;
+import com.miaxis.wx.service.IWxMessageEvenService;
+import com.miaxis.wx.service.WxService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 微信公众号业务层
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/20 14:57
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class WxGzhServiceImpl implements IWxGzhService {
+
+    private final RedisTemplate redisTemplate;
+
+    private final IWxSendService wxSendService;
+
+    private final ISysUserService userService;
+
+    private final IUserInfoService userInfoService;
+
+    private final IWxMessageEvenService wxMessageEvenService;
+
+    private final WxService wxService;
+
+
+    @Value("${zzgzh.appid}")
+    private String appid;
+
+    @Value("${zzgzh.appSecret}")
+    private String secret;
+
+
+    /**
+     * 获取微信公众号token
+     * @return
+     */
+    @Override
+    public String getGzhToken() {
+        String token = "";
+        Integer expiresIn;
+        if (redisTemplate.hasKey(Constants.GZH_MESSAGE_TOKEN)){
+            token = (String)redisTemplate.opsForValue().get(Constants.GZH_MESSAGE_TOKEN);
+        }
+        if (StringUtils.isEmpty(token)|| notEffect(token)){
+            String result = wxSendService.getAccessToken("client_credential",appid,secret);
+            JSONObject json = JSONObject.parseObject(result);
+            token = json.getString("access_token");
+            expiresIn = 1800;
+//            expiresIn = json.getIntValue("expires_in");
+//            if (expiresIn <= 0){
+//                expiresIn = 7000;
+//            }
+
+            redisTemplate.opsForValue().set(Constants.GZH_MESSAGE_TOKEN,token,expiresIn, TimeUnit.SECONDS);
+        }
+
+        return token;
+    }
+
+    //判定是否失效
+    private boolean notEffect(String token) {
+        String res = wxSendService.userInfo( token, "ovKTX5-FKLF6_sgTtCIXpG_lz3PY", "zh_CN");
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        return jsonObject.getString("unionid") ==null;
+
+    }
+
+
+    /**
+     * 微信推送消息处理
+     * @param request
+     * @return
+     */
+    @Override
+    public String handlePublicMsg(HttpServletRequest request) {
+        try {
+            log.info("1....");
+            cn.hutool.json.JSONObject decryptMap = XML.toJSONObject(IOUtils.toString(request.getInputStream()));
+            cn.hutool.json.JSONObject jsonObjectData = decryptMap.getJSONObject("xml");
+
+
+            //cn.hutool.json.JSONObject jsonObjectData = new cn.hutool.json.JSONObject("{\"CreateTime\":1639474955,\"EventKey\":\"https://jpcj-h5.zzxcx.net\",\"ToUserName\":\"gh_628da25a95e5\",\"MsgType\":\"event\",\"MenuId\":442656773,\"Event\":\"VIEW\",\"FromUserName\":\"ovKTX50v7OAEPI_ERofpUvrNQCJU\"}");
+            log.info("2-----jsonObjectData------"+jsonObjectData);
+
+
+
+            //开发者微信号
+            String toUserName = jsonObjectData.getStr("ToUserName");
+            //发送方帐号(一个OpenID)
+            String fromUserName = jsonObjectData.getStr("FromUserName");
+            // 区分消息类型
+            String msgType = jsonObjectData.getStr("MsgType");
+            //获取用户信息
+//            String userInfoResult = wxSendService.userInfo(this.getGzhToken(), fromUserName, "zh_CN");
+//            JSONObject jsonObj = JSONObject.parseObject(userInfoResult);
+
+            // 普通消息
+            if (MessageUtil.MESSAGE_TEXT.equals(msgType)) { // 文本消息
+
+            } else if (MessageUtil.MESSAGE_IMAGE.equals(msgType)) { // 图片消息
+                log.info("2.2...");
+                return MessageUtil.initText(fromUserName, toUserName, "抱歉,暂时无法识别图片信息!");
+            }else if (MessageUtil.MESSAGE_EVENT.equals(msgType)) { // 事件消息
+                log.info("3....");
+                String result = null ;
+                // 区分事件推送
+                String event = jsonObjectData.getStr("Event");
+                if (MessageUtil.MESSAGE_SUBSCRIBE.equals(event)) { // 关注事件 或 扫描二维码关注事件
+                    log.info("3.1...");
+                    String res = wxSendService.userInfo( this.getGzhToken(), fromUserName, "zh_CN");
+
+                    //存在Ticket为扫码关注
+                    if (org.apache.commons.lang3.StringUtils.isNotEmpty(jsonObjectData.getStr("Ticket"))){
+                        log.info("3.1.2..");
+                        result =  MessageUtil.initText(fromUserName,toUserName," ");
+
+                    }else {
+                        result =  MessageUtil.initText(fromUserName, toUserName, "欢迎关注金牌车教,您的学车好伙伴!");
+                    }
+
+
+                    return result;
+
+
+
+                }  else if (MessageUtil.MESSAGE_UNSUBSCRIBE.equals(event)) { // 取消订阅事件
+                    // todo 处理取消订阅事件
+
+                } else if (MessageUtil.MESSAGE_SCAN.equals(event)) { // 已关注扫描二维码事件
+
+
+                } else if (MessageUtil.MESSAGE_LOCATION.equals(event)) { // 上报地理位置事件
+                    // todo 处理上报地理位置事件
+
+                } else if (MessageUtil.MESSAGE_CLICK.equals(event)) { // 点击菜单拉取消息时的事件推送事件
+
+
+                } else if (MessageUtil.MESSAGE_VIEW.equals(event)) { // 点击菜单跳转链接时的事件推送
+                    // todo 处理点击菜单跳转链接时的事件推送
+                }
+            }
+        } catch (Exception e) {
+            log.error("处理微信公众号请求信息,失败", e);
+        }
+        return null;
+    }
+
+
+
+
+
+
+
+    private void sendSchool(StringBuffer buffer, List<Map> schools,String fromUserName) {
+        if (schools.size() <= 10){
+            buffer.append("请选择驾校:").append("\n\n");
+            for (Map school : schools) {
+                String name = (String) school.get("name");
+                String code = (String) school.get("code");
+                buffer.append("<a href=\"weixin://bizmsgmenu?msgmenuid=" + code + "&msgmenucontent=ok\">" + name + "</a>").append("\n");
+
+            }
+        }else{
+            int times = (schools.size()-1)/10+1;
+            for (int i =0; i< times-1; i++){
+                StringBuffer partBuffer  =new StringBuffer();
+                if (i == 0){
+                    partBuffer.append("请选择驾校:").append("\n\n");
+                }
+                for (int j =0; j< 10 ; j++){
+                    Map school = schools.get(i*10+j);
+                    String name = (String) school.get("name");
+                    String code = (String) school.get("code");
+                    partBuffer.append("<a href=\"weixin://bizmsgmenu?msgmenuid=" + code + "&msgmenucontent="+name+"\">" + name + "</a>").append("\n");
+                }
+
+                messageCustomSend(fromUserName,this.getGzhToken(),partBuffer.toString());
+            }
+            //最后一页做相应消息
+            for (int i = (times-1)*10; i< schools.size() ; i++){
+                Map school = schools.get(i);
+                String name = (String) school.get("name");
+                String code = (String) school.get("code");
+                buffer.append("<a href=\"weixin://bizmsgmenu?msgmenuid=" + code + "&msgmenucontent="+name+"\">" + name + "</a>").append("\n");
+            }
+        }
+    }
+
+    /**
+     * 发送客服消息
+     * @param fromUserName
+     * @param token
+     */
+    private void messageCustomSend(String fromUserName,String token,String content){
+
+        WxMessageCusom wxMessageCusom = new WxMessageCusom();
+        wxMessageCusom.setTouser(fromUserName);
+        wxMessageCusom.setMsgtype("text");
+        HashMap<String, Object> contentMap = new HashMap<>();
+        contentMap.put("content",content);
+        wxMessageCusom.setText(contentMap);
+        String send = wxSendService.messageCustomSend(token, wxMessageCusom);
+        JSONObject jsonObject = JSONObject.parseObject(send);
+    }
+
+
+    @Override
+    public JSONObject getJspapi(String url) {
+
+        //1、获取AccessToken
+        String gzhToken = this.getGzhToken();
+        //2、获取Ticket
+        String jsapiStr = wxService.getticket(gzhToken, "jsapi");
+        //3、时间戳和随机字符串
+//        String nonce_str = RandomStringUtils.randomAlphanumeric(16);
+//        long timestamp =  System.currentTimeMillis()/1000;
+        JSONObject jsapiData = JSONObject.parseObject(jsapiStr);
+        String ticket= jsapiData.getString("ticket");
+        Map<String, String> ret = sign(ticket, "https://jpcj-h5.zzxcx.net/mini1");
+
+
+
+//        //4、获取url
+//        String str = "jsapi_ticket="+jsapiStr+"&noncestr="+nonce_str+"&timestamp="+timestamp+"&url="+url;
+//
+//        //6、将字符串进行sha1加密
+//        String signature = SHA1Util.SHA1(str);
+        JSONObject resultJSONObject = new JSONObject();
+        resultJSONObject.put("ticket",ticket);
+        resultJSONObject.put("appId",appid);
+        resultJSONObject.put("timestamp",ret.get("timestamp"));
+        resultJSONObject.put("nonceStr",ret.get("nonceStr"));
+        resultJSONObject.put("signature",ret.get("signature"));
+        return resultJSONObject;
+    }
+
+    public static Map<String, String> sign(String jsapi_ticket, String url) {
+        Map<String, String> ret = new HashMap<String, String>();
+        String nonce_str = create_nonce_str();
+        String timestamp = create_timestamp();
+        String string1;
+        String signature = "";
+
+        //注意这里参数名必须全部小写,且必须有序
+        string1 = "jsapi_ticket=" + jsapi_ticket +
+                "&noncestr=" + nonce_str +
+                "&timestamp=" + timestamp +
+                "&url=" + url;
+        System.out.println(string1);
+
+        try
+        {
+            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+            crypt.reset();
+            crypt.update(string1.getBytes("UTF-8"));
+            signature = byteToHex(crypt.digest());
+        }
+        catch (NoSuchAlgorithmException e)
+        {
+            e.printStackTrace();
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            e.printStackTrace();
+        }
+
+        ret.put("url", url);
+        ret.put("jsapi_ticket", jsapi_ticket);
+        ret.put("nonceStr", nonce_str);
+        ret.put("timestamp", timestamp);
+        ret.put("signature", signature);
+
+        return ret;
+    }
+
+    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;
+    }
+
+    private static String create_nonce_str() {
+        return UUID.randomUUID().toString();
+    }
+
+    private static String create_timestamp() {
+        return Long.toString(System.currentTimeMillis() / 1000);
+    }
+
+
+
+
+
+
+}

+ 208 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxMenuServiceImpl.java

@@ -0,0 +1,208 @@
+package com.miaxis.wx.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.sign.VerifyUtil;
+import com.miaxis.feign.service.IWxSendService;
+import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.mapper.WxMenuMapper;
+import com.miaxis.wx.service.IWxGzhService;
+import com.miaxis.wx.service.IWxMenuService;
+import com.miaxis.wx.vo.WxMenuVo;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 微信公众号菜单Service业务层处理
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/3 9:24
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+public class WxMenuServiceImpl extends ServiceImpl<WxMenuMapper, WxMenu> implements IWxMenuService {
+
+    private final WxMenuMapper wxMenuMapper;
+
+    private final IWxGzhService wxGzhService;
+
+    private final IWxSendService wxSendService;
+
+    /**
+     * 查询微信公众号菜单列表
+     *
+     * @return 微信公众号菜单
+     */
+    @Override
+    public Response<List<WxMenuVo>> selectWxMenuTreeList(){
+        List<WxMenuVo> menuList = wxMenuMapper.selectWxMenuList();
+        return Response.success(builTree(menuList));
+    }
+
+    //建立树形结构
+    public List<WxMenuVo> builTree(List<WxMenuVo> menuList){
+        List<WxMenuVo> infoVos =new ArrayList<>();
+        //获取根节点
+        List<WxMenuVo> rootMenuLists =new  ArrayList<>();
+        for(WxMenuVo menuVo : menuList) {
+            if(menuVo.getParentId().toString().equals("0")) {
+                rootMenuLists.add(menuVo);
+            }
+        }
+        for(WxMenuVo wxMenuVo : rootMenuLists) {
+            wxMenuVo=getTree(wxMenuVo,menuList);
+            infoVos.add(wxMenuVo);
+        }
+        return infoVos;
+    }
+    //递归,建立子树形结构
+    private WxMenuVo getTree(WxMenuVo wxMenuVo,List<WxMenuVo> menuList){
+        List<WxMenuVo> infoVos = new ArrayList<>();
+        for (WxMenuVo menuVo : menuList) {
+            if (menuVo.getParentId().toString().equals(wxMenuVo.getId().toString())){
+                infoVos.add(getTree(menuVo,menuList));
+            }
+        }
+        wxMenuVo.setChildren(infoVos);
+        return wxMenuVo;
+    }
+
+
+    /**
+     * 新增微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    @Override
+    public Response saveMenu(WxMenu wxMenu) {
+        try {
+            wxMenuMapper.insert(wxMenu);
+            sendMenu();
+            return Response.success();
+        }catch (Exception e){
+            throw new CustomException("系统异常");
+        }
+    }
+
+    /**
+     * 修改微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    @Override
+    public Response updateMenuById(WxMenu wxMenu) {
+        try {
+            wxMenuMapper.updateById(wxMenu);
+            sendMenu();
+            return Response.success();
+        }catch (Exception e){
+            throw new CustomException("系统异常");
+        }
+    }
+
+    /**
+     * 删除微信公众号菜单
+     * @param ids
+     * @return
+     */
+    @Override
+    public Response removeMenuByIds(Long[] ids) {
+        try {
+            this.removeByIds(Arrays.asList(ids));
+            sendMenu();
+            return Response.success();
+        }catch (Exception e){
+            throw new CustomException("系统异常");
+        }
+    }
+
+    /**
+     * 一键发送数据库菜单
+     * @return
+     */
+    @Override
+    public Response sendMenuBySql() {
+        sendMenu();
+        return Response.success();
+    }
+
+
+    /**
+     * 发送菜单至微信
+     * @return
+     */
+    private String sendMenu(){
+        JSONObject wxMenuJson = getWxMenuJson();
+        String token = wxGzhService.getGzhToken();
+        System.out.println(wxMenuJson.toString());
+        String result = wxSendService.createMenu(token,wxMenuJson);
+        log.info("-----sendMenu-----"+ result);
+        return result;
+    }
+
+
+    /**
+     * 查询微信菜单数据
+     * @return
+     */
+    private JSONObject getWxMenuJson() {
+
+        JSONObject menuJson = new JSONObject();
+        //获取父类
+        List<WxMenu> menuList = wxMenuMapper.selectByMap(new HashMap<String,Object>(){{
+            put("parent_id",0);
+        }});
+        JSONArray button=new JSONArray();
+        for(WxMenu menu : menuList){
+            if(!VerifyUtil.verifyString(menu.getType())){
+                JSONObject childButton = new JSONObject();
+                childButton.put("name", menu.getMenuName());
+                //父类
+                JSONArray sub_button = new JSONArray();
+                List<WxMenu> childMenuList = wxMenuMapper.selectList(new QueryWrapper<WxMenu>().eq("parent_id", menu.getId()).orderByAsc("sort"));
+
+                for (WxMenu childMenu : childMenuList) {
+                    sub_button.add(getChildMenuJson(childMenu));
+                }
+                childButton.put("sub_button", sub_button);
+                button.add(childButton);
+            }else{
+                button.add(getChildMenuJson(menu));
+            }
+        }
+
+        menuJson.put("button", button);
+        return menuJson;
+    }
+
+
+    private JSONObject getChildMenuJson(WxMenu menu){
+        JSONObject menuJson = new JSONObject();
+        menuJson.put("type", menu.getType());
+        menuJson.put("name", menu.getMenuName());
+        if(menu.getType().equals("view")){
+            menuJson.put("url", menu.getUrl());
+        }else if(menu.getType().equals("click")){
+            menuJson.put("key", menu.getClickKey());
+        }else if(menu.getType().equals("miniprogram")){
+            menuJson.put("url", menu.getUrl());
+            menuJson.put("key", menu.getClickKey());
+            menuJson.put("appid", menu.getAppid());
+            menuJson.put("pagepath", menu.getPagePath());
+        }
+        return menuJson;
+    }
+
+
+}

+ 189 - 0
sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxMessageEvenServiceImpl.java

@@ -0,0 +1,189 @@
+package com.miaxis.wx.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.miaxis.common.utils.http.HttpUtils;
+import com.miaxis.feign.dto.WxGzhMini;
+import com.miaxis.feign.dto.WxMessageCusom;
+import com.miaxis.feign.dto.WxMessageTemplate;
+import com.miaxis.feign.dto.WxQrTicket;
+import com.miaxis.feign.service.IWxSendService;
+import com.miaxis.wx.domain.WxForeverCode;
+import com.miaxis.wx.service.IWxMessageEvenService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.awt.*;
+import java.io.File;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/27 14:35
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class WxMessageEvenServiceImpl implements IWxMessageEvenService {
+
+    private final static Integer expireTime = 2592000;//30天
+
+    private final RedisTemplate redisTemplate;
+
+    private final IWxSendService wxSendService;
+
+
+
+
+
+
+
+
+    /**
+     * 扫码关注事件
+     * @param fromUserName 发送方帐号(一个OpenID)
+     * @param eventKey
+     * @param token 凭证
+     * @param userName 微信名称
+     * @return
+     */
+    @Override
+    public String scanSubscribeEvent(String fromUserName, String eventKey,String token,String userName) {
+
+        String message = "";
+        //如果扫自己
+        if (fromUserName.equals(eventKey)){
+            //推送绑定模板信息到上级
+            return "不能成为自己的下级!";
+        }
+        //判断是否存在父、子级推广关系
+        String openid = eventKey;
+        if (true) {
+            //保存推广关系表
+
+
+            //推送绑定模板信息到上级
+            messageTemplateSend(openid, token, userName);
+            message = "欢迎关注金牌车教,您的学车好伙伴!";
+        }
+        else {
+            message =  "已存在上级绑定关系!";
+        }
+        return message;
+    }
+
+
+    /**
+     * click获取推广二维码事件
+     * @param fromUserName 发送方帐号(一个OpenID)
+     * @param token 凭证
+     * @param wxForeverCode
+     * @return
+     */
+    @Override
+    public String gainTicketEvent(String fromUserName, String token, boolean isForever, WxForeverCode wxForeverCode) {
+
+        //发送客服信息
+        messageCustomSend(fromUserName,token);
+
+
+        return null;
+    }
+
+    private WxQrTicket createForeverTicket(String fromUserName) {
+        WxQrTicket wxQrTicket = new WxQrTicket();
+        wxQrTicket.setAction_name("QR_LIMIT_STR_SCENE");//临时字符串参数
+        JSONObject jsonObject1 = new JSONObject();
+        JSONObject jsonObject2 = new JSONObject();
+        jsonObject1.put("scene_str",fromUserName);
+        jsonObject2.put("scene",jsonObject1);
+        wxQrTicket.setAction_info(jsonObject2);
+        return wxQrTicket;
+    }
+
+    private WxQrTicket createShortTimeTicket(String fromUserName) {
+        WxQrTicket wxQrTicket = new WxQrTicket();
+        wxQrTicket.setExpire_seconds(expireTime);
+        wxQrTicket.setAction_name("QR_STR_SCENE");//临时字符串参数
+        JSONObject jsonObject1 = new JSONObject();
+        JSONObject jsonObject2 = new JSONObject();
+        jsonObject1.put("scene_str",fromUserName);
+        jsonObject2.put("scene",jsonObject1);
+        wxQrTicket.setAction_info(jsonObject2);
+        return wxQrTicket;
+    }
+
+
+    /**
+     * 发送客服消息
+     * @param fromUserName
+     * @param token
+     */
+    private void messageCustomSend(String fromUserName,String token){
+
+        WxMessageCusom wxMessageCusom = new WxMessageCusom();
+        wxMessageCusom.setTouser(fromUserName);
+        wxMessageCusom.setMsgtype("text");
+        HashMap<String, Object> contentMap = new HashMap<>();
+        contentMap.put("content","正在努力生成推广码请稍等...");
+        wxMessageCusom.setText(contentMap);
+        String send = wxSendService.messageCustomSend(token, wxMessageCusom);
+        JSONObject jsonObject = JSONObject.parseObject(send);
+        log.info("回复客服消息:[{}],响应信息:[{}]",contentMap,jsonObject);
+    }
+
+    /**
+     * 发送模板信息
+     * @param openid
+     * @param token
+     * @param nickName
+     */
+    private void messageTemplateSend(String openid,String token,String nickName){
+
+        WxMessageTemplate messageTemplate = new WxMessageTemplate();
+        messageTemplate.setTouser(openid);
+        messageTemplate.setTemplate_id("P4nKRB6L3dmhBjEj1VeE0gr9yC11Z0uBTAuu-XKmIjs");
+        messageTemplate.setUrl("https://jpcj-h5.zzxcx.net/myIntegral");
+        WxGzhMini wxGzhMini = new WxGzhMini();
+        messageTemplate.setMiniprogram(wxGzhMini);
+
+        JSONObject jsonObject = new JSONObject();
+        JSONObject first = new JSONObject();
+        JSONObject keyword1 = new JSONObject();
+        JSONObject keyword2 = new JSONObject();
+        JSONObject keyword3 = new JSONObject();
+        first.put("value","您好,已成功绑定您的账号!");
+        first.put("color","#173177");
+        keyword1.put("value",nickName);
+        keyword1.put("color","#173177");
+        keyword2.put("value", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
+        keyword2.put("color","#173177");
+        keyword3.put("value","有新用户已成为你的下级!");
+        keyword3.put("color","#173177");
+        jsonObject.put("first",first);
+        jsonObject.put("keyword1",keyword1);
+        jsonObject.put("keyword2",keyword2);
+        jsonObject.put("keyword3",keyword3);
+        messageTemplate.setData(jsonObject);
+        String result = wxSendService.messageTemplateSend(token,messageTemplate);
+        JSONObject parseObject = JSONObject.parseObject(result);
+        log.info("模板消息:[{}],响应信息:[{}]",messageTemplate,parseObject);
+
+    }
+
+
+
+
+}

+ 71 - 0
sdjk-service/src/main/java/com/miaxis/wx/vo/WxMenuVo.java

@@ -0,0 +1,71 @@
+package com.miaxis.wx.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 微信公众号菜单返回参 WxMenuVo
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/26 10:06
+ */
+@Data
+@ApiModel(value = "WxMenuVo", description = "微信公众号菜单对象 WxMenuVo")
+public class WxMenuVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("parent_id")
+    @ApiModelProperty(value = "父节点")
+    private Integer parentId;
+
+    @TableField("type")
+    @ApiModelProperty(value = "菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型")
+    private String type;
+
+    @TableField("menu_name")
+    @ApiModelProperty(value = "菜单标题")
+    private String menuName;
+
+    @TableField("click_key")
+    @ApiModelProperty(value = "click等点击类型必须,菜单KEY值,用于消息接口推送,不超过128字节")
+    private String clickKey;
+
+    @TableField("url")
+    @ApiModelProperty(value = "view、miniprogram类型必须,网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。")
+    private String url;
+
+    @TableField("media_id")
+    @ApiModelProperty(value = "media_id类型和view_limited类型必须,调用新增永久素材接口返回的合法media_id")
+    private String mediaId;
+
+    @TableField("appid")
+    @ApiModelProperty(value = "miniprogram类型必须,小程序的appid(仅认证公众号可配置)")
+    private String appid;
+
+    @TableField("page_path")
+    @ApiModelProperty(value = "miniprogram类型必须,小程序的页面路径")
+    private String pagePath;
+
+    @TableField("article_id")
+    @ApiModelProperty(value = "发布后获得的合法 article_id")
+    private String articleId;
+
+    @TableField("sort")
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "子节点分类")
+    private List<WxMenuVo> children;
+
+}

+ 74 - 0
sdjk-service/src/main/java/com/miaxis/wx/vo/WxSchoolOrder.java

@@ -0,0 +1,74 @@
+package com.miaxis.wx.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.miaxis.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @author miaxis
+ * @date 2021-05-07
+ */
+@Data
+@TableName("wx_order")
+@ApiModel(value = "WxOrder", description = "微信订单对象 wx_order")
+public class WxSchoolOrder  {
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    /** app头像地址 */
+    @TableField("head_image")
+    @ApiModelProperty(value = "app头像地址")
+    private String headImage;
+
+    /** app昵称 */
+    @TableField("nick_name")
+    @ApiModelProperty(value = "app昵称")
+    private String nickName;
+
+
+    /** 商户订单号 */
+    @Excel(name = "商户订单号")
+    @TableField("out_trade_no")
+    @ApiModelProperty(value = "商户订单号")
+    private String outTradeNo;
+
+
+
+    /** 支付完成时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "支付完成时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("success_time")
+    @ApiModelProperty(value = "支付完成时间")
+    private Date successTime;
+
+
+    /** 订单总金额,单位为分。 */
+    @Excel(name = "订单总金额,单位为分。")
+    @TableField("total")
+    @ApiModelProperty(value = "订单总金额,单位为分。")
+    private Integer total;
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 31 - 0
sdjk-service/src/main/resources/mapper/wx/WxExtractBankMapper.xml

@@ -0,0 +1,31 @@
+<?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.miaxis.wx.mapper.WxExtractBankMapper">
+
+    <resultMap type="WxExtractBank" id="WxExtractBankResult">
+        <result property="id"    column="id"    />
+        <result property="openid"    column="openid"    />
+        <result property="encTrueName"    column="enc_true_name"    />
+        <result property="bankCode"    column="bank_code"    />
+        <result property="encBankNo"    column="enc_bank_no"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectWxExtractBankVo">
+        select * from wx_extract_bank
+    </sql>
+
+    <select id="selectWxExtractBankList" parameterType="WxExtractBank" resultMap="WxExtractBankResult">
+        <include refid="selectWxExtractBankVo"/>
+        <where>
+            <if test="openid != null  and openid != ''"> and openid = #{openid}</if>
+            <if test="encTrueName != null  and encTrueName != ''"> and enc_true_name like concat('%', #{encTrueName}, '%')</if>
+            <if test="bankCode != null "> and bank_code = #{bankCode}</if>
+            <if test="encBankNo != null  and encBankNo != ''"> and enc_bank_no = #{encBankNo}</if>
+        </where>
+    </select>
+
+</mapper>

+ 30 - 0
sdjk-service/src/main/resources/mapper/wx/WxExtractMapper.xml

@@ -0,0 +1,30 @@
+<?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.miaxis.wx.mapper.WxExtractMapper">
+
+    <resultMap type="WxExtract" id="WxExtractResult">
+        <result property="id"    column="id"    />
+        <result property="openid"    column="openid"    />
+        <result property="extractPrice"    column="extract_price"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="status"    column="status"    />
+    </resultMap>
+
+    <sql id="selectWxExtractVo">
+        select * from wx_extract
+    </sql>
+
+    <select id="selectWxExtractList" parameterType="WxExtract" resultMap="WxExtractResult">
+        <include refid="selectWxExtractVo"/>
+        <where>
+            <if test="openid != null  and openid != ''"> and openid = #{openid}</if>
+            <if test="extractPrice != null "> and extract_price = #{extractPrice}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+
+</mapper>

+ 32 - 0
sdjk-service/src/main/resources/mapper/wx/WxMenuMapper.xml

@@ -0,0 +1,32 @@
+<?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.miaxis.wx.mapper.WxMenuMapper">
+
+    <resultMap type="WxMenu" id="WxMenuResult">
+        <result property="id"    column="id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="type"    column="type"    />
+        <result property="menuName"    column="menu_name"    />
+        <result property="clickKey"    column="click_key"    />
+        <result property="url"    column="url"    />
+        <result property="mediaId"    column="media_id"    />
+        <result property="appid"    column="appid"    />
+        <result property="pagePath"    column="page_path"    />
+        <result property="articleId"    column="article_id"    />
+        <result property="sort"    column="sort"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectWxMenuVo">
+        select * from wx_menu
+    </sql>
+
+    <select id="selectWxMenuList" resultType="com.miaxis.wx.vo.WxMenuVo">
+        <include refid="selectWxMenuVo"/>
+        ORDER BY sort
+    </select>
+
+</mapper>