From 809d0832c39395e0845a67f3ab526895a1b2546b Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 15 Jul 2025 23:33:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=8B=89=E5=8D=A1?= =?UTF-8?q?=E6=8B=89=E6=92=A4=E9=94=80=E5=88=86=E8=B4=A6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/lakala/LklOrderSeparate.java | 3 + .../shop/lakala/service/LakalaApiService.java | 50 +++++++---- .../service/LklOrderSeparateService.java | 9 ++ .../service/impl/LakalaApiServiceImpl.java | 82 ++++++++++++++++++- .../impl/LklOrderSeparateServiceImpl.java | 31 +++++++ 5 files changed, 156 insertions(+), 19 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderSeparate.java b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderSeparate.java index cff6c638..86928dc4 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderSeparate.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderSeparate.java @@ -67,6 +67,9 @@ public class LklOrderSeparate { @ApiModelProperty(value = "完成日期 yyyyMMdd") private String finish_date; + @ApiModelProperty(value = "是否已提交撤销分账?1-是;2-否;") + private Integer is_canceled; + @ApiModelProperty(value = "拉卡拉异步通知回调地址") private String notify_url; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java index ea68560d..8a347a8d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java @@ -161,24 +161,6 @@ public interface LakalaApiService { CommonResult getBankCardBin(String bankCardNo); - /** - * 查询拉卡拉商户可分账的金额 - * 参考:https://o.lakala.com/#/home/document/detail?id=394 - * - * @param merchantNo 拉卡拉外部商户号 - * @param logNo 拉卡拉对账单流水号 - * @param logDate 拉卡拉对账单交易日期 yyyyMMdd - * @return 响应结果 分账总金额,可分账金额 键值对 - * { - * "merchant_no": "82229005943096D", - * "total_separate_amt": "9900", - * "can_separate_amt": "0", - * "log_date": "20221220", - * "log_no": "66210306990190" - * } - */ - Pair queryMchCanSplitAmt(String merchantNo, String logNo, String logDate); - /** * 拉卡拉订单分账,用户下单成功之后,进行分账 * 说明:分账指令是异步处理模式,响应报文成功时,指令状态是”status”: “PROCESSING”,需要等待分账结果通知,或者主动发起查询,建议主动发起查询与分账指令动作之间间隔15秒以上。 @@ -198,4 +180,36 @@ public interface LakalaApiService { * @return */ JSONObject sacsSeparateNotify(HttpServletRequest request); + + /** + * 查询拉卡拉商户可分账的金额 + * 参考:https://o.lakala.com/#/home/document/detail?id=394 + * + * @param merchantNo 拉卡拉外部商户号 + * @param logNo 拉卡拉对账单流水号 + * @param logDate 拉卡拉对账单交易日期 yyyyMMdd + * @return 响应结果 分账总金额,可分账金额 键值对 + * { + * "merchant_no": "82229005943096D", + * "total_separate_amt": "9900", + * "can_separate_amt": "0", + * "log_date": "20221220", + * "log_no": "66210306990190" + * } + */ + Pair queryMchCanSplitAmt(String merchantNo, String logNo, String logDate); + + /** + * 订单分账撤销 + * 参考:https://o.lakala.com/#/home/document/detail?id=390 + * + * @param merchantNo 拉卡拉外部商户号 + * @param originSeparateNo 原分账指令流水,origin_out_separate_no和该字段至少二选一,优先级: origin_separate_no> origin_out_separate_no + * @param originOutSeparateNo 原商户分账指令流水号,入参中的origin_separate_no该字段至少二选一,优先级: origin_separate_no> origin_out_separate_no + * @param outSeparateNo 商户分账指令流水号 + * @param totalAmt 撤销金额,用于金额校验,与原分账金额一致,否则校验失败 + * @return 响应结果 提交是否成功? + */ + Boolean sacsSeparateCancel(String merchantNo, String originSeparateNo, String originOutSeparateNo, String outSeparateNo, String totalAmt); + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java index c07df1d6..39ab3af6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java @@ -30,6 +30,15 @@ public interface LklOrderSeparateService extends IBaseService */ LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo); + /** + * 根据商户号和平台订单号查询记录 + * + * @param merchantNo + * @param outSeparateNo + * @return + */ + LklOrderSeparate getByMerchantNoAndOutTradeNo(String merchantNo, String outSeparateNo); + /** * 修改备注 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index 497b8002..1af3ad70 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -15,6 +15,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.lkl.laop.sdk.LKLSDK; import com.lkl.laop.sdk.exception.SDKException; import com.lkl.laop.sdk.request.*; @@ -1388,7 +1389,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { return JSONUtil.createObj().put("code", "FAIL").put("message", "参数转换失败"); } } - + // 3. 提取核心参数 String merCupNo = paramsJSON.getStr("merCupNo"); String applyId = paramsJSON.getStr("applyId"); @@ -1569,6 +1570,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { } } + /** * 拉卡拉订单分账,用户下单成功之后(大约15秒后),进行分账 * 说明:分账指令是异步处理模式,响应报文成功时,指令状态是”status”: “PROCESSING”,需要等待分账结果通知,或者主动发起查询,建议主动发起查询与分账指令动作之间间隔15秒以上。 @@ -1873,4 +1875,82 @@ public class LakalaApiServiceImpl implements LakalaApiService { } + /** + * 订单分账撤销 + * 参考文档:https://o.lakala.com/#/home/document/detail?id=390 + * + * @param merchantNo 拉卡拉外部商户号(必填) + * @param originSeparateNo 原分账指令流水号(与originOutSeparateNo二选一,优先级更高) + * @param originOutSeparateNo 原商户分账指令流水号(与originSeparateNo二选一) + * @param outSeparateNo 商户分账指令流水号(必填) + * @param totalAmt 撤销金额(必填,需与原分账金额一致) + * @return Boolean 撤销操作是否成功 + */ + @Override + public Boolean sacsSeparateCancel(String merchantNo, String originSeparateNo, + String originOutSeparateNo, String outSeparateNo, String totalAmt) { + try { + // === 1. 参数校验 === + if (StringUtils.isAnyBlank(merchantNo, outSeparateNo, totalAmt) || + StringUtils.isAllBlank(originSeparateNo, originOutSeparateNo)) { + log.error("分账撤销失败:缺少必要参数"); + return false; + } + + // 判断是否已经分账了?只有分账的订单才能撤销 + LklOrderSeparate lklOrderSeparate = lklOrderSeparateService.getByMerchantNoAndOutTradeNo(merchantNo, outSeparateNo); + if (lklOrderSeparate == null + || !lklOrderSeparate.getStatus().equals("SUCCESS")) { + log.error("分账撤销失败:商户订单未分账"); + return false; + } + + // === 2. 初始化拉卡拉SDK === + initLKLSDK(); + + // === 3. 构建请求参数 === + V3SacsCancelRequest req = new V3SacsCancelRequest(); + req.setMerchantNo(merchantNo); + req.setOutSeparateNo(outSeparateNo); + req.setTotalAmt(totalAmt); + // 根据接口文档要求,originSeparateNo优先级高于originOutSeparateNo + if (StringUtils.isNotBlank(originSeparateNo)) { + req.setOriginSeparateNo(originSeparateNo); + } else { + req.setOriginOutSeparateNo(originOutSeparateNo); + } + + // === 4. 发送请求并处理响应 === + String responseStr = LKLSDK.httpPost(req); + if (StringUtils.isBlank(responseStr)) { + log.error("分账撤销失败:拉卡拉接口返回空响应"); + return false; + } + + JSONObject lklRespJSON = JSONUtil.parseObj(responseStr); + JSONObject respData = lklRespJSON.getJSONObject("resp_data"); + + if (lklRespJSON == null || + !lklSacsSuccessCode.equals(lklRespJSON.getStr("code")) || + respData == null || + StringUtils.isBlank(respData.getStr("separate_no"))) { + log.error("分账撤销失败:响应数据异常"); + return false; + } + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", lklOrderSeparate.getId()).set("is_canceled", CommonConstant.Enable); + lklOrderSeparateService.update(updateWrapper); + + return true; + } catch (SDKException e) { + log.error("分账撤销SDK异常:merchantNo={}, outSeparateNo={}", merchantNo, outSeparateNo, e); + return false; + } catch (Exception e) { + log.error("分账撤销系统异常:merchantNo={}, outSeparateNo={}", merchantNo, outSeparateNo, e); + return false; + } + } + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java index 6369640d..a432223f 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java @@ -82,6 +82,37 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl() + .eq("merchant_no", merchantNo) + .eq("out_separate_no", outSeparateNo).orderByAsc("id")); + + if (lklOrderSeparate == null) { + log.info("未找到记录:merchantNo={}, outSeparateNo={}", merchantNo, outSeparateNo); + return null; + } + + return lklOrderSeparate; + } catch (Exception e) { + log.error("查询记录时发生异常:merchantNo={}, outSeparateNo={}, 异常信息={}", merchantNo, outSeparateNo, e.getMessage(), e); + return null; + } + } + /** * 修改备注 *