增加系统自动退款 相关逻辑。

This commit is contained in:
Jack 2025-07-03 23:33:34 +08:00
parent ebde9c0bdd
commit f3b5f63f59
3 changed files with 43 additions and 30 deletions

View File

@ -52,7 +52,7 @@ import java.util.List;
@Service
public class LakalaPayServiceImpl implements LakalaPayService {
private static final boolean init = false;
@Value("${lakala.server_url}")
private String serverUrl; //服务地址
@Value("${lakala.app_id}")
@ -230,6 +230,9 @@ public class LakalaPayServiceImpl implements LakalaPayService {
log.error("无法获取店铺的拉卡拉商户号或终端号: storeId={}", storeId);
return Pair.of(false, I18nUtil._("缺少商户号参数,退款失败!"));
}
// TODO 重要的逻辑获取是否已经分账已分账分账退回查商家账户余额够不够退回够就执行退回
// 5. 构造退款请求并发送
V3LabsRelationRefundRequest refundRequest = new V3LabsRelationRefundRequest();
refundRequest.setOutTradeNo(outTradeNo);
@ -261,8 +264,11 @@ public class LakalaPayServiceImpl implements LakalaPayService {
log.error("拉卡拉退款失败, 错误信息: {}", errorMessage);
return Pair.of(false, I18nUtil._(errorMessage));
}
JSONObject responseData = lakalaResponseJson.getJSONObject("resp_data");
log.info("拉卡拉退款成功: outTradeNo={}", outTradeNo);
return Pair.of(true, I18nUtil._("退款成功!"));
return Pair.of(true, responseData == null ? "" : responseData.toString());
} catch (SDKException e) {
log.error("拉卡拉退款SDK异常: ", e);
return Pair.of(false, I18nUtil._("拉卡拉退款SDK异常退款失败") + e.getMessage());

View File

@ -64,6 +64,7 @@ import io.seata.spring.annotation.GlobalTransactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
@ -1691,41 +1692,46 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
* 拉卡拉退款
*
* @param orderReturn
* @return
* @return ShopOrderReturn 退款结果信息
*/
@Override
public ShopOrderReturn lklPayRefund(ShopOrderReturn orderReturn) {
String deposit_trade_no = orderReturn.getDeposit_trade_no();
if (CheckUtil.isEmpty(deposit_trade_no)) {
deposit_trade_no = "";
}
BigDecimal trade_payment_amount = orderReturn.getTrade_payment_amount();
String refundAmount = Integer.toString(NumberUtil.mul(trade_payment_amount, 100).intValue());
WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
Map<String, String> params = RefundModel.builder().appid(wxPayApiConfig.getAppId()).mch_id(wxPayApiConfig.getMchId()).nonce_str(WxPayKit.generateStr()).transaction_id(deposit_trade_no).out_refund_no(WxPayKit.generateStr()).total_fee(refundAmount).refund_fee(refundAmount).build().createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
logger.info(String.format(I18nUtil._("微信退款请求参数参数: params【%s】"), params.toString()));
InputStream certInStream = PayKit.getFileToStream(wxPayApiConfig.getCertPath());
//IJPAY低版本jdk环境使用退款方法jdk1.8.0_111以下
//String xmlResult = WxPayApi.orderRefund(false, params, certInStream, wxPayApiConfig.getMchId());
//下面的方法解决IJPAY高版本jdk导致退款协议不支持问题jdk1.8.0_111以上
String xmlResult = HttpKit.getDelegate().post(WxPayApi.getReqUrl(WxApiType.REFUND, null, false), WxPayKit.toXml(params), certInStream, wxPayApiConfig.getMchId(), "");
logger.info(String.format(I18nUtil._("微信退款返回参数: xmlResult【%s】"), xmlResult));
Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
String returnCode = resultMap.get("return_code");
String resultCode = resultMap.get("result_code");
// 获取并处理交易号
String deposit_trade_no = CheckUtil.isEmpty(orderReturn.getDeposit_trade_no()) ? "" : orderReturn.getDeposit_trade_no();
if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) {
LogUtil.error("微信退款异常!" + resultMap);
// 调用拉卡拉退款接口
Pair<Boolean, String> resp = lakalaPayService.innerLklRefund(
orderReturn.getStore_id(),
orderReturn.getReturn_id(),
deposit_trade_no,
Integer.toString(NumberUtil.mul(orderReturn.getTrade_payment_amount(), 100).intValue()),
orderReturn.getReturn_buyer_message()
);
if (!resp.getFirst()) {
LogUtil.error("拉卡拉退款异常: " + resp.getSecond());
return null;
}
ShopOrderReturn shopOrderReturn = new ShopOrderReturn();
shopOrderReturn.setReturn_channel_flag(1);
shopOrderReturn.setDeposit_trade_no(deposit_trade_no);
shopOrderReturn.setOrder_id(orderReturn.getOrder_id());
shopOrderReturn.setReturn_channel_trans_id(resultMap.get("refund_id"));
shopOrderReturn.setReturn_channel_time(new Date());
return shopOrderReturn;
// 解析响应并获取退单号
String lklTradeNo = "";
try {
JSONObject respData = StrUtil.isNotBlank(resp.getSecond()) ? JSONObject.parseObject(resp.getSecond()) : null;
lklTradeNo = respData != null ? respData.getString("trade_no") : "";
} catch (Exception e) {
LogUtil.error("解析拉卡拉退款响应数据失败: " + e.getMessage());
return null;
}
// 构造并返回结果
String finalLklTradeNo = lklTradeNo;
return new ShopOrderReturn() {{
setReturn_channel_flag(1);
setDeposit_trade_no(deposit_trade_no);
setOrder_id(orderReturn.getOrder_id());
setReturn_channel_trans_id(finalLklTradeNo);
setReturn_channel_time(new Date());
}};
}
/**

View File

@ -942,6 +942,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
}
shopOrderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_RECEIVED);
shopOrderReturn.setReturn_store_message("系统自动退款");
shopOrderReturn.setReturn_flag(returnFlag);
// end 待审核状态