增加了拉卡拉撤销分账接口
This commit is contained in:
parent
bd5645296f
commit
809d0832c3
@ -67,6 +67,9 @@ public class LklOrderSeparate {
|
|||||||
@ApiModelProperty(value = "完成日期 yyyyMMdd")
|
@ApiModelProperty(value = "完成日期 yyyyMMdd")
|
||||||
private String finish_date;
|
private String finish_date;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否已提交撤销分账?1-是;2-否;")
|
||||||
|
private Integer is_canceled;
|
||||||
|
|
||||||
@ApiModelProperty(value = "拉卡拉异步通知回调地址")
|
@ApiModelProperty(value = "拉卡拉异步通知回调地址")
|
||||||
private String notify_url;
|
private String notify_url;
|
||||||
|
|
||||||
|
|||||||
@ -161,24 +161,6 @@ public interface LakalaApiService {
|
|||||||
CommonResult getBankCardBin(String bankCardNo);
|
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<String, String> queryMchCanSplitAmt(String merchantNo, String logNo, String logDate);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 拉卡拉订单分账,用户下单成功之后,进行分账
|
* 拉卡拉订单分账,用户下单成功之后,进行分账
|
||||||
* 说明:分账指令是异步处理模式,响应报文成功时,指令状态是”status”: “PROCESSING”,需要等待分账结果通知,或者主动发起查询,建议主动发起查询与分账指令动作之间间隔15秒以上。
|
* 说明:分账指令是异步处理模式,响应报文成功时,指令状态是”status”: “PROCESSING”,需要等待分账结果通知,或者主动发起查询,建议主动发起查询与分账指令动作之间间隔15秒以上。
|
||||||
@ -198,4 +180,36 @@ public interface LakalaApiService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
JSONObject sacsSeparateNotify(HttpServletRequest request);
|
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<String, String> 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,15 @@ public interface LklOrderSeparateService extends IBaseService<LklOrderSeparate>
|
|||||||
*/
|
*/
|
||||||
LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo);
|
LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据商户号和平台订单号查询记录
|
||||||
|
*
|
||||||
|
* @param merchantNo
|
||||||
|
* @param outSeparateNo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
LklOrderSeparate getByMerchantNoAndOutTradeNo(String merchantNo, String outSeparateNo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改备注
|
* 修改备注
|
||||||
*
|
*
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONArray;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.lkl.laop.sdk.LKLSDK;
|
import com.lkl.laop.sdk.LKLSDK;
|
||||||
import com.lkl.laop.sdk.exception.SDKException;
|
import com.lkl.laop.sdk.exception.SDKException;
|
||||||
import com.lkl.laop.sdk.request.*;
|
import com.lkl.laop.sdk.request.*;
|
||||||
@ -1569,6 +1570,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 拉卡拉订单分账,用户下单成功之后(大约15秒后),进行分账
|
* 拉卡拉订单分账,用户下单成功之后(大约15秒后),进行分账
|
||||||
* 说明:分账指令是异步处理模式,响应报文成功时,指令状态是”status”: “PROCESSING”,需要等待分账结果通知,或者主动发起查询,建议主动发起查询与分账指令动作之间间隔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<LklOrderSeparate> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -82,6 +82,37 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl<LklOrderSeparat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据商户号和平台订单号查询记录
|
||||||
|
*
|
||||||
|
* @param merchantNo
|
||||||
|
* @param outSeparateNo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public LklOrderSeparate getByMerchantNoAndOutTradeNo(String merchantNo, String outSeparateNo) {
|
||||||
|
try {
|
||||||
|
if (StrUtil.isBlank(merchantNo) || StrUtil.isBlank(outSeparateNo)) {
|
||||||
|
log.warn("查询参数为空:merchantNo={}, outSeparateNo={}", merchantNo, outSeparateNo);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
LklOrderSeparate lklOrderSeparate = findOne(new QueryWrapper<LklOrderSeparate>()
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改备注
|
* 修改备注
|
||||||
*
|
*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user