Compare commits
2 Commits
73f2d24816
...
41432e8d79
| Author | SHA1 | Date | |
|---|---|---|---|
| 41432e8d79 | |||
| 2b0eebdc0f |
@ -97,4 +97,15 @@ public class XhpcSettingConfig extends BaseEntity {
|
||||
*/
|
||||
private String tenantId;
|
||||
|
||||
// 商户API证书序列号(从证书中获取,十进制转十六进制大写)
|
||||
private String wxApiSerialNo;
|
||||
|
||||
// APIv3密钥(32位,在商户平台设置)
|
||||
private String wxApiV3Key;
|
||||
// 微信支付公钥ID(或平台证书序列号,用于解密回调,可暂不配置)
|
||||
private String wxPayPublicKeyId;
|
||||
// 微信支付公钥文件路径(PEM格式,用于加密敏感字段,本业务可不配置)
|
||||
private String wxPayPublicKeyPath;
|
||||
// 微信V3退款回调地址
|
||||
private String wxV3CallbackUrl;
|
||||
}
|
||||
|
||||
@ -98,14 +98,17 @@ public class XhpcPlaceholderOrderServiceImpl extends BaseService implements IXhp
|
||||
//查看是否有历史订单,历史订单为空,不收取占位费
|
||||
int count = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderTotalPrice(serialNumber, 2);
|
||||
if(count==0){
|
||||
endTime = startTime;
|
||||
endTime = startTime;
|
||||
}else{
|
||||
//查看下一单的时间是否超过30分钟
|
||||
// int result = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTime(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu);
|
||||
// if(result==0){
|
||||
// endTime = startTime;
|
||||
// }
|
||||
|
||||
int number = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTimeYu(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu);
|
||||
//有下一单返回1 没有下一单返回0
|
||||
if(number>0){
|
||||
//查看下一单的时间是否超过30分钟
|
||||
int result = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTime(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu);
|
||||
if(result==0){
|
||||
endTime = startTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
String start = DateUtil.formatTime(startTime);
|
||||
String end = DateUtil.formatTime(endTime);
|
||||
|
||||
@ -1460,6 +1460,7 @@
|
||||
ho.act_price as actPrice,
|
||||
ho.act_power_price as actPowerPrice,
|
||||
ho.act_service_price as actServicePrice,
|
||||
ho.act_total_price as actTotalPrice,
|
||||
ho.internet_commission as internetCommission,
|
||||
ho.internet_svc_commission as internetSvcCommission,
|
||||
ho.internet_degree_commission as internetDegreeCommission,
|
||||
|
||||
@ -90,6 +90,13 @@
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>3.14.9</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.wechatpay-apiv3</groupId>
|
||||
<artifactId>wechatpay-java</artifactId>
|
||||
<version>0.2.17</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package com.xhpc.payment.controller;
|
||||
|
||||
import com.wechat.pay.java.core.RSAAutoCertificateConfig;;
|
||||
import com.wechat.pay.java.core.notification.NotificationParser;
|
||||
import com.xhpc.common.core.annotation.NoRepeatSubmit;
|
||||
import com.xhpc.common.core.constant.HttpStatus;
|
||||
import com.xhpc.common.core.constant.StatusConstants;
|
||||
@ -9,9 +11,9 @@ import com.xhpc.common.core.utils.WXPayUtil;
|
||||
import com.xhpc.common.core.web.controller.BaseController;
|
||||
import com.xhpc.common.core.web.domain.AjaxResult;
|
||||
import com.xhpc.common.domain.XhpcRefundOrder;
|
||||
import com.xhpc.common.domain.XhpcSettingConfig;
|
||||
import com.xhpc.common.log.annotation.Log;
|
||||
import com.xhpc.common.log.enums.BusinessType;
|
||||
import com.xhpc.common.security.service.TokenService;
|
||||
import com.xhpc.common.util.UserTypeUtil;
|
||||
import com.xhpc.payment.domain.XhpcAppInternetUser;
|
||||
import com.xhpc.payment.domain.XhpcAppUser;
|
||||
@ -19,16 +21,16 @@ import com.xhpc.payment.domain.XhpcRefundAudit;
|
||||
import com.xhpc.payment.mapper.XhpcRefundOrderMapper;
|
||||
import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper;
|
||||
import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper;
|
||||
import com.xhpc.payment.service.IXhpcCommonPayment;
|
||||
import com.xhpc.payment.service.IXhpcRefundAuditService;
|
||||
import com.xhpc.payment.service.IXhpcRefundOrderService;
|
||||
import com.xhpc.payment.service.IXhpcRefundOriginalOrderService;
|
||||
import com.xhpc.payment.util.AESUtil;
|
||||
import com.xhpc.system.api.model.LoginUser;
|
||||
import com.xhpc.payment.util.TransferBatchNotifyData;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
||||
@ -51,6 +53,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author yuyang
|
||||
@ -73,6 +76,10 @@ public class XhpcRefundOriginalOrderController extends BaseController {
|
||||
private IXhpcRefundOrderService iXhpcRefundOrderService;
|
||||
@Resource
|
||||
private XhpcRefundOrderMapper xhpcRefundOrderMapper;
|
||||
@Resource
|
||||
private IXhpcCommonPayment xhpcCommonPayment;
|
||||
|
||||
|
||||
|
||||
private final ExecutorService executorService = Executors.newFixedThreadPool(40);
|
||||
|
||||
@ -93,8 +100,71 @@ public class XhpcRefundOriginalOrderController extends BaseController {
|
||||
return xhpcRefundOriginalOrderService.wxRefundOriginalOrder(refundOrderId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 微信回调Api(退款)
|
||||
* 微信回调Api(v3退款)
|
||||
*/
|
||||
@PostMapping("/transferCallback")
|
||||
public String transferCallback(HttpServletRequest request) {
|
||||
try {
|
||||
// 1. 获取请求头
|
||||
String serialNumber = request.getHeader("Wechatpay-Serial");
|
||||
String timestamp = request.getHeader("Wechatpay-Timestamp");
|
||||
String nonce = request.getHeader("Wechatpay-Nonce");
|
||||
String signature = request.getHeader("Wechatpay-Signature");
|
||||
|
||||
// 2. 获取请求体
|
||||
String body = request.getReader().lines().collect(Collectors.joining());
|
||||
// 3. 构建配置(与发起转账使用相同配置)
|
||||
XhpcSettingConfig config = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, "000000");
|
||||
RSAAutoCertificateConfig v3Config = new RSAAutoCertificateConfig.Builder()
|
||||
.merchantId(config.getWxMchId())
|
||||
.privateKeyFromPath(config.getWxApiclientKeyPem())
|
||||
.merchantSerialNumber(config.getWxApiSerialNo())
|
||||
.apiV3Key(config.getWxApiV3Key())
|
||||
.build();
|
||||
// 4. 解析并验签
|
||||
com.wechat.pay.java.core.notification.RequestParam param = new com.wechat.pay.java.core.notification.RequestParam.Builder()
|
||||
.serialNumber(serialNumber)
|
||||
.timestamp(timestamp)
|
||||
.nonce(nonce)
|
||||
.signature(signature)
|
||||
.body(body)
|
||||
.build();
|
||||
|
||||
NotificationParser parser = new NotificationParser(v3Config);
|
||||
|
||||
// 解析通知
|
||||
TransferBatchNotifyData notifyData = parser.parse(param, TransferBatchNotifyData.class);
|
||||
|
||||
// 7. 处理业务逻辑
|
||||
String outBatchNo = notifyData.getOutBatchNo();
|
||||
String batchStatus = notifyData.getBatchStatus();
|
||||
logger.info("回调业务数据:outBatchNo={}, batchStatus={}, totalAmount={}分, totalNum={}",
|
||||
outBatchNo, batchStatus, notifyData.getTotalAmount(), notifyData.getTotalNum());
|
||||
|
||||
// 根据批次状态更新订单
|
||||
if ("FINISHED".equals(batchStatus)) {
|
||||
// 检查明细是否全部成功
|
||||
boolean allSuccess = notifyData.getTransferDetailList().stream()
|
||||
.allMatch(d -> "SUCCESS".equals(d.getDetailStatus()));
|
||||
if (allSuccess) {
|
||||
xhpcRefundOriginalOrderService.updateXhpcRefundOriginalOrderV3(notifyData);
|
||||
logger.info("转账全部成功,订单更新成功,outBatchNo={}", outBatchNo);
|
||||
}
|
||||
}
|
||||
|
||||
// 8. 返回成功应答(必须返回这个格式,否则微信会重试)
|
||||
return "{\"code\":\"SUCCESS\"}";
|
||||
|
||||
}catch (Exception e){
|
||||
logger.error("处理转账回调异常", e);
|
||||
return "{\"code\":\"FAIL\",\"message\":\"" + e.getMessage() + "\"}";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信回调Api(v2退款)
|
||||
*/
|
||||
@RequestMapping("/paymentCallback")
|
||||
public Object payNotify(HttpServletRequest request, HttpServletResponse response) {
|
||||
|
||||
@ -130,4 +130,6 @@ public class XhpcRefundOriginalOrder extends BaseEntity {
|
||||
*/
|
||||
private Integer lastOne;
|
||||
|
||||
//商家明细单号
|
||||
private String outDetailNo;
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package com.xhpc.payment.service;
|
||||
import com.xhpc.common.core.domain.R;
|
||||
import com.xhpc.common.domain.XhpcRefundOrder;
|
||||
import com.xhpc.payment.domain.XhpcRefundAudit;
|
||||
import com.xhpc.payment.util.TransferBatchNotifyData;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Map;
|
||||
@ -22,6 +23,10 @@ public interface IXhpcRefundOriginalOrderService {
|
||||
//微信回调处理(退款)
|
||||
void updateXhpcRefundOriginalOrder(Map<String, String> reqInfo);
|
||||
|
||||
|
||||
//微信回调处理V3(退款)
|
||||
void updateXhpcRefundOriginalOrderV3(TransferBatchNotifyData notifyData);
|
||||
|
||||
void updateXhpcRefundOrder(XhpcRefundOrder refundOrder, BigDecimal refundFee, Integer type,Integer status);
|
||||
|
||||
//新增退款订单
|
||||
|
||||
@ -11,6 +11,12 @@ import com.alipay.api.request.AlipayTradeRefundRequest;
|
||||
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
|
||||
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
|
||||
import com.alipay.api.response.AlipayTradeRefundResponse;
|
||||
import com.wechat.pay.java.core.Config;
|
||||
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
|
||||
import com.wechat.pay.java.service.transferbatch.TransferBatchService;
|
||||
import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
|
||||
import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferResponse;
|
||||
import com.wechat.pay.java.service.transferbatch.model.TransferDetailInput;
|
||||
import com.xhpc.common.api.SmsService;
|
||||
import com.xhpc.common.core.constant.HttpStatus;
|
||||
import com.xhpc.common.core.constant.StatusConstants;
|
||||
@ -28,6 +34,7 @@ import com.xhpc.payment.domain.XhpcRefundOriginalOrder;
|
||||
import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper;
|
||||
import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper;
|
||||
import com.xhpc.payment.service.*;
|
||||
import com.xhpc.payment.util.TransferBatchNotifyData;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
@ -368,7 +375,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
if(r1.getCode()==200){
|
||||
Map<String, Object> map = (Map<String, Object>)r1.getData();
|
||||
if(map !=null && map.get("refundFee") !=null){
|
||||
bigDecimal = new BigDecimal(map.get("refundFee").toString());
|
||||
bigDecimal = new BigDecimal(map.get("refundFee").toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -557,6 +564,98 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateXhpcRefundOriginalOrderV3(TransferBatchNotifyData notifyData) {
|
||||
|
||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOriginalOrderRefundId(notifyData.getBatchId());
|
||||
if(xhpcRefundOriginalOrder !=null){
|
||||
if ("FINISHED".equals(notifyData.getBatchStatus())) {
|
||||
//退款成功
|
||||
xhpcRefundOriginalOrder.setStatus(1);
|
||||
BigDecimal refundFeeAmount = xhpcRefundOriginalOrder.getRefundFee();
|
||||
|
||||
XhpcRechargeOrder xhpcRechargeOrder = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrder(xhpcRefundOriginalOrder.getRechargeOrderId());
|
||||
BigDecimal amount = xhpcRechargeOrder.getAmount();
|
||||
if(xhpcRechargeOrder.getRefundStatus()==0){
|
||||
//修改支付订单付款金额和状态
|
||||
if(amount.compareTo(refundFeeAmount)==0){
|
||||
//全部退完
|
||||
iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2);
|
||||
}else if(amount.compareTo(refundFeeAmount)>0){
|
||||
//退了一部分
|
||||
iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFeeAmount,1);
|
||||
}
|
||||
}else{
|
||||
BigDecimal subtract = xhpcRechargeOrder.getAmount().subtract(xhpcRechargeOrder.getRefundFee());
|
||||
//修改支付订单付款金额和状态
|
||||
if(subtract.compareTo(refundFeeAmount)==0){
|
||||
//全部退完
|
||||
iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2);
|
||||
}else if(subtract.compareTo(refundFeeAmount)>0){
|
||||
//退了一部分
|
||||
iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),xhpcRechargeOrder.getRefundFee().add(refundFeeAmount),1);
|
||||
}
|
||||
}
|
||||
//修改用户金额
|
||||
Long userId = xhpcRefundOriginalOrder.getUserId();
|
||||
Integer source = xhpcRefundOriginalOrder.getSource();
|
||||
//增加用户流水记录
|
||||
xhpcUserAccountStatementService.add(xhpcRefundOriginalOrder.getRefundOrderId(), "-"+refundFeeAmount.toString(), userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,xhpcRefundOriginalOrder.getTenantId());
|
||||
if(UserTypeUtil.USER_TYPE.equals(source)){
|
||||
Map<String, Object> appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId);
|
||||
String balance = StringUtils.valueOf(appUserInfo.get("balance"));
|
||||
//减少用户余额
|
||||
XhpcAppUser xhpcAppUser = new XhpcAppUser();
|
||||
xhpcAppUser.setAppUserId(userId);
|
||||
BigDecimal surplus =new BigDecimal(balance).subtract(refundFeeAmount);
|
||||
xhpcAppUser.setBalance(surplus);
|
||||
if(xhpcRefundOriginalOrder.getLastOne()==1){
|
||||
xhpcAppUser.setIsRefundApplication(0);
|
||||
}
|
||||
xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser);
|
||||
|
||||
if(surplus.compareTo(new BigDecimal(0))==0){
|
||||
xhpcRefundOriginalOrderMapper.updateRechargeOrderRefundStatus(userId,source);
|
||||
}
|
||||
}else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){
|
||||
Map<String, Object> communityPersonnel = iXhpcRefundAuditService.getCommunityPersonnelById(userId, xhpcRefundOriginalOrder.getTenantId());
|
||||
BigDecimal surplus =new BigDecimal(communityPersonnel.get("balance").toString()).subtract(refundFeeAmount);
|
||||
if(xhpcRefundOriginalOrder.getLastOne()==1){
|
||||
int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,0);
|
||||
}else{
|
||||
int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,null);
|
||||
}
|
||||
if(surplus.compareTo(new BigDecimal(0))==0){
|
||||
xhpcRefundOriginalOrderMapper.updateRechargeOrderRefundStatus(userId,source);
|
||||
}
|
||||
}else if(UserTypeUtil.INTERNET_TYPE.equals(source) && userId>10000){
|
||||
System.out.println("=================查询微信支付信息==========修改金额=======================");
|
||||
System.out.println("=================查询微信支付信息==========修改金额=======================");
|
||||
Map<String, Object> appUserInfo = xhpcUserAccountStatementMapper.getAppInternetUser(userId);
|
||||
String balance = StringUtils.valueOf(appUserInfo.get("balance"));
|
||||
//减少用户余额
|
||||
XhpcAppInternetUser xhpcAppUser = new XhpcAppInternetUser();
|
||||
xhpcAppUser.setAppInternetUserId(userId);
|
||||
BigDecimal surplus =new BigDecimal(balance).subtract(refundFeeAmount);
|
||||
xhpcAppUser.setBalance(surplus);
|
||||
if(xhpcRefundOriginalOrder.getLastOne()==1){
|
||||
xhpcAppUser.setIsRefundApplication(0);
|
||||
}
|
||||
xhpcUserAccountStatementMapper.updateAppInternetUserBalance(xhpcAppUser);
|
||||
if(surplus.compareTo(new BigDecimal(0))==0){
|
||||
xhpcRefundOriginalOrderMapper.updateRechargeOrderRefundStatus(userId,source);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
//退款失败
|
||||
xhpcRefundOriginalOrder.setStatus(2);
|
||||
}
|
||||
|
||||
xhpcRefundOriginalOrderMapper.updateXhpcRefundOriginalOrder(xhpcRefundOriginalOrder);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateXhpcRefundOriginalOrder(Map<String, String> reqInfo) {
|
||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOriginalOrderRefundId(reqInfo.get("refund_id").toString());
|
||||
@ -679,91 +778,194 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
}
|
||||
|
||||
//微信退款原路退回
|
||||
public R getWxTradeRefundYu(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,Integer type){
|
||||
try {
|
||||
readWriteLock.writeLock().lock();//取
|
||||
XhpcSettingConfig config = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId());
|
||||
|
||||
if (config == null) {
|
||||
return R.fail(HttpStatus.ALREADY_EXISTING, "微信退款配置缺失");
|
||||
}
|
||||
// 构建V3配置(自动管理平台证书)
|
||||
Config v3Config = new RSAAutoCertificateConfig.Builder()
|
||||
.merchantId(config.getWxMchId())
|
||||
.privateKeyFromPath(config.getWxApiclientKeyPem())
|
||||
.merchantSerialNumber(config.getWxApiSerialNo())
|
||||
.apiV3Key(config.getWxApiV3Key())
|
||||
.build();
|
||||
|
||||
TransferBatchService transferService = new TransferBatchService.Builder().config(v3Config).build();
|
||||
// 4. 构建请求参数
|
||||
InitiateBatchTransferRequest request = new InitiateBatchTransferRequest();
|
||||
request.setAppid(config.getWxAppId());
|
||||
request.setOutBatchNo(orderNumber);
|
||||
request.setBatchName("用户退款");
|
||||
request.setBatchRemark("退款至零钱");
|
||||
|
||||
// 总金额(分)
|
||||
Long totalAmount = refundFee.multiply(BigDecimal.valueOf(100)).longValue();
|
||||
request.setTotalAmount(totalAmount);
|
||||
request.setTotalNum(1); // 单笔转账
|
||||
|
||||
// 构建明细列表
|
||||
List<TransferDetailInput> detailList = new ArrayList<>();
|
||||
TransferDetailInput detail = new TransferDetailInput();
|
||||
//商家明细单号
|
||||
String outDetailNo = StringUtils.numFormat(11L, 1, StatusConstants.FLOWING_WATER_REFUND_TYPE);
|
||||
detail.setOutDetailNo(outDetailNo);
|
||||
detail.setTransferAmount(totalAmount);
|
||||
detail.setTransferRemark("退款");
|
||||
detail.setOpenid(xhpcRefundOrder.getOpenId());
|
||||
// 如果单笔金额 >= 2000元,需要加密用户姓名
|
||||
// if (totalAmount >= 200000) {
|
||||
// detail.setUserName(encryptUserName(userName));
|
||||
// }
|
||||
detailList.add(detail);
|
||||
request.setTransferDetailList(detailList);
|
||||
//v3回调地址在微信商户后台配置
|
||||
request.setNotifyUrl(config.getWxV3CallbackUrl());
|
||||
|
||||
|
||||
InitiateBatchTransferResponse response = transferService.initiateBatchTransfer(request);
|
||||
// 6. 直接从响应中获取返回信息
|
||||
String outBatchNoResp = response.getOutBatchNo();
|
||||
String batchId = response.getBatchId();
|
||||
String createTime = response.getCreateTime();
|
||||
String batchStatus = response.getBatchStatus();
|
||||
|
||||
|
||||
|
||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder();
|
||||
if ("ACCEPTED".equals(batchStatus) || "PROCESSING".equals(batchStatus) || "FINISHED".equals(batchStatus)) {
|
||||
xhpcRefundOriginalOrder.setStatus(0);
|
||||
|
||||
} else {
|
||||
xhpcRefundOriginalOrder.setStatus(2);
|
||||
}
|
||||
xhpcRefundOriginalOrder.setOutTradeNo(outBatchNoResp);
|
||||
xhpcRefundOriginalOrder.setRefundId(batchId);
|
||||
xhpcRefundOriginalOrder.setCashRefundFee(refundFee);
|
||||
//入库
|
||||
xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId());
|
||||
xhpcRefundOriginalOrder.setType(1);
|
||||
xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource());
|
||||
xhpcRefundOriginalOrder.setDelFlag(0);
|
||||
xhpcRefundOriginalOrder.setCreateTime(new Date());
|
||||
xhpcRefundOriginalOrder.setRemark("微信退款");
|
||||
xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId());
|
||||
xhpcRefundOriginalOrder.setAppId(config.getWxAppId());
|
||||
xhpcRefundOriginalOrder.setMchId(config.getWxMchId());
|
||||
xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId());
|
||||
xhpcRefundOriginalOrder.setOutRefundNo(orderNumber);
|
||||
xhpcRefundOriginalOrder.setOutDetailNo(outDetailNo);
|
||||
xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount());
|
||||
xhpcRefundOriginalOrder.setRefundFee(refundFee);
|
||||
xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId());
|
||||
xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId());
|
||||
xhpcRefundOriginalOrder.setLastOne(type);
|
||||
xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder);
|
||||
|
||||
Thread.sleep(500);
|
||||
|
||||
return R.ok();
|
||||
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
readWriteLock.writeLock().unlock();//释放锁
|
||||
}
|
||||
return R.fail();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public R getWxTradeRefund(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,Integer type){
|
||||
try {
|
||||
readWriteLock.writeLock().lock();//取
|
||||
XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId());
|
||||
CloseableHttpClient httpClient = null;
|
||||
try {
|
||||
//证书的地址
|
||||
httpClient = initCert(xhpcSettingConfig);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
boolean fals = false;
|
||||
String result = "";
|
||||
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
|
||||
//随机字符串
|
||||
String nonceStr = WXPayUtil.generateNonceStr();
|
||||
StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8");
|
||||
httpPost.addHeader("Content-Type", "text/xml");
|
||||
httpPost.setEntity(postEntity);
|
||||
try {
|
||||
HttpResponse response = null;
|
||||
try {
|
||||
response = httpClient.execute(httpPost);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
HttpEntity entity = response.getEntity();
|
||||
try {
|
||||
result = EntityUtils.toString(entity, "UTF-8");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
httpPost.abort();
|
||||
}
|
||||
try {
|
||||
Map<String, String> map = WXPayUtil.xmlToMap(result);
|
||||
String result_code = map.get("result_code");
|
||||
String return_code = map.get("return_code");
|
||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++" + map.toString());
|
||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder();
|
||||
if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) {
|
||||
xhpcRefundOriginalOrder.setStatus(0);
|
||||
xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString());
|
||||
xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString());
|
||||
xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100)));
|
||||
fals = true;
|
||||
} else {
|
||||
xhpcRefundOriginalOrder.setStatus(2);
|
||||
}
|
||||
//入库
|
||||
xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId());
|
||||
xhpcRefundOriginalOrder.setType(1);
|
||||
xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource());
|
||||
xhpcRefundOriginalOrder.setDelFlag(0);
|
||||
xhpcRefundOriginalOrder.setCreateTime(new Date());
|
||||
xhpcRefundOriginalOrder.setRemark("微信退款");
|
||||
xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId());
|
||||
xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId());
|
||||
xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId());
|
||||
xhpcRefundOriginalOrder.setNonceStr(nonceStr);
|
||||
xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId());
|
||||
xhpcRefundOriginalOrder.setOutRefundNo(orderNumber);
|
||||
xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount());
|
||||
xhpcRefundOriginalOrder.setRefundFee(refundFee);
|
||||
xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId());
|
||||
xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId());
|
||||
xhpcRefundOriginalOrder.setLastOne(type);
|
||||
xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
Thread.sleep(500);
|
||||
if (fals) {
|
||||
return R.ok();
|
||||
}
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
readWriteLock.writeLock().unlock();//释放锁
|
||||
}
|
||||
try {
|
||||
readWriteLock.writeLock().lock();//取
|
||||
XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId());
|
||||
CloseableHttpClient httpClient = null;
|
||||
try {
|
||||
//证书的地址
|
||||
httpClient = initCert(xhpcSettingConfig);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
boolean fals = false;
|
||||
String result = "";
|
||||
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
|
||||
//随机字符串
|
||||
String nonceStr = WXPayUtil.generateNonceStr();
|
||||
StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8");
|
||||
httpPost.addHeader("Content-Type", "text/xml");
|
||||
httpPost.setEntity(postEntity);
|
||||
try {
|
||||
HttpResponse response = null;
|
||||
try {
|
||||
response = httpClient.execute(httpPost);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
HttpEntity entity = response.getEntity();
|
||||
try {
|
||||
result = EntityUtils.toString(entity, "UTF-8");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
httpPost.abort();
|
||||
}
|
||||
try {
|
||||
Map<String, String> map = WXPayUtil.xmlToMap(result);
|
||||
String result_code = map.get("result_code");
|
||||
String return_code = map.get("return_code");
|
||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++" + map.toString());
|
||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder();
|
||||
if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) {
|
||||
xhpcRefundOriginalOrder.setStatus(0);
|
||||
xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString());
|
||||
xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString());
|
||||
xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100)));
|
||||
fals = true;
|
||||
} else {
|
||||
xhpcRefundOriginalOrder.setStatus(2);
|
||||
}
|
||||
//入库
|
||||
xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId());
|
||||
xhpcRefundOriginalOrder.setType(1);
|
||||
xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource());
|
||||
xhpcRefundOriginalOrder.setDelFlag(0);
|
||||
xhpcRefundOriginalOrder.setCreateTime(new Date());
|
||||
xhpcRefundOriginalOrder.setRemark("微信退款");
|
||||
xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId());
|
||||
xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId());
|
||||
xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId());
|
||||
xhpcRefundOriginalOrder.setNonceStr(nonceStr);
|
||||
xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId());
|
||||
xhpcRefundOriginalOrder.setOutRefundNo(orderNumber);
|
||||
xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount());
|
||||
xhpcRefundOriginalOrder.setRefundFee(refundFee);
|
||||
xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId());
|
||||
xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId());
|
||||
xhpcRefundOriginalOrder.setLastOne(type);
|
||||
xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
Thread.sleep(500);
|
||||
if (fals) {
|
||||
return R.ok();
|
||||
}
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
readWriteLock.writeLock().unlock();//释放锁
|
||||
}
|
||||
return R.fail();
|
||||
}
|
||||
|
||||
@ -939,22 +1141,22 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
request.setBizContent(bizContent.toString());
|
||||
logger.info("=====支付宝退款订单=======bizContent=========================="+bizContent.toString());
|
||||
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
|
||||
if("Y".equals(response.getFundChange())){
|
||||
System.out.println("调用退款成功");
|
||||
paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee);
|
||||
addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee);
|
||||
return R.ok();
|
||||
}else{
|
||||
//查询订单
|
||||
R r = alipayTradeFastpayRefundQuery(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, refundFee, orderNumber, number);
|
||||
if(r.getCode()==200){
|
||||
if("Y".equals(response.getFundChange())){
|
||||
System.out.println("调用退款成功");
|
||||
paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee);
|
||||
addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee);
|
||||
return R.ok();
|
||||
}
|
||||
}else{
|
||||
//查询订单
|
||||
R r = alipayTradeFastpayRefundQuery(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, refundFee, orderNumber, number);
|
||||
if(r.getCode()==200){
|
||||
paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee);
|
||||
addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
}
|
||||
Thread.sleep(500);
|
||||
}
|
||||
Thread.sleep(500);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
@ -1035,7 +1237,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, refundFee,1);
|
||||
if(wxTradeRefund.getCode()==200){
|
||||
updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1);
|
||||
return R.ok(map);
|
||||
return R.ok(map);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
@ -1376,9 +1578,9 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
Integer source = refundOrder.getSource();
|
||||
Map<String, Object> appUserInfo = new HashMap<>();
|
||||
if(UserTypeUtil.USER_TYPE.equals(source)){
|
||||
appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId);
|
||||
appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId);
|
||||
}else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){
|
||||
appUserInfo = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId());
|
||||
appUserInfo = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId());
|
||||
}
|
||||
String phone=appUserInfo.get("phone").toString();
|
||||
String uid = StringUtils.valueOf(appUserInfo.get("alipayOpenId"));
|
||||
@ -1517,7 +1719,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
||||
HashMap<String, String> paramMap = new HashMap<>();
|
||||
paramMap.put("phone", "18123374652");
|
||||
paramMap.put("content", "【翔桦充电】尊敬的管理员,用户退款订单:"+number+",有问题请速速查看。");
|
||||
// smsService.sendNotice(paramMap);
|
||||
// smsService.sendNotice(paramMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -0,0 +1,79 @@
|
||||
package com.xhpc.payment.util;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
/**
|
||||
* 微信支付回调通知外层报文
|
||||
* 对应 resource 加密前的原始 JSON
|
||||
*/
|
||||
public class TransferBatchCallbackNotification {
|
||||
@SerializedName("id")
|
||||
private String id;
|
||||
|
||||
@SerializedName("create_time")
|
||||
private String createTime;
|
||||
|
||||
@SerializedName("resource_type")
|
||||
private String resourceType;
|
||||
|
||||
@SerializedName("event_type")
|
||||
private String eventType;
|
||||
|
||||
@SerializedName("summary")
|
||||
private String summary;
|
||||
|
||||
@SerializedName("resource")
|
||||
private Resource resource;
|
||||
|
||||
// ----- Getters and Setters -----
|
||||
public String getId() { return id; }
|
||||
public void setId(String id) { this.id = id; }
|
||||
|
||||
public String getCreateTime() { return createTime; }
|
||||
public void setCreateTime(String createTime) { this.createTime = createTime; }
|
||||
|
||||
public String getResourceType() { return resourceType; }
|
||||
public void setResourceType(String resourceType) { this.resourceType = resourceType; }
|
||||
|
||||
public String getEventType() { return eventType; }
|
||||
public void setEventType(String eventType) { this.eventType = eventType; }
|
||||
|
||||
public String getSummary() { return summary; }
|
||||
public void setSummary(String summary) { this.summary = summary; }
|
||||
|
||||
public Resource getResource() { return resource; }
|
||||
public void setResource(Resource resource) { this.resource = resource; }
|
||||
|
||||
public static class Resource {
|
||||
@SerializedName("original_type")
|
||||
private String originalType;
|
||||
|
||||
@SerializedName("algorithm")
|
||||
private String algorithm;
|
||||
|
||||
@SerializedName("ciphertext")
|
||||
private String ciphertext;
|
||||
|
||||
@SerializedName("associated_data")
|
||||
private String associatedData;
|
||||
|
||||
@SerializedName("nonce")
|
||||
private String nonce;
|
||||
|
||||
// ----- Getters and Setters -----
|
||||
public String getOriginalType() { return originalType; }
|
||||
public void setOriginalType(String originalType) { this.originalType = originalType; }
|
||||
|
||||
public String getAlgorithm() { return algorithm; }
|
||||
public void setAlgorithm(String algorithm) { this.algorithm = algorithm; }
|
||||
|
||||
public String getCiphertext() { return ciphertext; }
|
||||
public void setCiphertext(String ciphertext) { this.ciphertext = ciphertext; }
|
||||
|
||||
public String getAssociatedData() { return associatedData; }
|
||||
public void setAssociatedData(String associatedData) { this.associatedData = associatedData; }
|
||||
|
||||
public String getNonce() { return nonce; }
|
||||
public void setNonce(String nonce) { this.nonce = nonce; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,93 @@
|
||||
package com.xhpc.payment.util;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 微信商家转账批次回调通知数据
|
||||
* 文档:https://pay.weixin.qq.com/doc/v3/merchant/4012071382
|
||||
*/
|
||||
public class TransferBatchNotifyData {
|
||||
@SerializedName("mchid")
|
||||
private String mchid;
|
||||
|
||||
@SerializedName("out_batch_no")
|
||||
private String outBatchNo;
|
||||
|
||||
@SerializedName("batch_id")
|
||||
private String batchId;
|
||||
|
||||
@SerializedName("batch_status")
|
||||
private String batchStatus; // FINISHED, CLOSED
|
||||
|
||||
@SerializedName("total_num")
|
||||
private Integer totalNum;
|
||||
|
||||
@SerializedName("total_amount")
|
||||
private Long totalAmount; // 单位:分
|
||||
|
||||
@SerializedName("transfer_detail_list")
|
||||
private List<TransferDetail> transferDetailList;
|
||||
|
||||
// ----- Getter/Setter -----
|
||||
public String getMchid() { return mchid; }
|
||||
public void setMchid(String mchid) { this.mchid = mchid; }
|
||||
|
||||
public String getOutBatchNo() { return outBatchNo; }
|
||||
public void setOutBatchNo(String outBatchNo) { this.outBatchNo = outBatchNo; }
|
||||
|
||||
public String getBatchId() { return batchId; }
|
||||
public void setBatchId(String batchId) { this.batchId = batchId; }
|
||||
|
||||
public String getBatchStatus() { return batchStatus; }
|
||||
public void setBatchStatus(String batchStatus) { this.batchStatus = batchStatus; }
|
||||
|
||||
public Integer getTotalNum() { return totalNum; }
|
||||
public void setTotalNum(Integer totalNum) { this.totalNum = totalNum; }
|
||||
|
||||
public Long getTotalAmount() { return totalAmount; }
|
||||
public void setTotalAmount(Long totalAmount) { this.totalAmount = totalAmount; }
|
||||
|
||||
public List<TransferDetail> getTransferDetailList() { return transferDetailList; }
|
||||
public void setTransferDetailList(List<TransferDetail> transferDetailList) { this.transferDetailList = transferDetailList; }
|
||||
|
||||
public static class TransferDetail {
|
||||
@SerializedName("detail_id")
|
||||
private String detailId;
|
||||
|
||||
@SerializedName("out_detail_no")
|
||||
private String outDetailNo;
|
||||
|
||||
@SerializedName("detail_status")
|
||||
private String detailStatus; // SUCCESS, FAIL
|
||||
|
||||
@SerializedName("transfer_amount")
|
||||
private Long transferAmount;
|
||||
|
||||
@SerializedName("openid")
|
||||
private String openid;
|
||||
|
||||
@SerializedName("fail_reason")
|
||||
private String failReason;
|
||||
|
||||
// ----- Getter/Setter -----
|
||||
public String getDetailId() { return detailId; }
|
||||
public void setDetailId(String detailId) { this.detailId = detailId; }
|
||||
|
||||
public String getOutDetailNo() { return outDetailNo; }
|
||||
public void setOutDetailNo(String outDetailNo) { this.outDetailNo = outDetailNo; }
|
||||
|
||||
public String getDetailStatus() { return detailStatus; }
|
||||
public void setDetailStatus(String detailStatus) { this.detailStatus = detailStatus; }
|
||||
|
||||
public Long getTransferAmount() { return transferAmount; }
|
||||
public void setTransferAmount(Long transferAmount) { this.transferAmount = transferAmount; }
|
||||
|
||||
public String getOpenid() { return openid; }
|
||||
public void setOpenid(String openid) { this.openid = openid; }
|
||||
|
||||
public String getFailReason() { return failReason; }
|
||||
public void setFailReason(String failReason) { this.failReason = failReason; }
|
||||
}
|
||||
}
|
||||
@ -32,6 +32,13 @@
|
||||
<result column="update_by" property="updateBy"/>
|
||||
<result column="remark" property="remark"/>
|
||||
<result column="tenant_id" property="tenantId"/>
|
||||
<result column="wx_api_serial_no" property="wxApiSerialNo"/>
|
||||
<result column="wx_api_v3_key" property="wxApiV3Key"/>
|
||||
<result column="wx_pay_public_keyId" property="wxPayPublicKeyId"/>
|
||||
<result column="wx_pay_public_key_path" property="wxPayPublicKeyPath"/>
|
||||
<result column="wx_v3_callback_url" property="wxV3CallbackUrl"/>
|
||||
|
||||
|
||||
</resultMap>
|
||||
|
||||
<select id="getXhpcSettingConfigTenantId" resultMap="XhpcSettingConfigResult">
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user