xiaoyong931011
2022-07-28 363c0f2d5ac2cec13e28bcba4f46f272dff448dc
20220727  保存代码
4 files added
9 files modified
744 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java 15 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallTeamLeader.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallTeamLeaderService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallTeamLeaderServiceImpl.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallTeamLeaderServiceImpl.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/HttpRequest.java 196 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/HttpResponse.java 58 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/HttpsRequest.java 186 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/HttpsRequest2.java 213 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java 24 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallTeamLeaderMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/leader/leaderList.html 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java
@@ -12,12 +12,10 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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 org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
@@ -57,4 +55,13 @@
        return iAdminMallTeamLeaderService.selectList(mallTeamLeader);
    }
    /**
     * 团长信息--取消团长
     */
    @GetMapping("leaderCancel/{id}")
    @ControllerEndpoint(operation = "团长信息--取消团长", exceptionMessage = "取消团长失败")
    public FebsResponse leaderCancel(@NotNull(message = "{required}") @PathVariable Long id) {
        return iAdminMallTeamLeaderService.leaderCancel(id);
    }
}
src/main/java/cc/mrbird/febs/mall/entity/MallTeamLeader.java
@@ -15,11 +15,12 @@
    //用户ID
    private Long memberId;
    //申请状态 1:审核通过 2:审核不通过 3:申请中
    //申请状态 1:审核通过 2:审核不通过 3:申请中 4:已取消
    private Integer state;
    public static final Integer STATE_YES = 1;
    public static final Integer STATE_NO = 2;
    public static final Integer STATE_ING = 3;
    public static final Integer STATE_CANCEL = 4;
    //团长姓名
    private String name;
    //手机号码
src/main/java/cc/mrbird/febs/mall/service/IAdminMallTeamLeaderService.java
@@ -20,4 +20,6 @@
    FebsResponse leaderUpdate(AdminLeaderUpdateDto adminLeaderUpdateDto);
    List<AdminSelectListLeaderVo> selectList(MallTeamLeader mallTeamLeader);
    FebsResponse leaderCancel(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallTeamLeaderServiceImpl.java
@@ -12,6 +12,7 @@
import cc.mrbird.febs.mall.vo.AdminMallTeamLeaderVo;
import cc.mrbird.febs.mall.vo.AdminSelectListLeaderVo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -76,4 +77,20 @@
        }
        return list;
    }
    @Override
    public FebsResponse leaderCancel(Long id) {
        MallTeamLeader mallTeamLeader = this.baseMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallTeamLeader)){
            return new FebsResponse().fail().message("团长信息不存在");
        }
        Integer state = mallTeamLeader.getState();
        if(MallTeamLeader.STATE_YES != state){
            return new FebsResponse().fail().message("团长的状态不是审核通过");
        }
        mallTeamLeader.setState(MallTeamLeader.STATE_CANCEL);
        this.baseMapper.updateById(mallTeamLeader);
        return new FebsResponse().success().message("已取消");
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallTeamLeaderServiceImpl.java
@@ -45,6 +45,10 @@
        if(CollUtil.isNotEmpty(mallTeamLeaders)){
            return new FebsResponse().fail().message("正在申请中");
        }
        List<MallTeamLeader> mallTeamLeaderCancel = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_CANCEL);
        if(CollUtil.isNotEmpty(mallTeamLeaderCancel)){
            return new FebsResponse().fail().message("当前用户无法申请");
        }
        MallTeamLeader mallTeamLeader = MallTeamLeaderConversion.INSTANCE.dtoToEntity(apiApplayLeaderDto);
        mallTeamLeader.setMemberId(memberId);
        mallTeamLeader.setState(MallTeamLeader.STATE_ING);
@@ -68,10 +72,13 @@
        List<MallTeamLeader> mallTeamLeadersIng = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_ING);
        List<MallTeamLeader> mallTeamLeadersNo = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_NO);
        List<MallTeamLeader> mallTeamLeadersYes = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_YES);
        List<MallTeamLeader> mallTeamLeadersCancel = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_CANCEL);
        if(CollUtil.isNotEmpty(mallTeamLeadersIng) ||CollUtil.isNotEmpty(mallTeamLeadersYes)){
            apiMallleaderStateVo.setState(2);
        }else if(CollUtil.isNotEmpty(mallTeamLeadersNo)){
            apiMallleaderStateVo.setState(1);
        }else if(CollUtil.isNotEmpty(mallTeamLeadersCancel)){
            apiMallleaderStateVo.setState(2);
        }else{
            apiMallleaderStateVo.setState(1);
        }
@@ -82,6 +89,7 @@
    public FebsResponse getApiLeaderInfoVoById(Long id) {
        MallTeamLeader mallTeamLeader = this.baseMapper.selectById(id);
        ApiLeaderInfoVo apiLeaderInfoVo = new ApiLeaderInfoVo();
        apiLeaderInfoVo.setId(mallTeamLeader.getId());
        apiLeaderInfoVo.setName(mallTeamLeader.getName());
        apiLeaderInfoVo.setPhone(mallTeamLeader.getPhone());
        apiLeaderInfoVo.setAddressPic(mallTeamLeader.getAddressPic());
src/main/java/cc/mrbird/febs/pay/util/HttpRequest.java
New file
@@ -0,0 +1,196 @@
package cc.mrbird.febs.pay.util;
import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
public class HttpRequest {
    public static final String SEND_POST = "POST";
    public static final String SEND_GET = "GET";
    private HttpRequest() {
    }
    public static HttpRequest createHttpRequest() {
        return new HttpRequest();
    }
    public HttpResponse sendHttpGet(String urlString, Map<String, String> params) throws IOException {
        if (params != null) {
            StringBuffer param = new StringBuffer();
            int i = 0;
            for (String key : params.keySet()) {
                if (i == 0)
                    param.append("?");
                else
                    param.append("&");
                param.append(key).append("=").append((String) params.get(key));
                i++;
            }
            urlString = urlString + param;
        }
        URL url = new URL(urlString);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        HttpResponse response = new HttpResponse();
        response.setInputStream(urlConnection.getInputStream());
        response.setContentType(urlConnection.getContentType());
        response.setContentLength(urlConnection.getContentLength());
        response.setFileName(urlConnection.getRequestProperty("filename"));
        return response;
    }
    public HttpResponse sendHttpPost(String urlString, Map<String, String> params, String filePath, String contentType)
            throws IOException {
        if (params != null) {
            StringBuffer param = new StringBuffer();
            int i = 0;
            for (String key : params.keySet()) {
                if (i == 0)
                    param.append("?");
                else
                    param.append("&");
                param.append(key).append("=").append((String) params.get(key));
                i++;
            }
            urlString = urlString + param;
        }
        URL url = new URL(urlString);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("POST");
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        File file = new File(filePath);
        urlConnection.setRequestProperty("Connection", "Keep-Alive");
        urlConnection.setRequestProperty("Charset", "UTF-8");
        String BOUNDARY = "----------" + System.currentTimeMillis();
        urlConnection.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=\"file\";filename=\"" + file.getName() + "\"\r\n");
        sb.append("Content-Type:application/octet-stream\r\n\r\n");
        byte[] head = sb.toString().getBytes("utf-8");
        OutputStream out1 = new DataOutputStream(urlConnection.getOutputStream());
        out1.write(head);
        DataInputStream in1 = new DataInputStream(new FileInputStream(file));
        int bytes = 0;
        byte[] bufferOut = new byte[1024];
        while ((bytes = in1.read(bufferOut)) != -1) {
            out1.write(bufferOut, 0, bytes);
        }
        in1.close();
        byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");
        out1.write(foot);
        out1.flush();
        out1.close();
        FileInputStream in = new FileInputStream(file);
        OutputStream out = urlConnection.getOutputStream();
        byte[] buf = new byte[1024];
        int hasRead = 0;
        while ((hasRead = in.read(buf)) > 0) {
            out.write(buf, 0, hasRead);
        }
        in.close();
        out.flush();
        out.close();
        HttpResponse response = new HttpResponse();
        response.setInputStream(urlConnection.getInputStream());
        return response;
    }
    public HttpResponse sendHttpsGet(String urlString, Map<String, String> params) throws IOException {
        if (params != null) {
            StringBuffer param = new StringBuffer();
            int i = 0;
            for (String key : params.keySet()) {
                if (i == 0)
                    param.append("?");
                else
                    param.append("&");
                param.append(key).append("=").append((String) params.get(key));
                i++;
            }
            urlString = urlString + param;
        }
        URL url = new URL(urlString);
        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        HttpResponse response = new HttpResponse();
        response.setInputStream(urlConnection.getInputStream());
        response.setContentType(urlConnection.getContentType());
        response.setContentLength(urlConnection.getContentLength());
        return response;
    }
    public HttpResponse sendHttpsPost(String urlString, Map<String, String> params, String sendData)
            throws IOException {
        if (params != null) {
            StringBuffer param = new StringBuffer();
            int i = 0;
            for (String key : params.keySet()) {
                if (i == 0)
                    param.append("?");
                else
                    param.append("&");
                param.append(key).append("=").append((String) params.get(key));
                i++;
            }
            urlString = urlString + param;
        }
        URL url = new URL(urlString);
        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setRequestMethod("POST");
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        if (sendData != null) {
            urlConnection.getOutputStream().write(sendData.getBytes("utf-8"));
            urlConnection.getOutputStream().flush();
            urlConnection.getOutputStream().close();
        }
        HttpResponse response = new HttpResponse();
        response.setInputStream(urlConnection.getInputStream());
        response.setContentType(urlConnection.getContentType());
        response.setContentLength(urlConnection.getContentLength());
        return response;
    }
}
src/main/java/cc/mrbird/febs/pay/util/HttpResponse.java
New file
@@ -0,0 +1,58 @@
package cc.mrbird.febs.pay.util;
import java.io.InputStream;
import java.io.InputStreamReader;
public class HttpResponse {
    private InputStream inputStream;
    private String fileName;
    private String contentType;
    private int contentLength;
    public String getFileName() {
        return this.fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public InputStream getInputStream() {
        return this.inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    public String getContentType() {
        return this.contentType;
    }
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    public int getContentLength() {
        return this.contentLength;
    }
    public void setContentLength(int contentLength) {
        this.contentLength = contentLength;
    }
    public String getDataString() {
        StringBuilder sb = new StringBuilder();
        try {
            InputStreamReader isr = new InputStreamReader(getInputStream(), "utf-8");
            char[] cbuf = new char[1024];
            int hasRead = 0;
            while ((hasRead = isr.read(cbuf)) > 0) {
                sb.append(cbuf, 0, hasRead);
            }
            isr.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
}
src/main/java/cc/mrbird/febs/pay/util/HttpsRequest.java
New file
@@ -0,0 +1,186 @@
package cc.mrbird.febs.pay.util;
import cc.mrbird.febs.pay.service.IServiceRequest;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ConnectionPoolTimeoutException;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
/**
 * User: rizenguo
 * Date: 2014/10/29
 * Time: 14:36
 */
public class HttpsRequest implements IServiceRequest {
    public interface ResultListener {
        public void onConnectionPoolTimeoutError();
    }
    //表示请求器是否已经做了初始化工作
    private boolean hasInit = false;
    //连接超时时间,默认10秒
    private int socketTimeout = 10000;
    //传输超时时间,默认30秒
    private int connectTimeout = 30000;
    //请求器的配置
    private RequestConfig requestConfig;
    //HTTP请求器
    private CloseableHttpClient httpClient;
    public HttpsRequest() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException {
        init();
    }
    private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
   /*    KeyStore keyStore = KeyStore.getInstance("PKCS12");
        FileInputStream instream = new FileInputStream(new File(Configure.getCertLocalPath()));//加载本地的证书进行https加密传输
        try {
            keyStore.load(instream, Configure.getCertPassword().toCharArray());//设置证书密码
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } finally {
            instream.close();
        }
        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, Configure.getCertPassword().toCharArray())
                .build();
        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[]{"TLSv1"},
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
*/
         httpClient = HttpClients.custom().build();
        //根据默认超时限制初始化requestConfig
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
        hasInit = true;
    }
    /**
     * 通过Https往API post xml数据
     *
     * @param url    API地址
     * @param xmlObj 要提交的XML数据对象
     * @return API回包的实际数据
     * @throws IOException
     * @throws KeyStoreException
     * @throws UnrecoverableKeyException
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    public String sendPost(String url, Object xmlObj) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
        if (!hasInit) {
            init();
        }
        String result = null;
        HttpPost httpPost = new HttpPost(url);
        //解决XStream对出现双下划线的bug
        XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
        //将要提交给API的数据对象转换成XML格式数据Post给API
        String postDataXML = xStreamForRequestPostData.toXML(xmlObj);
        //得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
        StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
        httpPost.addHeader("Content-Type", "text/xml");
        httpPost.setEntity(postEntity);
        //设置请求器的配置
        httpPost.setConfig(requestConfig);
        try {
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            result = EntityUtils.toString(entity, "UTF-8");
        } catch (ConnectionPoolTimeoutException e) {
//            log.e("http get throw ConnectionPoolTimeoutException(wait time out)");
        } catch (ConnectTimeoutException e) {
//            log.e("http get throw ConnectTimeoutException");
        } catch (SocketTimeoutException e) {
//            log.e("http get throw SocketTimeoutException");
        } catch (Exception e) {
            e.printStackTrace();
//            log.e("http get throw Exception");
        } finally {
            httpPost.abort();
        }
        return result;
    }
    /**
     * 设置连接超时时间
     *
     * @param socketTimeout 连接时长,默认10秒
     */
    public void setSocketTimeout(int socketTimeout) {
        this.socketTimeout = socketTimeout;
        resetRequestConfig();
    }
    /**
     * 设置传输超时时间
     *
     * @param connectTimeout 传输时长,默认30秒
     */
    public void setConnectTimeout(int connectTimeout) {
        this.connectTimeout = connectTimeout;
        resetRequestConfig();
    }
    private void resetRequestConfig(){
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
    }
    /**
     * 允许商户自己做更高级更复杂的请求器配置
     *
     * @param requestConfig 设置HttpsRequest的请求器配置
     */
    public void setRequestConfig(RequestConfig requestConfig) {
        this.requestConfig = requestConfig;
    }
}
src/main/java/cc/mrbird/febs/pay/util/HttpsRequest2.java
New file
@@ -0,0 +1,213 @@
package cc.mrbird.febs.pay.util;
import cc.mrbird.febs.pay.service.IServiceRequest;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ConnectionPoolTimeoutException;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.security.*;
import java.security.cert.CertificateException;
/**
 * User: rizenguo
 * Date: 2014/10/29
 * Time: 14:36
 */
public class HttpsRequest2 implements IServiceRequest {
    public interface ResultListener {
        public void onConnectionPoolTimeoutError();
    }
    //表示请求器是否已经做了初始化工作
    private boolean hasInit = false;
    //连接超时时间,默认10秒
    private int socketTimeout = 10000;
    //传输超时时间,默认30秒
    private int connectTimeout = 30000;
    //请求器的配置
    private RequestConfig requestConfig;
    //HTTP请求器
    private CloseableHttpClient httpClient;
    //证书地址
    private String  certLocalPath;
    //商户号
    private String mchId;
    public HttpsRequest2() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException {
    }
    private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        FileInputStream instream = new FileInputStream(new File(certLocalPath));//加载本地的证书进行https加密传输
        try {
            keyStore.load(instream, mchId.toCharArray());//设置证书密码
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } finally {
            instream.close();
        }
        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, mchId.toCharArray())
                .build();
        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[]{"TLSv1"},
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        httpClient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .build();
        // httpClient = HttpClients.custom().build();
        //根据默认超时限制初始化requestConfig
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
        hasInit = true;
    }
    /**
     * 通过Https往API post xml数据
     *
     * @param url    API地址
     * @param xmlObj 要提交的XML数据对象
     * @return API回包的实际数据
     * @throws IOException
     * @throws KeyStoreException
     * @throws UnrecoverableKeyException
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    public String sendPost(String url, Object xmlObj) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
        if (!hasInit) {
            init();
        }
        String result = null;
        HttpPost httpPost = new HttpPost(url);
        //解决XStream对出现双下划线的bug
        XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
        //将要提交给API的数据对象转换成XML格式数据Post给API
        String postDataXML = xStreamForRequestPostData.toXML(xmlObj);
        //得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
        StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
        httpPost.addHeader("Content-Type", "text/xml");
        httpPost.setEntity(postEntity);
        //设置请求器的配置
        httpPost.setConfig(requestConfig);
        try {
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            result = EntityUtils.toString(entity, "UTF-8");
        } catch (ConnectionPoolTimeoutException e) {
//            log.e("http get throw ConnectionPoolTimeoutException(wait time out)");
        } catch (ConnectTimeoutException e) {
//            log.e("http get throw ConnectTimeoutException");
        } catch (SocketTimeoutException e) {
//            log.e("http get throw SocketTimeoutException");
        } catch (Exception e) {
            e.printStackTrace();
//            log.e("http get throw Exception");
        } finally {
            httpPost.abort();
        }
        return result;
    }
    /**
     * 设置连接超时时间
     *
     * @param socketTimeout 连接时长,默认10秒
     */
    public void setSocketTimeout(int socketTimeout) {
        this.socketTimeout = socketTimeout;
        resetRequestConfig();
    }
    /**
     * 设置传输超时时间
     *
     * @param connectTimeout 传输时长,默认30秒
     */
    public void setConnectTimeout(int connectTimeout) {
        this.connectTimeout = connectTimeout;
        resetRequestConfig();
    }
    private void resetRequestConfig(){
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
    }
    /**
     * 允许商户自己做更高级更复杂的请求器配置
     *
     * @param requestConfig 设置HttpsRequest的请求器配置
     */
    public void setRequestConfig(RequestConfig requestConfig) {
        this.requestConfig = requestConfig;
    }
    public String getMchId() {
        return mchId;
    }
    public void setMchId(String mchId) {
        this.mchId = mchId;
    }
    public String getCertLocalPath() {
        return certLocalPath;
    }
    public void setCertLocalPath(String certLocalPath) {
        this.certLocalPath = certLocalPath;
    }
}
src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
@@ -7,18 +7,23 @@
    /**
     * 发送http请求类
     */
    public static String HttpsRequestClassName = "com.matrix.component.wechat.externalInterface.common.HttpsRequest";
    public static String HttpsRequestClassName = "cc.mrbird.febs.pay.util.HttpsRequest";
    public static final String TRADE_TYPE_JSAPI = "JSAPI";
    // 2)被扫支付查询API
    /**
     * 发送  SSL请求,企业付款,退款用
     */
    public static String HttpsRequestClassName2 = "cc.mrbird.febs.pay.util.HttpsRequest2";
    // 被扫支付查询API
    public static String PAY_QUERY_API = "https://api.mch.weixin.qq.com/pay/orderquery";
    /**
     * 微信商户号
     */
    public static final String WECHARPAY_MCHID = "1605533690";
    /**
     * 支付秘钥
     */
@@ -28,21 +33,18 @@
     * 小程序APPID
     */
    public static final String MINIPROGRAM_APPID = "wx5cc58f796224af61";
    // 8) 企业付款API
    // 企业付款API
    public static String COM_PAY_API="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
    /**
     * 发送  SSL请求,企业付款,退款用
     */
    public static String HttpsRequestClassName2 = "com.matrix.component.wechat.externalInterface.common.HttpsRequest2";
    // 3)退款API
    // 退款API
    public static String REFUND_API = "https://api.mch.weixin.qq.com/secapi/pay/refund";
    /**
     * 成功
     */
    public static final String CODE_SUCCESS = "SUCCESS";
    /**
     * SUCCESS报文
     */
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -33,7 +33,7 @@
                </if>
            </if>
        </where>
        order by m.CREATED_TIME desc
        GROUP BY m.id order by m.CREATED_TIME desc
    </select>
    <select id="getMallMemberInfoById" resultType="cc.mrbird.febs.mall.vo.MallMemberVo">
src/main/resources/mapper/modules/MallTeamLeaderMapper.xml
@@ -146,7 +146,7 @@
        select
            a.*
        from mall_team_leader a
        where a.unique_code = #{uniqueCode} limit 1
        where a.unique_code = #{uniqueCode} and a.state = 1 limit 1
    </select>
    <select id="selectLeaderByLonAndLat" resultType="cc.mrbird.febs.mall.entity.MallTeamLeader">
src/main/resources/templates/febs/views/modules/leader/leaderList.html
@@ -20,6 +20,7 @@
                                                <option value="1">通过</option>
                                                <option value="2">不通过</option>
                                                <option value="3">申请中</option>
                                                <option value="4">取消</option>
                                            </select>
                                        </div>
                                    </div>
@@ -97,6 +98,11 @@
                    }
                });
            }
            if (layEvent === 'leaderCancel') {
                febs.modal.confirm('取消', '确认取消该团长?', function () {
                    leaderCancel(data.id);
                });
            }
            if (layEvent === 'seeImgThumb') {
                var t = $view.find('#seeImgThumb'+data.id+'');
                //页面层
@@ -113,6 +119,13 @@
                });
            }
        });
        function leaderCancel(id) {
            febs.get(ctx + 'admin/leader/leaderCancel/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
@@ -148,6 +161,8 @@
                                return '<span style="color:red;">拒绝</span>'
                            }else if (d.state === 3) {
                                return '<span style="color:blue;">待审核</span>'
                            }else if (d.state === 4) {
                                return '<span style="color:blue;">已取消</span>'
                            }else{
                                return ''
                            }
@@ -157,6 +172,9 @@
                            if (d.state === 3) {
                                return ''
                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="leaderUpdate" shiro:hasPermission="user:update">审核</button>'
                            }else if(d.state === 1) {
                                return ''
                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="leaderCancel" shiro:hasPermission="user:update">取消</button>'
                            }else{
                                return '';
                            }