拉卡拉分账异步通知处,增加了提现流程。

This commit is contained in:
Jack 2025-09-27 12:16:46 +08:00
parent 8f39816f36
commit 9f62bf8ddd
4 changed files with 39 additions and 29 deletions

View File

@ -27,7 +27,7 @@ public class UpdateOrderSeparateJob extends QuartzJobBean {
return; return;
} }
Integer processedCount = lakalaApiService.fixedUnSuccessSeparateStatusJob(); Integer processedCount = lakalaApiService.fixUnSuccessSeparateStatusJob();
logger.info("[分账状态修复定时任务] 执行完成,共处理 {} 条记录", processedCount); logger.info("[分账状态修复定时任务] 执行完成,共处理 {} 条记录", processedCount);
} catch (Exception e) { } catch (Exception e) {

View File

@ -49,7 +49,7 @@ public class LakalaAdminController extends BaseControllerImpl {
} }
// 执行业务逻辑 // 执行业务逻辑
Boolean success = lakalaPayService.ewalletWithDrawD1(paramsJSON.getStr("mercId"), paramsJSON.getStr("merOrderNo"), paramsJSON.getStr("drawAmt"), paramsJSON.getStr("remark"), paramsJSON.getStr("summary")); Boolean success = lakalaPayService.ewalletWithDrawD1(paramsJSON.getStr("mercId"), paramsJSON.getStr("merOrderNo"), paramsJSON.getStr("drawAmt"), paramsJSON.getStr("summary"));
if (success) { if (success) {
return CommonResult.success("账户D1提现提交成功"); return CommonResult.success("账户D1提现提交成功");
} }

View File

@ -299,7 +299,7 @@ public interface LakalaApiService {
* *
* @return * @return
*/ */
Integer fixedUnSuccessSeparateStatusJob(); Integer fixUnSuccessSeparateStatusJob();
/** /**
* 检测修复补全商户的商户分账业务信息及分账接收方绑定关系分账业务申请异步通知的补偿机制 * 检测修复补全商户的商户分账业务信息及分账接收方绑定关系分账业务申请异步通知的补偿机制
@ -337,10 +337,9 @@ public interface LakalaApiService {
* @param mercId 822商户号或receiveNo * @param mercId 822商户号或receiveNo
* @param merOrderNo 商户订单号 * @param merOrderNo 商户订单号
* @param drawAmt 提现金额 * @param drawAmt 提现金额
* @param remark
* @param summary * @param summary
*/ */
Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String remark, String summary); Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String summary);
/** /**
* 拉卡拉账户D1提现结果通知 * 拉卡拉账户D1提现结果通知

View File

@ -2693,9 +2693,10 @@ public class LakalaApiServiceImpl implements LakalaApiService {
* 参考文档https://o.lakala.com/#/home/document/detail?id=393 * 参考文档https://o.lakala.com/#/home/document/detail?id=393
* </p> * </p>
* *
* @param request * @param request HTTP请求对象包含拉卡拉分账结果通知的参数
* @param merchantNoParam 分账方商户号非空表示是事后补偿 * @param merchantNoParam 分账方商户号非空表示是事后补偿
* @param separateNoParam 分账指令流水号非空表示是事后补偿 * @param separateNoParam 分账指令流水号非空表示是事后补偿
* @return 处理结果JSON对象
* <ul> * <ul>
* <li>成功: {"code": "SUCCESS", "message": "操作成功"}</li> * <li>成功: {"code": "SUCCESS", "message": "操作成功"}</li>
* <li>失败: {"code": "FAIL", "message": "错误信息"}</li> * <li>失败: {"code": "FAIL", "message": "错误信息"}</li>
@ -2708,7 +2709,8 @@ public class LakalaApiServiceImpl implements LakalaApiService {
JSONObject paramsJson = null; JSONObject paramsJson = null;
if (!StrUtil.hasBlank(merchantNoParam, separateNoParam)) { if (!StrUtil.hasBlank(merchantNoParam, separateNoParam)) {
channel = "(补偿)"; channel = "(补偿)";
log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调 merchantNoParam={},separateNoParam={}" + channel, merchantNoParam, separateNoParam); log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调{}merchantNoParam={}separateNoParam={}",
channel, merchantNoParam, separateNoParam);
paramsJson = sacsQuery(merchantNoParam, separateNoParam); paramsJson = sacsQuery(merchantNoParam, separateNoParam);
} else { } else {
log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调"); log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调");
@ -2742,15 +2744,15 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String status = paramsJson.getStr("status"); String status = paramsJson.getStr("status");
String finalStatus = paramsJson.getStr("final_status"); String finalStatus = paramsJson.getStr("final_status");
// 必要参数 // 必要参数校验
List<String> missingParams = new ArrayList<>(); List<String> missingParams = new ArrayList<>();
if (StrUtil.isBlank(outSeparateNo)) missingParams.add("outSeparateNo"); if (StrUtil.isBlank(outSeparateNo)) missingParams.add("outSeparateNo");
if (StrUtil.isBlank(separateNo)) missingParams.add("separateNo"); if (StrUtil.isBlank(separateNo)) missingParams.add("separateNo");
if (StrUtil.isBlank(status)) missingParams.add("status"); if (StrUtil.isBlank(status)) missingParams.add("status");
if (!missingParams.isEmpty()) { if (!missingParams.isEmpty()) {
String errorMsg = "分账通知缺少必要参数" + channel + String.join(", ", missingParams); String errorMsg = "分账通知缺少必要参数" + channel + ": " + String.join(", ", missingParams);
log.error("[拉卡拉分账通知] {} {},参数详情: {}", channel, errorMsg, paramsJson); log.error("[拉卡拉分账通知] {},参数详情: {}", errorMsg, paramsJson);
return JSONUtil.createObj() return JSONUtil.createObj()
.put("code", "FAIL") .put("code", "FAIL")
.put("message", errorMsg); .put("message", errorMsg);
@ -2761,7 +2763,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (lklOrderSeparateExist == null) { if (lklOrderSeparateExist == null) {
String errorMsg = "未找到对应的分账记录" + channel; String errorMsg = "未找到对应的分账记录" + channel;
log.error("[拉卡拉分账通知] {},外部分账单号={},分账单号={},参数详情: {}", log.error("[拉卡拉分账通知] {},外部分账单号={},分账单号={},参数详情: {}",
errorMsg, outSeparateNo, separateNoParam, paramsJson); errorMsg, outSeparateNo, separateNo, paramsJson);
return JSONUtil.createObj() return JSONUtil.createObj()
.put("code", "FAIL") .put("code", "FAIL")
.put("message", errorMsg); .put("message", errorMsg);
@ -2779,8 +2781,8 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
// 6. 记录关键参数信息便于问题排查 // 6. 记录关键参数信息便于问题排查
log.info("[拉卡拉分账通知] 接收到分账通知,分账单号={},外部分账单号={},状态={},最终状态={}" + channel, log.info("[拉卡拉分账通知] 接收到分账通知{},分账单号={},外部分账单号={},状态={},最终状态={}",
separateNo, outSeparateNo, status, finalStatus); channel, separateNo, outSeparateNo, status, finalStatus);
// 7. 构建分账记录对象 - 准备更新数据库的分账记录 // 7. 构建分账记录对象 - 准备更新数据库的分账记录
LklOrderSeparate lklOrderSeparate = new LklOrderSeparate(); LklOrderSeparate lklOrderSeparate = new LklOrderSeparate();
@ -2819,14 +2821,25 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 更改分账状态分账成功 // 更改分账状态分账成功
shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Success, ""); shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Success, "");
// RMK 本次分账成功后给商户和接收方 D1提现到银行卡
if (CollUtil.isNotEmpty(detailDatas)) {
for (JSONObject detailData : detailDatas.jsonIter()) {
String recvNo = detailData.getStr("recv_no"); // 822商户号或接收方号
String amt = detailData.getStr("amt"); // 单位
if (StrUtil.isNotBlank(recvNo) && StrUtil.isNotBlank(amt)) {
ewalletWithDrawD1(recvNo, outSeparateNo, amt, JSONUtil.toJsonStr(detailDatas));
}
}
}
// 9. 记录处理成功日志 // 9. 记录处理成功日志
log.info("[拉卡拉分账通知] 分账通知处理成功, separateNo={}, status={}" + channel, separateNo, status); log.info("[拉卡拉分账通知] 分账通知处理成功{}separateNo={}status={}", channel, separateNo, status);
return JSONUtil.createObj() return JSONUtil.createObj()
.put("code", "SUCCESS") .put("code", "SUCCESS")
.put("message", "操作成功"); .put("message", "操作成功");
} catch (Exception e) { } catch (Exception e) {
// 10. 异常处理 // 10. 异常处理
String errorMsg = String.format("分账通知数据处理异常: %s" + channel, e.getMessage()); String errorMsg = String.format("分账通知数据处理异常: %s%s", e.getMessage(), channel);
log.error("[拉卡拉分账通知] {}", errorMsg, e); log.error("[拉卡拉分账通知] {}", errorMsg, e);
return JSONUtil.createObj() return JSONUtil.createObj()
.put("code", "FAIL") .put("code", "FAIL")
@ -2920,15 +2933,15 @@ public class LakalaApiServiceImpl implements LakalaApiService {
* @return 成功处理的记录数量 * @return 成功处理的记录数量
*/ */
@Override @Override
public Integer fixedUnSuccessSeparateStatusJob() { public Integer fixUnSuccessSeparateStatusJob() {
log.info("[分账状态修复任务] 开始执行未成功分账记录的状态修复任务"); log.info("[分账状态修复任务] 开始执行未成功分账记录的状态修复任务");
// 获取3天前分账状态未成功的记录 // 获取2天前分账状态未成功的记录
Date now = new Date(); Date now = new Date();
Date threeDaysAgo = DateUtils.addHours(now, -72); Date threeDaysAgo = DateUtils.addHours(now, -48);
// 分页参数 // 分页参数
int pageSize = 100; int pageSize = 200;
int currentPage = 1; int currentPage = 1;
int totalSuccessCount = 0; int totalSuccessCount = 0;
int totalProcessed = 0; int totalProcessed = 0;
@ -3384,12 +3397,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
* @param mercId 822商户号或receiveNo * @param mercId 822商户号或receiveNo
* @param merOrderNo 商户订单号 * @param merOrderNo 商户订单号
* @param drawAmt 提现金额 * @param drawAmt 提现金额
* @param remark 备注信息
* @param summary 摘要信息 * @param summary 摘要信息
* @return 操作结果成功返回true失败返回false * @return 操作结果成功返回true失败返回false
*/ */
@Override @Override
public Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String remark, String summary) { public Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String summary) {
// 1. 参数校验 // 1. 参数校验
if (StrUtil.hasBlank(mercId, merOrderNo, drawAmt)) { if (StrUtil.hasBlank(mercId, merOrderNo, drawAmt)) {
log.warn("[D1提现申请] D1提现参数校验失败关键参数为空: mercId={}, merOrderNo={}, drawAmt={}", log.warn("[D1提现申请] D1提现参数校验失败关键参数为空: mercId={}, merOrderNo={}, drawAmt={}",
@ -3399,8 +3411,10 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 账号类型01收款账户04分账接收方账户 // 账号类型01收款账户04分账接收方账户
String payType = "04"; String payType = "04";
String payTypeStr = "接收方账户04";
if (StrUtil.startWith(mercId, "822")) { if (StrUtil.startWith(mercId, "822")) {
payType = "01"; payType = "01";
payTypeStr = "收款账户01";
} }
try { try {
@ -3411,10 +3425,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return false; return false;
} }
// 设置默认值 String remark = String.format("订单:%s %s 分账后立即提现", merOrderNo, payTypeStr);
if (StrUtil.isBlank(remark)) {
remark = String.format("商户订单:%s 账号类型:%s 分账后立即提现", merOrderNo, payType);
}
log.info("[D1提现申请] 开始处理D1提现商户号={},订单号={},提现金额={}分", mercId, merOrderNo, drawAmt); log.info("[D1提现申请] 开始处理D1提现商户号={},订单号={},提现金额={}分", mercId, merOrderNo, drawAmt);