From c634075944e32cb920686bfc83f09423f8aaf0b1 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期三, 27 八月 2025 17:12:51 +0800 Subject: [PATCH] PC跳转小程序支付 --- ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java | 609 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 546 insertions(+), 63 deletions(-) diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java index 21f2f8a..07bbc02 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java @@ -1,48 +1,77 @@ 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.domain.AjaxResult; 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.redis.service.RedisService; 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.api.dto.NativePayDTO; 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.util.MyQrCodeUtil; -import com.ruoyi.other.util.ObsUploadUtil; -import com.ruoyi.other.util.QRCodeUtil; -import com.ruoyi.other.util.UUIDUtil; +import com.ruoyi.other.service.TServicePayService; +import com.ruoyi.other.util.*; +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 com.ruoyi.system.api.model.LoginUser; import io.swagger.annotations.ApiOperation; +import org.apache.http.HttpResponse; import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.*; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; 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.SecureRandom; +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 +87,83 @@ private TIntegralRecordService integralRecordService; @Autowired private TIntegralPayService integralPayService; + @Autowired + private SysConfigClient sysConfigClient; + + + @Autowired + private WxAppletTools wxAppletTools; + + + @Autowired + private RestTemplate restTemplate; + @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 +175,417 @@ 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); } } - + @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取小程序二维码") + @PostMapping(value = "/getQrCode") + public R getQrCode(@RequestParam("amount") String amount ) { + LoginUser loginUser = tokenService.getLoginUser(); + SysUser data = sysUserClient.getSysUser(loginUser.getUserid()).getData(); + // 充值手机号 + String phonenumber = data.getPhonenumber(); + InputStream inputStream = null; + OutputStream outputStream = null; + String accessToken = wxAppletTools.getAccessToken(); + try { + String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken; + Map<String, Object> param = new HashMap<>(); + param.put("scene", "phone=" + phonenumber+",amount="+amount); + param.put("page", "chargingPile/payMent/payMent"); + param.put("check_path", false); + param.put("env_version", "trial"); + param.put("width", 200); //二维码尺寸 + param.put("is_hyaline", true); // 是否需要透明底色, is_hyaline 为true时,生成透明底色的小程序码 参数仅对小程序码生效 + param.put("auto_color", true); // 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调 参数仅对小程序码生效 + Map<String, Object> line_color = new HashMap<>(); + line_color.put("r", 0); + line_color.put("g", 0); + line_color.put("b", 0); + param.put("line_color", line_color); + System.err.println("调用生成微信URL接口传参:" + param); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity(param, headers); + ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class); + System.err.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody()); + byte[] result = entity.getBody(); + inputStream = new ByteArrayInputStream(result); + //拿到httpResponse后,在获取里面的图片 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + // 最后上传生成的文件名 + String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg"; + // oss中的文件夹名 + String objectName = sdf.format(new Date()) + "/" + finalFileName; + // 上传oss + String s = ObsUploadUtil.obsUpload(objectName, inputStream); + return R.ok(s); + }catch (Exception e){ + return R.fail(e.getMessage()); + } + } + @Resource + private WeChatUtil weChatUtil; @PostMapping("/nativePay") - @ApiOperation(tags = {"2.0-积分钱包"},value = "获取支付二维码") - public R nativePay(@RequestParam("amount") String amount) throws Exception { + @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取支付二维码") + public R nativePay(@RequestBody @Validated NativePayDTO dto) throws Exception { + + R<SysUser> sysUserR = sysUserClient.queryUserByPhone(dto.getPhone()); + SysUser data = sysUserR.getData(); + //使用jscode获取微信openid + Map<String, Object> map = weChatUtil.code2Session(dto.getJsCode()); + Integer errcode = Integer.valueOf(map.get("errcode").toString()); + if(0 != errcode){ + return R.fail(map.get("msg").toString()); + } + String openid = map.get("openid").toString(); + data.setOpenId(openid); + BigDecimal amount = dto.getAmount(); + BigDecimal money = amount.setScale(2, RoundingMode.HALF_UP); + + 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); - Map<String, String> res = wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback"); - Long userid = tokenService.getLoginUser().getUserid(); - R<SysUser> sysUser = sysUserClient.getSysUser(userid); - SysUser data = sysUser.getData(); - // 生成待支付记录 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()); + sysUserClient.updateSysUser(data); + 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()); + 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); + + +// 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 +606,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(); } -- Gitblit v1.7.1