增加商户转账到零钱v3版本
This commit is contained in:
parent
2b0eebdc0f
commit
41432e8d79
@ -97,4 +97,15 @@ public class XhpcSettingConfig extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String tenantId;
|
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);
|
int count = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderTotalPrice(serialNumber, 2);
|
||||||
if(count==0){
|
if(count==0){
|
||||||
endTime = startTime;
|
endTime = startTime;
|
||||||
}else{
|
}else{
|
||||||
//查看下一单的时间是否超过30分钟
|
int number = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTimeYu(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu);
|
||||||
// int result = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTime(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu);
|
//有下一单返回1 没有下一单返回0
|
||||||
// if(result==0){
|
if(number>0){
|
||||||
// endTime = startTime;
|
//查看下一单的时间是否超过30分钟
|
||||||
// }
|
int result = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTime(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu);
|
||||||
|
if(result==0){
|
||||||
|
endTime = startTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
String start = DateUtil.formatTime(startTime);
|
String start = DateUtil.formatTime(startTime);
|
||||||
String end = DateUtil.formatTime(endTime);
|
String end = DateUtil.formatTime(endTime);
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
package com.xhpc.payment.controller;
|
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.annotation.NoRepeatSubmit;
|
||||||
import com.xhpc.common.core.constant.HttpStatus;
|
import com.xhpc.common.core.constant.HttpStatus;
|
||||||
import com.xhpc.common.core.constant.StatusConstants;
|
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.controller.BaseController;
|
||||||
import com.xhpc.common.core.web.domain.AjaxResult;
|
import com.xhpc.common.core.web.domain.AjaxResult;
|
||||||
import com.xhpc.common.domain.XhpcRefundOrder;
|
import com.xhpc.common.domain.XhpcRefundOrder;
|
||||||
|
import com.xhpc.common.domain.XhpcSettingConfig;
|
||||||
import com.xhpc.common.log.annotation.Log;
|
import com.xhpc.common.log.annotation.Log;
|
||||||
import com.xhpc.common.log.enums.BusinessType;
|
import com.xhpc.common.log.enums.BusinessType;
|
||||||
import com.xhpc.common.security.service.TokenService;
|
|
||||||
import com.xhpc.common.util.UserTypeUtil;
|
import com.xhpc.common.util.UserTypeUtil;
|
||||||
import com.xhpc.payment.domain.XhpcAppInternetUser;
|
import com.xhpc.payment.domain.XhpcAppInternetUser;
|
||||||
import com.xhpc.payment.domain.XhpcAppUser;
|
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.XhpcRefundOrderMapper;
|
||||||
import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper;
|
import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper;
|
||||||
import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper;
|
import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper;
|
||||||
|
import com.xhpc.payment.service.IXhpcCommonPayment;
|
||||||
import com.xhpc.payment.service.IXhpcRefundAuditService;
|
import com.xhpc.payment.service.IXhpcRefundAuditService;
|
||||||
import com.xhpc.payment.service.IXhpcRefundOrderService;
|
import com.xhpc.payment.service.IXhpcRefundOrderService;
|
||||||
import com.xhpc.payment.service.IXhpcRefundOriginalOrderService;
|
import com.xhpc.payment.service.IXhpcRefundOriginalOrderService;
|
||||||
import com.xhpc.payment.util.AESUtil;
|
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.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
||||||
@ -51,6 +53,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author yuyang
|
* @author yuyang
|
||||||
@ -73,6 +76,10 @@ public class XhpcRefundOriginalOrderController extends BaseController {
|
|||||||
private IXhpcRefundOrderService iXhpcRefundOrderService;
|
private IXhpcRefundOrderService iXhpcRefundOrderService;
|
||||||
@Resource
|
@Resource
|
||||||
private XhpcRefundOrderMapper xhpcRefundOrderMapper;
|
private XhpcRefundOrderMapper xhpcRefundOrderMapper;
|
||||||
|
@Resource
|
||||||
|
private IXhpcCommonPayment xhpcCommonPayment;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private final ExecutorService executorService = Executors.newFixedThreadPool(40);
|
private final ExecutorService executorService = Executors.newFixedThreadPool(40);
|
||||||
|
|
||||||
@ -93,8 +100,71 @@ public class XhpcRefundOriginalOrderController extends BaseController {
|
|||||||
return xhpcRefundOriginalOrderService.wxRefundOriginalOrder(refundOrderId);
|
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")
|
@RequestMapping("/paymentCallback")
|
||||||
public Object payNotify(HttpServletRequest request, HttpServletResponse response) {
|
public Object payNotify(HttpServletRequest request, HttpServletResponse response) {
|
||||||
|
|||||||
@ -130,4 +130,6 @@ public class XhpcRefundOriginalOrder extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private Integer lastOne;
|
private Integer lastOne;
|
||||||
|
|
||||||
|
//商家明细单号
|
||||||
|
private String outDetailNo;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,12 @@ import com.alipay.api.request.AlipayTradeRefundRequest;
|
|||||||
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
|
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
|
||||||
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
|
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
|
||||||
import com.alipay.api.response.AlipayTradeRefundResponse;
|
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.api.SmsService;
|
||||||
import com.xhpc.common.core.constant.HttpStatus;
|
import com.xhpc.common.core.constant.HttpStatus;
|
||||||
import com.xhpc.common.core.constant.StatusConstants;
|
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.XhpcRefundOriginalOrderMapper;
|
||||||
import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper;
|
import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper;
|
||||||
import com.xhpc.payment.service.*;
|
import com.xhpc.payment.service.*;
|
||||||
|
import com.xhpc.payment.util.TransferBatchNotifyData;
|
||||||
import org.apache.http.HttpEntity;
|
import org.apache.http.HttpEntity;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
import org.apache.http.client.methods.HttpPost;
|
||||||
@ -368,7 +375,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
|||||||
if(r1.getCode()==200){
|
if(r1.getCode()==200){
|
||||||
Map<String, Object> map = (Map<String, Object>)r1.getData();
|
Map<String, Object> map = (Map<String, Object>)r1.getData();
|
||||||
if(map !=null && map.get("refundFee") !=null){
|
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();
|
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
|
@Override
|
||||||
public void updateXhpcRefundOriginalOrder(Map<String, String> reqInfo) {
|
public void updateXhpcRefundOriginalOrder(Map<String, String> reqInfo) {
|
||||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOriginalOrderRefundId(reqInfo.get("refund_id").toString());
|
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){
|
public R getWxTradeRefund(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,Integer type){
|
||||||
try {
|
try {
|
||||||
readWriteLock.writeLock().lock();//取
|
readWriteLock.writeLock().lock();//取
|
||||||
XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId());
|
XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId());
|
||||||
CloseableHttpClient httpClient = null;
|
CloseableHttpClient httpClient = null;
|
||||||
try {
|
try {
|
||||||
//证书的地址
|
//证书的地址
|
||||||
httpClient = initCert(xhpcSettingConfig);
|
httpClient = initCert(xhpcSettingConfig);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
boolean fals = false;
|
boolean fals = false;
|
||||||
String result = "";
|
String result = "";
|
||||||
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
|
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
|
||||||
//随机字符串
|
//随机字符串
|
||||||
String nonceStr = WXPayUtil.generateNonceStr();
|
String nonceStr = WXPayUtil.generateNonceStr();
|
||||||
StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8");
|
StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8");
|
||||||
httpPost.addHeader("Content-Type", "text/xml");
|
httpPost.addHeader("Content-Type", "text/xml");
|
||||||
httpPost.setEntity(postEntity);
|
httpPost.setEntity(postEntity);
|
||||||
try {
|
try {
|
||||||
HttpResponse response = null;
|
HttpResponse response = null;
|
||||||
try {
|
try {
|
||||||
response = httpClient.execute(httpPost);
|
response = httpClient.execute(httpPost);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
HttpEntity entity = response.getEntity();
|
HttpEntity entity = response.getEntity();
|
||||||
try {
|
try {
|
||||||
result = EntityUtils.toString(entity, "UTF-8");
|
result = EntityUtils.toString(entity, "UTF-8");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
httpPost.abort();
|
httpPost.abort();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Map<String, String> map = WXPayUtil.xmlToMap(result);
|
Map<String, String> map = WXPayUtil.xmlToMap(result);
|
||||||
String result_code = map.get("result_code");
|
String result_code = map.get("result_code");
|
||||||
String return_code = map.get("return_code");
|
String return_code = map.get("return_code");
|
||||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
||||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++" + map.toString());
|
logger.info("+++++++原路退款+++++退款信息++++++++++++++++" + map.toString());
|
||||||
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
logger.info("+++++++原路退款+++++退款信息++++++++++++++++");
|
||||||
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder();
|
XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder();
|
||||||
if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) {
|
if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) {
|
||||||
xhpcRefundOriginalOrder.setStatus(0);
|
xhpcRefundOriginalOrder.setStatus(0);
|
||||||
xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString());
|
xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString());
|
||||||
xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString());
|
xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString());
|
||||||
xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100)));
|
xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100)));
|
||||||
fals = true;
|
fals = true;
|
||||||
} else {
|
} else {
|
||||||
xhpcRefundOriginalOrder.setStatus(2);
|
xhpcRefundOriginalOrder.setStatus(2);
|
||||||
}
|
}
|
||||||
//入库
|
//入库
|
||||||
xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId());
|
xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId());
|
||||||
xhpcRefundOriginalOrder.setType(1);
|
xhpcRefundOriginalOrder.setType(1);
|
||||||
xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource());
|
xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource());
|
||||||
xhpcRefundOriginalOrder.setDelFlag(0);
|
xhpcRefundOriginalOrder.setDelFlag(0);
|
||||||
xhpcRefundOriginalOrder.setCreateTime(new Date());
|
xhpcRefundOriginalOrder.setCreateTime(new Date());
|
||||||
xhpcRefundOriginalOrder.setRemark("微信退款");
|
xhpcRefundOriginalOrder.setRemark("微信退款");
|
||||||
xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId());
|
xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId());
|
||||||
xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId());
|
xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId());
|
||||||
xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId());
|
xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId());
|
||||||
xhpcRefundOriginalOrder.setNonceStr(nonceStr);
|
xhpcRefundOriginalOrder.setNonceStr(nonceStr);
|
||||||
xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId());
|
xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId());
|
||||||
xhpcRefundOriginalOrder.setOutRefundNo(orderNumber);
|
xhpcRefundOriginalOrder.setOutRefundNo(orderNumber);
|
||||||
xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount());
|
xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount());
|
||||||
xhpcRefundOriginalOrder.setRefundFee(refundFee);
|
xhpcRefundOriginalOrder.setRefundFee(refundFee);
|
||||||
xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId());
|
xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId());
|
||||||
xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId());
|
xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId());
|
||||||
xhpcRefundOriginalOrder.setLastOne(type);
|
xhpcRefundOriginalOrder.setLastOne(type);
|
||||||
xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder);
|
xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
Thread.sleep(500);
|
Thread.sleep(500);
|
||||||
if (fals) {
|
if (fals) {
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}finally {
|
}finally {
|
||||||
readWriteLock.writeLock().unlock();//释放锁
|
readWriteLock.writeLock().unlock();//释放锁
|
||||||
}
|
}
|
||||||
return R.fail();
|
return R.fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -939,22 +1141,22 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
|||||||
request.setBizContent(bizContent.toString());
|
request.setBizContent(bizContent.toString());
|
||||||
logger.info("=====支付宝退款订单=======bizContent=========================="+bizContent.toString());
|
logger.info("=====支付宝退款订单=======bizContent=========================="+bizContent.toString());
|
||||||
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
|
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
|
||||||
if("Y".equals(response.getFundChange())){
|
if("Y".equals(response.getFundChange())){
|
||||||
System.out.println("调用退款成功");
|
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);
|
paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee);
|
||||||
addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee);
|
addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee);
|
||||||
return R.ok();
|
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){
|
}catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}finally {
|
}finally {
|
||||||
@ -1035,7 +1237,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
|||||||
R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, refundFee,1);
|
R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, refundFee,1);
|
||||||
if(wxTradeRefund.getCode()==200){
|
if(wxTradeRefund.getCode()==200){
|
||||||
updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1);
|
updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1);
|
||||||
return R.ok(map);
|
return R.ok(map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@ -1376,9 +1578,9 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
|||||||
Integer source = refundOrder.getSource();
|
Integer source = refundOrder.getSource();
|
||||||
Map<String, Object> appUserInfo = new HashMap<>();
|
Map<String, Object> appUserInfo = new HashMap<>();
|
||||||
if(UserTypeUtil.USER_TYPE.equals(source)){
|
if(UserTypeUtil.USER_TYPE.equals(source)){
|
||||||
appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId);
|
appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId);
|
||||||
}else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){
|
}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 phone=appUserInfo.get("phone").toString();
|
||||||
String uid = StringUtils.valueOf(appUserInfo.get("alipayOpenId"));
|
String uid = StringUtils.valueOf(appUserInfo.get("alipayOpenId"));
|
||||||
@ -1517,7 +1719,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr
|
|||||||
HashMap<String, String> paramMap = new HashMap<>();
|
HashMap<String, String> paramMap = new HashMap<>();
|
||||||
paramMap.put("phone", "18123374652");
|
paramMap.put("phone", "18123374652");
|
||||||
paramMap.put("content", "【翔桦充电】尊敬的管理员,用户退款订单:"+number+",有问题请速速查看。");
|
paramMap.put("content", "【翔桦充电】尊敬的管理员,用户退款订单:"+number+",有问题请速速查看。");
|
||||||
// smsService.sendNotice(paramMap);
|
// smsService.sendNotice(paramMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user