| | |
| | | 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; |
| | |
| | | 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 无关风月 |
| | |
| | | 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(); |
| | | if (one!=null){ |
| | | workPlatformVO.setServiceStatus(1); |
| | | workPlatformVO.setEndTime(one.getEndTime()); |
| | | }else{ |
| | | workPlatformVO.setServiceStatus(0); |
| | | workPlatformVO.setEndTime(null); |
| | | } |
| | | |
| | | |
| | | 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); |
| | |
| | | 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 = "查询支付结果 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(); |
| | | // 生成待支付记录 |
| | | IntegralPay integralPay = new IntegralPay(); |
| | | integralPay.setUserId(data.getUserId()); |
| | | TIntegralRule one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one(); |
| | | if (one==null){ |
| | | return R.fail("获取支付失败,平台未设置充值积分比例"); |
| | | 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("当前登录用户未绑定站点"); |
| | | } |
| | | 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)); |
| | | 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); |
| | | 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); |
| | | 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()); |
| | | } |
| | | 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 转换为字节数组 |
| | |
| | | |
| | | 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(); |
| | | } |
| | | |