fix:小程序退款及公众号推送消息

This commit is contained in:
lhb 2025-04-30 16:33:22 +08:00
parent 42323ded0d
commit f10bbd184e
20 changed files with 396 additions and 16 deletions

View File

@ -34,7 +34,7 @@ public class TradeDetail extends BaseEntity implements Serializable {
@Schema(description = "交易人编码")
private String traderCode;
@Schema(description = "交易类型1-充值2-订单消费,3-提现")
@Schema(description = "交易类型1-充值2-订单消费,9-提现")
private Integer tradeType;
@Schema(description = "变动金额的钱包账户,钱包金额不变时不需要")

View File

@ -0,0 +1,39 @@
package com.evotech.hd.common.core.entity.cloud.request;
import com.evotech.hd.common.core.entity.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Schema(name = "查询资金账户请求参数", hidden = true)
@EqualsAndHashCode(callSuper=false)
public class PrePayRequest extends BasePageRequest {
@Schema(description = "用户编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank
private String wuid;
@Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull
@Min(1)
@Max(100000000)
private Integer total;
@Schema(description = "商户订单号")
private String outTradeNo;
@Schema(description = "微信支付订单号")
private String transactionId;
@Schema(description = "退款原因")
private String reason;
@Schema(description = "金额")
private Integer money;
@Schema(description = "支付方式")
private Integer payType;
@Schema(description = "交易类型")
private Integer tradeType;
}

View File

@ -5,11 +5,9 @@ import java.util.List;
import com.evotech.hd.common.core.entity.cloud.vo.WalletAccountVO;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.common.core.entity.Result;
@ -109,4 +107,11 @@ public class WalletAccountController {
public Result<Integer> updateName(@ParameterObject WalletAccount wa) {
return walletAccountService.updateName(wa);
}
@Operation(summary = "获取钱包对象")
@PostMapping("/getDetailById")
@ApiOperationSupport(order = 12)
public WalletAccount getDetailById(@NotBlank @RequestParam String outTradeNo) {
return walletAccountService.getDetailById(outTradeNo);
}
}

View File

@ -3,6 +3,7 @@ package com.evotech.hd.cloud.entity.request;
import com.evotech.hd.common.core.entity.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -11,6 +12,9 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
public class PageListTradeRequest extends BasePageRequest {
@Schema(description = "用户编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank
private String wuid;
@Schema(description = "换电站编码")
private String stationCode;
@ -23,7 +27,10 @@ public class PageListTradeRequest extends BasePageRequest {
@Schema(description = "交易编码")
private String outTradeNo;
@Schema(description = "交易类型1-充值2-订单消费,3-提现")
@Schema(description = "交易类型1-充值2-订单消费,9-提现")
private Integer tradeType;
@Schema(description = "支付方式1-账户余额2-微信3-支付宝4-网银5 -充电补偿")
private Integer payType;
}

View File

@ -15,7 +15,11 @@ public interface TradeService {
public Result<Integer> update(TradeDetail td);
public Result<List<TradeDetail>> list(PageListTradeRequest pltr);
public List<TradeDetail> tradeList(PageListTradeRequest pltr);
public Result<String> wechatPayNotifyHandle(TradeDetail tradeDetail);
public Result<String> wechatBackNotifyHandle(TradeDetail tradeDetail);
}

View File

@ -32,4 +32,6 @@ public interface WalletAccountService {
public Result<WechatPayAttach> getPayAttach(String wuid);
public Result<Integer> updateName(WalletAccount wa);
public WalletAccount getDetailById(String outTradeNo);
}

View File

@ -7,7 +7,9 @@ import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService;
import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.resource.ProxyOperater;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@ -74,7 +76,9 @@ public class TradeServiceImpl implements TradeService {
page = tradeDetailDao.selectPage(page, new QueryWrapper<TradeDetail>()
.eq(StringUtils.hasText(pltr.getStationCode()), "station_code", pltr.getStationCode())
.like(StringUtils.hasText(pltr.getAccountName()), "account_name", pltr.getAccountName())
.eq(pltr.getWuid() != null, "trader_code", pltr.getWuid())
.eq(pltr.getTradeType() != null, "trade_type", pltr.getTradeType())
.eq(pltr.getPayType() != null, "pay_type", pltr.getPayType())
.eq(StringUtils.hasText(pltr.getAccountCode()), "account_code", pltr.getAccountCode())
.eq(StringUtils.hasText(pltr.getOutTradeNo()), "out_trade_no", pltr.getOutTradeNo())
.ne("del_flag", 1)
@ -85,6 +89,20 @@ public class TradeServiceImpl implements TradeService {
return new Result<List<TradeDetail>>().success(page);
}
public List<TradeDetail> tradeList(PageListTradeRequest pltr) {
List<TradeDetail> list = tradeDetailDao.selectList(new LambdaQueryWrapper<TradeDetail>()
.eq(TradeDetail::getTradeType, pltr.getTradeType())
.eq(TradeDetail::getPayType, pltr.getPayType())
.eq(TradeDetail::getTraderCode, pltr.getWuid())
.select(TradeDetail::getPkId, TradeDetail::getTradeAmount, TradeDetail::getOutTradeNo, TradeDetail::getTransactionId).orderByDesc(TradeDetail::getPayTime));
if (list.isEmpty()) {
return null;
}
return list;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result<String> wechatPayNotifyHandle(TradeDetail tradeDetail) {
@ -141,4 +159,42 @@ public class TradeServiceImpl implements TradeService {
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result<String> wechatBackNotifyHandle(TradeDetail tradeDetail) {
try {
// 1. 参数校验
if (tradeDetail == null || !StringUtils.hasText(tradeDetail.getOutTradeNo())) {
log.error("微信支付回调参数异常: {}", JSONUtil.toJsonStr(tradeDetail));
return new Result<String>().error("参数异常");
}
// 2. 幂等性检查
boolean isProcessed = tradeDetailDao.exists(new QueryWrapper<TradeDetail>()
.eq("out_trade_no", tradeDetail.getOutTradeNo())
.eq("transaction_id", tradeDetail.getTransactionId())
.eq("pay_result", tradeDetail.getPayResult()));
if (isProcessed) {
log.info("重复的退款微信支付回调, outTradeNo: {}", tradeDetail.getOutTradeNo());
return new Result<String>().error("退款重复消息");
}
// 3. 记录交易
add(tradeDetail);
// 4. 业务处理
payNotifyHandleService.payNotifyBussinessHandle(tradeDetail);
return new Result<String>().success("OK");
} catch (Exception e) {
log.error("处理微信退款回调异常, outTradeNo: {}, 异常信息: {}",
tradeDetail.getOutTradeNo(),
e.getMessage(),
e);
throw new RuntimeException("处理支付回调失败", e);
}
}
}

View File

@ -325,5 +325,17 @@ public class WalletAccountServiceImpl implements WalletAccountService {
return wechatPayAttach;
}
@Override
public WalletAccount getDetailById(String outTradeNo) {
LambdaQueryWrapper<WalletAccountDetail> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WalletAccountDetail::getTradeNo, outTradeNo).eq(WalletAccountDetail::getTradeType, 1);
WalletAccountDetail walletAccountDetail = walletAccountDetailDao.selectOne(queryWrapper);
LambdaQueryWrapper<WalletAccount> queryWrapper1 = new LambdaQueryWrapper<>();
queryWrapper1.eq(WalletAccount::getCode, walletAccountDetail.getCode());
return walletAccountDao.selectOne(queryWrapper1);
}
}

View File

@ -37,4 +37,9 @@ public class GZHTemplateMessageService {
wechatService.rechargeMessage(trade, money);
}
@Async("taskExecutor")
public void backMessageSend(TradeDetail trade, Integer money) {
wechatService.backMessage(trade, money);
}
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.evotech.hd.cloud.dao.WalletAccountDao;
import com.evotech.hd.cloud.dao.WalletAccountDetailDao;
import com.evotech.hd.cloud.service.TaxPointService;
import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao;
import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao;
import com.evotech.hd.common.core.entity.cloud.*;
@ -35,6 +36,8 @@ public class WechatPayNotifyHandleService {
private PreOrderRelationSwapOrderDao preOrderRelationSwapOrderDao;
@Resource
TaxPointService taxPointService;
@Resource
private WalletAccountService walletAccountService;
// @Async("taskExecutor")
@ -88,6 +91,44 @@ public class WechatPayNotifyHandleService {
nativePayHandle(tradeDetail);
}
} else if (tradeDetail.getTradeType() == 9) {
// 提现
WalletAccount wallet = walletAccountService.getDetailById(tradeDetail.getOutTradeNo());
if (wallet == null) {
return;
}
// 添加明细
WalletAccountDetail wad = new WalletAccountDetail();
// TODO 写一个算法计算充值的减多少赠送的减多少总金额减多少
wad.setTradeRechargeAmount(tradeDetail.getTradeAmount());//交易金额
wad.setTradeGiftAmount(0);
wad.setTradeTotalAmount(wad.getTradeRechargeAmount() + wad.getTradeGiftAmount());//交易总金额
wad.setPreTotalAmount(wallet.getTotalAmount());
wad.setPreRechargeAmount(wallet.getRechargeAmount());
wad.setPreGiftAmount(wallet.getGiftAmount());
wad.setAfterRechargeAmount(wad.getPreRechargeAmount() - Math.abs(wad.getTradeRechargeAmount()));
wad.setAfterTotalAmount(wad.getPreTotalAmount() - Math.abs(wad.getTradeTotalAmount()));
wad.setAfterGiftAmount(wad.getPreGiftAmount() - Math.abs(wad.getTradeGiftAmount()));
wad.setTradeGiftAmount(0);
wad.setCode(tradeDetail.getWallet());
wad.setTradeType(tradeDetail.getTradeType());
wad.setTradeNo(tradeDetail.getOutTradeNo());
wad.setCtime(new Date());
walletAccountDetailDao.insert(wad);
// 改余额
wallet.setTotalAmount(wad.getAfterTotalAmount());
wallet.setRechargeAmount(wad.getAfterRechargeAmount());
wallet.setGiftAmount(wad.getAfterGiftAmount());
wallet.setUptime(null);
walletAccountDao.updateById(wallet);
// 发送公众号消息
templateMessageService.backMessageSend(tradeDetail, wallet.getTotalAmount());
} else {
}

View File

@ -50,4 +50,8 @@ public interface WechatService {
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<String> orderQuery(@RequestParam Integer type, @RequestParam String outTradeNo);
@PostMapping(value = "/gzh/msg/send/back",
consumes = {MediaType.APPLICATION_JSON_VALUE})
public Result<String> backMessage(@RequestBody TradeDetail trade, @RequestParam Integer money);
}

View File

@ -33,4 +33,6 @@ public class GZHProperties {
private String WalletRechargeTemplateId;
private String orderToPayTemplateId2;
private String WalletBackTemplateId;
}

View File

@ -1,5 +1,8 @@
package com.evotech.hd.wechat.controller;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.cloud.request.PrePayRequest;
import com.evotech.hd.wechat.service.rpc.CloudService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@ -20,6 +23,11 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Tag(name = "微信支付")
@RestController
@RequestMapping("/wechatpay")
@ -29,6 +37,8 @@ public class WechatPayController {
@Resource
private WechatPayService wechatPayService;
@Resource
private CloudService cloudService;
@Operation(summary = "小程序预支付订单")
@ -57,13 +67,18 @@ public class WechatPayController {
@Operation(summary = "退款")
@PostMapping("/refunds")
@PostMapping("/xcx/refunds")
@ApiOperationSupport(order = 4)
public Result<String> refunds(String outTradeNo, String transactionId, String reason, Integer money, Integer total) {
public Result<String> refunds(@RequestBody PrePayVO prePay) {
String outTradeNo = prePay.getOutTradeNo();
String transactionId = prePay.getTransactionId();
String reason = prePay.getReason();
Integer money = prePay.getMoney();
Integer total = prePay.getTotal();
return wechatPayService.refunds(outTradeNo, transactionId, reason, money, total);
}
@Operation(summary = "退款回调地址")
@PostMapping("/refundsback/msg")
@ApiOperationSupport(order = 5)
@ -88,6 +103,46 @@ public class WechatPayController {
public Result<String> dayTradebill(@RequestParam @NotBlank String day) {
return wechatPayService.dayTradebill(day);
}
@Operation(summary = "全部余额退款")
@PostMapping("/xcx/refundsBalance")
@ApiOperationSupport(order = 8)
public Result<String> refundsBalance(@RequestBody PrePayRequest prePay) {
//total=账户总金额按总金额扣减支付成功的充值订单按时间倒序进行扣减直到总金额扣减为零为止
/**
* 1先查询该账户下所有有效的充值订单集合
* 2按订单支付金额和总金额比较
*/
//交易类型1-充值2-订单消费9-提现
prePay.setTradeType(1);
//支付方式1-账户余额2-微信
prePay.setPayType(2);
List<TradeDetail> listTradeDetail = cloudService.tradeList(prePay);
//退款总金额
int totals = prePay.getTotal();
// 遍历集合
for (TradeDetail tradeDetail : listTradeDetail) {
int tradeAmount = tradeDetail.getTradeAmount();//订单交易金额
totals = totals - tradeAmount;
//如果总价大于订单单价则退款
if (totals >= 0) {
String outTradeNo = tradeDetail.getOutTradeNo();
String transactionId = tradeDetail.getTransactionId();
String reason = "多笔余额申请退款";
Integer total = tradeAmount;
return wechatPayService.refunds(outTradeNo, transactionId, reason, tradeAmount, tradeAmount);
}else{//部分退款
String outTradeNo = tradeDetail.getOutTradeNo();
String transactionId = tradeDetail.getTransactionId();
String reason = "余额申请退款";
Integer total = tradeAmount;
return wechatPayService.refunds(outTradeNo, transactionId, reason, total, tradeAmount);
}
}
return new Result<String>().success("ok");
}
}

View File

@ -68,4 +68,11 @@ public class GZHMessageSendController {
return gzhMessageTemplateService.sendTemplateMessageRecharge(trade, money);
}
@Operation(summary = "提现成功推送公众号消息")
@PostMapping("/back")
@ApiOperationSupport(order = 5)
public Result<String> sendTemplateMessageBack(@RequestBody TradeDetail trade, @RequestParam Integer money) {
return gzhMessageTemplateService.sendTemplateMessageBack(trade, money);
}
}

View File

@ -63,4 +63,16 @@ public class PrePayVO {
@Schema(description = "用户设备型号")
private String deviceId;
@Schema(description = "商户订单号")
private String outTradeNo;
@Schema(description = "微信支付订单号")
private String transactionId;
@Schema(description = "退款原因")
private String reason;
@Schema(description = "金额")
private Integer money;
@Schema(description = "支付方式")
private String payType;
@Schema(description = "交易类型")
private String tradeType;
}

View File

@ -16,6 +16,12 @@ public class WalletRechargeTemplateData {
private JSONObject time4;
private JSONObject amount5;
private JSONObject amount2;
private JSONObject amount3;
private JSONObject time1;
public void setThing3(String value1) {
@ -42,4 +48,22 @@ public class WalletRechargeTemplateData {
this.amount5 = jo;
}
public void setAmount2(String value5) {
JSONObject jo = new JSONObject();
jo.set("value", value5);
this.amount2 = jo;
}
public void setAmount3(String value6) {
JSONObject jo = new JSONObject();
jo.set("value", value6);
this.amount3 = jo;
}
public void setTime1(String value7) {
JSONObject jo = new JSONObject();
jo.set("value", value7);
this.time1 = jo;
}
}

View File

@ -232,4 +232,43 @@ public class GZHMessageTemplateService {
return new Result<String>().error(CodeMsg.WECHAT_API_ERROR, jo);
}
/**
* 充值成功推送公众号消息
* @return
*/
public Result<String> sendTemplateMessageBack(TradeDetail trade, Integer money) {
if (!StringUtils.hasText(trade.getTraderCode())) {
return null;
}
WechatUser wuser = wechatUserDao.selectOne(new QueryWrapper<WechatUser>().eq("wuid", trade.getTraderCode()));
if (wuser == null) {
return null;
}
if (!StringUtils.hasText(wuser.getGzhOpenid())) {
return new Result<String>().error("未关注公众号!");
}
MessageTemplateSendData sendData = new MessageTemplateSendData();
sendData.setTouser(wuser.getGzhOpenid());
String templateId = gzhProperties.getWalletBackTemplateId();//模版配置
sendData.setTemplate_id(templateId);
Miniprogram miniprogram = new Miniprogram();
miniprogram.setAppid(xcxProperties.getAppid());
miniprogram.setPath(orderPage);
sendData.setMiniprogram(miniprogram);
WalletRechargeTemplateData data = new WalletRechargeTemplateData();
data.setThing3(trade.getTrader());//账号名称
data.setAmount2(new BigDecimal(trade.getTradeAmount()).divide(new BigDecimal(100)).setScale(2) + "");//退款金额
data.setTime1(DateUtil.format(trade.getPayTime(), DatePattern.NORM_DATETIME_FORMATTER));//到账时间
data.setAmount3(new BigDecimal(money).divide(new BigDecimal(100)).setScale(2) + "");//可用余额
sendData.setData(JSONUtil.parseObj(data));
String res = TemplateMessageUtil.templateMessageSend(gzhAccessTokenService.gzhAccessToken(), sendData);
JSONObject jo = JSONUtil.parseObj(res);
if (jo.getInt("errcode") == 0) {
return new Result<String>().success(jo);
}
return new Result<String>().error(CodeMsg.WECHAT_API_ERROR, jo);
}
}

View File

@ -210,6 +210,7 @@ public class WechatPayServiceImpl implements WechatPayService {
@Override
public Result<String> refunds(String outTradeNo, String transactionId, String reason, Integer money, Integer total) {
try {
RefundService refundService = new RefundService.Builder().config(config).build();
//
CreateRequest request = new CreateRequest();
@ -217,15 +218,22 @@ public class WechatPayServiceImpl implements WechatPayService {
request.setTransactionId(transactionId);
request.setReason(reason);
request.setOutRefundNo("HD1001REFUND" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_FORMATTER) + RandomUtil.randomInt(1000, 10000));
request.setNotifyUrl(xcxProperties.getRefundNotifyUrl());
// request.setNotifyUrl(xcxProperties.getRefundNotifyUrl());
request.setNotifyUrl("https://www.famhub.cn/gateway/wechat/wechatpay/refundsback/msg");
AmountReq amount = new AmountReq();
amount.setRefund(Long.valueOf(money));
amount.setCurrency("CNY");
amount.setTotal(Long.valueOf(total));
request.setAmount(amount);
Refund refund = refundService.create(request);
return new Result<String>().success(refund);
} catch (Exception e) {
e.printStackTrace();
return new Result<String>().error("剩余金额请联系客服人员进行继续退款!");
}
}
@Override
@ -265,6 +273,8 @@ public class WechatPayServiceImpl implements WechatPayService {
}
// 4. 业务处理逻辑
System.out.println("\r\n=====>>>>>" + JSONUtil.toJsonPrettyStr(refund));
wechatPayComponent.wechatBackBussinessHandle(refund);
return new ResponseEntity<String>("", HttpStatus.OK);
}

View File

@ -3,12 +3,10 @@ package com.evotech.hd.wechat.service.rpc;
import com.evotech.hd.common.core.entity.BasePageRequest;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListWalletRequest;
import com.evotech.hd.common.core.entity.cloud.request.*;
import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import com.evotech.hd.wechat.entity.PrePayVO;
import jakarta.validation.constraints.NotBlank;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
@ -101,4 +99,15 @@ public interface CloudService {
@GetMapping(value = "/company/list",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<List<Company>> companylist(@RequestParam BasePageRequest bpr);
@GetMapping(value = "/trade/tradeList",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public List<TradeDetail> tradeList(@SpringQueryMap PrePayRequest prePay);
@PostMapping(value = "/wallet/getDetailById", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public WalletAccount getDetailById(@RequestParam String outTradeNo);
@PostMapping(value = "/trade/wechatpay/backnotify",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public void wechatBackNotifyHandle(TradeDetail tradeDetail);
}

View File

@ -9,6 +9,7 @@ import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import com.evotech.hd.common.core.entity.wechat.WechatPayPreOrder;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
@ -18,6 +19,7 @@ import com.evotech.hd.common.core.enums.WechatPayApiTypeEnums;
import com.evotech.hd.wechat.service.rpc.CloudService;
import com.wechat.pay.java.service.payments.model.Transaction;
import com.wechat.pay.java.service.payments.model.Transaction.TradeTypeEnum;
import com.wechat.pay.java.service.refund.model.Refund;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -39,6 +41,7 @@ public class WechatPayComponent {
private CloudService cloudService;
/**
* 校验并创建钱包账户
* @param wuid 用户ID
@ -155,4 +158,48 @@ public class WechatPayComponent {
cloudService.wechatPayNotifyHandle(tradeDetail);
}
/**
* 微信退款申请回调业务处理
* @param refund
*/
public void wechatBackBussinessHandle(Refund refund) {
// 1. 生成交易信息
TradeDetail tradeDetail = new TradeDetail();
BeanUtils.copyProperties(refund, tradeDetail);//transactionId
WalletAccount walletAccount = cloudService.getDetailById(refund.getOutTradeNo());
WechatUser wuser = wechatUserDao.selectOne(new QueryWrapper<WechatUser>().eq("wuid", walletAccount.getOwnerId()));
if (wuser != null) {
tradeDetail.setPayer(wuser.getWuid());
}
tradeDetail.setAppid(wuser.getAppid());
tradeDetail.setWechatPayApiType("JSAPI");
tradeDetail.setTradeType(9);
//交易人
tradeDetail.setTrader(wuser.getName());
//交易人编码
tradeDetail.setTraderCode(wuser.getWuid());
tradeDetail.setOutTradeNo(refund.getOutTradeNo());//OutRefundNo
//变动金额的钱包账户
tradeDetail.setWallet(walletAccount.getCode());
tradeDetail.setDescription(refund.getUserReceivedAccount());
tradeDetail.setOrderNo(refund.getRefundId());//refundId
tradeDetail.setOrderCount(1);
tradeDetail.setTradeAmount(Integer.valueOf(refund.getAmount().getTotal().toString()));
tradeDetail.setPayType(PayTypeEnums.WECHAT.getCode());
tradeDetail.setPayResult(refund.getUserReceivedAccount());
tradeDetail.setPayMsg("余额退款");
tradeDetail.setPayTime(DateUtil.parseISO8601(refund.getSuccessTime()));
// 2. 处理订单看要不要异步
log.info("请求时间{} 处理订单开始{}" ,new Date() ,JSONUtil.toJsonStr(tradeDetail));
cloudService.wechatBackNotifyHandle(tradeDetail);
}
}