fix:小程序退款及公众号推送消息
This commit is contained in:
parent
42323ded0d
commit
f10bbd184e
@ -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 = "变动金额的钱包账户,钱包金额不变时不需要")
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -32,4 +32,6 @@ public interface WalletAccountService {
|
||||
public Result<WechatPayAttach> getPayAttach(String wuid);
|
||||
|
||||
public Result<Integer> updateName(WalletAccount wa);
|
||||
|
||||
public WalletAccount getDetailById(String outTradeNo);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -37,4 +37,9 @@ public class GZHTemplateMessageService {
|
||||
wechatService.rechargeMessage(trade, money);
|
||||
}
|
||||
|
||||
@Async("taskExecutor")
|
||||
public void backMessageSend(TradeDetail trade, Integer money) {
|
||||
wechatService.backMessage(trade, money);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -33,4 +33,6 @@ public class GZHProperties {
|
||||
private String WalletRechargeTemplateId;
|
||||
|
||||
private String orderToPayTemplateId2;
|
||||
|
||||
private String WalletBackTemplateId;
|
||||
}
|
||||
|
||||
@ -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");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user