## Opt - 手动补偿异常回调

This commit is contained in:
sangelxiu1 2025-08-20 11:40:13 +08:00
parent a1c9f83862
commit 5194d5ee9c
8 changed files with 353 additions and 17 deletions

View File

@ -2,6 +2,7 @@ package com.hzs.third.pay.controller.manage;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hzs.common.core.annotation.AccessPermissions;
import com.hzs.common.core.annotation.Log;
import com.hzs.common.core.constant.EnumsPrefixConstants;
@ -20,6 +21,7 @@ import com.hzs.common.service.ITransactionCommonService;
import com.hzs.common.util.TransactionUtils;
import com.hzs.third.pay.param.OnlinePaymentParam;
import com.hzs.third.pay.param.OnlinePaymentRetryParam;
import com.hzs.third.pay.service.IJdPayService;
import com.hzs.third.pay.service.IPayService;
import com.hzs.third.pay.service.ITOnlinePaymentService;
import com.hzs.third.pay.vo.OnlinePaymentVO;
@ -43,6 +45,8 @@ public class OnlinePaymentController extends BaseController {
private ITOnlinePaymentService itOnlinePaymentService;
@Autowired
private IPayService iPayService;
@Autowired
private IJdPayService iJdPayService;
@Autowired
private ITransactionCommonService iTransactionCommonService;
@ -139,4 +143,16 @@ public class OnlinePaymentController extends BaseController {
return toAjax(iPayService.retryHandle(tOnlinePayment, false));
}
/**
* 补偿支付回调
*
* @param param 业务重试入参
* @return
*/
@Log(module = EOperationModule.ONLINE_PAY_DETAIL, business = EOperationBusiness.ONLINE_PAY_DETAIL, method = EOperationMethod.SUBMIT)
@GetMapping("/compensationCallBack")
public AjaxResult compensationCallBack(@RequestParam("businessCode") String businessCode) {
return iJdPayService.compensationCallBack(businessCode);
}
}

View File

@ -0,0 +1,27 @@
package com.hzs.third.pay.jdpay.dto;
import java.io.Serializable;
public class JdPayQueryOrderRequest implements Serializable {
/**
* 商户订单号
*/
private String outTradeNo;
public String getOutTradeNo() {
return outTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
@Override
public String toString() {
return "{ \"outTradeNo\":\"" + outTradeNo + "\""
+ "}"
;
}
}

View File

@ -0,0 +1,197 @@
package com.hzs.third.pay.jdpay.dto;
import java.io.Serializable;
public class JdPayQueryOrderResponse implements Serializable {
/**
* 京东交易订单号
*/
private String tradeNo;
/**
* 商户订单号
*/
private String outTradeNo;
/**
* 订单总金额
*/
private String tradeAmount;
/**
* 支付完成时间
*/
private String finishDate;
/**
* 交易类型
*/
private String tradeType;
/**
* 交易状态
*/
private String tradeStatus;
/**
* 回传字段
*/
private String returnParams;
/**
* 商户用户标识
*/
private String userId;
/**
* 优惠金额
*/
private String discountAmount;
/**
* 支付工具
*/
private String payTool;
/**
* ]
* 掩码卡号
*/
private String maskCardNo;
/**
* 卡类型
*/
private String cardType;
/**
* 银行编码
*/
private String bankCode;
/**
* 白条分期数
*/
private String installmentNum;
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public String getOutTradeNo() {
return outTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
public String getTradeAmount() {
return tradeAmount;
}
public void setTradeAmount(String tradeAmount) {
this.tradeAmount = tradeAmount;
}
public String getFinishDate() {
return finishDate;
}
public void setFinishDate(String finishDate) {
this.finishDate = finishDate;
}
public String getTradeType() {
return tradeType;
}
public void setTradeType(String tradeType) {
this.tradeType = tradeType;
}
public String getTradeStatus() {
return tradeStatus;
}
public void setTradeStatus(String tradeStatus) {
this.tradeStatus = tradeStatus;
}
public String getReturnParams() {
return returnParams;
}
public void setReturnParams(String returnParams) {
this.returnParams = returnParams;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getDiscountAmount() {
return discountAmount;
}
public void setDiscountAmount(String discountAmount) {
this.discountAmount = discountAmount;
}
public String getPayTool() {
return payTool;
}
public void setPayTool(String payTool) {
this.payTool = payTool;
}
public String getMaskCardNo() {
return maskCardNo;
}
public void setMaskCardNo(String maskCardNo) {
this.maskCardNo = maskCardNo;
}
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
public String getBankCode() {
return bankCode;
}
public void setBankCode(String bankCode) {
this.bankCode = bankCode;
}
public String getInstallmentNum() {
return installmentNum;
}
public void setInstallmentNum(String installmentNum) {
this.installmentNum = installmentNum;
}
@Override
public String toString() {
return "{\"tradeNo\":\"" + tradeNo + "\""
+ ", \"outTradeNo\":\"" + outTradeNo + "\""
+ ", \"tradeAmount\":\"" + tradeAmount + "\""
+ ", \"finishDate\":\"" + finishDate + "\""
+ ", \"tradeType\":\"" + tradeType + "\""
+ ", \"tradeStatus\":\"" + tradeStatus + "\""
+ ", \"returnParams\":\"" + returnParams + "\""
+ ", \"userId\":\"" + userId + "\""
+ ", \"discountAmount\":\"" + discountAmount + "\""
+ ", \"payTool\":\"" + payTool + "\""
+ ", \"maskCardNo\":\"" + maskCardNo + "\""
+ ", \"cardType\":\"" + cardType + "\""
+ ", \"bankCode\":\"" + bankCode + "\""
+ ", \"installmentNum\":\"" + installmentNum + "\""
+ "}"
;
}
}

View File

@ -56,9 +56,9 @@ public class JdPay {
// * @return JdPayQueryOrderResponse 返回数据
// * @throws Exception
// */
// public JdPayQueryOrderResponse queryOrder(JdPayQueryOrderRequest request) throws Exception {
// return this.baseExecute(JdPayConstant.TRADE_QUERY_URL, request, JdPayQueryOrderResponse.class);
// }
public JdPayQueryOrderResponse queryOrder(JdPayQueryOrderRequest request) throws Exception {
return this.baseExecute(JdPayConstant.TRADE_QUERY_URL, request, JdPayQueryOrderResponse.class);
}
//
// /**
// * 作用代扣

View File

@ -2,6 +2,7 @@ package com.hzs.third.pay.service;
import com.hzs.common.core.domain.R;
import com.hzs.common.core.enums.EDataSource;
import com.hzs.common.core.web.domain.AjaxResult;
import com.hzs.common.domain.third.pay.TOnlinePayment;
/**
@ -34,5 +35,12 @@ public interface IJdPayService {
* @return
*/
R<String> cashRegister(TOnlinePayment onlinePayment, EDataSource dataSource);
/**
* 收银台支付
*
* @param onlinePayment
* @param dataSource
* @return
*/
AjaxResult compensationCallBack(String businessCode);
}

View File

@ -2,12 +2,12 @@ package com.hzs.third.pay.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hzs.common.core.config.BdConfig;
import com.hzs.common.core.domain.R;
import com.hzs.common.core.enums.EBindStatus;
import com.hzs.common.core.enums.EDataSource;
import com.hzs.common.core.enums.EEnv;
import com.hzs.common.core.enums.*;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.core.web.domain.AjaxResult;
import com.hzs.common.domain.third.pay.TOnlineCard;
import com.hzs.common.domain.third.pay.TOnlinePayment;
import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc;
@ -25,16 +25,10 @@ import com.hzs.third.pay.dto.jd.JdScanDTO;
import com.hzs.third.pay.dto.jd.JdScanResult;
import com.hzs.third.pay.enums.EJdAppType;
import com.hzs.third.pay.enums.EJdTerminalType;
import com.hzs.third.pay.jdpay.dto.JdPayAggregateCreateOrderRequest;
import com.hzs.third.pay.jdpay.dto.JdPayAggregateCreateOrderResponse;
import com.hzs.third.pay.jdpay.dto.JdPayDivisionAccount;
import com.hzs.third.pay.jdpay.dto.JdPayDivisionAccountTradeInfo;
import com.hzs.third.pay.jdpay.dto.*;
import com.hzs.third.pay.jdpay.sdk.JdPay;
import com.hzs.third.pay.jdpay.util.GsonUtil;
import com.hzs.third.pay.service.IJdPayService;
import com.hzs.third.pay.service.ITOnlineCardService;
import com.hzs.third.pay.service.ITOnlinePaymentSepAccService;
import com.hzs.third.pay.service.ITOnlinePaymentService;
import com.hzs.third.pay.service.*;
import com.hzs.third.pay.util.JdPayUtil;
import com.hzs.third.pay.util.PayUtil;
import lombok.extern.slf4j.Slf4j;
@ -48,6 +42,7 @@ import java.math.BigDecimal;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@ -73,6 +68,8 @@ public class JdPayServiceImpl implements IJdPayService {
@Autowired
private ITOnlinePaymentService itOnlinePaymentService;
@Autowired
private IPayService iPayService;
@Resource
private JdPayWechatAlipayProperties jdPayWechatAlipayProperties;
@ -336,5 +333,94 @@ public class JdPayServiceImpl implements IJdPayService {
}
}
@Override
public AjaxResult compensationCallBack(String businessCode) {
LambdaQueryWrapper<TOnlinePayment> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TOnlinePayment::getBusinessCode, businessCode);
queryWrapper.eq(TOnlinePayment::getDelFlag, EDelFlag.UN_DELETE.getValue());
TOnlinePayment tOnlinePayment = itOnlinePaymentService.getOne(queryWrapper, false);
if(ObjectUtil.isEmpty(tOnlinePayment)){
return AjaxResult.error("订单不存在");
}
JdPayQueryOrderRequest request = new JdPayQueryOrderRequest();
request.setOutTradeNo(tOnlinePayment.getBusinessCode());
JdPayQueryOrderResponse response = null;
try {
response = jdPay.queryOrder(request);
if (ObjectUtil.isEmpty(response.getTradeNo()) || EPayStatus.PAID.getValue() == tOnlinePayment.getPayStatus()) {
log.error("支付信息不存在或已支付");
return AjaxResult.success("已支付订单 无需补偿回调!");
}
log.info("queryOrder : {}", JSONUtil.toJsonStr(response));
{
// 支付成功处理
// 商户订单号
String payNumber = response.getTradeNo();
// 渠道流水号
String channelNumber = "";
// 支付完成时间
Date payTime = DateUtils.parseDateOne(response.getFinishDate(), DateUtils.YAMMERERS);
// 回调订单编号
String thirdOrderCode = response.getOutTradeNo();
// 订单编号
String acqOrderId = "compensationCallBack";
// 订单金额
int tradeAmount = Integer.parseInt(response.getTradeAmount());
BigDecimal payMoney = new BigDecimal(tradeAmount).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP);
Integer payType = convertPayType(response.getPayTool());
// 支付后续业务处理
if (iPayService.notifyHandle(tOnlinePayment.getBusinessType().toString() , thirdOrderCode, thirdOrderCode, payNumber, payTime, payMoney, EPayChannel.JD, channelNumber, payType, acqOrderId)) {
return AjaxResult.success();
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return AjaxResult.success();
}
/**
* 京东收银台处理成功返回
*/
private static final String SUCCESS = "SUCCESS";
/**
* 京东收银台处理失败返回
*/
private static final String ERROR = "ERROR";
private Integer convertPayType(String payName){
Integer result = EPayType.WECHAT.getValue();
switch (payName){
case "XJK":
result = EPayType.MINI_TREASURY.getValue();
break;
case "JIOU":
result = EPayType.CREDIT_LINE.getValue();
break;
case "SJIOU":
result = EPayType.SUPER_CREDIT_LINE.getValue();
break;
case "ACCT":
result = EPayType.WALLET_BALANCE.getValue();
break;
case "EXPR":
result = EPayType.BANK_CARD.getValue();
break;
case "WX":
result = EPayType.WECHAT.getValue();
break;
case "ALIPAY":
result = EPayType.ALIPAY.getValue();
break;
case "YSF":
result = EPayType.CLOUD_PAY.getValue();
break;
}
return result;
}
}

View File

@ -124,8 +124,10 @@ public class PayServiceImpl implements IPayService {
Integer payType, String acqOrderId) {
Long pkId = null;
String redisKey = CacheConstants.ONLINE_PAY_KEY + businessCode;
try {
if(!redisService.lockKeyOnce(redisKey, 10)){
return false;
}
// 校验支付信息状态业务与支付金额是否一致等
TOnlinePayment onlinePayment = itOnlinePaymentService.queryByBusiness(
ObjectUtil.isNotEmpty(businessType) ? Integer.valueOf(businessType) : null

View File

@ -91,7 +91,7 @@ public class OnlinePaymentVO {
/**
* 支付状态0=未支付,1=已支付
*/
@JsonIgnore
// @JsonIgnore
@Transaction(transactionKey = EnumsPrefixConstants.PAY_STATUS)
private Integer payStatus;
/**