111
k94314517
2023-11-08 2bb847e3b8bdc2692d88ad9df0d4ad54a3ccd890
111
已修改6个文件
174 ■■■■■ 文件已修改
server/platform/src/main/java/com/doumee/task/ScheduleTool.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/AccountApi.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -1,16 +1,23 @@
package com.doumee.task;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.wx.WxPayProperties;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.GoodsorderService;
import com.doumee.service.business.MemberRidesService;
import com.doumee.service.business.SitesService;
import com.doumee.service.business.WxBillService;
import com.doumee.service.system.SystemDictDataService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.util.ThreadContext;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@@ -19,6 +26,7 @@
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * 定时任务
@@ -33,6 +41,9 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private SystemDictDataService systemDictDataService;
    @Autowired
    private WxBillService wxBillService;
@@ -91,4 +102,30 @@
        log.info("=====================结束 站点车辆满架率预警=======================");
    }
    @Autowired
    private WxPayProperties wxPayProperties;
    /**
     * 更新微信 ACCESS_TOKEN
     */
    @Scheduled(fixedDelay = 1000L * 60L * 90L)
    public void updAccessToken(){
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        ThreadContext.bind(manager);
        String appId = wxPayProperties.getAppId();
        String appSecret = wxPayProperties.getAppSecret();
        //生成微信token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret;
        String response = HttpsUtil.doGet(url,null);
        JSONObject json = JSONObject.parseObject(response);
        SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.ACCESS_TOKEN);
        if(!Objects.isNull(systemDictData)){
            systemDictData.setCode(json.getString("access_token"));
            systemDictData.setUpdateTime(new Date());
            systemDictDataService.updateById(systemDictData);
        }
    }
}
server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -47,6 +47,8 @@
        systemDictDataService.updateById(systemDictData);
    }
    @Override
    public SystemDictData queryByCode(String dicCode, String label){
        SystemDict queryDto = new SystemDict();
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -27,6 +27,7 @@
    public static final String DINGDING ="DINGDING" ;
    public static final String MINI_PROGRAMME ="MINI_PROGRAMME" ;
    public static final String FREE_RENT_TIME ="FREE_RENT_TIME" ;
    public static final String ACCESS_TOKEN ="ACCESS_TOKEN" ;
    public static final String IMG_DIR = "IMG_DIR";
    public static final String FILE_DIR ="FILE_DIR" ;
    public static final String PRIVATE_KEY = "PRIVATE_KEY";
server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -1,15 +1,25 @@
package com.doumee.core.utils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;
public class HttpsUtil {
@@ -80,6 +90,48 @@
        return null;
    }
    /**
     * 发送get请求
     * @param url 请求URL
     * @param param 请求参数 key:value url携带参数 或者无参可不填
     * @return
     */
    public static  String doGet(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();
            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);
            // 执行请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }
    public static void main(String[] args) {
        //局部信任所有证书和主机
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
@@ -1,5 +1,6 @@
package com.doumee.core.wx;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
@@ -7,22 +8,31 @@
import com.doumee.core.utils.ID;
import com.doumee.dao.business.RefundMapper;
import com.doumee.dao.business.TransactionsMapper;
import com.doumee.dao.business.model.Locks;
import com.doumee.dao.business.model.Refund;
import com.doumee.dao.business.model.Transactions;
import com.doumee.dao.business.web.request.RefundDTO;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.RefundService;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.*;
/**
 * 微信小程序-公共方法
@@ -36,6 +46,9 @@
    @Autowired
    private TransactionsMapper transactionsMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
@@ -111,4 +124,56 @@
        throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"退款发生异常请联系管理员");
    }
    /**
     * 生成小程序码
     * https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
     * @return
     */
    public void generateWXMiniCode(Locks locks){
        SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.ACCESS_TOKEN);
        if(Objects.isNull(systemDictData)){
            return;
        }
        //生成图片上传OSS
        Map<String,Object> body = new HashMap<>();
        // 场景码,与前端约定,最终是需要前端解析
        body.put("scene", locks.getSiteId() + "/" +locks.getCode() );
        // 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
        body.put("env_version", "release");
        // 透明,根据你的场景自行设置body参数
        body.put("is_hyaline", false);
//        body.put("page","pages/index/index");
        OkHttpClient client = new OkHttpClient().newBuilder().build();
        okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
        okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType, JSONObject.toJSONString(body));
        Request request = new Request.Builder().url("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+systemDictData.getCode()).method("POST", requestBody).build();
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                InputStream inputStream = new ByteArrayInputStream(response.body().bytes());
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = inputStream.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                locks.setInfo("data:mediatype;base64," + Base64.getEncoder().encodeToString(baos.toByteArray()));
//                FileOutputStream out = new FileOutputStream("d:\\test.png");
//                byte[] buffer = new byte[8192];
//                int bytesRead = 0;
//                while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
//                    out.write(buffer, 0, bytesRead);
//                }
//                out.flush();
//                inputStream.close();
//                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
server/web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -5,6 +5,8 @@
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.wx.WxMiniUtilService;
import com.doumee.dao.business.model.Locks;
import com.doumee.dao.business.web.request.RegisterRequest;
import com.doumee.dao.business.web.request.WxPhoneRequest;
import com.doumee.dao.business.web.response.AccountResponse;
@@ -34,6 +36,9 @@
    @Autowired
    private MemberService memberService;
    @Autowired
    private WxMiniUtilService wxMiniUtilService;
//    @ApiOperation(value = "用户注册", notes = "小程序端")
//    @PostMapping("/userRegister")
@@ -96,6 +101,16 @@
    @ApiOperation(value = "测试生成二维码", notes = "小程序端")
    @GetMapping("/generateWXMiniCode")
    public ApiResponse<Locks> generateWXMiniCode() {
        Locks locks = new Locks();
        locks.setCode(12);
        locks.setSiteId("1005");
        wxMiniUtilService.generateWXMiniCode(locks);
        return  ApiResponse.success("操作成功",locks);
    }
}