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.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.*;
|
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.*;
|
|
/**
|
* <p>
|
* 前端控制器
|
* </p>
|
*
|
* @author 无关风月
|
* @since 2024-08-06
|
*/
|
@RestController
|
@RequestMapping("/integral")
|
public class TIntegralController {
|
|
@Autowired
|
private TIntegralRuleService integralRuleService;
|
@Autowired
|
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 = "积分钱包")
|
public R<IntegralVO> integralPageList(@RequestBody IntegralListQuery query) {
|
Long userid = tokenService.getLoginUser().getUserid();
|
R<SysUser> sysUser = sysUserClient.getSysUser(userid);
|
query.setSiteId(sysUser.getData().getSiteId());
|
Integer integral = sysUser.getData().getIntegral();
|
IntegralVO integralVO = new IntegralVO();
|
PageInfo<IntegralListVO> integralListVOPageInfo = integralRecordService.integralPageList(query);
|
integralVO.setIntegralList(integralListVOPageInfo);
|
integralVO.setIntegral(integral);
|
return R.ok(integralVO);
|
}
|
@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 {
|
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);
|
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(@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);
|
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://47.120.5.122:8080/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://47.120.5.122:8080/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://47.120.5.122:8080/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 转换为字节数组
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ImageIO.write(bufferedImage, "png", baos);
|
byte[] bytes = baos.toByteArray();
|
|
// 创建 ByteArrayResource
|
ByteArrayResource resource = new ByteArrayResource(bytes);
|
|
// 创建 MockMultipartFile
|
MockMultipartFile multipartFile = new MockMultipartFile(
|
"file",
|
fileName,
|
"image/png",
|
resource.getInputStream()
|
);
|
|
return multipartFile;
|
}
|
|
@GetMapping("/getSet")
|
@ApiOperation(tags = {"2.0-积分管理"}, value = "获取积分设置")
|
public R<TIntegralRule> getSet() {
|
Long userid = tokenService.getLoginUser().getUserid();
|
SysUser data = sysUserClient.getSysUser(userid).getData();
|
|
if (data != null ) {
|
if (data.getRoleType() == 1) {
|
// 平台
|
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 {
|
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 = "保存积分设置")
|
@Log(title = "【积分管理】保存积分设置", businessType = BusinessType.INSERT)
|
public R saveSet(@RequestBody TIntegralRule dto) {
|
Long userid = tokenService.getLoginUser().getUserid();
|
SysUser data = sysUserClient.getSysUser(userid).getData();
|
|
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);
|
}
|
}
|
|
return R.ok();
|
}
|
|
}
|