Compare commits

...

2 Commits

7 changed files with 139 additions and 6 deletions

View File

@ -0,0 +1,34 @@
package com.njzscloud.supervisory.biz.controller;
import com.njzscloud.common.core.utils.R;
import com.njzscloud.supervisory.biz.pojo.param.QRCodeParam;
import com.njzscloud.supervisory.biz.service.QRCodeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*
* @author ljw
*/
@Slf4j
@RestController
@RequestMapping("/qr")
@RequiredArgsConstructor
public class QRCodeController {
private final QRCodeService qrCodeService;
/**
*
*/
@GetMapping("/getCode")
public R<?> getCode(QRCodeParam codeParam) {
return R.success(qrCodeService.getCode(codeParam));
}
}

View File

@ -0,0 +1,37 @@
package com.njzscloud.supervisory.biz.pojo.param;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
/**
* @author ljw
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class QRCodeParam {
/**
*
*/
private String content;
/**
*
*/
private Integer width;
/**
*
*/
private Integer height;
/**
* jpg png
*/
private String imgType;
}

View File

@ -0,0 +1,39 @@
package com.njzscloud.supervisory.biz.service;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.njzscloud.supervisory.biz.pojo.param.QRCodeParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
*
* @author ljw
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class QRCodeService {
public String getCode(QRCodeParam codeParam) {
Integer width = codeParam.getWidth();
Integer height = codeParam.getHeight();
if (width == null) {
width = 300;
}
if (height == null) {
height = 300;
}
String imgType = codeParam.getImgType();
if (imgType == null) {
imgType = ImgUtil.IMAGE_TYPE_JPG;
}
return QrCodeUtil.generateAsBase64(codeParam.getContent(), new QrConfig(width, height), imgType);
}
}

View File

@ -48,6 +48,7 @@ import java.time.LocalDateTime;
/** /**
* *
* 使SDK * 使SDK
* @author ljw
*/ */
@Slf4j @Slf4j
@RestController @RestController
@ -120,11 +121,13 @@ public class PaymentController {
WxPayUnifiedOrderRequest wxRequest = new WxPayUnifiedOrderRequest(); WxPayUnifiedOrderRequest wxRequest = new WxPayUnifiedOrderRequest();
wxRequest.setOutTradeNo(outTradeNo); wxRequest.setOutTradeNo(outTradeNo);
wxRequest.setBody("订单支付-" + ctx.getSn()); wxRequest.setBody("订单支付-" + ctx.getSn());
wxRequest.setTotalFee(ctx.getSettleMoney().multiply(new BigDecimal("100")).intValue()); // 转换为分 // 转换为分
wxRequest.setTotalFee(ctx.getSettleMoney().multiply(new BigDecimal("100")).intValue());
wxRequest.setOpenid(getCurrentUserOpenid(paymentParam.getWxCode())); wxRequest.setOpenid(getCurrentUserOpenid(paymentParam.getWxCode()));
wxRequest.setTradeType("JSAPI"); wxRequest.setTradeType("JSAPI");
wxRequest.setSpbillCreateIp(RequestHolder.getClientIP()); wxRequest.setSpbillCreateIp(RequestHolder.getClientIP());
wxRequest.setNotifyUrl(properties.getNotifyUrl()); // 需要配置实际的回调地址 // 需要配置实际的回调地址
wxRequest.setNotifyUrl(properties.getNotifyUrl());
// 调用微信支付服务 // 调用微信支付服务
WxPayMpOrderResult result = (WxPayMpOrderResult) wechatPayService.createJsapiOrder(wxRequest); WxPayMpOrderResult result = (WxPayMpOrderResult) wechatPayService.createJsapiOrder(wxRequest);
@ -168,7 +171,8 @@ public class PaymentController {
*/ */
private String generateOutTradeNo(String sn) { private String generateOutTradeNo(String sn) {
String safeSn = sn == null ? "" : sn.replaceAll("[^0-9A-Za-z_-]", ""); String safeSn = sn == null ? "" : sn.replaceAll("[^0-9A-Za-z_-]", "");
String suffix = String.valueOf(System.currentTimeMillis() % 100000000L); // 8位以内 // 8位以内
String suffix = String.valueOf(System.currentTimeMillis() % 100000000L);
String base = "ORDER_" + safeSn + "_" + suffix; String base = "ORDER_" + safeSn + "_" + suffix;
if (base.length() <= 32) { if (base.length() <= 32) {
return base; return base;
@ -290,9 +294,16 @@ public class PaymentController {
@PostMapping("/wechat/refundNotify") @PostMapping("/wechat/refundNotify")
public String parseRefundNotifyResult(@RequestBody String xmlData) { public String parseRefundNotifyResult(@RequestBody String xmlData) {
try { try {
log.info("收到微信退款回调:{}", xmlData);
WxPayRefundNotifyResult result = wxPayService.parseRefundNotifyResult(xmlData); WxPayRefundNotifyResult result = wxPayService.parseRefundNotifyResult(xmlData);
log.info("退款回调解析结果:{}", result);
String orderSn = extractOrderIdFromOutTradeNo(result.getReqInfo().getOutTradeNo()); String orderSn = extractOrderIdFromOutTradeNo(result.getReqInfo().getOutTradeNo());
log.info("从退款回调中提取订单号:{}", orderSn);
OrderInfoEntity entity = orderInfoService.getOne(Wrappers.<OrderInfoEntity>lambdaQuery().eq(OrderInfoEntity::getSn, orderSn)); OrderInfoEntity entity = orderInfoService.getOne(Wrappers.<OrderInfoEntity>lambdaQuery().eq(OrderInfoEntity::getSn, orderSn));
if (entity == null) {
log.warn("退款回调订单不存在:{}", orderSn);
return WxPayNotifyResponse.fail("订单不存在");
}
// 更新订单状态为已退款 // 更新订单状态为已退款
orderInfoService.lambdaUpdate() orderInfoService.lambdaUpdate()
.eq(OrderInfoEntity::getId, entity.getId()) .eq(OrderInfoEntity::getId, entity.getId())
@ -300,9 +311,10 @@ public class PaymentController {
.set(OrderInfoEntity::getRefundMoney, entity.getSettleMoney()) .set(OrderInfoEntity::getRefundMoney, entity.getSettleMoney())
.set(OrderInfoEntity::getRefundTime, LocalDateTime.now()) .set(OrderInfoEntity::getRefundTime, LocalDateTime.now())
.update(); .update();
log.info("退款回调处理成功,订单号:{}", orderSn);
return WxPayNotifyResponse.success("退款成功!"); return WxPayNotifyResponse.success("退款成功!");
} catch (WxPayException e) { } catch (WxPayException e) {
log.error(e.getMessage()); log.error("退款回调处理异常:{}", e.getMessage(), e);
return WxPayNotifyResponse.fail(e.getMessage()); return WxPayNotifyResponse.fail(e.getMessage());
} }
} }

View File

@ -5,6 +5,9 @@ import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
/**
* @author ljw
*/
@Getter @Getter
@Setter @Setter
@ToString @ToString

View File

@ -5,6 +5,7 @@ import com.njzscloud.supervisory.wxPay.dto.RefundRequestDto;
/** /**
* 退 * 退
* @author ljw
*/ */
public interface PaymentService { public interface PaymentService {

View File

@ -21,6 +21,7 @@ import java.math.BigDecimal;
/** /**
* 退 * 退
* @author ljw
*/ */
@Slf4j @Slf4j
@Service @Service
@ -35,8 +36,11 @@ public class PaymentServiceImpl implements PaymentService {
/** /**
* 退 * 退
*/ */
@Override
public void refund(RefundRequestDto refundRequest, PaymentContextResult ctx, Boolean isChange) { public void refund(RefundRequestDto refundRequest, PaymentContextResult ctx, Boolean isChange) {
try { try {
log.info("开始处理退款申请订单ID{},支付方式:{},是否改价:{}",
refundRequest.getOrderId(), ctx.getOiPayWay(), isChange);
// 根据支付方式处理退款 // 根据支付方式处理退款
if (SettlementWay.CASH.getVal().equals(ctx.getOiPayWay())) { if (SettlementWay.CASH.getVal().equals(ctx.getOiPayWay())) {
//微信退款 生成退款单号 //微信退款 生成退款单号
@ -48,7 +52,10 @@ public class PaymentServiceImpl implements PaymentService {
money = refundRequest.getRefundAmount().multiply(new BigDecimal("100")).intValue(); money = refundRequest.getRefundAmount().multiply(new BigDecimal("100")).intValue();
} }
String notifyUrl = properties.getRefundNotifyUrl(); String notifyUrl = properties.getRefundNotifyUrl();
wechatPayService.refund(refundRequest.getOutTradeNo(), orderSn, money, money, notifyUrl); log.info("发起微信退款订单ID{},商户订单号:{},退款单号:{},退款金额:{}分,退款回调地址:{}",
refundRequest.getOrderId(), refundRequest.getOutTradeNo(), orderSn, money, notifyUrl);
String refundId = wechatPayService.refund(refundRequest.getOutTradeNo(), orderSn, money, money, notifyUrl);
log.info("微信退款申请成功退款ID{}", refundId);
} else if (SettlementWay.MONTH.getVal().equals(ctx.getOiPayWay()) || SettlementWay.BALANCE.getVal().equals(ctx.getOiPayWay())) { } else if (SettlementWay.MONTH.getVal().equals(ctx.getOiPayWay()) || SettlementWay.BALANCE.getVal().equals(ctx.getOiPayWay())) {
// 公司退款 // 公司退款
processCompanyRefund(refundRequest, ctx); processCompanyRefund(refundRequest, ctx);
@ -101,4 +108,4 @@ public class PaymentServiceImpl implements PaymentService {
} }
} }