无关风月
2025-08-25 48d3f1b77adea0609bb2453c7b4a660f2222871f
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
@@ -1,25 +1,41 @@
package com.ruoyi.other.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.IntegralPay;
import com.ruoyi.other.api.domain.IntegralRecord;
import com.ruoyi.other.api.domain.ServicePay;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.query.IntegralListQuery;
import com.ruoyi.other.service.TIntegralPayService;
import com.ruoyi.other.service.TIntegralRecordService;
import com.ruoyi.other.service.TIntegralRuleService;
import com.ruoyi.other.service.TServicePayService;
import com.ruoyi.other.util.MyQrCodeUtil;
import com.ruoyi.other.util.ObsUploadUtil;
import com.ruoyi.other.util.QRCodeUtil;
import com.ruoyi.other.util.UUIDUtil;
import com.ruoyi.other.util.pay.CreateLinkStringByGet1;
import com.ruoyi.other.util.pay.HttpRequester;
import com.ruoyi.other.util.pay.HttpRespons;
import com.ruoyi.other.util.pay.Md5_Sign;
import com.ruoyi.other.util.payment.wx.WechatPayConfig;
import com.ruoyi.other.util.payment.wx.WechatPayService;
import com.ruoyi.other.vo.IntegralListVO;
import com.ruoyi.other.vo.IntegralVO;
import com.ruoyi.other.vo.PayDto;
import com.ruoyi.other.vo.WorkPlatformVO;
import com.ruoyi.system.api.domain.SysConfig;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysConfigClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.swagger.annotations.ApiOperation;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
@@ -32,17 +48,22 @@
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
import java.util.*;
/**
 * <p>
 *  前端控制器
 * 前端控制器
 * </p>
 *
 * @author 无关风月
@@ -58,15 +79,74 @@
    private TIntegralRecordService integralRecordService;
    @Autowired
    private TIntegralPayService integralPayService;
    @Autowired
    private SysConfigClient sysConfigClient;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TServicePayService servicePayService;
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private SiteClient siteClient;
    @Resource
    private WechatPayService wechatPayService;
    /**
     * 充电保存积分记录
     *
     * @return
     */
    @PostMapping("/saveIntegralRecord")
    public R saveIntegralRecord(@RequestBody IntegralRecord record) {
        integralRecordService.save(record);
        return R.ok();
    }
    @PostMapping("/workPlatform")
    @ApiOperation(tags = {"小程序工作台"}, value = "小程序工作台")
    public R<WorkPlatformVO> workPlatform() {
        Long userid = tokenService.getLoginUser().getUserid();
        R<SysUser> data = sysUserClient.getSysUser(userid);
        SysUser user = data.getData();
        List<Site> sites = siteClient.getSiteAll().getData();
        Site site = sites.stream().filter(e -> e.getId().equals(user.getSiteId())).findFirst().orElse(null);
        if (site==null){
            return R.fail("当前登录用户未绑定站点");
        }
        WorkPlatformVO workPlatformVO = new WorkPlatformVO();
        workPlatformVO.setSiteName(site.getName());
        workPlatformVO.setHeaderName(user.getNickName());
        ServicePay one = servicePayService.lambdaQuery().eq(ServicePay::getPayStatus, 2)
                .eq(ServicePay::getUserId, userid).orderByDesc(ServicePay::getCreateTime)
                .last("limit 1").one();
        ServicePay servicePayBefore = servicePayService.lambdaQuery()
                .eq(ServicePay::getUserId, userid)
                .eq(ServicePay::getPayStatus,2)
                .eq(ServicePay::getDelFlag,0)
                .orderByDesc(ServicePay::getCreateTime)
                .last("limit 1")
                .one();
        if (servicePayBefore==null){
            workPlatformVO.setServiceStatus(1);
        } else if (servicePayBefore.getEndTime().isBefore(LocalDateTime.now())) {
            workPlatformVO.setServiceStatus(2);
            workPlatformVO.setEndTime(servicePayBefore.getEndTime());
        }else{
            workPlatformVO.setServiceStatus(3);
            workPlatformVO.setEndTime(servicePayBefore.getEndTime());
        }
        return R.ok(workPlatformVO);
    }
    @PostMapping("/integralPageList")
    @ApiOperation(tags = {"2.0-积分钱包"},value = "积分钱包")
    @ApiOperation(tags = {"2.0-积分钱包"}, value = "积分钱包")
    public R<IntegralVO> integralPageList(@RequestBody IntegralListQuery query) {
        Long userid = tokenService.getLoginUser().getUserid();
        R<SysUser> sysUser = sysUserClient.getSysUser(userid);
@@ -78,54 +158,355 @@
        integralVO.setIntegral(integral);
        return R.ok(integralVO);
    }
    @PostMapping("/queryPayStatus")
    @ApiOperation(tags = {"2.0-积分钱包"},value = "查询支付结果 true成功 false失败")
    public R<Boolean> integralPageList(@RequestParam("code") String code) throws Exception {
        Map<String, String> resMap = wechatPayService.queryOrder(code);
        if("SUCCESS".equals(resMap.get("return_code"))){
    @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取积分充值比例")
    @PostMapping(value = "/getPointPercent")
    public R getPointPercent() {
        SysConfig data1 = sysConfigClient.getInfo(8L).getData();
        return R.ok(data1.getConfigValue());
    }
    @ApiOperation(tags = {"2.0-积分钱包"}, value = "查询支付结果 true成功 false失败")
    @PostMapping(value = "/queryPayStatus")
    public R buy(@RequestParam Integer id) {
        IntegralPay integralPay = integralPayService.getById(id);
        if (integralPay.getPayStatus() == 2) {
            return R.ok(true);
        }else{
        } else {
            return R.ok(false);
        }
    }
    @PostMapping("/nativePay")
    @ApiOperation(tags = {"2.0-积分钱包"},value = "获取支付二维码")
    @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取支付二维码")
    public R nativePay(@RequestParam("amount") String amount) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        Map<String, String> res =  wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback");
        BigDecimal bigDecimal = new BigDecimal(amount);
        BigDecimal money = bigDecimal.setScale(2, RoundingMode.HALF_UP);
        Long userid = tokenService.getLoginUser().getUserid();
        R<SysUser> sysUser = sysUserClient.getSysUser(userid);
        SysUser data = sysUser.getData();
        // 生成待支付记录
        List<Site> sites = siteClient.getSiteAll().getData();
        Site site = sites.stream().filter(e -> e.getId().equals(data.getSiteId())).findFirst().orElse(null);
        if (site==null){
            return R.fail("当前登录用户未绑定站点");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        ServicePay servicePay = new ServicePay();
        servicePay.setUserId(data.getUserId());
        servicePay.setAmount(site.getAnnualServiceFee());
        servicePay.setCode(code);
        servicePay.setPayStatus(1);
        servicePay.setPayType(1);
        servicePay.setDelFlag(0);
        servicePay.setCreateTime(LocalDateTime.now());
        servicePayService.save(servicePay);
//        return wechatPayService.unifiedOrderApplet(servicePay.getId()+"",code, site.getAnnualServiceFee()+"", "服务费缴纳",data.getOpenId(), "/other/wx/serviceCallback");
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd");
        String key = "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDAna1TkFL4MRjBiPpGqBbvRy8ojVglU306o01wibafNiE7pvAVjn9aUShSzCA9OkvMld35XLpO4o8ZhetFK5W9mlVGgCVyOSCcApEyadBH8zfRGpL96vQDynhY7QP0Ffgrua5jKXvbIxcqwGO0kdHqQULJFjDoqwknTy+LUWX/IhuViY4hzS79RoQhCmvTM8BaPUY3cGLA7XbRHMgYkkoRrRzfIio2rwEtq+2s2sajPsdM/g0D4ilCOFYUO36+H26uzBWlwBprjEkoPujcdAo93Y3JxkC7ZcVP3ytyFVQTUwNbmeLdK8XPet95ngbmRQyAgN//QItLvIukAJjJp8zNAgMBAAECggEBAJ3QkvKkjVZM47uuP2Ek16W07S6MoGv0u+YPZqOOMdLAxvnZDVycJDwbwq4UEVYZLYGySOzGzN9VQWnoD5vc2hM/IB9jX0r3A4DPmad0ivJolJL+8vCYUNXKTlCN4W9bkLpCqF8W3iPt3E1q1EZeM197mPyo8emwOQ+8EXhUeP1PyJDHGu6EXMApaobGFZy00ggke8h0P7/OZbrf0o9G0u004fH9bfHHREwsa31LsYkQrGBOXXWSO6KGc0wcjK3gIV06DyA9uQNAi8Afd7ga3M/QzTNdg0G5GwVBBIlcg8NA5FFJO6fxmS9kPhWeij7C20iHJfqqc4CEC4ig2w4IgQECgYEA5+tYwnuiFyaiZsdlrSkb7z7NiYPBjtDRz0ZgfT51LMzO3UvegpwpuxZgJFIpL4k5EFfHrkLztUCDzsPdaDFnPKqVzRgBNSFbZ4iTAht9CgX/RSHuBHwiRBZRoWWlL3bKUAIXXHtwpx12nweh+iRE8feGd7VJwrMY3QOqAqtN3YMCgYEA1J2bE2cp0aNZxAYc1CmV6nJxPniQlNV+pCQv3usUaGMJzxqXG1N6ViuB1VxC6WLvy8cp3uMu57Pjae71AcBgjULv5KcCg1cJctwvcv+7ZteJUhg7chr4nLGjdip85UyRqmoTF7EnIPqmDm8aGvWBDCPRTION59G88zgUNEFFa28CgYEAj9JxTtpg4L6Cw/4v3by6qBloWTkuFaUGF+Zq/AB5pfi06KOeL50se+saYCvbgrE0hCALotO+Us7ZbqYkbfMFNKgNEg0q4on3JzOZBxuI5Whmr7ak5n8cuOCmatKgJ9khCZDib+XVLK2m3GRdXMSVRQDdkOsJ/QYYCye0jMczGIUCgYEAlUTtSesErhyr+fZ8qOtlSAr+vGgywXs+BQku3qdWVY8qpM87RUEPQ44aAexbQbVnOz7hg40mMh/WSlosgwVIBAT5nSMvnXwuswgo++jU7ffmfc9rdMnAv2nrpBtiQi3GmskMDHcgTIQMr1eLEWBJMHe5CqnVp+pVaMB3VtR4Y1sCgYEAqg43xBxz6P/3K/PfCMmx4Vh2xpT+V3JLGA7DcnEHOUjG5M9jwkkXBuOp0gdtojEoIlI1c2xd4RFZsl451RKZOc4+YsVS2LzCJQrP0PcMlvMVVCIddm7v//ec7s+hAL5g+VuMyq7YKMXXWfA9a+H2thvrAVagihMho2SNAh+LYn8=";
        // 构建data部分
        Map<String, Object> dataMap = new LinkedHashMap<String, Object>(); // 使用LinkedHashMap保持顺序
        dataMap.put("goods_desc", "积分充值");
        dataMap.put("huifu_id", "6666000174575407");
        dataMap.put("notify_url", "http://221.182.45.100:8084/other/wx/integralCallback");
        dataMap.put("req_date", date.format(new Date()));
        dataMap.put("req_seq_id", code);
        dataMap.put("trade_type", "T_MINIAPP");
        dataMap.put("trans_amt", money+"");
        Map<String, String> wx_data = new LinkedHashMap<String, String>(); // 使用LinkedHashMap保持顺序
        // todo
        wx_data.put("sub_appid", wechatPayConfig.getAppId());
        wx_data.put("sub_openid", data.getOpenId());
        dataMap.put("wx_data", wx_data);
        // 将dataMap转化为json对象
        String signStr = JSON.toJSONString(JSONObject.parseObject(JSON.toJSONString(dataMap), TreeMap.class));
        System.out.println("待签名字符串:" + signStr);
        // 签名 (按照汇付天下规则,使用MD5加签)
        String sign = sign(signStr, key);
        System.out.println("签名:" + sign);
        // 构建完整请求JSON
        Map<String, Object> requestJson = new HashMap<>();
        requestJson.put("sys_id", "6666000174575407");
        requestJson.put("product_id", "KAZX");
        requestJson.put("sign", sign);
        requestJson.put("data", dataMap);
        String jsonBody = JSON.toJSONString(requestJson);
        System.out.println("发送JSON:" + jsonBody);
        // 使用原生Java发送请求
        URL url = new URL("https://api.huifu.com/v3/trade/payment/jspay");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        conn.setRequestProperty("Accept", "application/json");
        conn.setDoOutput(true);
        // 发送请求体
        try (OutputStream os = conn.getOutputStream()) {
            byte[] input = jsonBody.getBytes("utf-8");
            os.write(input, 0, input.length);
        }
        // 读取响应
        int responseCode = conn.getResponseCode();
        System.out.println("响应码: " + responseCode);
        // 正确处理响应流,无论成功还是失败
        InputStream inputStream = null;
        try {
            inputStream = conn.getInputStream();
        } catch (IOException e) {
            inputStream = conn.getErrorStream();
        }
        StringBuilder response = new StringBuilder();
        if (inputStream != null) {
            try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))) {
                String responseLine;
                while ((responseLine = br.readLine()) != null) {
                    response.append(responseLine.trim());
                }
            }
        }
        System.out.println("接收返回参数:" + response.toString());
        return R.ok(response.toString());
    }
    @Autowired
    private WechatPayConfig wechatPayConfig;
    @PostMapping("/integralPayApplet")
    @ApiOperation(tags = {"2.0-积分钱包"},value = "小程序积分充值")
    public R servicePayApplet(@RequestParam("amount")BigDecimal amount) throws Exception {
        BigDecimal money = amount.setScale(2, RoundingMode.HALF_UP);
        Long userid = tokenService.getLoginUser().getUserid();
        R<SysUser> sysUser = sysUserClient.getSysUser(userid);
        SysUser data = sysUser.getData();
        List<Site> sites = siteClient.getSiteAll().getData();
        Site site = sites.stream().filter(e -> e.getId().equals(data.getSiteId())).findFirst().orElse(null);
        if (site==null){
            return R.fail("当前登录用户未绑定站点");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        IntegralPay integralPay = new IntegralPay();
        integralPay.setUserId(data.getUserId());
        TIntegralRule one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
        if (one==null){
            return R.fail("获取支付失败,平台未设置充值积分比例");
        }
        String chargeCredit = one.getChargeCredit();
        JSONObject jsonObject = JSONObject.parseObject(chargeCredit);
        Integer num1 = jsonObject.getInteger("num1");
        BigDecimal bigDecimal = new BigDecimal(amount);
        // 向上取整 比如5.1 当作6 5.9也当作6
        integralPay.setIntegralCount(bigDecimal.divide(new BigDecimal(num1), RoundingMode.UP).intValue());
        int i = bigDecimal.multiply(new BigDecimal(num1)).intValue();
        integralPay.setIntegralCount(i);
        integralPay.setAmount(new BigDecimal(amount));
        SysConfig data1 = sysConfigClient.getInfo(8L).getData();
        BigDecimal bigDecimal = amount.multiply(new BigDecimal(data1.getConfigValue())).setScale(2, RoundingMode.HALF_DOWN);
        integralPay.setIntegralCount(bigDecimal.intValue());
        integralPay.setAmount(amount);
        integralPay.setCode(code);
        integralPay.setPayStatus(1);
        integralPay.setDelFlag(0);
        integralPay.setCreateTime(LocalDateTime.now());
        integralPayService.save(integralPay);
        String codeUrl = res.get("code_url");
        MyQrCodeUtil.createCodeToFile(codeUrl);
        BufferedImage blueImage = QRCodeUtil.createImage(codeUrl);
        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
        String s = ObsUploadUtil.obsUpload(blueFile);
        System.err.println(s);
        return R.ok(s);
//        return wechatPayService.unifiedOrderApplet(servicePay.getId()+"",code, site.getAnnualServiceFee()+"", "服务费缴纳",data.getOpenId(), "/other/wx/serviceCallback");
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd");
        String key = "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDAna1TkFL4MRjBiPpGqBbvRy8ojVglU306o01wibafNiE7pvAVjn9aUShSzCA9OkvMld35XLpO4o8ZhetFK5W9mlVGgCVyOSCcApEyadBH8zfRGpL96vQDynhY7QP0Ffgrua5jKXvbIxcqwGO0kdHqQULJFjDoqwknTy+LUWX/IhuViY4hzS79RoQhCmvTM8BaPUY3cGLA7XbRHMgYkkoRrRzfIio2rwEtq+2s2sajPsdM/g0D4ilCOFYUO36+H26uzBWlwBprjEkoPujcdAo93Y3JxkC7ZcVP3ytyFVQTUwNbmeLdK8XPet95ngbmRQyAgN//QItLvIukAJjJp8zNAgMBAAECggEBAJ3QkvKkjVZM47uuP2Ek16W07S6MoGv0u+YPZqOOMdLAxvnZDVycJDwbwq4UEVYZLYGySOzGzN9VQWnoD5vc2hM/IB9jX0r3A4DPmad0ivJolJL+8vCYUNXKTlCN4W9bkLpCqF8W3iPt3E1q1EZeM197mPyo8emwOQ+8EXhUeP1PyJDHGu6EXMApaobGFZy00ggke8h0P7/OZbrf0o9G0u004fH9bfHHREwsa31LsYkQrGBOXXWSO6KGc0wcjK3gIV06DyA9uQNAi8Afd7ga3M/QzTNdg0G5GwVBBIlcg8NA5FFJO6fxmS9kPhWeij7C20iHJfqqc4CEC4ig2w4IgQECgYEA5+tYwnuiFyaiZsdlrSkb7z7NiYPBjtDRz0ZgfT51LMzO3UvegpwpuxZgJFIpL4k5EFfHrkLztUCDzsPdaDFnPKqVzRgBNSFbZ4iTAht9CgX/RSHuBHwiRBZRoWWlL3bKUAIXXHtwpx12nweh+iRE8feGd7VJwrMY3QOqAqtN3YMCgYEA1J2bE2cp0aNZxAYc1CmV6nJxPniQlNV+pCQv3usUaGMJzxqXG1N6ViuB1VxC6WLvy8cp3uMu57Pjae71AcBgjULv5KcCg1cJctwvcv+7ZteJUhg7chr4nLGjdip85UyRqmoTF7EnIPqmDm8aGvWBDCPRTION59G88zgUNEFFa28CgYEAj9JxTtpg4L6Cw/4v3by6qBloWTkuFaUGF+Zq/AB5pfi06KOeL50se+saYCvbgrE0hCALotO+Us7ZbqYkbfMFNKgNEg0q4on3JzOZBxuI5Whmr7ak5n8cuOCmatKgJ9khCZDib+XVLK2m3GRdXMSVRQDdkOsJ/QYYCye0jMczGIUCgYEAlUTtSesErhyr+fZ8qOtlSAr+vGgywXs+BQku3qdWVY8qpM87RUEPQ44aAexbQbVnOz7hg40mMh/WSlosgwVIBAT5nSMvnXwuswgo++jU7ffmfc9rdMnAv2nrpBtiQi3GmskMDHcgTIQMr1eLEWBJMHe5CqnVp+pVaMB3VtR4Y1sCgYEAqg43xBxz6P/3K/PfCMmx4Vh2xpT+V3JLGA7DcnEHOUjG5M9jwkkXBuOp0gdtojEoIlI1c2xd4RFZsl451RKZOc4+YsVS2LzCJQrP0PcMlvMVVCIddm7v//ec7s+hAL5g+VuMyq7YKMXXWfA9a+H2thvrAVagihMho2SNAh+LYn8=";
        // 构建data部分
        Map<String, Object> dataMap = new LinkedHashMap<String, Object>(); // 使用LinkedHashMap保持顺序
        dataMap.put("goods_desc", "积分充值");
        dataMap.put("huifu_id", "6666000174575407");
        dataMap.put("notify_url", "http://221.182.45.100:8084/other/wx/integralCallback");
        dataMap.put("req_date", date.format(new Date()));
        dataMap.put("req_seq_id", code);
        dataMap.put("trade_type", "T_MINIAPP");
        dataMap.put("trans_amt", money+"");
        Map<String, String> wx_data = new LinkedHashMap<String, String>(); // 使用LinkedHashMap保持顺序
        // todo
        wx_data.put("sub_appid", wechatPayConfig.getAppId());
        wx_data.put("sub_openid", data.getOpenId());
        dataMap.put("wx_data", wx_data);
        // 将dataMap转化为json对象
        String signStr = JSON.toJSONString(JSONObject.parseObject(JSON.toJSONString(dataMap), TreeMap.class));
        System.out.println("待签名字符串:" + signStr);
        // 签名 (按照汇付天下规则,使用MD5加签)
        String sign = sign(signStr, key);
        System.out.println("签名:" + sign);
        // 构建完整请求JSON
        Map<String, Object> requestJson = new HashMap<>();
        requestJson.put("sys_id", "6666000174575407");
        requestJson.put("product_id", "KAZX");
        requestJson.put("sign", sign);
        requestJson.put("data", dataMap);
        String jsonBody = JSON.toJSONString(requestJson);
        System.out.println("发送JSON:" + jsonBody);
        // 使用原生Java发送请求
        URL url = new URL("https://api.huifu.com/v3/trade/payment/jspay");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        conn.setRequestProperty("Accept", "application/json");
        conn.setDoOutput(true);
        // 发送请求体
        try (OutputStream os = conn.getOutputStream()) {
            byte[] input = jsonBody.getBytes("utf-8");
            os.write(input, 0, input.length);
        }
        // 读取响应
        int responseCode = conn.getResponseCode();
        System.out.println("响应码: " + responseCode);
        // 正确处理响应流,无论成功还是失败
        InputStream inputStream = null;
        try {
            inputStream = conn.getInputStream();
        } catch (IOException e) {
            inputStream = conn.getErrorStream();
        }
        StringBuilder response = new StringBuilder();
        if (inputStream != null) {
            try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))) {
                String responseLine;
                while ((responseLine = br.readLine()) != null) {
                    response.append(responseLine.trim());
                }
            }
        }
        System.out.println("接收返回参数:" + response.toString());
        return R.ok(response.toString());
    }
    public static void main(String[] args) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
//        return wechatPayService.unifiedOrderApplet(servicePay.getId()+"",code, site.getAnnualServiceFee()+"", "服务费缴纳",data.getOpenId(), "/other/wx/serviceCallback");
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd");
        String key = "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDAna1TkFL4MRjBiPpGqBbvRy8ojVglU306o01wibafNiE7pvAVjn9aUShSzCA9OkvMld35XLpO4o8ZhetFK5W9mlVGgCVyOSCcApEyadBH8zfRGpL96vQDynhY7QP0Ffgrua5jKXvbIxcqwGO0kdHqQULJFjDoqwknTy+LUWX/IhuViY4hzS79RoQhCmvTM8BaPUY3cGLA7XbRHMgYkkoRrRzfIio2rwEtq+2s2sajPsdM/g0D4ilCOFYUO36+H26uzBWlwBprjEkoPujcdAo93Y3JxkC7ZcVP3ytyFVQTUwNbmeLdK8XPet95ngbmRQyAgN//QItLvIukAJjJp8zNAgMBAAECggEBAJ3QkvKkjVZM47uuP2Ek16W07S6MoGv0u+YPZqOOMdLAxvnZDVycJDwbwq4UEVYZLYGySOzGzN9VQWnoD5vc2hM/IB9jX0r3A4DPmad0ivJolJL+8vCYUNXKTlCN4W9bkLpCqF8W3iPt3E1q1EZeM197mPyo8emwOQ+8EXhUeP1PyJDHGu6EXMApaobGFZy00ggke8h0P7/OZbrf0o9G0u004fH9bfHHREwsa31LsYkQrGBOXXWSO6KGc0wcjK3gIV06DyA9uQNAi8Afd7ga3M/QzTNdg0G5GwVBBIlcg8NA5FFJO6fxmS9kPhWeij7C20iHJfqqc4CEC4ig2w4IgQECgYEA5+tYwnuiFyaiZsdlrSkb7z7NiYPBjtDRz0ZgfT51LMzO3UvegpwpuxZgJFIpL4k5EFfHrkLztUCDzsPdaDFnPKqVzRgBNSFbZ4iTAht9CgX/RSHuBHwiRBZRoWWlL3bKUAIXXHtwpx12nweh+iRE8feGd7VJwrMY3QOqAqtN3YMCgYEA1J2bE2cp0aNZxAYc1CmV6nJxPniQlNV+pCQv3usUaGMJzxqXG1N6ViuB1VxC6WLvy8cp3uMu57Pjae71AcBgjULv5KcCg1cJctwvcv+7ZteJUhg7chr4nLGjdip85UyRqmoTF7EnIPqmDm8aGvWBDCPRTION59G88zgUNEFFa28CgYEAj9JxTtpg4L6Cw/4v3by6qBloWTkuFaUGF+Zq/AB5pfi06KOeL50se+saYCvbgrE0hCALotO+Us7ZbqYkbfMFNKgNEg0q4on3JzOZBxuI5Whmr7ak5n8cuOCmatKgJ9khCZDib+XVLK2m3GRdXMSVRQDdkOsJ/QYYCye0jMczGIUCgYEAlUTtSesErhyr+fZ8qOtlSAr+vGgywXs+BQku3qdWVY8qpM87RUEPQ44aAexbQbVnOz7hg40mMh/WSlosgwVIBAT5nSMvnXwuswgo++jU7ffmfc9rdMnAv2nrpBtiQi3GmskMDHcgTIQMr1eLEWBJMHe5CqnVp+pVaMB3VtR4Y1sCgYEAqg43xBxz6P/3K/PfCMmx4Vh2xpT+V3JLGA7DcnEHOUjG5M9jwkkXBuOp0gdtojEoIlI1c2xd4RFZsl451RKZOc4+YsVS2LzCJQrP0PcMlvMVVCIddm7v//ec7s+hAL5g+VuMyq7YKMXXWfA9a+H2thvrAVagihMho2SNAh+LYn8=";
        // 构建data部分
        Map<String, Object> dataMap = new LinkedHashMap<String, Object>(); // 使用LinkedHashMap保持顺序
        dataMap.put("goods_desc", "积分充值");
        dataMap.put("huifu_id", "6666000174575407");
        dataMap.put("notify_url", "http://221.182.45.100:8084/other/wx/integralCallback");
        dataMap.put("req_date", date.format(new Date()));
        dataMap.put("req_seq_id", code);
        dataMap.put("trade_type", "T_JSAPI");
        dataMap.put("trans_amt", "0.01");
        Map<String, String> wx_data = new LinkedHashMap<String, String>(); // 使用LinkedHashMap保持顺序
        // todo
        wx_data.put("sub_appid", "wx049faf9c5234f31c");
        wx_data.put("sub_openid", "oJiKr7cxOTJAVkOJSYDSOh9kynKE");
        dataMap.put("wx_data", wx_data);
        // 将dataMap转化为json对象
        String signStr = JSON.toJSONString(JSONObject.parseObject(JSON.toJSONString(dataMap), TreeMap.class));
        System.out.println("待签名字符串:" + signStr);
        // 签名 (按照汇付天下规则,使用MD5加签)
        String sign = sign(signStr, key);
        System.out.println("签名:" + sign);
        // 构建完整请求JSON
        Map<String, Object> requestJson = new HashMap<>();
        requestJson.put("sys_id", "6666000174575407");
        requestJson.put("product_id", "KAZX");
        requestJson.put("sign", sign);
        requestJson.put("data", dataMap);
        String jsonBody = JSON.toJSONString(requestJson);
        System.out.println("发送JSON:" + jsonBody);
        // 使用原生Java发送请求
        URL url = new URL("https://api.huifu.com/v3/trade/payment/jspay");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        conn.setRequestProperty("Accept", "application/json");
        conn.setDoOutput(true);
        // 发送请求体
        try (OutputStream os = conn.getOutputStream()) {
            byte[] input = jsonBody.getBytes("utf-8");
            os.write(input, 0, input.length);
        }
        // 读取响应
        int responseCode = conn.getResponseCode();
        System.out.println("响应码: " + responseCode);
        // 正确处理响应流,无论成功还是失败
        InputStream inputStream = null;
        try {
            inputStream = conn.getInputStream();
        } catch (IOException e) {
            inputStream = conn.getErrorStream();
        }
        StringBuilder response = new StringBuilder();
        if (inputStream != null) {
            try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))) {
                String responseLine;
                while ((responseLine = br.readLine()) != null) {
                    response.append(responseLine.trim());
                }
            }
        }
        System.out.println("接收返回参数:" + response.toString());
    }
    /**
     * RSA私钥签名:签名方式SHA256WithRSA
     * @param data 待签名字符串
     * @param privateKeyBase64 私钥(Base64编码)
     * @return 签名byte[]
     * @throws Exception
     */
    public static String sign(String data, String privateKeyBase64) {
        // Base64 --> Key
        try {
            byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
            KeyFactory keyFactory;
            keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
            // Sign
            Signature signature = Signature.getInstance("SHA256WithRSA");
            signature.initSign(privateKey);
            signature.update(data.getBytes("UTF-8"));
            return Base64.getEncoder().encodeToString(signature.sign());
        } catch (Exception e) {
            return null;
        }
    }
    public static MultipartFile convert(BufferedImage bufferedImage, String fileName) throws IOException {
        // 将 BufferedImage 转换为字节数组
@@ -146,44 +527,67 @@
        return multipartFile;
    }
    @GetMapping("/getSet")
    @ApiOperation(tags = {"2.0-积分管理"},value = "获取积分设置")
    @ApiOperation(tags = {"2.0-积分管理"}, value = "获取积分设置")
    public R<TIntegralRule> getSet() {
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser data = sysUserClient.getSysUser(userid).getData();
        if (data!=null&&data.getSiteId()!=null){
            if (data.getRoleType()==1){
        if (data != null ) {
            if (data.getRoleType() == 1) {
                // 平台
                TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
                return R.ok(res);
            }else{
                SysConfig data1 = sysConfigClient.getInfo(8L).getData();
                sysConfigClient.update(data1);
                TIntegralRule tIntegralRule = new TIntegralRule();
                tIntegralRule.setChargeCredit("{\"num1\":"+data1.getConfigValue()+"}");
                tIntegralRule.setContent(data1.getRemark());
                tIntegralRule.setSiteId(0);
                return R.ok(tIntegralRule);
            } else if (data.getRoleType() == 2){
                TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, data.getSiteId()).one();
                return R.ok(res);
            }else{
                return R.ok(new TIntegralRule());
            }
        }else {
        } else {
            return R.ok(new TIntegralRule());
        }
    }
    @GetMapping("/getSetBySiteId")
    @ApiOperation(tags = {"2.0-积分管理"}, value = "获取积分设置")
    public R<TIntegralRule> getSetBySiteId(@RequestParam("siteId") Integer siteId) {
        TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, siteId).last("limit 1").one();
        return R.ok(res);
    }
    @PostMapping("/saveSet")
    @ApiOperation(tags = {"2.0-积分管理"},value = "保存积分设置")
    @ApiOperation(tags = {"2.0-积分管理"}, value = "保存积分设置")
    @Log(title = "【积分管理】保存积分设置", businessType = BusinessType.INSERT)
    public R saveSet(@RequestBody TIntegralRule dto) {
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser data = sysUserClient.getSysUser(userid).getData();
        TIntegralRule one;
        if (data.getRoleType()==1){
            one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
        }else{
            one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, data.getSiteId()).one();
        if (data.getRoleType() == 1) {
            SysConfig data1 = sysConfigClient.getInfo(8L).getData();
            JSONObject jsonObject = JSONObject.parseObject(dto.getChargeCredit());
            Integer num1 = jsonObject.getInteger("num1");
            data1.setConfigValue(num1.toString());
            data1.setRemark(dto.getContent());
            sysConfigClient.update(data1);
        } else {
            TIntegralRule  one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, data.getSiteId()).one();
            if (one != null) {
                dto.setId(one.getId());
                dto.setSiteId(data.getSiteId());
                integralRuleService.saveOrUpdate(dto);
            } else {
                dto.setSiteId(data.getSiteId());
                integralRuleService.saveOrUpdate(dto);
            }
        }
        if (one!=null){
            dto.setId(one.getId());
            integralRuleService.saveOrUpdate(dto);
        }else{
            integralRuleService.saveOrUpdate(dto);
        }
        return R.ok();
    }