From 4adb656ffd2c3660e07d224dd483e7479d48b46e Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期三, 30 四月 2025 17:58:57 +0800 Subject: [PATCH] bug修改 --- cloud-server-activity/src/main/java/com/dsh/activity/model/response/MyHuiminCardVO.java | 2 cloud-server-activity/src/main/resources/mapper/PayHuiminMapper.xml | 8 cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminRecordController.java | 43 ++ cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java | 102 +---- cloud-server-activity/src/main/java/com/dsh/activity/controller/WeiXinV3Controller.java | 152 +++++----- cloud-server-activity/src/main/java/com/dsh/activity/util/PayMoneyUtil.java | 5 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TPayHuiminController.java | 1 cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html | 4 /dev/null | 56 --- cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminRecord.java | 6 cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/ImageUtils.java | 10 cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminCallBack.java | 25 + cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WxAppPayService.java | 443 ++++++++++++++-------------- cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PayHuiminServiceImpl.java | 10 14 files changed, 411 insertions(+), 456 deletions(-) diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminCallBack.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminCallBack.java index dc5c192..401316c 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminCallBack.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminCallBack.java @@ -80,7 +80,7 @@ @PostMapping("/aliPayHuiminCallback") public void aliPayHuiminCallback(HttpServletRequest request, HttpServletResponse response) { try { - System.err.println("==========回调"); + System.err.println("支付宝回调"); Map<String, String> map = payMoneyUtil.alipayCallback(request); if (null != map) { String out_trade_no = map.get("out_trade_no"); @@ -92,11 +92,20 @@ out.write("success"); out.flush(); out.close(); - }else{ + }else if (one.getStatus()==1){ one.setOrderNumber(transaction_id); one.setStatus(2); one.setPaymentTime(new Date()); payHuiminService.updateById(one); + PrintWriter out = response.getWriter(); + out.write("success"); + out.flush(); + out.close(); + }else{ + PrintWriter out = response.getWriter(); + out.write("success"); + out.flush(); + out.close(); } } } @@ -110,6 +119,7 @@ @PostMapping("/weixinPayHuiminCallback") public void weixinPayHuiminCallback(HttpServletRequest request, HttpServletResponse response) { try { + System.err.println("微信回调"); Map<String, String> map = payMoneyUtil.weixinpayCallback(request); if (null != map) { String out_trade_no = map.get("out_trade_no"); @@ -122,11 +132,20 @@ out.write(result); out.flush(); out.close(); - }else{ + }else if (one.getStatus()==1){ one.setOrderNumber(transaction_id); one.setStatus(2); one.setPaymentTime(new Date()); payHuiminService.updateById(one); + PrintWriter out = response.getWriter(); + out.write(result); + out.flush(); + out.close(); + }else{ + PrintWriter out = response.getWriter(); + out.write(result); + out.flush(); + out.close(); } } } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java index 37ce23c..d10313d 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java @@ -326,6 +326,13 @@ huiminCardVO1.setHuiminName(huiminCard.getHuiMinName()); huiminCardVO1.setCover(huiminCard.getBuyCover()); huiminCardVO1.setIsBuy(1); + int count = huiminRecordService.list(new LambdaQueryWrapper<THuiminRecord>() + .eq(THuiminRecord::getPayId, payHuimin.getId())).size(); + if (count>0){ + huiminCardVOS.add(huiminCardVO1); + integers.add(payHuimin.getCardId()); + continue; + } String siteIds = ""; if (huiminCard.getUseScope() == 2) { siteIds = huiminCard.getUseIds(); @@ -388,7 +395,7 @@ if (tStudent!=null){ huiminCardVO1.setStudentName(tStudent.getName()); } - String temp = "{\"sid\":" + sid.toJSONString() + "," + "\"rid\":" + rid + "," + "\"uid\":\"" + payHuimin.getStudentId().split(",")[0] + "\"," + "\"time\":" + jsonArray.toJSONString() + ",\"type\":" + 2 + "}"; + String temp = "{\"id\":"+payHuimin.getId() + ","+"\"sid\":" + sid.toJSONString() + "," + "\"rid\":" + rid + "," + "\"uid\":\"" + payHuimin.getStudentId() + "\"," + "\"time\":" + jsonArray.toJSONString() + ",\"type\":" + 2 + "}"; huiminCardVO1.setQrCode(temp); huiminCardVOS.add(huiminCardVO1); integers.add(payHuimin.getCardId()); @@ -425,14 +432,14 @@ int startIndex = (pageNo - 1) * pageSize; int endIndex = Math.min(startIndex + pageSize, huiminCardVOS.size()); -// 防止 startIndex 超过 huiminCardVOS.size() + // 防止 startIndex 超过 huiminCardVOS.size() if (startIndex > huiminCardVOS.size()) { startIndex = huiminCardVOS.size(); } List<HuiminCardVO> paginatedHuiminCardVOS = huiminCardVOS.subList(startIndex, endIndex); -// 将分页后的数据设置到 huiminAgreementVO 中 + // 将分页后的数据设置到 huiminAgreementVO 中 huiminAgreementVO.setCardList(paginatedHuiminCardVOS); -// 将分页后的数据设置到 huiminAgreementVO 中 + // 将分页后的数据设置到 huiminAgreementVO 中 huiminAgreementVO.setCardList(paginatedHuiminCardVOS); // huiminAgreementVO.setCardList(huiminCardVOS); return ResultUtil.success(huiminAgreementVO); @@ -638,7 +645,7 @@ } } - String temp = "{\"sid\":" + sid.toJSONString() + "," + "\"rid\":" + rid + "," + "\"uid\":\"" + studentId + "\"," + "\"time\":" + jsonArray.toJSONString() + ",\"type\":" + 2 + "}"; + String temp = "{\"id\":"+tPayHuimin.getId() + ","+"\"sid\":" + sid.toJSONString() + "," + "\"rid\":" + rid + "," + "\"uid\":\"" + tPayHuimin.getStudentId() + "\"," + "\"time\":" + jsonArray.toJSONString() + ",\"type\":" + 2 + "}"; huiminCardStudentVO.setQrCode(temp); TStudent tStudent = tStudents.stream().filter(e -> e.getId().equals(studentId)).findFirst().orElse(null); if (tStudent!=null){ @@ -678,15 +685,20 @@ myHuiminCardVO.setEndTime(byId.getEndTime()); myHuiminCardVO.setSalesMoney(byId.getSalesMoney()); int count = huiminRecordService.count(new LambdaQueryWrapper<THuiminRecord>() - .eq(THuiminRecord::getHuiminCardId, myHuiminCardVO.getCardId())); + .eq(THuiminRecord::getPayId, byId.getId())); // 购卡7日内没有使用记录可退款。超过7日不管有没有使用记录都不能退款 if (new Date().after(DateUtil.addDay(myHuiminCardVO.getPaymentTime(), 7))) { // 超过七天不可退款 myHuiminCardVO.setIsRefund(0); - } else if (count >= 7) { + } else if (count > 0) { myHuiminCardVO.setIsRefund(0); } else { myHuiminCardVO.setIsRefund(1); + } + if (byId.getStatus()==4){ + // 退款中 + myHuiminCardVO.setIsRefund(2); + } THuiminCard huiminCard = list.stream().filter(e -> e.getId().equals(myHuiminCardVO.getCardId())).findFirst().orElse(null); if (null != huiminCard) { @@ -735,19 +747,22 @@ if (tPayHuimin.getStatus() == 3 && tPayHuimin.getRefundStatus() != 1) { return ResultUtil.error("不可重复退款"); } + if (tPayHuimin.getEndTime().before(new Date())) { // 已过期 return ResultUtil.error("惠民卡已过期,不可退款"); } - int count = huiminRecordService.count(new LambdaQueryWrapper<THuiminRecord>() - .eq(THuiminRecord::getHuiminCardId, tPayHuimin.getCardId())); + tPayHuimin.setStatus(4); + payHuiminService.updateById(tPayHuimin); + int count = huiminRecordService.list(new LambdaQueryWrapper<THuiminRecord>() + .eq(THuiminRecord::getPayId, tPayHuimin.getId())).size(); + // 购卡7日内没有使用记录可退款。超过7日不管有没有使用记录都不能退款 if (new Date().after(DateUtil.addDay(tPayHuimin.getPaymentTime(), 7))) { // 超过七天不可退款 return ResultUtil.error("惠民卡购买超过七天,不可退款"); - } else if (count >= 7) { - // 使用记录大于等于7次不可退款 - return ResultUtil.error("惠民卡使用记录大于等于7次,不可退款"); + } else if (count > 0) { + return ResultUtil.error("惠民卡已使用,不可退款"); } if (tPayHuimin.getPaymentType() == 1) { Map<String, String> map = payMoneyUtil.wxRefund(tPayHuimin.getOrderNumber(), tPayHuimin.getCode(), @@ -778,68 +793,7 @@ } } - public static void main(String[] args) { -// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); -// LocalDateTime localDateTime = LocalDateTime.now().plusDays(365); -// // 将LocalDateTime转换为Date类型 -// Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); -// String format = simpleDateFormat.format(date); -// System.err.println(format); -// String storeIds = "1001,1002"; -// JSONArray jsonArray = JSONArray.parseArray(Arrays.toString(storeIds.split(","))); -// System.err.println(jsonArray); -// -// // 获取当前日期 -// LocalDate today = LocalDate.now(); -// -// // 获取当前日期是周几 -// DayOfWeek dayOfWeek = today.getDayOfWeek(); -// -// // 输出当前是周几,使用中文显示 -// System.out.println("今天是: " + dayOfWeek.getValue()); - Date start = new Date(); - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - System.err.println(simpleDateFormat.format(start)); - start.setTime(start.getTime() + 30 * 1000); - System.err.println(simpleDateFormat.format(start)); -// String temp = "[{\"days\":[{\"value\":\"1\",\"label\":\"星期一\",\"checked\":true},{\"value\":\"2\",\"label\":\"星期二\",\"checked\":true},{\"value\":\"3\",\"label\":\"星期三\",\"checked\":true},{\"value\":\"4\",\"label\":\"星期四\",\"checked\":true},{\"value\":\"5\",\"label\":\"星期五\",\"checked\":true},{\"value\":\"6\",\"label\":\"星期六\",\"checked\":false},{\"value\":\"7\",\"label\":\"星期日\",\"checked\":false}],\"startTime\":\"00:00\",\"endTime\":\"23:59\"}]"; -// // 可用时间 -// LocalDate today = LocalDate.now(); -// -// int week = today.getDayOfWeek().getValue(); -// -// JSONArray time = JSONArray.parseArray(temp); -// int i = 0; -// JSONArray jsonArray = new JSONArray(); -// -// StringBuilder startTime = new StringBuilder(); -// StringBuilder endTime = new StringBuilder(); -// -// String string = LocalDate.now().toString(); -// -// for (Object o : time) { -// JSONObject jsonObject = (JSONObject) o; -// for (Object days : jsonObject.getJSONArray("days")) { -// JSONObject jsonObject1 = (JSONObject) days; -// if (jsonObject1.getString("value").equals(String.valueOf(week))&&jsonObject1.getBoolean("checked")){ -// JSONObject jsonObject2 = new JSONObject(); -// String s1 = string+" "+jsonObject.getString("startTime")+":00"; -// String e1 = string+" "+jsonObject.getString("endTime")+":00"; -// // 转化为Date类型 -// Date start = DateUtil.parse(s1,"yyyy-MM-dd HH:mm:ss"); -// Date end = DateUtil.parse(e1,"yyyy-MM-dd HH:mm:ss"); -// jsonObject2.put("startTime",start.getTime()); -// jsonObject2.put("endTime",end.getTime()); -// jsonArray.add(jsonObject2); -// } -// -// -// } -// i++; -// } -// System.err.println(jsonArray); - } /** * 个人中心-我的惠民卡-查看详情 @@ -928,7 +882,7 @@ } } - String temp = "{\"sid\":" + sid.toJSONString() + "," + "\"rid\":" + rid + "," + "\"uid\":\"" + tPayHuimin.getStudentId() + "\"," + "\"time\":" + jsonArray.toJSONString() + ",\"type\":" + 2 + "}"; + String temp = "{\"id\":"+tPayHuimin.getId() + ","+"\"sid\":" + sid.toJSONString() + "," + "\"rid\":" + rid + "," + "\"uid\":\"" + tPayHuimin.getStudentId() + "\"," + "\"time\":" + jsonArray.toJSONString() + ",\"type\":" + 2 + "}"; myHuiminCardDetailVO.setQrCode(temp); myHuiminCardDetailVO.setCardId(tPayHuimin.getCardId()); myHuiminCardDetailVO.setHuiminCard(byId); diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminRecordController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminRecordController.java new file mode 100644 index 0000000..067ad75 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminRecordController.java @@ -0,0 +1,43 @@ +package com.dsh.activity.controller; + +import com.dsh.activity.entity.THuiminRecord; +import com.dsh.activity.entity.TPayHuimin; +import com.dsh.activity.service.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * 硬件方调用 存储惠民卡使用记录 + * @author zhibing.pu + * @date 2023/6/24 11:27 + */ +@RestController +@RequestMapping("/base/huimin") +public class HuiminRecordController { + @Resource + private HuiminRecordService huiminRecordService; + @Resource + private PayHuiminService payHuiminService; + /** + * 硬件开门后回调 存储惠民卡使用记录 + */ + @PostMapping("/record") + public void aliPayHuiminCallback(Integer id,Integer uid) { + System.err.println("硬件开门后回调 存储惠民卡使用记录"); + System.err.println("id:"+id); + System.err.println("uid:"+uid); + if (id!=null){ + THuiminRecord huiminRecord = new THuiminRecord(); + TPayHuimin payHuimin = payHuiminService.getById(id); + huiminRecord.setPayId(id); + huiminRecord.setHuiminCardId(payHuimin.getCardId()); + huiminRecord.setInsertTime(new Date()); + huiminRecord.setAppUserId(uid); + huiminRecordService.save(huiminRecord); + } + } +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/WeiXinV3Controller.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/WeiXinV3Controller.java index 772b83a..9bcfa85 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/WeiXinV3Controller.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/WeiXinV3Controller.java @@ -1,76 +1,76 @@ -package com.dsh.activity.controller; - -import cn.hutool.core.collection.CollUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.dsh.activity.entity.*; -import com.dsh.activity.feignclient.account.StudentClient; -import com.dsh.activity.feignclient.other.SiteClient; -import com.dsh.activity.feignclient.other.StoreClient; -import com.dsh.activity.feignclient.other.model.Site; -import com.dsh.activity.feignclient.other.model.Store; -import com.dsh.activity.model.response.*; -import com.dsh.activity.service.*; -import com.dsh.activity.util.*; -//import com.dsh.activity.util.wx.WechatPaymentService; -import com.dsh.activity.util.wx.WxAppPayService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.*; -import java.util.stream.Collectors; - -/** - * @author zhibing.pu - * @date 2023/6/24 11:27 - */ -@RestController -@RequestMapping("/base") -public class WeiXinV3Controller { - -// @Resource -// private WechatPaymentService wechatPaymentService; - @Autowired - private WxAppPayService wxAppPayService; - @ResponseBody - @PostMapping("/testWeiXinV3") - @ApiOperation(value = "获取添加人员、选择人员说明文案") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") - }) - public ResultUtil getContentForStudent() throws Exception { -// Map<String, Object> stringObjectMap = wechatPaymentService.weChatDoUnifiedOrder(); - // ... 在你的下单方法中调用 ... - try { - String description = "商品描述"; - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); - String outTradeNo =sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); - BigDecimal amount = new BigDecimal("0.01"); // 支付金额,例如1分钱 - Map<String, String> payParams = wxAppPayService.createOrder(description, outTradeNo, amount); - return ResultUtil.success(payParams); - - // 将 payParams 返回给你的APP前端,前端使用这些参数调起微信支付SDK - // return ResponseEntity.ok(payParams); // 示例 - - } catch (Exception e) { - // 处理异常 - // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("下单失败"); - } - return ResultUtil.success(); - } - -} +//package com.dsh.activity.controller; +// +//import cn.hutool.core.collection.CollUtil; +//import com.alibaba.fastjson.JSONArray; +//import com.alibaba.fastjson.JSONObject; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.dsh.activity.entity.*; +//import com.dsh.activity.feignclient.account.StudentClient; +//import com.dsh.activity.feignclient.other.SiteClient; +//import com.dsh.activity.feignclient.other.StoreClient; +//import com.dsh.activity.feignclient.other.model.Site; +//import com.dsh.activity.feignclient.other.model.Store; +//import com.dsh.activity.model.response.*; +//import com.dsh.activity.service.*; +//import com.dsh.activity.util.*; +////import com.dsh.activity.util.wx.WechatPaymentService; +//import com.dsh.activity.util.wx.WxAppPayService; +//import io.swagger.annotations.Api; +//import io.swagger.annotations.ApiImplicitParam; +//import io.swagger.annotations.ApiImplicitParams; +//import io.swagger.annotations.ApiOperation; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.ResponseBody; +//import org.springframework.web.bind.annotation.RestController; +// +//import javax.annotation.Resource; +//import java.math.BigDecimal; +//import java.text.SimpleDateFormat; +//import java.time.LocalDate; +//import java.time.LocalDateTime; +//import java.time.ZoneId; +//import java.util.*; +//import java.util.stream.Collectors; +// +///** +// * @author zhibing.pu +// * @date 2023/6/24 11:27 +// */ +//@RestController +//@RequestMapping("/base") +//public class WeiXinV3Controller { +// +//// @Resource +//// private WechatPaymentService wechatPaymentService; +// @Autowired +// private WxAppPayService wxAppPayService; +// @ResponseBody +// @PostMapping("/testWeiXinV3") +// @ApiOperation(value = "获取添加人员、选择人员说明文案") +// @ApiImplicitParams({ +// @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") +// }) +// public ResultUtil getContentForStudent() throws Exception { +//// Map<String, Object> stringObjectMap = wechatPaymentService.weChatDoUnifiedOrder(); +// // ... 在你的下单方法中调用 ... +// try { +// String description = "商品描述"; +// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); +// String outTradeNo =sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); +// BigDecimal amount = new BigDecimal("0.01"); // 支付金额,例如1分钱 +// Map<String, String> payParams = wxAppPayService.createOrder(description, outTradeNo, amount); +// return ResultUtil.success(payParams); +// +// // 将 payParams 返回给你的APP前端,前端使用这些参数调起微信支付SDK +// // return ResponseEntity.ok(payParams); // 示例 +// +// } catch (Exception e) { +// // 处理异常 +// // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("下单失败"); +// } +// return ResultUtil.success(); +// } +// +//} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminRecord.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminRecord.java index 6a4b975..1724189 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminRecord.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminRecord.java @@ -45,6 +45,12 @@ @ApiModelProperty(value = "惠民卡id") private Integer huiminCardId; /** + * 惠民卡id + */ + @TableField("payId") + @ApiModelProperty(value = "惠民卡支付记录id") + private Integer payId; + /** *使用时间 */ @ApiModelProperty(value = "使用时间") diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/response/MyHuiminCardVO.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/MyHuiminCardVO.java index 0374b06..24b8837 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/model/response/MyHuiminCardVO.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/MyHuiminCardVO.java @@ -25,7 +25,7 @@ private String cover; @ApiModelProperty("是否过期 0否1是") private Integer isExpire; - @ApiModelProperty("是否可以退款 0否1是") + @ApiModelProperty("是否可以退款 0否1是 2退款中") private Integer isRefund; @ApiModelProperty("状态1待支付2使用中3已退款") private Integer status; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PayHuiminServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PayHuiminServiceImpl.java index fdc0890..1befab5 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PayHuiminServiceImpl.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PayHuiminServiceImpl.java @@ -50,8 +50,7 @@ List<SalesDetailVO> records = salesDetailVOPage.getRecords(); for (SalesDetailVO record : records) { List<THuiminRecord> list = huiminRecordService.list(new LambdaQueryWrapper<THuiminRecord>() - .eq(THuiminRecord::getAppUserId, record.getAppUserId()) - .eq(THuiminRecord::getHuiminCardId, record.getCarId())); + .eq(THuiminRecord::getPayId, record.getId())); record.setUseTimes(list.size()); } if (CollUtil.isNotEmpty(records)){ @@ -82,9 +81,8 @@ public ResultUtil<?> refund(Integer id) throws AlipayApiException { TPayHuimin payHuimin = this.getById(id); if (Objects.nonNull(payHuimin)) { - Integer count = huiminRecordService.lambdaQuery().eq(THuiminRecord::getAppUserId, payHuimin.getAppUserId()) - .eq(THuiminRecord::getHuiminCardId, payHuimin.getCardId()) - .lt(THuiminRecord::getInsertTime, DateUtil.addDay(payHuimin.getPaymentTime(),7)) + Integer count = huiminRecordService.lambdaQuery() + .eq(THuiminRecord::getPayId, payHuimin.getId()) .count(); if (count > 0 || new Date().after(DateUtil.addDay(payHuimin.getPaymentTime(),7))) { //超过七日或者七日内有使用记录的退款:更改状态,实际退款线下操作。 @@ -92,7 +90,7 @@ } else { if (payHuimin.getPaymentType() == 1) { Map<String, String> map = payMoneyUtil.wxRefund(payHuimin.getOrderNumber(), payHuimin.getCode(), - payHuimin.getSalesMoney().toString(), payHuimin.getSalesMoney().toString(), "/base/worldCup/wxRefundWorldCupCallback"); + payHuimin.getSalesMoney().toString(), payHuimin.getSalesMoney().toString(), "/base/huimin/callBack/wxRefundHuiminCallback"); if (!"SUCCESS".equals(map.get("return_code"))) { System.err.println("-------------微信退款失败---------"); System.err.println(map.get("return_msg")); diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/PayMoneyUtil.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/PayMoneyUtil.java index 12b44c4..15c0c44 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/util/PayMoneyUtil.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/util/PayMoneyUtil.java @@ -62,7 +62,6 @@ private String key = "6f5e0c2dcabfa9c27b5da5836a362fef";//微信商户号 private String callbackPath = "https://online.daowepark.com:443/activity";//支付回调网关地址 - // private String callbackPath = "http://vbef9arg13uu.guyubao.com/activity";//支付回调网关地址 private String app_cert_path = "C:/cert/alipay/user/app_cert_path.crt";//应用公钥证书路径 @@ -243,7 +242,7 @@ extendParams.setRoyaltyFreeze("false");// 冻结资金 用于后续分账处理 model.setExtendParams(extendParams); request.setBizModel(model); - request.setNotifyUrl(callbackPath + notifyUrl); + request.setNotifyUrl("http://8.137.22.229:5002" + notifyUrl); try { //这里和普通的接口调用不同,使用的是sdkExecute @@ -408,7 +407,7 @@ Map<String, Object> map = new HashMap<>(); map.put("appid", appid); map.put("mch_id", mchId); - map.put("sub_mch_id", "123456"); +// map.put("sub_mch_id", "123456"); map.put("nonce_str", nonce_str); String temp = ""; if (body.split("-").length>1){ diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WeChatPaymentServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WeChatPaymentServiceImpl.java deleted file mode 100644 index 981d6f2..0000000 --- a/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WeChatPaymentServiceImpl.java +++ /dev/null @@ -1,315 +0,0 @@ -//package com.dsh.activity.util.wx;/* -//* -//*改了七八遍 照顾找包困难的朋友吧 -//* -//*/ -//import cn.hutool.core.text.StrFormatter; -//import com.alibaba.fastjson.JSONObject; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import com.fasterxml.jackson.databind.node.ObjectNode; -//import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; -//import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; -//import com.wechat.pay.contrib.apache.httpclient.notification.Notification; -//import com.wechat.pay.contrib.apache.httpclient.notification.NotificationHandler; -//import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest; -//import org.apache.commons.lang3.RandomStringUtils; -//import org.apache.http.client.methods.CloseableHttpResponse; -//import org.apache.http.client.methods.HttpPost; -//import org.apache.http.entity.StringEntity; -//import org.apache.http.impl.client.CloseableHttpClient; -//import org.apache.http.util.EntityUtils; -//import org.springframework.stereotype.Service; -// -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -//import java.io.BufferedReader; -//import java.io.ByteArrayOutputStream; -//import java.math.BigDecimal; -//import java.nio.charset.StandardCharsets; -//import java.util.HashMap; -//import java.util.Map; -// -//@Service -//public class WeChatPaymentServiceImpl implements WechatPaymentService { -// -// -// -// /** -// * V3微信支付统一下单 -// * -// * @return -// * -// */ -// @Override -// public Map<String, Object>weChatDoUnifiedOrder() { -// Map<String,Object> map =new HashMap<>(); -// //支付总金额 -// BigDecimal totalPrice = BigDecimal.ZERO; -// totalPrice = totalPrice.add(BigDecimal.valueOf(600)); -// //转换金额保留两位小数点 -// Integer money=new BigDecimal(String.valueOf(totalPrice)).movePointRight(2).intValue(); -// try { -// CloseableHttpClient httpClient = WXPaySignatureCertificateUtil.checkSign(); -// -// //app下单 -// HttpPost httpPost = new HttpPost(WXPayConstants.DOMAIN_API+WXPayConstants.PAY_TRANSACTIONS_APP); -// httpPost.addHeader("Accept", "application/json"); -// httpPost.addHeader("Content-type", "application/json; charset=utf-8"); -// ByteArrayOutputStream bos = new ByteArrayOutputStream(); -// ObjectMapper objectMapper = new ObjectMapper(); -// ObjectNode rootNode = objectMapper.createObjectNode(); -// rootNode.put("mchid", "商户id") -// .put("appid", "APPID") -// .put("description","描述") -// .put("notify_url", WXPayConstants.WECHAT_PAY_NOTIFY_URL)//回调 -// .put("out_trade_no", "订单号"); -// rootNode.putObject("amount") -// .put("total","总金额"); -// objectMapper.writeValue(bos, rootNode); -// httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8")); -// //完成签名并执行请求 -// CloseableHttpResponse response = httpClient.execute(httpPost); -// //获取返回状态 -// int statusCode = response.getStatusLine().getStatusCode(); -// if (statusCode == 200) { //处理成功 -// String result = EntityUtils.toString(response.getEntity(), "UTF-8"); -// JSONObject object = JSONObject.parseObject(result); -// //获取预付单 -// String prepayId = object.getString("prepay_id"); -// //生成签名 -// Long timestamp = System.currentTimeMillis() / 1000; -// //随机字符串 这个是微信支付maven自带的 也可以用其它的 -// //这个是v2支付依赖自带的工具包 可以去掉了 -// //String nonceStr = WXPayUtil.generateNonceStr(); -// //该方法org.apache.commons.lang3.RandomStringUtils依赖自带随机生成字符串 RandomStringUtils.randomAlphanumeric(32) 代表生成32位 -// String nonceStr = RandomStringUtils.randomAlphanumeric(32); -// //生成带签名支付信息 -// String paySign = WXPaySignatureCertificateUtil.appPaySign(String.valueOf(timestamp), nonceStr, prepayId); -// Map<String, String> param = new HashMap<>(); -// param.put("appid", WxV3PayConfig.APP_ID); -// param.put("partnerid", WxV3PayConfig.Mch_ID); -// param.put("prepayid", prepayId); -// param.put("package", "Sign=WXPay"); -// param.put("noncestr", nonceStr); -// param.put("timestamp", String.valueOf(timestamp)); -// param.put("sign", paySign); -// map.put("code",200); -// map.put("message", "下单成功"); -// map.put("data", param); -// return map; -// } -// map.put("code",200); -// map.put("message", "下单失败"); -// map.put("data", response); -// return map; -// } catch (Exception e) { -// e.printStackTrace(); -// } -// return null; -// } -// -// -// /** -// * 微信支付回调通知 -// * @return -// */ -// @Override -// public Map<String, Object> weChatNotificationHandler(HttpServletRequest request, HttpServletResponse response){ -// Map<String,Object> map = new HashMap<>(); -// try { -// BufferedReader br = request.getReader(); -// String str = null; -// StringBuilder sb = new StringBuilder(); -// while ((str = br.readLine())!=null) { -// sb.append(str); -// } -// // 构建request,传入必要参数 -// NotificationRequest requests = new NotificationRequest.Builder() -// .withSerialNumber(request.getHeader("Wechatpay-Serial")) -// .withNonce(request.getHeader("Wechatpay-Nonce")) -// .withTimestamp(request.getHeader("Wechatpay-Timestamp")) -// .withSignature(request.getHeader("Wechatpay-Signature")) -// .withBody(String.valueOf(sb)) -// .build(); -// //验签 -// NotificationHandler handler = new NotificationHandler(WXPaySignatureCertificateUtil.getVerifier(), WxV3PayConfig.apiV3Key.getBytes(StandardCharsets.UTF_8)); -// //解析请求体 -// Notification notification = handler.parse(requests); -// String decryptData = notification.getDecryptData(); -// //解析 -// JSONObject jsonObject = JSONObject.parseObject(decryptData); -// //支付状态交易状态,枚举值: SUCCESS:支付成功 REFUND:转入退款 NOTPAY:未支付 CLOSED:已关闭 REVOKED:已撤销(付款码支付) -// // USERPAYING:用户支付中(付款码支付) PAYERROR:支付失败(其他原因,如银行返回失败) -// String trade_state = String.valueOf(jsonObject.get("trade_state")); -// if (trade_state.equals("SUCCESS")) { -// //订单号 -// String orderNumber = String.valueOf(jsonObject.get("out_trade_no")); -// //微信支付微信生成的订单号 -// String transactionId = String.valueOf(jsonObject.get("transaction_id")); -// //省略查询订单 -// //此处处理业务 -// map.put("code","SUCCESS"); -// map.put("message","成功"); -// //消息推送成功 -// return map; -// } -// map.put("code","RESOURCE_NOT_EXISTS"); -// map.put("message", "订单不存在"); -// return map; -// }catch (Exception e) { -// e.printStackTrace(); -// } -// map.put("code","FAIL"); -// map.put("message", "失败"); -// return map; -// } -///** -// * 关闭订单 -// * @param outTradeNo 订单号 -// * @return -// */ -// @Override -// public Map<String, Object> closeOrder(String outTradeNo) { -// Map<String,Object> map = new HashMap<>(); -// try { -// //验证证书 -// CloseableHttpClient httpClient = WXPaySignatureCertificateUtil.checkSign(); -// //关闭订单 -// String url = StrFormatter.format(WXPayConstants.DOMAIN_API+WXPayConstants.PAY_TRANSACTIONS_OUT_TRADE_NO, outTradeNo); -// HttpPost httpPost = new HttpPost(url); -// httpPost.addHeader("Accept", "application/json"); -// httpPost.addHeader("Content-type", "application/json; charset=utf-8"); -// ByteArrayOutputStream bos = new ByteArrayOutputStream(); -// //2.添加商户id -// ObjectMapper objectMapper = new ObjectMapper(); -// ObjectNode rootNode = objectMapper.createObjectNode(); -// rootNode.put("mchid", WxV3PayConfig.Mch_ID); -// objectMapper.writeValue(bos, rootNode); -// //3.调起微信关单接口 -// httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8")); -// //完成签名并执行请求 -// CloseableHttpResponse response = httpClient.execute(httpPost); -// System.out.println(response.getStatusLine().getStatusCode() == 204); -// //无数据(Http状态码为204) 微信返回结果无数据 状态码为204 成功 -// if (response.getStatusLine().getStatusCode() == 204) { -// -// //code 退款码请前往微信支付文档查询 -// map.put("code",200); -// map.put("message", "关闭订单成功!"); -// return map; -// } -// } catch (Exception e) { -// } -// return null; -// } -// -// /** -// * 微信退款 -// * @param outTradeNo 订单号 -// * @return -// */ -// @Override -// public Map<String, Object> weChatRefunds(String outTradeNo) { -// Map<String,Object> map = new HashMap<>(); -// //退款总金额 -// BigDecimal totalPrice = BigDecimal.ZERO; -// totalPrice = totalPrice.add(BigDecimal.valueOf(600)); -// //转换金额 -// Integer money=new BigDecimal(String.valueOf(totalPrice)).movePointRight(2).intValue(); -// -// try { -// //验证证书 -// CloseableHttpClient httpClient = WXPaySignatureCertificateUtil.checkSign(); -// //申请退款接口 -// HttpPost httpPost = new HttpPost(WXPayConstants.DOMAIN_API+WXPayConstants.REFUND_DOMESTIC_REFUNDS); -// httpPost.addHeader("Accept", "application/json"); -// httpPost.addHeader("Content-type","application/json; charset=utf-8"); -// ByteArrayOutputStream bos = new ByteArrayOutputStream(); -// ObjectMapper objectMapper = new ObjectMapper(); -// ObjectNode rootNode = objectMapper.createObjectNode(); -// //微信支付订单号 -// rootNode.put("transaction_id", "微信支付订单号") -// //退款订单号 -// .put("out_refund_no","生成退款订单号") -// .put("notify_url","退款回调"); -// //退款金额 -// rootNode.putObject("amount") -// .put("refund", "100.00") -// //原订单金额 -// .put("total", "100.00") -// .put("currency","CNY"); -// objectMapper.writeValue(bos, rootNode); -// httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8")); -// CloseableHttpResponse response = httpClient.execute(httpPost); -// //退款成功返回消息 -// String bodyAsString = EntityUtils.toString(response.getEntity()); -// JSONObject jsonObject = JSONObject.parseObject(bodyAsString); -// if (jsonObject.get("status").equals("SUCCESS") || jsonObject.get("status").equals("PROCESSING")) { -// //code返回 -// map.put("code",200); -// map.put("message", "退款成功"); -// return map; -// } -// }catch (Exception e) { -// e.printStackTrace(); -// } -// map.put("code",500); -// map.put("message", "申请退款失败!"); -//// map.put("data", jsonObject); -// return map; -// } -// -// /** -// * 申请退款回调 -// * @param request -// * @return -// */ -// @Override -// public Map<String,Object> weChatPayRefundsNotify(HttpServletRequest request) { -// Map<String,Object> map = new HashMap<>(); -// try { -// BufferedReader br = request.getReader(); -// String str = null; -// StringBuilder sb = new StringBuilder(); -// while ((str = br.readLine())!=null) { -// sb.append(str); -// } -// // 构建request,传入必要参数 -// NotificationRequest requests = new NotificationRequest.Builder() -// .withSerialNumber(request.getHeader("Wechatpay-Serial")) -// .withNonce(request.getHeader("Wechatpay-Nonce")) -// .withTimestamp(request.getHeader("Wechatpay-Timestamp")) -// .withSignature(request.getHeader("Wechatpay-Signature")) -// .withBody(String.valueOf(sb)) -// .build(); -// //验签 -// NotificationHandler handler = new NotificationHandler(WXPaySignatureCertificateUtil.getVerifier(), WxV3PayConfig.apiV3Key.getBytes(StandardCharsets.UTF_8)); -// //解析请求体 -// Notification notification = handler.parse(requests); -// String decryptData = notification.getDecryptData(); -// //解析 -// JSONObject jsonObject = JSONObject.parseObject(decryptData); -// String refund_status = String.valueOf(jsonObject.get("refund_status")); -// if (refund_status.equals("SUCCESS")) { -// //订单号 -// String orderNumber = String.valueOf(jsonObject.get("out_trade_no")); -// //微信支付订单号 -// String transactionId = String.valueOf(jsonObject.get("transaction_id")); -// -// //这里是处理业务逻辑 -// -// -// //code 退款码请前往微信支付文档查询 -// map.put("code","RESOURCE_NOT_EXISTS"); -// map.put("message", "订单不存在"); -// return map; -// } -// }catch (Exception e) { -// e.printStackTrace(); -// } -// map.put("code","USER_ACCOUNT_ABNORMAL"); -// map.put("message", "退款请求失败"); -// return map; -// } -// -//} \ No newline at end of file diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WechatPaymentService.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WechatPaymentService.java deleted file mode 100644 index 5199d0c..0000000 --- a/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WechatPaymentService.java +++ /dev/null @@ -1,56 +0,0 @@ -//package com.dsh.activity.util.wx; -// -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -//import java.util.Map; -// -///** -// * @author 影子 -// */ -//public interface WechatPaymentService -//{ -// -// -// /** -// * 微信商品支付 -// * @return -// */ -// public Map<String, Object> weChatDoUnifiedOrder() throws Exception; -// -// -// -// -//// /** -//// * 微信支付回调通知 -//// * @param -//// * @return -//// */ -//// public Map<String, Object> weChatNotificationHandler(HttpServletRequest request, HttpServletResponse response); -//// -//// /** -//// *微信关闭订单 -//// * @param outTradeNo -//// * @return -//// */ -//// public Map<String, Object> closeOrder(String outTradeNo); -//// -//// -//// -//// -//// /** -//// * 申请退款 -//// * @param -//// * @return -//// */ -//// public Map<String, Object> weChatPayRefundsNotify(HttpServletRequest request); -//// -//// -//// -//// -//// /** -//// * 微信退款 -//// * @param outTradeNo 订单号 -//// * @return -//// */ -//// public Map<String, Object> weChatRefunds(String outTradeNo); -//} \ No newline at end of file diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WxAppPayService.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WxAppPayService.java index 4d53065..0b243e3 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WxAppPayService.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/util/wx/WxAppPayService.java @@ -1,221 +1,222 @@ -package com.dsh.activity.util.wx; - -import com.dsh.activity.util.wx.WXPayConstants; -import com.dsh.activity.util.wx.WXPaySignatureCertificateUtil; -import com.dsh.activity.util.wx.WxV3PayConfig; -import com.fasterxml.jackson.databind.JsonNode; // 引入Jackson库处理JSON -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - -@Service -public class WxAppPayService { - - private static final Logger log = LoggerFactory.getLogger(WxAppPayService.class); - - private final ObjectMapper objectMapper; // 用于JSON序列化和反序列化 - private final CloseableHttpClient wechatPayClient; // 注入通过工具类创建的HTTP客户端 - - @Autowired - public WxAppPayService(ObjectMapper objectMapper) throws IOException { - this.objectMapper = objectMapper; - // 在构造函数中初始化带有签名验证功能的HTTP客户端 - this.wechatPayClient = WXPaySignatureCertificateUtil.getWechatPayClient(); - log.info("微信支付V3 HTTP客户端初始化完成。"); - } - - /** - * 创建APP支付预付单 (统一下单) - * - * @param description 商品描述 - * @param outTradeNo 商户订单号 (要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一) - * @param totalAmount 支付总金额 (单位:元) - * @return 用于调起APP支付的参数 Map (appid, partnerid, prepayid, package, noncestr, timestamp, sign) - * @throws IOException 网络或IO异常 - * @throws RuntimeException 支付请求失败或处理异常 - */ - public Map<String, String> createOrder(String description, String outTradeNo, BigDecimal totalAmount) - throws IOException { - - // 1. 构建请求URL - String url = WXPayConstants.DOMAIN_API + WXPayConstants.PAY_TRANSACTIONS_APP; - HttpPost httpPost = new HttpPost(url); - httpPost.addHeader("Accept", "application/json"); - httpPost.addHeader("Content-type", "application/json; charset=utf-8"); - - // 2. 构建请求体 JSON - ObjectNode rootNode = objectMapper.createObjectNode(); -// rootNode.put("appid", WxV3PayConfig.APP_ID);//服务商不需要该字段 -// rootNode.put("mchid", WxV3PayConfig.Mch_ID);//服务商不需要该字段 - rootNode.put("description", description); - rootNode.put("out_trade_no", outTradeNo); - rootNode.put("notify_url", WXPayConstants.WECHAT_PAY_NOTIFY_URL); // 使用常量中的回调地址 - - ObjectNode amountNode = objectMapper.createObjectNode(); - // 微信支付金额单位为分,需要转换 - amountNode.put("total", totalAmount.multiply(new BigDecimal("100")).intValue()); - amountNode.put("currency", "CNY"); // 货币类型,默认人民币 - rootNode.set("amount", amountNode); - - // 如果你是服务商模式,需要添加子商户信息 - rootNode.put("sp_mchid", WxV3PayConfig.Mch_ID); - rootNode.put("sub_mchid", "123"); - rootNode.put("sp_appid", "wx41d32f362ba0f911"); - // rootNode.put("sub_appid", "子商户AppID"); // 如果子商户需要用自己的AppID拉起支付 - - String requestBody = rootNode.toString(); - log.info("微信APP支付下单请求体: {}", requestBody); - httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); - - // 3. 发送请求 - try (CloseableHttpResponse response = wechatPayClient.execute(httpPost)) { - int statusCode = response.getStatusLine().getStatusCode(); - String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - log.info("微信APP支付下单响应状态码: {}, 响应体: {}", statusCode, responseBody); - - if (statusCode == 200) { // HTTP状态码 200 表示成功 - JsonNode responseNode = objectMapper.readTree(responseBody); - String prepayId = responseNode.get("prepay_id").asText(); - log.info("成功获取预支付交易会话标识 (prepay_id): {}", prepayId); - - // 4. 生成调起支付所需的参数 - Map<String, String> payParams = WXPaySignatureCertificateUtil.buildAppPayParams(prepayId); - log.info("生成APP支付参数: {}", payParams); - return payParams; - - } else { - // 处理错误情况 - log.error("微信APP支付下单失败,状态码: {}, 响应: {}", statusCode, responseBody); - // 可以根据 responseBody 中的 code 和 message 进一步分析错误 - throw new RuntimeException("微信APP支付下单失败: " + responseBody); - } - } catch (Exception e) { - log.error("微信APP支付下单请求执行异常", e); - throw new IOException("微信APP支付下单请求执行异常", e); - } - } - - /** - * 关闭订单 (根据商户订单号) - * - * @param outTradeNo 商户订单号 - * @return true 如果关闭成功或订单已关闭/不存在 (根据微信文档,成功是204 No Content) - * @throws IOException 网络或IO异常 - * @throws RuntimeException 关闭请求失败或处理异常 - */ - public boolean closeOrder(String outTradeNo) throws IOException { - // 1. 构建请求URL, 注意替换占位符 - String url = WXPayConstants.DOMAIN_API - + WXPayConstants.PAY_TRANSACTIONS_OUT_TRADE_NO.replace("{}", outTradeNo); - - HttpPost httpPost = new HttpPost(url); - httpPost.addHeader("Accept", "application/json"); - httpPost.addHeader("Content-type", "application/json; charset=utf-8"); - - // 2. 构建请求体 JSON (只需要商户号) - ObjectNode rootNode = objectMapper.createObjectNode(); - rootNode.put("mchid", WxV3PayConfig.Mch_ID); - // 如果是服务商模式,则用 sp_mchid - rootNode.put("sp_mchid", WxV3PayConfig.Mch_ID); - - String requestBody = rootNode.toString(); - log.info("微信关单请求 URL: {}, 请求体: {}", url, requestBody); - httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); - - // 3. 发送请求 - try (CloseableHttpResponse response = wechatPayClient.execute(httpPost)) { - int statusCode = response.getStatusLine().getStatusCode(); - // 关单成功时,微信返回 HTTP 状态码 204 No Content - log.info("微信关单响应状态码: {}", statusCode); - if (statusCode == 204) { - log.info("订单 {} 关闭成功。", outTradeNo); - return true; - } else { - String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - log.error("微信关单失败,商户订单号: {}, 状态码: {}, 响应: {}", outTradeNo, statusCode, responseBody); - // 根据需要可以解析responseBody获取错误详情 - return false; // 或者抛出异常,根据业务决定 - } - } catch (Exception e) { - log.error("微信关单请求执行异常, 商户订单号: {}", outTradeNo, e); - throw new IOException("微信关单请求执行异常", e); - } - } - - - // --- 退款相关方法 (可选) --- - - /** - * 申请退款 - * - * @param outTradeNo 原商户订单号 - * @param outRefundNo 商户退款单号 (商户系统内部的退款单号,要求唯一) - * @param reason 退款原因 (可选) - * @param refundAmount 退款金额 (单位:元) - * @param totalAmount 原订单总金额 (单位:元) - * @return 退款处理结果,可以返回微信返回的JSON节点或自定义对象 - * @throws IOException 网络或IO异常 - * @throws RuntimeException 退款请求失败或处理异常 - */ - public JsonNode createRefund(String outTradeNo, String outRefundNo, String reason, - BigDecimal refundAmount, BigDecimal totalAmount) throws IOException { - - String url = WXPayConstants.DOMAIN_API + WXPayConstants.REFUND_DOMESTIC_REFUNDS; - HttpPost httpPost = new HttpPost(url); - httpPost.addHeader("Accept", "application/json"); - httpPost.addHeader("Content-type", "application/json; charset=utf-8"); - - ObjectNode rootNode = objectMapper.createObjectNode(); - // 如果是服务商模式,需要添加子商户号 - // rootNode.put("sub_mchid", "子商户号"); - rootNode.put("out_trade_no", outTradeNo); - rootNode.put("out_refund_no", outRefundNo); - if (reason != null && !reason.isEmpty()) { - rootNode.put("reason", reason); - } - // 设置退款回调地址 - rootNode.put("notify_url", WXPayConstants.WECHAT_REFUNDS_NOTIFY_URL); - - ObjectNode amountNode = objectMapper.createObjectNode(); - amountNode.put("refund", refundAmount.multiply(new BigDecimal("100")).intValue()); // 退款金额,分 - amountNode.put("total", totalAmount.multiply(new BigDecimal("100")).intValue()); // 原订单金额,分 - amountNode.put("currency", "CNY"); - rootNode.set("amount", amountNode); - - String requestBody = rootNode.toString(); - log.info("微信申请退款请求体: {}", requestBody); - httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); - - try (CloseableHttpResponse response = wechatPayClient.execute(httpPost)) { - int statusCode = response.getStatusLine().getStatusCode(); - String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - log.info("微信申请退款响应状态码: {}, 响应体: {}", statusCode, responseBody); - - if (statusCode == 200) { // 成功受理 - log.info("微信退款申请成功受理。"); - return objectMapper.readTree(responseBody); - } else { - log.error("微信申请退款失败,状态码: {}, 响应: {}", statusCode, responseBody); - throw new RuntimeException("微信申请退款失败: " + responseBody); - } - } catch (Exception e) { - log.error("微信申请退款请求执行异常", e); - throw new IOException("微信申请退款请求执行异常", e); - } - } - -} \ No newline at end of file +//package com.dsh.activity.util.wx; +// +//import com.dsh.activity.util.wx.WXPayConstants; +//import com.dsh.activity.util.wx.WXPaySignatureCertificateUtil; +//import com.dsh.activity.util.wx.WxV3PayConfig; +//import com.fasterxml.jackson.databind.JsonNode; // 引入Jackson库处理JSON +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.fasterxml.jackson.databind.node.ObjectNode; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpPost; +//import org.apache.http.entity.StringEntity; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.util.EntityUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Service; +// +//import java.io.IOException; +//import java.math.BigDecimal; +//import java.nio.charset.StandardCharsets; +//import java.util.HashMap; +//import java.util.Map; +// +//@Component +//public class WxAppPayService { +// +// private static final Logger log = LoggerFactory.getLogger(WxAppPayService.class); +// +// private final ObjectMapper objectMapper; // 用于JSON序列化和反序列化 +// private final CloseableHttpClient wechatPayClient; // 注入通过工具类创建的HTTP客户端 +// +// @Autowired +// public WxAppPayService(ObjectMapper objectMapper) throws IOException { +// this.objectMapper = objectMapper; +// // 在构造函数中初始化带有签名验证功能的HTTP客户端 +// this.wechatPayClient = WXPaySignatureCertificateUtil.getWechatPayClient(); +// log.info("微信支付V3 HTTP客户端初始化完成。"); +// } +// +// /** +// * 创建APP支付预付单 (统一下单) +// * +// * @param description 商品描述 +// * @param outTradeNo 商户订单号 (要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一) +// * @param totalAmount 支付总金额 (单位:元) +// * @return 用于调起APP支付的参数 Map (appid, partnerid, prepayid, package, noncestr, timestamp, sign) +// * @throws IOException 网络或IO异常 +// * @throws RuntimeException 支付请求失败或处理异常 +// */ +// public Map<String, String> createOrder(String description, String outTradeNo, BigDecimal totalAmount) +// throws IOException { +// +// // 1. 构建请求URL +// String url = WXPayConstants.DOMAIN_API + WXPayConstants.PAY_TRANSACTIONS_APP; +// HttpPost httpPost = new HttpPost(url); +// httpPost.addHeader("Accept", "application/json"); +// httpPost.addHeader("Content-type", "application/json; charset=utf-8"); +// +// // 2. 构建请求体 JSON +// ObjectNode rootNode = objectMapper.createObjectNode(); +//// rootNode.put("appid", WxV3PayConfig.APP_ID);//服务商不需要该字段 +//// rootNode.put("mchid", WxV3PayConfig.Mch_ID);//服务商不需要该字段 +// rootNode.put("description", description); +// rootNode.put("out_trade_no", outTradeNo); +// rootNode.put("notify_url", WXPayConstants.WECHAT_PAY_NOTIFY_URL); // 使用常量中的回调地址 +// +// ObjectNode amountNode = objectMapper.createObjectNode(); +// // 微信支付金额单位为分,需要转换 +// amountNode.put("total", totalAmount.multiply(new BigDecimal("100")).intValue()); +// amountNode.put("currency", "CNY"); // 货币类型,默认人民币 +// rootNode.set("amount", amountNode); +// +// // 如果你是服务商模式,需要添加子商户信息 +// rootNode.put("sp_mchid", WxV3PayConfig.Mch_ID); +// rootNode.put("sub_mchid", "123"); +// rootNode.put("sp_appid", "wx41d32f362ba0f911"); +// // rootNode.put("sub_appid", "子商户AppID"); // 如果子商户需要用自己的AppID拉起支付 +// +// String requestBody = rootNode.toString(); +// log.info("微信APP支付下单请求体: {}", requestBody); +// httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); +// +// // 3. 发送请求 +// try (CloseableHttpResponse response = wechatPayClient.execute(httpPost)) { +// int statusCode = response.getStatusLine().getStatusCode(); +// String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); +// log.info("微信APP支付下单响应状态码: {}, 响应体: {}", statusCode, responseBody); +// +// if (statusCode == 200) { // HTTP状态码 200 表示成功 +// JsonNode responseNode = objectMapper.readTree(responseBody); +// String prepayId = responseNode.get("prepay_id").asText(); +// log.info("成功获取预支付交易会话标识 (prepay_id): {}", prepayId); +// +// // 4. 生成调起支付所需的参数 +// Map<String, String> payParams = WXPaySignatureCertificateUtil.buildAppPayParams(prepayId); +// log.info("生成APP支付参数: {}", payParams); +// return payParams; +// +// } else { +// // 处理错误情况 +// log.error("微信APP支付下单失败,状态码: {}, 响应: {}", statusCode, responseBody); +// // 可以根据 responseBody 中的 code 和 message 进一步分析错误 +// throw new RuntimeException("微信APP支付下单失败: " + responseBody); +// } +// } catch (Exception e) { +// log.error("微信APP支付下单请求执行异常", e); +// throw new IOException("微信APP支付下单请求执行异常", e); +// } +// } +// +// /** +// * 关闭订单 (根据商户订单号) +// * +// * @param outTradeNo 商户订单号 +// * @return true 如果关闭成功或订单已关闭/不存在 (根据微信文档,成功是204 No Content) +// * @throws IOException 网络或IO异常 +// * @throws RuntimeException 关闭请求失败或处理异常 +// */ +// public boolean closeOrder(String outTradeNo) throws IOException { +// // 1. 构建请求URL, 注意替换占位符 +// String url = WXPayConstants.DOMAIN_API +// + WXPayConstants.PAY_TRANSACTIONS_OUT_TRADE_NO.replace("{}", outTradeNo); +// +// HttpPost httpPost = new HttpPost(url); +// httpPost.addHeader("Accept", "application/json"); +// httpPost.addHeader("Content-type", "application/json; charset=utf-8"); +// +// // 2. 构建请求体 JSON (只需要商户号) +// ObjectNode rootNode = objectMapper.createObjectNode(); +// rootNode.put("mchid", WxV3PayConfig.Mch_ID); +// // 如果是服务商模式,则用 sp_mchid +// rootNode.put("sp_mchid", WxV3PayConfig.Mch_ID); +// +// String requestBody = rootNode.toString(); +// log.info("微信关单请求 URL: {}, 请求体: {}", url, requestBody); +// httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); +// +// // 3. 发送请求 +// try (CloseableHttpResponse response = wechatPayClient.execute(httpPost)) { +// int statusCode = response.getStatusLine().getStatusCode(); +// // 关单成功时,微信返回 HTTP 状态码 204 No Content +// log.info("微信关单响应状态码: {}", statusCode); +// if (statusCode == 204) { +// log.info("订单 {} 关闭成功。", outTradeNo); +// return true; +// } else { +// String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); +// log.error("微信关单失败,商户订单号: {}, 状态码: {}, 响应: {}", outTradeNo, statusCode, responseBody); +// // 根据需要可以解析responseBody获取错误详情 +// return false; // 或者抛出异常,根据业务决定 +// } +// } catch (Exception e) { +// log.error("微信关单请求执行异常, 商户订单号: {}", outTradeNo, e); +// throw new IOException("微信关单请求执行异常", e); +// } +// } +// +// +// // --- 退款相关方法 (可选) --- +// +// /** +// * 申请退款 +// * +// * @param outTradeNo 原商户订单号 +// * @param outRefundNo 商户退款单号 (商户系统内部的退款单号,要求唯一) +// * @param reason 退款原因 (可选) +// * @param refundAmount 退款金额 (单位:元) +// * @param totalAmount 原订单总金额 (单位:元) +// * @return 退款处理结果,可以返回微信返回的JSON节点或自定义对象 +// * @throws IOException 网络或IO异常 +// * @throws RuntimeException 退款请求失败或处理异常 +// */ +// public JsonNode createRefund(String outTradeNo, String outRefundNo, String reason, +// BigDecimal refundAmount, BigDecimal totalAmount) throws IOException { +// +// String url = WXPayConstants.DOMAIN_API + WXPayConstants.REFUND_DOMESTIC_REFUNDS; +// HttpPost httpPost = new HttpPost(url); +// httpPost.addHeader("Accept", "application/json"); +// httpPost.addHeader("Content-type", "application/json; charset=utf-8"); +// +// ObjectNode rootNode = objectMapper.createObjectNode(); +// // 如果是服务商模式,需要添加子商户号 +// // rootNode.put("sub_mchid", "子商户号"); +// rootNode.put("out_trade_no", outTradeNo); +// rootNode.put("out_refund_no", outRefundNo); +// if (reason != null && !reason.isEmpty()) { +// rootNode.put("reason", reason); +// } +// // 设置退款回调地址 +// rootNode.put("notify_url", WXPayConstants.WECHAT_REFUNDS_NOTIFY_URL); +// +// ObjectNode amountNode = objectMapper.createObjectNode(); +// amountNode.put("refund", refundAmount.multiply(new BigDecimal("100")).intValue()); // 退款金额,分 +// amountNode.put("total", totalAmount.multiply(new BigDecimal("100")).intValue()); // 原订单金额,分 +// amountNode.put("currency", "CNY"); +// rootNode.set("amount", amountNode); +// +// String requestBody = rootNode.toString(); +// log.info("微信申请退款请求体: {}", requestBody); +// httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8)); +// +// try (CloseableHttpResponse response = wechatPayClient.execute(httpPost)) { +// int statusCode = response.getStatusLine().getStatusCode(); +// String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); +// log.info("微信申请退款响应状态码: {}, 响应体: {}", statusCode, responseBody); +// +// if (statusCode == 200) { // 成功受理 +// log.info("微信退款申请成功受理。"); +// return objectMapper.readTree(responseBody); +// } else { +// log.error("微信申请退款失败,状态码: {}, 响应: {}", statusCode, responseBody); +// throw new RuntimeException("微信申请退款失败: " + responseBody); +// } +// } catch (Exception e) { +// log.error("微信申请退款请求执行异常", e); +// throw new IOException("微信申请退款请求执行异常", e); +// } +// } +// +//} \ No newline at end of file diff --git a/cloud-server-activity/src/main/resources/mapper/PayHuiminMapper.xml b/cloud-server-activity/src/main/resources/mapper/PayHuiminMapper.xml index 758cf33..5129063 100644 --- a/cloud-server-activity/src/main/resources/mapper/PayHuiminMapper.xml +++ b/cloud-server-activity/src/main/resources/mapper/PayHuiminMapper.xml @@ -28,15 +28,13 @@ <if test="query.huiMinType !=null and query.huiMinType != ''"> AND thc.huiMinType = #{query.huiMinType} </if> - <if test="query.operatorId !=null and query.operatorId != ''"> - AND thc.huiMinType = #{query.huiMinType} + <if test="query.operatorId !=null "> + AND thc.operatorId = #{query.operatorId} </if> <if test="query.useId !=null and query.useId != ''"> AND FIND_IN_SET(#{query.useId},thc.useIds) </if> - <if test="query.useId !=null and query.useId != ''"> - AND FIND_IN_SET(#{query.useId},thc.useIds) - </if> + <if test="query.appUserIds != null and query.appUserIds.size()>0"> AND tph.appUserId IN <foreach collection="query.appUserIds" item="appUserId" open="(" separator="," close=")"> diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TPayHuiminController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TPayHuiminController.java index d349876..edcad6c 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TPayHuiminController.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TPayHuiminController.java @@ -142,6 +142,7 @@ records.forEach(item->{ item.setOperatorName(operatorMap.getOrDefault(item.getOperatorId(),"")); StringBuilder sb = new StringBuilder(); + System.err.println("==========="+item); Arrays.stream(item.getStoreIds().split(",")).map(Integer::parseInt).forEach(s->{ sb.append( storeMap.getOrDefault(s, "")); sb.append(","); diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/ImageUtils.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/ImageUtils.java index 425161f..7298646 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/ImageUtils.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/ImageUtils.java @@ -66,13 +66,5 @@ } // 示例用法 - public static void main(String[] args) { - try { - Dimension dimension = getImageDimensions("https://we-park-life.oss-cn-beijing.aliyuncs.com/img/e4ef2672d1a6456f9cd680ce51cf3a6e.jpg"); - System.out.println(dimension); - System.out.println(dimension.getDisplayType()); - } catch (IOException e) { - e.printStackTrace(); - } - } + } \ No newline at end of file diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html index 5f4374b..dcc67ca 100644 --- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html +++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html @@ -7,9 +7,9 @@ </div> <div class="ibox-content"> <el-form :inline="true" :model="query"> - <el-form-item label="惠民卡名称:"> + <elshou-form-item label="惠民卡名称:"> <el-input v-model="query.huiMinName" placeholder="请输入"></el-input> - </el-form-item> + </elshou-form-item> <el-form-item label="惠民卡类型:"> <el-select v-model="query.huiMinType" placeholder="全部"> -- Gitblit v1.7.1