分账逻辑的调整
This commit is contained in:
parent
1eae2007c3
commit
04042d5a4b
@ -56,13 +56,15 @@ public class ShopOrderLkl implements Serializable {
|
|||||||
|
|
||||||
private String trade_status;
|
private String trade_status;
|
||||||
|
|
||||||
|
private String lkl_trade_no;
|
||||||
|
|
||||||
private String lkl_log_no;
|
private String lkl_log_no;
|
||||||
|
|
||||||
private String lkl_log_date;
|
private String lkl_log_date;
|
||||||
|
|
||||||
private String lkl_sub_log_no;
|
private String lkl_sub_trade_no;
|
||||||
|
|
||||||
private String lkl_trade_no;
|
private String lkl_sub_log_no;
|
||||||
|
|
||||||
private String lkl_receive_trade_no;
|
private String lkl_receive_trade_no;
|
||||||
|
|
||||||
|
|||||||
@ -78,6 +78,9 @@ public class ShopStoreBase implements Serializable {
|
|||||||
@ApiModelProperty(value = "店铺状态(ENUM):0-关闭; 1-运营中, 商品是否可用,需要判断该商品店铺状态")
|
@ApiModelProperty(value = "店铺状态(ENUM):0-关闭; 1-运营中, 商品是否可用,需要判断该商品店铺状态")
|
||||||
private Integer store_is_open;
|
private Integer store_is_open;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "店铃声开关:1-开启;2-关闭;")
|
||||||
|
private Integer ringtone_is_enable;
|
||||||
|
|
||||||
@ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;")
|
@ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;")
|
||||||
private Integer store_biz_state;
|
private Integer store_biz_state;
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,12 @@
|
|||||||
|
|
||||||
package com.suisung.mall.common.service.impl;
|
package com.suisung.mall.common.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.json.JSONArray;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.suisung.mall.common.api.StateCode;
|
import com.suisung.mall.common.api.StateCode;
|
||||||
|
import com.suisung.mall.common.constant.CommonConstant;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@ -140,6 +145,116 @@ public class CommonService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println(isValidInput("", "+8618924071446"));
|
System.out.println(getLklCombineSplitRespInfo("8226330541100GU", "[{\"sub_trade_no\":\"20250911110110000066202050017882\",\"sub_log_no\":\"66202050017882\",\"origin_sub_trade_no\":\"20250911110113130266250044162421\",\"origin_sub_log_no\":\"66250044162421\",\"merchant_no\":\"822584059990FYP\",\"term_no\":\"N5811590\",\"amount\":\"1\"},{\"sub_trade_no\":\"20250911110110000066202050152097\",\"sub_log_no\":\"66202050152097\",\"origin_sub_trade_no\":\"20250911110113130266250044162422\",\"origin_sub_log_no\":\"66250044162422\",\"merchant_no\":\"8226330541100GU\",\"term_no\":\"N5817779\",\"amount\":\"1\"}]", false));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从拉卡拉分账响应信息中提取合单运费或商品订单信息
|
||||||
|
* <p>该方法用于处理合单支付场景,从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息</p>
|
||||||
|
*
|
||||||
|
* @param merchantNo 商家商户号
|
||||||
|
* @param outSplitRspInfos 拉卡拉分账响应信息,格式为JSON数组字符串:
|
||||||
|
* [
|
||||||
|
* {
|
||||||
|
* "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
|
||||||
|
* "merchant_no":"822584059990FYP", // 商户号
|
||||||
|
* "amount":"1", // 分账金额
|
||||||
|
* "settle_type":"0", // 结算类型
|
||||||
|
* "sub_log_no":"66250034401288", // 子流水号
|
||||||
|
* "out_sub_trade_no":"DF-DD-20250830-21", // 外部子交易订单号(DF开头为运费订单)
|
||||||
|
* "term_no":"N5811590" // 终端设备号
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
|
||||||
|
* "merchant_no":"8226330541100GU", // 商户号
|
||||||
|
* "amount":"1", // 分账金额
|
||||||
|
* "settle_type":"0", // 结算类型
|
||||||
|
* "sub_log_no":"66250034401289", // 子流水号
|
||||||
|
* "out_sub_trade_no":"ORD-DD-20250830-21", // 外部子交易订单号(ORD开头为商品订单)
|
||||||
|
* "term_no":"N5817779" // 终端设备号
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
|
||||||
|
* @return JSONObject 返回匹配的子单信息,格式如下:
|
||||||
|
* {
|
||||||
|
* "sub_trade_no":"20250830110113130266250034401288",
|
||||||
|
* "merchant_no":"822584059990FYP",
|
||||||
|
* "amount":"1",
|
||||||
|
* "settle_type":"0",
|
||||||
|
* "sub_log_no":"66250034401288",
|
||||||
|
* "out_sub_trade_no":"DF-DD-20250830-21",
|
||||||
|
* "term_no":"N5811590"
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public static JSONObject getLklCombineSplitRespInfo(String merchantNo, String outSplitRspInfos, boolean isDeliveryFee) {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 开始获取合单数据: merchantNo={} isDeliveryFee={} outSplitRspInfos长度={}",
|
||||||
|
merchantNo, isDeliveryFee, outSplitRspInfos != null ? outSplitRspInfos.length() : 0);
|
||||||
|
|
||||||
|
// 输入参数校验:检查分账信息是否为空
|
||||||
|
if (StrUtil.isBlank(outSplitRspInfos)) {
|
||||||
|
log.warn("[拉卡拉合单数据拆分] 合单数据为空");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析JSON数组:将字符串转换为JSONArray对象
|
||||||
|
JSONArray outSplitRspInfoArray;
|
||||||
|
try {
|
||||||
|
outSplitRspInfoArray = JSONUtil.parseArray(outSplitRspInfos);
|
||||||
|
log.debug("[拉卡拉合单数据拆分] JSON解析完成,数组大小={}", outSplitRspInfoArray.size());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("[拉卡拉合单数据拆分] JSON解析失败:{}", outSplitRspInfos, e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查解析后的数组是否为空
|
||||||
|
if (outSplitRspInfoArray.isEmpty()) {
|
||||||
|
log.warn("[拉卡拉合单数据拆分] 拆分合单数据失败:分账信息数组为空");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 遍历JSON数组查找匹配的子单 (合单订单通常只有两个子单:一个运费单,一个商品单)
|
||||||
|
final String deliveryPrefix = CommonConstant.Sep_DeliveryFee_Prefix;
|
||||||
|
final String goodsPrefix = CommonConstant.Sep_GoodsFee_Prefix;
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 开始遍历数组查找匹配子单: deliveryPrefix={} goodsPrefix={}", deliveryPrefix, goodsPrefix);
|
||||||
|
|
||||||
|
for (int i = 0; i < outSplitRspInfoArray.size(); i++) {
|
||||||
|
JSONObject item = outSplitRspInfoArray.getJSONObject(i);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 数组第{}项为空,跳过", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取外部子交易订单号字段和商户号
|
||||||
|
String subMerchantNo = item.getStr("merchant_no");
|
||||||
|
String outSubTradeNo = item.getStr("out_sub_trade_no");
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 检查第{}项: outSubTradeNo={} subMerchantNo={}", i, outSubTradeNo, subMerchantNo);
|
||||||
|
|
||||||
|
// 根据isDeliveryFee参数和商户号筛选对应的子单信息
|
||||||
|
if (isDeliveryFee && StrUtil.isNotBlank(merchantNo) && !merchantNo.equals(subMerchantNo)) {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 找到运费子单(通过商户号匹配): outSubTradeNo={} subMerchantNo={}", outSubTradeNo, subMerchantNo);
|
||||||
|
return item;
|
||||||
|
} else if (!isDeliveryFee && StrUtil.isNotBlank(merchantNo) && merchantNo.equals(subMerchantNo)) {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 找到商品子单(通过商户号匹配): outSubTradeNo={} subMerchantNo={}", outSubTradeNo, subMerchantNo);
|
||||||
|
return item;
|
||||||
|
} else {
|
||||||
|
// 如果商户号匹配失败,则通过订单号前缀匹配
|
||||||
|
if (isDeliveryFee && StrUtil.isNotBlank(outSubTradeNo) && outSubTradeNo.startsWith(deliveryPrefix)) {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 找到运费子单(通过前缀匹配): outSubTradeNo={}", outSubTradeNo);
|
||||||
|
return item;
|
||||||
|
} else if (!isDeliveryFee && StrUtil.isNotBlank(outSubTradeNo) && outSubTradeNo.startsWith(goodsPrefix)) {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 找到商品子单(通过前缀匹配): outSubTradeNo={}", outSubTradeNo);
|
||||||
|
return item;
|
||||||
|
} else {
|
||||||
|
log.debug("[拉卡拉合单数据拆分] 第{}项不匹配条件: isDeliveryFee={} merchantNo={} subMerchantNo={} outSubTradeNo={}",
|
||||||
|
i, isDeliveryFee, merchantNo, subMerchantNo, outSubTradeNo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 未找到匹配的子单信息
|
||||||
|
log.warn("[拉卡拉合单数据拆分] 未找到匹配的子单信息: merchantNo={} isDeliveryFee={}", merchantNo, isDeliveryFee);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package com.suisung.mall.pay.service;
|
package com.suisung.mall.pay.service;
|
||||||
|
|
||||||
import cn.hutool.json.JSONObject;
|
|
||||||
import com.suisung.mall.common.api.CommonResult;
|
import com.suisung.mall.common.api.CommonResult;
|
||||||
import com.suisung.mall.common.modules.order.ShopOrderReturn;
|
import com.suisung.mall.common.modules.order.ShopOrderReturn;
|
||||||
import com.suisung.mall.common.modules.pay.PayConsumeTrade;
|
import com.suisung.mall.common.modules.pay.PayConsumeTrade;
|
||||||
@ -62,44 +61,4 @@ public interface PayConsumeTradeService extends IBaseService<PayConsumeTrade> {
|
|||||||
*/
|
*/
|
||||||
Boolean updateTradeByPrimaryKey(PayConsumeTrade payConsumeTrade);
|
Boolean updateTradeByPrimaryKey(PayConsumeTrade payConsumeTrade);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 从拉卡拉分账响应信息中提取合单运费或商品订单信息
|
|
||||||
* <p>该方法用于处理合单支付场景,从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息</p>
|
|
||||||
*
|
|
||||||
* @param outSplitRspInfos 拉卡拉分账响应信息,格式为JSON数组字符串:
|
|
||||||
* [
|
|
||||||
* {
|
|
||||||
* "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
|
|
||||||
* "merchant_no":"822584059990FYP", // 商户号
|
|
||||||
* "amount":"1", // 分账金额
|
|
||||||
* "settle_type":"0", // 结算类型
|
|
||||||
* "sub_log_no":"66250034401288", // 子流水号
|
|
||||||
* "out_sub_trade_no":"DF_DD_20250830_21", // 外部子交易订单号(DF开头为运费订单)
|
|
||||||
* "term_no":"N5811590" // 终端设备号
|
|
||||||
* },
|
|
||||||
* {
|
|
||||||
* "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
|
|
||||||
* "merchant_no":"8226330541100GU", // 商户号
|
|
||||||
* "amount":"1", // 分账金额
|
|
||||||
* "settle_type":"0", // 结算类型
|
|
||||||
* "sub_log_no":"66250034401289", // 子流水号
|
|
||||||
* "out_sub_trade_no":"ORD_DD_20250830_21", // 外部子交易订单号(ORD开头为商品订单)
|
|
||||||
* "term_no":"N5817779" // 终端设备号
|
|
||||||
* }
|
|
||||||
* ]
|
|
||||||
* @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
|
|
||||||
* @return JSONObject 返回匹配的子单信息,格式如下:
|
|
||||||
* {
|
|
||||||
* "sub_trade_no":"20250830110113130266250034401288",
|
|
||||||
* "merchant_no":"822584059990FYP",
|
|
||||||
* "amount":"1",
|
|
||||||
* "settle_type":"0",
|
|
||||||
* "sub_log_no":"66250034401288",
|
|
||||||
* "out_sub_trade_no":"DF-DD-20250830-21",
|
|
||||||
* "term_no":"N5811590"
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
JSONObject getLklCombineSplitRespInfo(String outSplitRspInfos, boolean isDeliveryFee);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -381,7 +381,7 @@ public class LakalaPayServiceImpl implements LakalaPayService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 重要约定,订单号规则:商品订单:ORD_订单号,运费订单:DF_订单号
|
// 重要约定,订单号规则:商品订单:ORD_订单号,运费订单:DF_订单号
|
||||||
// 分单信息
|
// 商品子单信息
|
||||||
JSONObject goodsSplitInfo = new JSONObject();
|
JSONObject goodsSplitInfo = new JSONObject();
|
||||||
goodsSplitInfo.put("out_sub_trade_no", CommonConstant.Sep_GoodsFee_Prefix + orderId); // 商品子订单号
|
goodsSplitInfo.put("out_sub_trade_no", CommonConstant.Sep_GoodsFee_Prefix + orderId); // 商品子订单号
|
||||||
goodsSplitInfo.put("merchant_no", merchantNo); // 分账商户号
|
goodsSplitInfo.put("merchant_no", merchantNo); // 分账商户号
|
||||||
@ -400,9 +400,10 @@ public class LakalaPayServiceImpl implements LakalaPayService {
|
|||||||
|
|
||||||
int goodsAmountInt = totalAmountInt - agentAmountInt;
|
int goodsAmountInt = totalAmountInt - agentAmountInt;
|
||||||
goodsSplitInfo.put("amount", Convert.toStr(goodsAmountInt)); // 分账金额
|
goodsSplitInfo.put("amount", Convert.toStr(goodsAmountInt)); // 分账金额
|
||||||
goodsSplitInfo.put("settle_type", "0"); // "0"或者空,常规结算方式
|
goodsSplitInfo.put("settle_type", "1"); // "0"或者空,常规结算方式
|
||||||
goodsSplitInfo.put("sub_remark", "商品订单金额"); // 子单备注信息
|
goodsSplitInfo.put("sub_remark", "商品订单金额"); // 子单备注信息
|
||||||
|
|
||||||
|
// 运费子单信息
|
||||||
JSONObject deliverySplitInfo = new JSONObject();
|
JSONObject deliverySplitInfo = new JSONObject();
|
||||||
deliverySplitInfo.put("out_sub_trade_no", CommonConstant.Sep_DeliveryFee_Prefix + orderId); // 运费子订单号
|
deliverySplitInfo.put("out_sub_trade_no", CommonConstant.Sep_DeliveryFee_Prefix + orderId); // 运费子订单号
|
||||||
deliverySplitInfo.put("merchant_no", agentMerchantNo); // 分账商户号
|
deliverySplitInfo.put("merchant_no", agentMerchantNo); // 分账商户号
|
||||||
|
|||||||
@ -7,9 +7,7 @@ import cn.hutool.core.date.DateUtil;
|
|||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.json.JSONArray;
|
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
@ -22,6 +20,7 @@ import com.suisung.mall.common.feignService.AccountService;
|
|||||||
import com.suisung.mall.common.feignService.ShopService;
|
import com.suisung.mall.common.feignService.ShopService;
|
||||||
import com.suisung.mall.common.modules.order.*;
|
import com.suisung.mall.common.modules.order.*;
|
||||||
import com.suisung.mall.common.modules.pay.*;
|
import com.suisung.mall.common.modules.pay.*;
|
||||||
|
import com.suisung.mall.common.service.impl.CommonService;
|
||||||
import com.suisung.mall.common.utils.CheckUtil;
|
import com.suisung.mall.common.utils.CheckUtil;
|
||||||
import com.suisung.mall.common.utils.I18nUtil;
|
import com.suisung.mall.common.utils.I18nUtil;
|
||||||
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
|
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
|
||||||
@ -1385,7 +1384,8 @@ public class PayConsumeTradeServiceImpl extends BaseServiceImpl<PayConsumeTradeM
|
|||||||
outTradeNo = dfSubTradeNo;
|
outTradeNo = dfSubTradeNo;
|
||||||
|
|
||||||
// {"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"}
|
// {"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"}
|
||||||
JSONObject lklCombineDeliveryFeeInfo = getLklCombineSplitRespInfo(consumeRow.getLkl_combine_params(), true);
|
// JSONObject lklCombineDeliveryFeeInfo = getLklCombineSplitRespInfoBak(consumeRow.getLkl_combine_params(), true);
|
||||||
|
JSONObject lklCombineDeliveryFeeInfo = CommonService.getLklCombineSplitRespInfo("", consumeRow.getLkl_combine_params(), true);
|
||||||
if (lklCombineDeliveryFeeInfo != null) {
|
if (lklCombineDeliveryFeeInfo != null) {
|
||||||
lklMerchantNo = lklCombineDeliveryFeeInfo.getStr("merchant_no");
|
lklMerchantNo = lklCombineDeliveryFeeInfo.getStr("merchant_no");
|
||||||
lklTermNo = lklCombineDeliveryFeeInfo.getStr("term_no");
|
lklTermNo = lklCombineDeliveryFeeInfo.getStr("term_no");
|
||||||
@ -2122,94 +2122,4 @@ public class PayConsumeTradeServiceImpl extends BaseServiceImpl<PayConsumeTradeM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 从拉卡拉分账响应信息中提取合单运费或商品订单信息
|
|
||||||
* <p>该方法用于处理合单支付场景,从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息</p>
|
|
||||||
*
|
|
||||||
* @param outSplitRspInfos 拉卡拉分账响应信息,格式为JSON数组字符串:
|
|
||||||
* [
|
|
||||||
* {
|
|
||||||
* "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
|
|
||||||
* "merchant_no":"822584059990FYP", // 商户号
|
|
||||||
* "amount":"1", // 分账金额
|
|
||||||
* "settle_type":"0", // 结算类型
|
|
||||||
* "sub_log_no":"66250034401288", // 子流水号
|
|
||||||
* "out_sub_trade_no":"DF-DD-20250830-21", // 外部子交易订单号(DF开头为运费订单)
|
|
||||||
* "term_no":"N5811590" // 终端设备号
|
|
||||||
* },
|
|
||||||
* {
|
|
||||||
* "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
|
|
||||||
* "merchant_no":"8226330541100GU", // 商户号
|
|
||||||
* "amount":"1", // 分账金额
|
|
||||||
* "settle_type":"0", // 结算类型
|
|
||||||
* "sub_log_no":"66250034401289", // 子流水号
|
|
||||||
* "out_sub_trade_no":"ORD-DD-20250830-21", // 外部子交易订单号(ORD开头为商品订单)
|
|
||||||
* "term_no":"N5817779" // 终端设备号
|
|
||||||
* }
|
|
||||||
* ]
|
|
||||||
* @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
|
|
||||||
* @return JSONObject 返回匹配的子单信息,格式如下:
|
|
||||||
* {
|
|
||||||
* "sub_trade_no":"20250830110113130266250034401288",
|
|
||||||
* "merchant_no":"822584059990FYP",
|
|
||||||
* "amount":"1",
|
|
||||||
* "settle_type":"0",
|
|
||||||
* "sub_log_no":"66250034401288",
|
|
||||||
* "out_sub_trade_no":"DF-DD-20250830-21",
|
|
||||||
* "term_no":"N5811590"
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public JSONObject getLklCombineSplitRespInfo(String outSplitRspInfos, boolean isDeliveryFee) {
|
|
||||||
// 输入参数校验:检查分账信息是否为空
|
|
||||||
if (StrUtil.isBlank(outSplitRspInfos)) {
|
|
||||||
logger.warn("获取子流水号失败:输入的分账信息为空");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析JSON数组:将字符串转换为JSONArray对象
|
|
||||||
JSONArray outSplitRspInfoArray;
|
|
||||||
try {
|
|
||||||
outSplitRspInfoArray = JSONUtil.parseArray(outSplitRspInfos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("JSON解析失败:{}", outSplitRspInfos, e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查解析后的数组是否为空
|
|
||||||
if (outSplitRspInfoArray.isEmpty()) {
|
|
||||||
logger.warn("获取子流水号失败:分账信息数组为空");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历JSON数组查找匹配的子单 (合单订单通常只有两个子单:一个运费单,一个商品单)
|
|
||||||
final String deliveryPrefix = CommonConstant.Sep_DeliveryFee_Prefix;
|
|
||||||
final String goodsPrefix = CommonConstant.Sep_GoodsFee_Prefix;
|
|
||||||
|
|
||||||
for (int i = 0; i < outSplitRspInfoArray.size(); i++) {
|
|
||||||
JSONObject item = outSplitRspInfoArray.getJSONObject(i);
|
|
||||||
if (item == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取外部子交易订单号字段
|
|
||||||
String outSubTradeNo = item.getStr("out_sub_trade_no");
|
|
||||||
if (StrUtil.isBlank(outSubTradeNo)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 根据isDeliveryFee参数筛选对应的子单信息
|
|
||||||
if (isDeliveryFee && outSubTradeNo.startsWith(deliveryPrefix)) {
|
|
||||||
// 运费子单:订单号以DF开头
|
|
||||||
return item;
|
|
||||||
} else if (!isDeliveryFee && !outSubTradeNo.startsWith(goodsPrefix)) {
|
|
||||||
// 商品子单:订单号不以ORD开头
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 未找到匹配的子单信息
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,6 +52,7 @@ import com.suisung.mall.common.modules.pay.*;
|
|||||||
import com.suisung.mall.common.modules.pay.dto.ItemActivityInfoDTO;
|
import com.suisung.mall.common.modules.pay.dto.ItemActivityInfoDTO;
|
||||||
import com.suisung.mall.common.modules.store.ShopStoreBase;
|
import com.suisung.mall.common.modules.store.ShopStoreBase;
|
||||||
import com.suisung.mall.common.pojo.res.ThirdApiRes;
|
import com.suisung.mall.common.pojo.res.ThirdApiRes;
|
||||||
|
import com.suisung.mall.common.service.impl.CommonService;
|
||||||
import com.suisung.mall.common.utils.CheckUtil;
|
import com.suisung.mall.common.utils.CheckUtil;
|
||||||
import com.suisung.mall.common.utils.I18nUtil;
|
import com.suisung.mall.common.utils.I18nUtil;
|
||||||
import com.suisung.mall.common.utils.LogUtil;
|
import com.suisung.mall.common.utils.LogUtil;
|
||||||
@ -1344,59 +1345,69 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理拉卡拉支付异步通知
|
||||||
|
* 该方法用于接收并处理来自拉卡拉支付平台的异步通知,包括验签、解析参数、更新订单状态等操作
|
||||||
|
*
|
||||||
|
* @param request HTTP请求对象,包含拉卡拉支付平台发送的异步通知数据
|
||||||
|
* @return String 返回处理结果,用于响应拉卡拉支付平台
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String lklNotifyUrl(HttpServletRequest request) {
|
public String lklNotifyUrl(HttpServletRequest request) {
|
||||||
Map<String, String> params;
|
Map<String, String> params;
|
||||||
try {
|
try {
|
||||||
|
logger.info("[拉卡拉支付通知] 开始处理拉卡拉支付异步通知");
|
||||||
|
|
||||||
|
// 初始化拉卡拉SDK
|
||||||
lakalaPayService.initLKLSDK();
|
lakalaPayService.initLKLSDK();
|
||||||
|
log.debug("[拉卡拉支付通知] 拉卡拉SDK初始化完成");
|
||||||
|
|
||||||
// 读取请求体并验签
|
// 读取请求体并验签
|
||||||
String body = LKLSDK.notificationHandle(request);
|
String body = LKLSDK.notificationHandle(request);
|
||||||
String authorization = request.getHeader("Authorization");
|
String authorization = request.getHeader("Authorization");
|
||||||
|
logger.debug("[拉卡拉支付通知] 接收到通知数据,body长度={},authorization长度={}",
|
||||||
|
body != null ? body.length() : 0,
|
||||||
|
authorization != null ? authorization.length() : 0);
|
||||||
|
|
||||||
if (StrUtil.isBlank(body)) {
|
if (StrUtil.isBlank(body)) {
|
||||||
|
log.warn("[拉卡拉支付通知] 验签失败,请求体为空");
|
||||||
return lklNotifyMsg(false, "验签失败!");
|
return lklNotifyMsg(false, "验签失败!");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 敏感头信息脱敏打印
|
// 敏感头信息脱敏打印
|
||||||
logger.info("拉卡拉支付异步通知回调 body:{} \n authorization: {}", body, authorization);
|
logger.info("[拉卡拉支付通知] 拉卡拉支付异步通知回调 body:{} \n authorization: {}",
|
||||||
// 非合单返回的数据异步通知返回的 body json数据:{"out_trade_no":"202203151637334864280014","trade_no":"2022031566210203291925","log_no":"66210203291925",
|
body, authorization != null ? "***" : "null");
|
||||||
// "acc_trade_no":"2022031522001483661454130929 ","trade_status":"SUCCESS","trade_state":"SUCCESS","total_amount":"1",
|
|
||||||
// "payer_amount":"1","acc_settle_amount":"1","trade_time":"20220315163808","user_id1":"app***@163.com",
|
|
||||||
// "user_id2":"2088432881453660","notify_url":"https://www.baidu.com","account_type":"ALIPAY","card_type":"99"}
|
|
||||||
|
|
||||||
// 合单返回的数据异步通知返回的 body json数据:{"out_trade_no":"DD-20250830-10","trade_no":"20250830110113130266250034160499","log_no":"66250034160499",
|
|
||||||
// "acc_trade_no":"4200002826202508306761393882","trade_status":"SUCCESS","trade_state":"SUCCESS","total_amount":"2","payer_amount":"2","acc_settle_amount":"2",
|
|
||||||
// "acc_mdiscount_amount":"0","acc_discount_amount":"0","trade_time":"20250830180435","user_id1":"oDVKR7T0qxg6O8tqIL9SgY6LXqqQ",
|
|
||||||
// "user_id2":"oVxsc1QRAqDRv_gAmXuLZwSVSL18","notify_url":"https://mall.gpxscs.cn/mobile/pay/index/lkl_wxPay_notify_url","account_type":"WECHAT",
|
|
||||||
// "bank_type":"OTHERS","card_type":"02","merchant_no":"8226330541100GU","remark":"","sub_mch_id":"803819329",
|
|
||||||
// "out_split_rsp_infos":[{"sub_trade_no":"20250830110113130266250034112794","sub_log_no":"66250034112794","out_sub_trade_no":"ORD-DD-20250830-10",
|
|
||||||
// "merchant_no":"8226330541100GU","term_no":"N5817779","amount":"1","settle_type":"0"},{"sub_trade_no":"20250830110113130266250034160498","sub_log_no":"66250034160498",
|
|
||||||
// "out_sub_trade_no":"DF-DD-20250830-10","merchant_no":"822584059990FYP","term_no":"N5811590","amount":"1","settle_type":"0"}],"trade_req_date":"20250830","gb_amount":"",
|
|
||||||
// "qb_amount":""}
|
|
||||||
|
|
||||||
// 解析JSON格式响应
|
// 解析JSON格式响应
|
||||||
cn.hutool.json.JSONObject lklNotifyRespJSON = JSONUtil.parseObj(body);
|
cn.hutool.json.JSONObject lklNotifyRespJSON = JSONUtil.parseObj(body);
|
||||||
|
logger.debug("[拉卡拉支付通知] 解析JSON完成: keys={}", lklNotifyRespJSON.keySet());
|
||||||
|
|
||||||
params = Convert.toMap(String.class, String.class, lklNotifyRespJSON);
|
params = Convert.toMap(String.class, String.class, lklNotifyRespJSON);
|
||||||
String orderId = params.getOrDefault("out_trade_no", "");
|
String orderId = params.getOrDefault("out_trade_no", "");
|
||||||
String accTradeNo = params.getOrDefault("acc_trade_no", ""); // 需要跟拉卡拉确认这个字段是原支付交易对应的微信订单号吗?
|
String tradeStatus = params.getOrDefault("trade_status", "");
|
||||||
String outSplitRspInfos = params.getOrDefault("out_split_rsp_infos", ""); // 拉卡拉合单订单信息
|
String accTradeNo = params.getOrDefault("acc_trade_no", "");
|
||||||
|
String outSplitRspInfos = params.getOrDefault("out_split_rsp_infos", "");
|
||||||
|
|
||||||
|
logger.info("[拉卡拉支付通知] 核心参数 - 订单号:{} 状态:{} 是否合单:{}",
|
||||||
|
orderId, tradeStatus, StrUtil.isNotBlank(outSplitRspInfos) ? "是" : "否");
|
||||||
|
|
||||||
// 提取授权签名信息
|
// 提取授权签名信息
|
||||||
Map<String, String> authMap = LakalaUtil.getLakalaAuthorizationMap(authorization);
|
Map<String, String> authMap = LakalaUtil.getLakalaAuthorizationMap(authorization);
|
||||||
if (authMap != null && authMap.containsKey("signature")) {
|
if (authMap != null && authMap.containsKey("signature")) {
|
||||||
params.put("sign", authMap.get("signature"));
|
params.put("sign", authMap.get("signature"));
|
||||||
|
logger.debug("[拉卡拉支付通知] 签名信息提取成功");
|
||||||
} else {
|
} else {
|
||||||
logger.error("缺少签名信息");
|
logger.error("[拉卡拉支付通知] 缺少签名信息,authMap={}", authMap);
|
||||||
return lklNotifyMsg(false, "缺少签名信息");
|
return lklNotifyMsg(false, "缺少签名信息");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StrUtil.isBlank(orderId)) {
|
if (StrUtil.isBlank(orderId)) {
|
||||||
logger.error("缺少out_trade_no字段");
|
logger.error("[拉卡拉支付通知] 缺少out_trade_no字段,body={}", body);
|
||||||
return lklNotifyMsg(false, "缺少out_trade_no字段");
|
return lklNotifyMsg(false, "缺少out_trade_no字段");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询交易信息
|
// 查询交易信息
|
||||||
|
logger.debug("[拉卡拉支付通知] 查询交易信息: orderId={}", orderId);
|
||||||
QueryWrapper<PayConsumeTrade> tradeQueryWrapper = new QueryWrapper<>();
|
QueryWrapper<PayConsumeTrade> tradeQueryWrapper = new QueryWrapper<>();
|
||||||
tradeQueryWrapper.eq("order_id", orderId);
|
tradeQueryWrapper.eq("order_id", orderId);
|
||||||
PayConsumeTrade trade_row_tmp = payConsumeTradeService.findOne(tradeQueryWrapper);
|
PayConsumeTrade trade_row_tmp = payConsumeTradeService.findOne(tradeQueryWrapper);
|
||||||
@ -1405,25 +1416,32 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
|
|||||||
String orderSubject = trade_row_tmp != null ? trade_row_tmp.getTrade_title() : "";
|
String orderSubject = trade_row_tmp != null ? trade_row_tmp.getTrade_title() : "";
|
||||||
Integer userId = trade_row_tmp != null ? trade_row_tmp.getBuyer_id() : 0;
|
Integer userId = trade_row_tmp != null ? trade_row_tmp.getBuyer_id() : 0;
|
||||||
|
|
||||||
|
logger.debug("[拉卡拉支付通知] 交易信息查询完成: storeId={} userId={}", payment_store_id, userId);
|
||||||
|
|
||||||
// 更新交易记录的 原支付交易对应的微信订单号 transaction_id
|
// 更新交易记录的 原支付交易对应的微信订单号 transaction_id
|
||||||
if (trade_row_tmp != null && StrUtil.isNotBlank(accTradeNo)) {
|
if (trade_row_tmp != null && StrUtil.isNotBlank(accTradeNo)) {
|
||||||
|
logger.debug("[拉卡拉支付通知] 更新交易记录的微信订单号: tradeId={} accTradeNo={}",
|
||||||
|
trade_row_tmp.getConsume_trade_id(), accTradeNo);
|
||||||
PayConsumeTrade payConsumeTradeUpd = new PayConsumeTrade();
|
PayConsumeTrade payConsumeTradeUpd = new PayConsumeTrade();
|
||||||
payConsumeTradeUpd.setConsume_trade_id(trade_row_tmp.getConsume_trade_id()).setTransaction_id(accTradeNo);
|
payConsumeTradeUpd.setConsume_trade_id(trade_row_tmp.getConsume_trade_id()).setTransaction_id(accTradeNo);
|
||||||
payConsumeTradeService.updateTradeByPrimaryKey(payConsumeTradeUpd);
|
payConsumeTradeService.updateTradeByPrimaryKey(payConsumeTradeUpd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询支付渠道
|
// 查询支付渠道
|
||||||
|
logger.debug("[拉卡拉支付通知] 查询支付渠道: channelCode=lakala");
|
||||||
QueryWrapper<PayPaymentChannel> channelQueryWrapper = new QueryWrapper<>();
|
QueryWrapper<PayPaymentChannel> channelQueryWrapper = new QueryWrapper<>();
|
||||||
channelQueryWrapper.eq("payment_channel_code", "lakala");
|
channelQueryWrapper.eq("payment_channel_code", "lakala");
|
||||||
PayPaymentChannel payPaymentChannel = payPaymentChannelService.findOne(channelQueryWrapper);
|
PayPaymentChannel payPaymentChannel = payPaymentChannelService.findOne(channelQueryWrapper);
|
||||||
|
|
||||||
if (payPaymentChannel == null) {
|
if (payPaymentChannel == null) {
|
||||||
logger.error("支付渠道不存在");
|
logger.error("[拉卡拉支付通知] 支付渠道不存在: channelCode=lakala");
|
||||||
return lklNotifyMsg(false, "支付渠道不存在");
|
return lklNotifyMsg(false, "支付渠道不存在");
|
||||||
}
|
}
|
||||||
Integer payment_channel_id = payPaymentChannel.getPayment_channel_id();
|
Integer payment_channel_id = payPaymentChannel.getPayment_channel_id();
|
||||||
|
logger.debug("[拉卡拉支付通知] 支付渠道查询完成: channelId={}", payment_channel_id);
|
||||||
|
|
||||||
// 插入充值记录
|
// 插入充值记录
|
||||||
|
logger.debug("[拉卡拉支付通知] 创建充值记录");
|
||||||
PayConsumeDeposit payConsumeDeposit = createNotify(params, payPaymentChannel);
|
PayConsumeDeposit payConsumeDeposit = createNotify(params, payPaymentChannel);
|
||||||
payConsumeDeposit.setOrder_id(orderId);
|
payConsumeDeposit.setOrder_id(orderId);
|
||||||
payConsumeDeposit.setStore_id(payment_store_id); // 所属店铺
|
payConsumeDeposit.setStore_id(payment_store_id); // 所属店铺
|
||||||
@ -1433,11 +1451,22 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
|
|||||||
payConsumeDeposit.setDeposit_body(orderSubject);
|
payConsumeDeposit.setDeposit_body(orderSubject);
|
||||||
payConsumeDeposit.setUser_id(userId);
|
payConsumeDeposit.setUser_id(userId);
|
||||||
|
|
||||||
|
// 设置拉卡拉相关参数
|
||||||
|
String merchantNo = lklNotifyRespJSON.getStr("merchant_no");
|
||||||
lklNotifyRespJSON.set("out_separate_no", orderId);// 默认非合单主单订单号
|
lklNotifyRespJSON.set("out_separate_no", orderId);// 默认非合单主单订单号
|
||||||
lklNotifyRespJSON.set("lkl_sub_log_no", lklNotifyRespJSON.getStr("log_no")); // 默认非合单主单的流水号
|
lklNotifyRespJSON.set("lkl_sub_trade_no", lklNotifyRespJSON.getStr("trade_no"));// 默认非合单主单交易号
|
||||||
|
lklNotifyRespJSON.set("lkl_sub_log_no", lklNotifyRespJSON.getStr("log_no")); // 默认非合单主单的对账流水号
|
||||||
lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("total_amount")); // 默认非合单主单支付金额
|
lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("total_amount")); // 默认非合单主单支付金额
|
||||||
|
|
||||||
|
logger.debug("[拉卡拉支付通知] 基础参数设置完成: out_separate_no={} lkl_sub_trade_no={} lkl_sub_log_no={} split_amt={}",
|
||||||
|
lklNotifyRespJSON.getStr("out_separate_no"),
|
||||||
|
lklNotifyRespJSON.getStr("lkl_sub_trade_no"),
|
||||||
|
lklNotifyRespJSON.getStr("lkl_sub_log_no"),
|
||||||
|
lklNotifyRespJSON.getStr("split_amt"));
|
||||||
|
|
||||||
// 拉卡拉订单合单信息
|
// 拉卡拉订单合单信息
|
||||||
if (StrUtil.isNotBlank(outSplitRspInfos)) {
|
if (StrUtil.isNotBlank(outSplitRspInfos)) {
|
||||||
|
logger.debug("[拉卡拉支付通知] 处理合单信息");
|
||||||
// [{"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"},{"sub_trade_no":"20250830110113130266250034401289","merchant_no":"8226330541100GU","amount":"1","settle_type":"0","sub_log_no":"66250034401289","out_sub_trade_no":"ORD-DD-20250830-21","term_no":"N5817779"}]
|
// [{"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"},{"sub_trade_no":"20250830110113130266250034401289","merchant_no":"8226330541100GU","amount":"1","settle_type":"0","sub_log_no":"66250034401289","out_sub_trade_no":"ORD-DD-20250830-21","term_no":"N5817779"}]
|
||||||
payConsumeDeposit.setLkl_combine_params(outSplitRspInfos);
|
payConsumeDeposit.setLkl_combine_params(outSplitRspInfos);
|
||||||
|
|
||||||
@ -1447,46 +1476,64 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
|
|||||||
payConsumeDeposit.setOrd_sub_trade_no(subTradeNos.getFirst());
|
payConsumeDeposit.setOrd_sub_trade_no(subTradeNos.getFirst());
|
||||||
// 商品运费子订单号
|
// 商品运费子订单号
|
||||||
payConsumeDeposit.setDf_sub_trade_no(subTradeNos.getSecond());
|
payConsumeDeposit.setDf_sub_trade_no(subTradeNos.getSecond());
|
||||||
|
logger.debug("[拉卡拉支付通知] 子订单号解析完成: ord={} df={}",
|
||||||
|
subTradeNos.getFirst(), subTradeNos.getSecond());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取拉卡拉订单合单商品信息
|
// 获取拉卡拉合单商品子订单信息
|
||||||
cn.hutool.json.JSONObject goodsOrderInfo = payConsumeTradeService.getLklCombineSplitRespInfo(outSplitRspInfos, false);
|
cn.hutool.json.JSONObject goodsOrderInfo = CommonService.getLklCombineSplitRespInfo(merchantNo, outSplitRspInfos, false);
|
||||||
if (goodsOrderInfo != null) {
|
if (goodsOrderInfo != null) {
|
||||||
lklNotifyRespJSON.set("out_separate_no", goodsOrderInfo.getStr("out_sub_trade_no"));// 合单子订单号
|
lklNotifyRespJSON.set("out_separate_no", goodsOrderInfo.getStr("out_sub_trade_no"));// 合单商品子订单号
|
||||||
lklNotifyRespJSON.set("lkl_sub_log_no", lklNotifyRespJSON.getStr("sub_log_no")); // 合单子商品订单的流水号
|
lklNotifyRespJSON.set("lkl_sub_trade_no", goodsOrderInfo.getStr("sub_trade_no")); // 合单商品子订单的流水号
|
||||||
lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("amount")); // 合单子商品订单支付金额
|
lklNotifyRespJSON.set("lkl_sub_log_no", goodsOrderInfo.getStr("sub_log_no")); // 合单商品子订单的流水号
|
||||||
|
lklNotifyRespJSON.set("split_amt", goodsOrderInfo.getStr("amount")); // 合单子商品订单支付金额
|
||||||
|
|
||||||
|
logger.debug("[拉卡拉支付通知] 合单信息更新完成: out_separate_no={} lkl_sub_trade_no={} lkl_sub_log_no={} split_amt={}",
|
||||||
|
lklNotifyRespJSON.getStr("out_separate_no"),
|
||||||
|
lklNotifyRespJSON.getStr("lkl_sub_trade_no"),
|
||||||
|
lklNotifyRespJSON.getStr("lkl_sub_log_no"),
|
||||||
|
lklNotifyRespJSON.getStr("split_amt"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否联合支付
|
// 判断是否联合支付
|
||||||
|
logger.debug("[拉卡拉支付通知] 查询联合支付信息: orderId={}", orderId);
|
||||||
PayConsumeTradeCombine tradeCombine = payConsumeTradeCombineService.get(orderId);
|
PayConsumeTradeCombine tradeCombine = payConsumeTradeCombineService.get(orderId);
|
||||||
|
|
||||||
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
|
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
|
||||||
try {
|
try {
|
||||||
|
logger.debug("[拉卡拉支付通知] 开始事务处理");
|
||||||
|
|
||||||
// 修改 拉卡拉的订单记录 shop_order_lkl
|
// 修改 拉卡拉的订单记录 shop_order_lkl
|
||||||
|
logger.debug("[拉卡拉支付通知] 调用shopService更新拉卡拉订单记录");
|
||||||
shopService.lklPayNotifyUpdateShopOrderLkl(lklNotifyRespJSON);
|
shopService.lklPayNotifyUpdateShopOrderLkl(lklNotifyRespJSON);
|
||||||
|
log.debug("[拉卡拉支付通知] 拉卡拉订单记录更新完成");
|
||||||
|
|
||||||
if (tradeCombine != null && StrUtil.isNotBlank(tradeCombine.getOrder_ids())) {
|
if (tradeCombine != null && StrUtil.isNotBlank(tradeCombine.getOrder_ids())) {
|
||||||
|
logger.debug("[拉卡拉支付通知] 处理联合支付: combinedOrderIds={}", tradeCombine.getOrder_ids());
|
||||||
payConsumeDeposit.setOrder_id(tradeCombine.getOrder_ids());
|
payConsumeDeposit.setOrder_id(tradeCombine.getOrder_ids());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注:重要,支付完成接口调用
|
// 注:重要,支付完成接口调用
|
||||||
|
log.debug("[拉卡拉支付通知] 调用支付完成处理接口");
|
||||||
if (!payConsumeDepositService.processDeposit(payConsumeDeposit, BigDecimal.ZERO, BigDecimal.ZERO,
|
if (!payConsumeDepositService.processDeposit(payConsumeDeposit, BigDecimal.ZERO, BigDecimal.ZERO,
|
||||||
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)) {
|
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)) {
|
||||||
log.error("[processDeposit]处理订单数据失败!");
|
logger.error("[拉卡拉支付通知][processDeposit]处理订单数据失败!");
|
||||||
return lklNotifyMsg(false, "支付失败!");
|
return lklNotifyMsg(false, "支付失败!");
|
||||||
}
|
}
|
||||||
|
log.debug("[拉卡拉支付通知] 支付完成处理接口调用成功");
|
||||||
|
|
||||||
transactionManager.commit(transactionStatus);
|
transactionManager.commit(transactionStatus);
|
||||||
|
logger.info("[拉卡拉支付通知] 事务提交成功,支付处理完成: orderId={}", orderId);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
transactionManager.rollback(transactionStatus);
|
transactionManager.rollback(transactionStatus);
|
||||||
log.error("接收拉卡拉支付异步通知出错:{}", e);
|
logger.error("[拉卡拉支付通知] 事务处理出错,已回滚: orderId={}", orderId, e);
|
||||||
throw new ApiException(e.getMessage());
|
throw new ApiException(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
return lklNotifyMsg(true, "执行成功");
|
return lklNotifyMsg(true, "执行成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("通知处理发生异常:{}", e.getMessage(), e);
|
logger.error("[拉卡拉支付通知] 通知处理发生异常", e);
|
||||||
return lklNotifyMsg(false, "通知处理发生异常!");
|
return lklNotifyMsg(false, "通知处理发生异常!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,7 +28,7 @@ public interface LklOrderSeparateService extends IBaseService<LklOrderSeparate>
|
|||||||
* @param outSeparateNo
|
* @param outSeparateNo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo);
|
LklOrderSeparate getByLogNoAndOutTradeNo(String logNo, String outSeparateNo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据商户号和平台订单号查询记录
|
* 根据商户号和平台订单号查询记录
|
||||||
|
|||||||
@ -30,6 +30,7 @@ import com.suisung.mall.common.modules.lakala.*;
|
|||||||
import com.suisung.mall.common.modules.order.ShopOrderLkl;
|
import com.suisung.mall.common.modules.order.ShopOrderLkl;
|
||||||
import com.suisung.mall.common.modules.store.ShopMchEntry;
|
import com.suisung.mall.common.modules.store.ShopMchEntry;
|
||||||
import com.suisung.mall.common.modules.store.ShopStoreBase;
|
import com.suisung.mall.common.modules.store.ShopStoreBase;
|
||||||
|
import com.suisung.mall.common.service.impl.CommonService;
|
||||||
import com.suisung.mall.common.utils.*;
|
import com.suisung.mall.common.utils.*;
|
||||||
import com.suisung.mall.shop.lakala.service.*;
|
import com.suisung.mall.shop.lakala.service.*;
|
||||||
import com.suisung.mall.shop.lakala.utils.LakalaUtil;
|
import com.suisung.mall.shop.lakala.utils.LakalaUtil;
|
||||||
@ -604,10 +605,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
req.setOrgCode(orgCode);
|
req.setOrgCode(orgCode);
|
||||||
req.setMerCupNo(shopMchEntry.getLkl_mer_cup_no()); // 从进件申请返回的商户号(不要传入内部商户号,传银联商户号才有效)
|
req.setMerCupNo(shopMchEntry.getLkl_mer_cup_no()); // 从进件申请返回的商户号(不要传入内部商户号,传银联商户号才有效)
|
||||||
req.setContactMobile(shopMchEntry.getLogin_mobile()); // 商户入驻注册的手机号
|
req.setContactMobile(shopMchEntry.getLogin_mobile()); // 商户入驻注册的手机号
|
||||||
// 分账比例为了考虑低价订单的运费占比高,分账比例暂时定70%分账给商户,30%分账给平台
|
// 分账比例默认 94%
|
||||||
req.setSplitLowestRatio(new BigDecimal(splitLowestRatio));
|
req.setSplitLowestRatio(new BigDecimal(splitLowestRatio));
|
||||||
req.setEleContractNo(shopMchEntry.getLkl_ec_no());
|
req.setEleContractNo(shopMchEntry.getLkl_ec_no());
|
||||||
String fileName = "商家分账授权委托书.pdf";//paramsJSON.getStr("splitEntrustFileName");
|
req.setSplitRange("ALL"); // ALL:全部交易分账 (商户所有交易默认待分账) MARK:标记交易分账(只有带分账标识交易待分账,其余交易正常结算) 默认:MARK
|
||||||
|
String fileName = "商家分账授权委托书.pdf";
|
||||||
req.setSplitEntrustFileName(fileName);
|
req.setSplitEntrustFileName(fileName);
|
||||||
|
|
||||||
// TODO 分账结算委托书文件上传到拉卡拉服务器
|
// TODO 分账结算委托书文件上传到拉卡拉服务器
|
||||||
@ -714,15 +716,52 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
return JSONUtil.createObj().set("code", "FAIL").set("message", "返回数据转换异常!");
|
return JSONUtil.createObj().set("code", "FAIL").set("message", "返回数据转换异常!");
|
||||||
}
|
}
|
||||||
|
|
||||||
String logNo = paramsJSON.getStr("log_no");
|
// 订单是否为合单
|
||||||
String tradeState = paramsJSON.getStr("trade_state");
|
boolean isCombine = paramsJSON.containsKey("out_split_rsp_infos");
|
||||||
|
log.debug("[确认收货通知] 检查是否为合单订单: isCombine={}", isCombine);
|
||||||
|
|
||||||
String merchantNo = paramsJSON.getStr("merchant_no");
|
String merchantNo = paramsJSON.getStr("merchant_no");
|
||||||
|
log.debug("[确认收货通知] 获取商户号: merchantNo={}", merchantNo);
|
||||||
|
|
||||||
|
// 分账用途
|
||||||
|
String logNo = paramsJSON.getStr("log_no");
|
||||||
|
String tradeNo = paramsJSON.getStr("trade_no");
|
||||||
|
log.debug("[确认收货通知] 获取基础交易信息: logNo={} tradeNo={}", logNo, tradeNo);
|
||||||
|
|
||||||
|
// 查询用途
|
||||||
String originTradeNo = paramsJSON.getStr("origin_trade_no");
|
String originTradeNo = paramsJSON.getStr("origin_trade_no");
|
||||||
String originLogNo = paramsJSON.getStr("origin_log_no");
|
String originLogNo = paramsJSON.getStr("origin_log_no");
|
||||||
|
log.debug("[确认收货通知] 获取原始交易信息: originTradeNo={} originLogNo={}", originTradeNo, originLogNo);
|
||||||
|
|
||||||
|
String tradeState = paramsJSON.getStr("trade_state");
|
||||||
|
log.debug("[确认收货通知] 获取交易状态: tradeState={}", tradeState);
|
||||||
|
|
||||||
log.info("[确认收货通知] 接收到通知参数: logNo={}, tradeState={}, merchantNo={}, originTradeNo={}, originLogNo={}",
|
log.info("[确认收货通知] 接收到通知参数: logNo={}, tradeState={}, merchantNo={}, originTradeNo={}, originLogNo={}",
|
||||||
logNo, tradeState, merchantNo, originTradeNo, originLogNo);
|
logNo, tradeState, merchantNo, originTradeNo, originLogNo);
|
||||||
|
|
||||||
|
if (isCombine) {
|
||||||
|
log.debug("[确认收货通知] 处理合单订单,开始获取子单信息");
|
||||||
|
// 合单的时候获取子单信息
|
||||||
|
JSONObject goodsOrderInfo = CommonService.getLklCombineSplitRespInfo(merchantNo, paramsJSON.getStr("out_split_rsp_infos"), false);
|
||||||
|
if (goodsOrderInfo != null) {
|
||||||
|
log.debug("[确认收货通知] 成功获取商品子单信息: {}", goodsOrderInfo);
|
||||||
|
// 分账用途
|
||||||
|
tradeNo = goodsOrderInfo.getStr("sub_trade_no");
|
||||||
|
logNo = goodsOrderInfo.getStr("sub_log_no");
|
||||||
|
log.debug("[确认收货通知] 从子单信息中获取交易号: tradeNo={} logNo={}", tradeNo, logNo);
|
||||||
|
|
||||||
|
// 查询用途
|
||||||
|
originTradeNo = goodsOrderInfo.getStr("origin_sub_trade_no");
|
||||||
|
originLogNo = goodsOrderInfo.getStr("origin_sub_log_no");
|
||||||
|
log.debug("[确认收货通知] 从子单信息中获取原始交易号: originTradeNo={} originLogNo={}", originTradeNo, originLogNo);
|
||||||
|
} else {
|
||||||
|
log.warn("[确认收货通知] 未能获取到商品子单信息,使用原始参数进行处理");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.debug("[确认收货通知] 非合单订单,使用原始参数进行处理");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (StrUtil.isBlank(tradeState) || !"SUCCESS".equals(tradeState)) {
|
if (StrUtil.isBlank(tradeState) || !"SUCCESS".equals(tradeState)) {
|
||||||
log.warn("[确认收货通知] 交易状态未成功,不做任何处理: tradeState={}", tradeState);
|
log.warn("[确认收货通知] 交易状态未成功,不做任何处理: tradeState={}", tradeState);
|
||||||
return JSONUtil.createObj().set("code", "FAIL").set("message", "交易状态未成功,不做任何处理!");
|
return JSONUtil.createObj().set("code", "FAIL").set("message", "交易状态未成功,不做任何处理!");
|
||||||
@ -734,7 +773,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
return JSONUtil.createObj().set("code", "FAIL").set("message", "关键编号返回空值!");
|
return JSONUtil.createObj().set("code", "FAIL").set("message", "关键编号返回空值!");
|
||||||
}
|
}
|
||||||
|
|
||||||
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndTradeNoAndSubLogNo(merchantNo, originTradeNo, originLogNo);
|
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndSubTradeNoAndSubLogNo(merchantNo, originTradeNo, originLogNo);
|
||||||
if (shopOrderLkl == null) {
|
if (shopOrderLkl == null) {
|
||||||
log.warn("[确认收货通知] 订单不存在: merchantNo={}, originTradeNo={}, originLogNo={}",
|
log.warn("[确认收货通知] 订单不存在: merchantNo={}, originTradeNo={}, originLogNo={}",
|
||||||
merchantNo, originTradeNo, originLogNo);
|
merchantNo, originTradeNo, originLogNo);
|
||||||
@ -744,7 +783,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
try {
|
try {
|
||||||
// 更新订单信息
|
// 更新订单信息
|
||||||
shopOrderLkl.setLkl_receive_log_no(logNo);
|
shopOrderLkl.setLkl_receive_log_no(logNo);
|
||||||
shopOrderLkl.setLkl_receive_trade_no(paramsJSON.getStr("trade_no"));
|
shopOrderLkl.setLkl_receive_trade_no(tradeNo);
|
||||||
shopOrderLkl.setLkl_receive_notify_resp(checkResult.getSecond());
|
shopOrderLkl.setLkl_receive_notify_resp(checkResult.getSecond());
|
||||||
shopOrderLkl.setReceive_status(CommonConstant.Enable);
|
shopOrderLkl.setReceive_status(CommonConstant.Enable);
|
||||||
|
|
||||||
@ -759,7 +798,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
// 发起分账指令
|
// 发起分账指令
|
||||||
log.info("[确认收货通知] 开始发起分账指令: merchantNo={}, receiveTradeNo={}, logNo={}",
|
log.info("[确认收货通知] 开始发起分账指令: merchantNo={}, receiveTradeNo={}, logNo={}",
|
||||||
merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo);
|
merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo);
|
||||||
Pair<Boolean, String> separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo);
|
Pair<Boolean, String> separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), shopOrderLkl.getLkl_receive_log_no());
|
||||||
if (!separateResult.getFirst()) {
|
if (!separateResult.getFirst()) {
|
||||||
log.error("[确认收货通知] 发起分账指令失败: orderId={}, reason={}", shopOrderLkl.getOrder_id(), separateResult.getSecond());
|
log.error("[确认收货通知] 发起分账指令失败: orderId={}, reason={}", shopOrderLkl.getOrder_id(), separateResult.getSecond());
|
||||||
return JSONUtil.createObj().set("code", "FAIL").set("message", "发起分账指令失败:" + separateResult.getSecond());
|
return JSONUtil.createObj().set("code", "FAIL").set("message", "发起分账指令失败:" + separateResult.getSecond());
|
||||||
@ -1740,7 +1779,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 5. 检查分账状态,避免重复处理
|
// 5. 检查分账状态,避免重复处理
|
||||||
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByOutTradeNo(shopOrderLkl.getLkl_sub_log_no(), orderId);
|
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByLogNoAndOutTradeNo(shopOrderLkl.getLkl_sub_log_no(), orderId);
|
||||||
if (existingSeparateRecord != null) {
|
if (existingSeparateRecord != null) {
|
||||||
String status = existingSeparateRecord.getStatus();
|
String status = existingSeparateRecord.getStatus();
|
||||||
if ("SUCCESS".equals(status)) {
|
if ("SUCCESS".equals(status)) {
|
||||||
@ -2005,7 +2044,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 4. 检查分账状态,避免重复处理
|
// 4. 检查分账状态,避免重复处理
|
||||||
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByOutTradeNo(shopOrderLkl.getLkl_sub_log_no(), shopOrderLkl.getOut_separate_no());
|
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByLogNoAndOutTradeNo(shopOrderLkl.getLkl_receive_log_no(), shopOrderLkl.getOut_separate_no());
|
||||||
if (existingSeparateRecord != null) {
|
if (existingSeparateRecord != null) {
|
||||||
String status = existingSeparateRecord.getStatus();
|
String status = existingSeparateRecord.getStatus();
|
||||||
if ("SUCCESS".equals(status)) {
|
if ("SUCCESS".equals(status)) {
|
||||||
@ -2120,9 +2159,9 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
// 17. 构建分账请求对象
|
// 17. 构建分账请求对象
|
||||||
V3SacsSeparateRequest separateRequest = new V3SacsSeparateRequest();
|
V3SacsSeparateRequest separateRequest = new V3SacsSeparateRequest();
|
||||||
separateRequest.setMerchantNo(merchantNo);
|
separateRequest.setMerchantNo(merchantNo);
|
||||||
|
separateRequest.setOutSeparateNo(shopOrderLkl.getOut_separate_no());
|
||||||
separateRequest.setLogNo(shopOrderLkl.getLkl_receive_log_no()); // 使用收货流水号作为分账流水号
|
separateRequest.setLogNo(shopOrderLkl.getLkl_receive_log_no()); // 使用收货流水号作为分账流水号
|
||||||
separateRequest.setLogDate(shopOrderLkl.getLkl_log_date());
|
separateRequest.setLogDate(shopOrderLkl.getLkl_log_date());
|
||||||
separateRequest.setOutSeparateNo(shopOrderLkl.getOut_separate_no());
|
|
||||||
separateRequest.setTotalAmt(splitAmount.toString());
|
separateRequest.setTotalAmt(splitAmount.toString());
|
||||||
separateRequest.setLklOrgNo(orgCode);
|
separateRequest.setLklOrgNo(orgCode);
|
||||||
separateRequest.setCalType("0"); // 0- 按照指定金额,1- 按照指定比例。默认 0
|
separateRequest.setCalType("0"); // 0- 按照指定金额,1- 按照指定比例。默认 0
|
||||||
@ -2154,7 +2193,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s,商户=%s,分账流水号=%s,响应=%s,respJson=%s",
|
String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s,商户=%s,分账流水号=%s,响应=%s,respJson=%s",
|
||||||
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response, respJson);
|
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response, respJson);
|
||||||
log.error(errorMsg);
|
log.error(errorMsg);
|
||||||
return Pair.of(false, "拉卡拉返回格式异常");
|
return Pair.of(false, "拉卡拉分账异常:[" + respJson.getStr("code") + "]" + respJson.getStr("msg"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 21. 保存分账记录
|
// 21. 保存分账记录
|
||||||
@ -2271,7 +2310,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
.put("message", errorMsg);
|
.put("message", errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByOutTradeNo(logNo, outSeparateNo);
|
LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByLogNoAndOutTradeNo(logNo, outSeparateNo);
|
||||||
if (lklOrderSeparateExist == null) {
|
if (lklOrderSeparateExist == null) {
|
||||||
String errorMsg = "未找到对应的分账记录";
|
String errorMsg = "未找到对应的分账记录";
|
||||||
log.error(errorMsg + ", 外部分账单号={}, 分账单号={}, 参数详情: {}", outSeparateNo, separateNo, paramsJson);
|
log.error(errorMsg + ", 外部分账单号={}, 分账单号={}, 参数详情: {}", outSeparateNo, separateNo, paramsJson);
|
||||||
@ -2288,6 +2327,14 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
.put("message", "分账已处理成功,请不要重复通知");
|
.put("message", "分账已处理成功,请不要重复通知");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!"FAIL".equals(lklOrderSeparateExist.getFinal_status())) {
|
||||||
|
String errorMsg = "已受理或处理中,成功后再通知";
|
||||||
|
log.warn(errorMsg + ", 订单号={}, 外部分账单号={}, 参数详情: {}", logNo, outSeparateNo, paramsJson);
|
||||||
|
return JSONUtil.createObj()
|
||||||
|
.put("code", "FAIL")
|
||||||
|
.put("message", "已受理或处理中,成功后再通知");
|
||||||
|
}
|
||||||
|
|
||||||
// 4. 记录关键参数信息,便于问题排查
|
// 4. 记录关键参数信息,便于问题排查
|
||||||
log.info("接收到分账通知,分账单号={}, 外部分账单号={}, 状态={}, 最终状态={}",
|
log.info("接收到分账通知,分账单号={}, 外部分账单号={}, 状态={}, 最终状态={}",
|
||||||
separateNo, outSeparateNo, status, finalStatus);
|
separateNo, outSeparateNo, status, finalStatus);
|
||||||
@ -2302,6 +2349,9 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
|||||||
lklOrderSeparate.setCal_type(paramsJson.getStr("cal_type"));
|
lklOrderSeparate.setCal_type(paramsJson.getStr("cal_type"));
|
||||||
lklOrderSeparate.setSeparate_type(paramsJson.getStr("separate_type"));
|
lklOrderSeparate.setSeparate_type(paramsJson.getStr("separate_type"));
|
||||||
lklOrderSeparate.setSeparate_date(paramsJson.getStr("separate_date"));
|
lklOrderSeparate.setSeparate_date(paramsJson.getStr("separate_date"));
|
||||||
|
lklOrderSeparate.setTotal_separate_value(paramsJson.getInt("total_amt"));
|
||||||
|
lklOrderSeparate.setRemark("分账已完成");
|
||||||
|
lklOrderSeparate.setFinish_date(paramsJson.getStr("finish_date"));
|
||||||
|
|
||||||
// 处理detail_datas(避免空指针)
|
// 处理detail_datas(避免空指针)
|
||||||
JSONArray detailDatas = paramsJson.getJSONArray("detail_datas");
|
JSONArray detailDatas = paramsJson.getJSONArray("detail_datas");
|
||||||
|
|||||||
@ -54,30 +54,30 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl<LklOrderSeparat
|
|||||||
/**
|
/**
|
||||||
* 根据拉卡拉对账单流水号和平台订单号查询记录
|
* 根据拉卡拉对账单流水号和平台订单号查询记录
|
||||||
*
|
*
|
||||||
* @param splitLogNo
|
* @param logNo 分账对账流水号
|
||||||
* @param outSeparateNo
|
* @param outSeparateNo 分账商家的订单号
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public LklOrderSeparate getByOutTradeNo(String splitLogNo, String outSeparateNo) {
|
public LklOrderSeparate getByLogNoAndOutTradeNo(String logNo, String outSeparateNo) {
|
||||||
try {
|
try {
|
||||||
if (StrUtil.isBlank(splitLogNo) || StrUtil.isBlank(outSeparateNo)) {
|
if (StrUtil.isBlank(logNo) || StrUtil.isBlank(outSeparateNo)) {
|
||||||
log.warn("查询参数为空:logNo={}, outSeparateNo={}", splitLogNo, outSeparateNo);
|
log.warn("查询参数为空:logNo={}, outSeparateNo={}", logNo, outSeparateNo);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<LklOrderSeparate> list = list(new QueryWrapper<LklOrderSeparate>()
|
List<LklOrderSeparate> list = list(new QueryWrapper<LklOrderSeparate>()
|
||||||
.eq("log_no", splitLogNo)
|
.eq("log_no", logNo)
|
||||||
.eq("out_separate_no", outSeparateNo));
|
.eq("out_separate_no", outSeparateNo));
|
||||||
|
|
||||||
if (CollUtil.isEmpty(list)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
log.info("未找到记录:logNo={}, outSeparateNo={}", splitLogNo, outSeparateNo);
|
log.info("未找到记录:logNo={}, outSeparateNo={}", logNo, outSeparateNo);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return list.get(0);
|
return list.get(0);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("查询记录时发生异常:logNo={}, outSeparateNo={}, 异常信息={}", splitLogNo, outSeparateNo, e.getMessage(), e);
|
log.error("查询记录时发生异常:logNo={}, outSeparateNo={}, 异常信息={}", logNo, outSeparateNo, e.getMessage(), e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -82,7 +82,7 @@ public interface ShopOrderLklService extends IBaseService<ShopOrderLkl> {
|
|||||||
* @param lklSubLogNo
|
* @param lklSubLogNo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
ShopOrderLkl getByLklMchNoAndTradeNoAndSubLogNo(String lklMerchantNo, String lklTradeNo, String lklSubLogNo);
|
ShopOrderLkl getByLklMchNoAndSubTradeNoAndSubLogNo(String lklMerchantNo, String lklTradeNo, String lklSubLogNo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -763,9 +763,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
|
|||||||
// update 2025-09-10 增加KLK支付信息
|
// update 2025-09-10 增加KLK支付信息
|
||||||
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(shopOrderInfo.getStore_id(), order_id);
|
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(shopOrderInfo.getStore_id(), order_id);
|
||||||
if (shopOrderLkl != null) {
|
if (shopOrderLkl != null) {
|
||||||
base_row.put("lkl_trade_no", shopOrderLkl.getLkl_trade_no());
|
|
||||||
base_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no());
|
base_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no());
|
||||||
base_row.put("lkl_sub_log_no", shopOrderLkl.getLkl_sub_log_no());
|
base_row.put("lkl_trade_no", shopOrderLkl.getLkl_sub_trade_no());
|
||||||
|
base_row.put("lkl_log_no", shopOrderLkl.getLkl_sub_log_no());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否为虚拟商品
|
// 是否为虚拟商品
|
||||||
@ -8091,9 +8091,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
|
|||||||
// update 2025-09-10 增加KLK支付信息
|
// update 2025-09-10 增加KLK支付信息
|
||||||
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(store_id, order_id);
|
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(store_id, order_id);
|
||||||
if (shopOrderLkl != null) {
|
if (shopOrderLkl != null) {
|
||||||
order_info_row.put("lkl_trade_no", shopOrderLkl.getLkl_trade_no());
|
|
||||||
order_info_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no());
|
order_info_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no());
|
||||||
order_info_row.put("lkl_sub_log_no", shopOrderLkl.getLkl_sub_log_no());
|
order_info_row.put("lkl_trade_no", shopOrderLkl.getLkl_sub_trade_no());
|
||||||
|
order_info_row.put("lkl_log_no", shopOrderLkl.getLkl_sub_log_no());
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<Map> store_row_Opl = store_rows.stream().filter(s -> ObjectUtil.equal(store_id, Convert.toInt(s.get("store_id")))).findFirst();
|
Optional<Map> store_row_Opl = store_rows.stream().filter(s -> ObjectUtil.equal(store_id, Convert.toInt(s.get("store_id")))).findFirst();
|
||||||
|
|||||||
@ -123,100 +123,149 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
|
|||||||
* "merchantNo": "8226330599900LN"
|
* "merchantNo": "8226330599900LN"
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
* @return
|
* @return Boolean 是否保存或更新成功
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean addOrUpdateByLklPayDataJson(JSONObject lklPayReqAndRespJson) {
|
public Boolean addOrUpdateByLklPayDataJson(JSONObject lklPayReqAndRespJson) {
|
||||||
if (lklPayReqAndRespJson == null) {
|
if (lklPayReqAndRespJson == null) {
|
||||||
log.warn("参数为空,无法保存拉卡拉订单记录");
|
log.warn("[拉卡拉订单保存] 参数为空,无法保存拉卡拉订单记录");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("拉卡拉支付请求和响应数据 body:{}", lklPayReqAndRespJson);
|
log.debug("[拉卡拉订单保存] 开始处理拉卡拉支付请求和响应数据: {}", lklPayReqAndRespJson);
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// 获取请求体和响应体
|
// 获取请求体和响应体
|
||||||
JSONObject reqDataJson = lklPayReqAndRespJson.getJSONObject("req");// 驼峰命名
|
JSONObject reqDataJson = lklPayReqAndRespJson.getJSONObject("req");// 驼峰命名
|
||||||
JSONObject respDataJson = JSONUtil.parseObj(lklPayReqAndRespJson.getByPath("resp.resp_data"));// 下划线命名
|
JSONObject respDataJson = JSONUtil.parseObj(lklPayReqAndRespJson.getByPath("resp.resp_data"));// 下划线命名
|
||||||
|
|
||||||
if (reqDataJson == null || respDataJson == null) {
|
if (reqDataJson == null || respDataJson == null) {
|
||||||
log.error("请求或响应数据中的 req_data / resp_data 为空");
|
log.error("[拉卡拉订单保存] 请求或响应数据中的 req_data / resp_data 为空");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
log.debug("[拉卡拉订单保存] 解析请求和响应数据完成");
|
||||||
|
|
||||||
// 提取订单号并校验
|
// 提取订单号并校验
|
||||||
String orderId = JsonUtil.getJsonValueSmart(respDataJson, "out_trade_no");
|
String orderId = JsonUtil.getJsonValueSmart(respDataJson, "out_trade_no");
|
||||||
if (StringUtils.isBlank(orderId)) {
|
if (StringUtils.isBlank(orderId)) {
|
||||||
log.error("订单ID为空,无法保存拉卡拉支付记录");
|
log.error("[拉卡拉订单保存] 订单ID为空,无法保存拉卡拉支付记录");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
log.debug("[拉卡拉订单保存] 解析订单ID: {}", orderId);
|
||||||
|
|
||||||
ShopOrderBase shopOrderBase = shopOrderBaseService.get(orderId);
|
ShopOrderBase shopOrderBase = shopOrderBaseService.get(orderId);
|
||||||
if (shopOrderBase == null) {
|
if (shopOrderBase == null) {
|
||||||
log.error("订单不存在,无法保存拉卡拉支付记录");
|
log.error("[拉卡拉订单保存] 订单不存在,无法保存拉卡拉支付记录: orderId={}", orderId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
log.debug("[拉卡拉订单保存] 获取订单基础信息完成: storeId={}", shopOrderBase.getStore_id());
|
||||||
|
|
||||||
ShopOrderLkl record = new ShopOrderLkl();
|
ShopOrderLkl record = new ShopOrderLkl();
|
||||||
record.setOrder_id(orderId);
|
record.setOrder_id(orderId);
|
||||||
record.setOut_separate_no(JsonUtil.getJsonValueSmart(reqDataJson, "outTradeNo"));
|
String outSeparateNo = JsonUtil.getJsonValueSmart(reqDataJson, "outTradeNo");
|
||||||
|
record.setOut_separate_no(outSeparateNo);
|
||||||
|
log.debug("[拉卡拉订单保存] 设置订单ID和分离订单号: orderId={} outSeparateNo={}", orderId, outSeparateNo);
|
||||||
|
|
||||||
// 设置请求内容
|
// 设置请求内容
|
||||||
|
|
||||||
// 订单金额安全处理
|
// 订单金额安全处理
|
||||||
Integer amount = JsonUtil.getJsonValueSmart(reqDataJson, "totalAmount", Integer.class);
|
Integer amount = JsonUtil.getJsonValueSmart(reqDataJson, "totalAmount", Integer.class);
|
||||||
if (amount == null) {
|
if (amount == null) {
|
||||||
log.error("订单{}金额无效: {}", orderId, amount);
|
log.error("[拉卡拉订单保存] 订单{}金额无效: amount={}", orderId, amount);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
record.setTotal_amt(amount); // 应支付总金额
|
record.setTotal_amt(amount); // 应支付总金额
|
||||||
|
log.debug("[拉卡拉订单保存] 设置订单金额: amount={}分", amount);
|
||||||
|
|
||||||
// 关键数据:获取店铺ID,分账比例用到
|
// 关键数据:获取店铺ID,分账比例用到
|
||||||
Integer storeId = shopOrderBase.getStore_id();
|
Integer storeId = shopOrderBase.getStore_id();
|
||||||
record.setStore_id(Convert.toStr(storeId));
|
record.setStore_id(Convert.toStr(storeId));
|
||||||
|
log.debug("[拉卡拉订单保存] 设置店铺ID: storeId={}", storeId);
|
||||||
|
|
||||||
// 运费和商家分账比例
|
// 运费和商家分账比例
|
||||||
BigDecimal shipperFee = shopOrderDataService.getOrderShippingFee(orderId); // 运费获取
|
BigDecimal shipperFee = shopOrderDataService.getOrderShippingFee(orderId); // 运费获取
|
||||||
record.setShopping_fee(shipperFee.multiply(BigDecimal.valueOf(100)).intValue()); // 运费,单位:分
|
if (shipperFee != null) {
|
||||||
record.setSplit_ratio(shopStoreBaseService.getStoreSplitRatio(storeId, false)); // 商家分账比例计算
|
int shipperFeeInCents = shipperFee.multiply(BigDecimal.valueOf(100)).intValue(); // 运费,单位:分
|
||||||
|
record.setShopping_fee(shipperFeeInCents);
|
||||||
|
log.debug("[拉卡拉订单保存] 设置运费: 元={} 分={}", shipperFee, shipperFeeInCents);
|
||||||
|
} else {
|
||||||
|
log.debug("[拉卡拉订单保存] 未获取到运费信息");
|
||||||
|
}
|
||||||
|
|
||||||
record.setAccount_type(JsonUtil.getJsonValueSmart(reqDataJson, "accountType"));
|
BigDecimal splitRatio = shopStoreBaseService.getStoreSplitRatio(storeId, false); // 商家分账比例计算
|
||||||
record.setTrans_type(JsonUtil.getJsonValueSmart(reqDataJson, "transType"));
|
record.setSplit_ratio(splitRatio);
|
||||||
record.setNotify_url(JsonUtil.getJsonValueSmart(reqDataJson, "notifyUrl"));
|
log.debug("[拉卡拉订单保存] 设置分账比例: ratio={}", splitRatio);
|
||||||
record.setReceive_notify_url(JsonUtil.getJsonValueSmart(reqDataJson, "complete_notify_url"));
|
|
||||||
record.setLkl_merchant_no(JsonUtil.getJsonValueSmart(reqDataJson, "merchantNo"));
|
// 设置其他请求字段
|
||||||
record.setLkl_term_no(JsonUtil.getJsonValueSmart(reqDataJson, "termNo"));
|
String accountType = JsonUtil.getJsonValueSmart(reqDataJson, "accountType");
|
||||||
record.setLkl_req(JSONUtil.toJsonStr(reqDataJson));
|
String transType = JsonUtil.getJsonValueSmart(reqDataJson, "transType");
|
||||||
|
String notifyUrl = JsonUtil.getJsonValueSmart(reqDataJson, "notifyUrl");
|
||||||
|
String receiveNotifyUrl = JsonUtil.getJsonValueSmart(reqDataJson, "complete_notify_url");
|
||||||
|
String merchantNo = JsonUtil.getJsonValueSmart(reqDataJson, "merchantNo");
|
||||||
|
String termNo = JsonUtil.getJsonValueSmart(reqDataJson, "termNo");
|
||||||
|
|
||||||
|
record.setAccount_type(accountType);
|
||||||
|
record.setTrans_type(transType);
|
||||||
|
record.setNotify_url(notifyUrl);
|
||||||
|
record.setReceive_notify_url(receiveNotifyUrl);
|
||||||
|
record.setLkl_merchant_no(merchantNo);
|
||||||
|
record.setLkl_term_no(termNo);
|
||||||
|
|
||||||
|
log.debug("[拉卡拉订单保存] 设置请求字段: accountType={} transType={} merchantNo={} termNo={}",
|
||||||
|
accountType, transType, merchantNo, termNo);
|
||||||
|
|
||||||
|
String reqJsonStr = JSONUtil.toJsonStr(reqDataJson);
|
||||||
|
record.setLkl_req(reqJsonStr);
|
||||||
|
log.debug("[拉卡拉订单保存] 设置请求JSON,长度={}", reqJsonStr != null ? reqJsonStr.length() : 0);
|
||||||
|
|
||||||
// 设置响应内容
|
// 设置响应内容
|
||||||
String logNo = JsonUtil.getJsonValueSmart(respDataJson, "log_no");
|
String logNo = JsonUtil.getJsonValueSmart(respDataJson, "log_no");
|
||||||
record.setLkl_log_no(logNo);
|
record.setLkl_log_no(logNo);
|
||||||
|
log.debug("[拉卡拉订单保存] 设置流水号: logNo={}", logNo);
|
||||||
|
|
||||||
record.setLkl_trade_no(JsonUtil.getJsonValueSmart(respDataJson, "trade_no"));
|
String tradeNo = JsonUtil.getJsonValueSmart(respDataJson, "trade_no");
|
||||||
record.setLkl_resp(JSONUtil.toJsonStr(respDataJson));
|
record.setLkl_trade_no(tradeNo);
|
||||||
|
log.debug("[拉卡拉订单保存] 设置交易号: tradeNo={}", tradeNo);
|
||||||
|
|
||||||
return addOrUpdateByStoreOrder(record);
|
String respJsonStr = JSONUtil.toJsonStr(respDataJson);
|
||||||
|
record.setLkl_resp(respJsonStr);
|
||||||
|
log.debug("[拉卡拉订单保存] 设置响应JSON,长度={}", respJsonStr != null ? respJsonStr.length() : 0);
|
||||||
|
|
||||||
|
log.debug("[拉卡拉订单保存] 调用addOrUpdateByStoreOrder方法保存记录: orderId={}", orderId);
|
||||||
|
Boolean result = addOrUpdateByStoreOrder(record);
|
||||||
|
if (result) {
|
||||||
|
log.info("[拉卡拉订单保存] 拉卡拉订单记录保存成功: orderId={}", orderId);
|
||||||
|
} else {
|
||||||
|
log.error("[拉卡拉订单保存] 拉卡拉订单记录保存失败: orderId={}", orderId);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("新增拉卡拉支付记录出错", e);
|
log.error("[拉卡拉订单保存] 新增拉卡拉支付记录出错", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据拉卡拉支付通知数据保存或更新拉卡拉订单记录
|
||||||
|
* 该方法用于处理拉卡拉支付平台发送的支付通知,将通知中的数据保存到shop_order_lkl表中
|
||||||
|
*
|
||||||
|
* @param lklPayNotifyDataJson 拉卡拉支付通知的JSON数据
|
||||||
|
* @return Boolean 是否保存或更新成功
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean addOrUpdateByLklPayNotifyDataJson(JSONObject lklPayNotifyDataJson) {
|
public Boolean addOrUpdateByLklPayNotifyDataJson(JSONObject lklPayNotifyDataJson) {
|
||||||
if (lklPayNotifyDataJson == null) {
|
if (lklPayNotifyDataJson == null) {
|
||||||
log.warn("参数为空,无法保存拉卡拉支付通知记录");
|
log.warn("[拉卡拉订单更新] 参数为空,无法保存拉卡拉支付通知记录");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("拉卡拉支付通知回调 body:{}", lklPayNotifyDataJson);
|
log.debug("[拉卡拉订单更新] 开始处理拉卡拉支付通知回调: {}", lklPayNotifyDataJson);
|
||||||
try {
|
try {
|
||||||
|
// 获取订单ID
|
||||||
String orderId = lklPayNotifyDataJson.getStr("out_trade_no");
|
String orderId = lklPayNotifyDataJson.getStr("out_trade_no");
|
||||||
if (StringUtils.isBlank(orderId)) {
|
if (StringUtils.isBlank(orderId)) {
|
||||||
log.warn("订单ID为空,无法保存拉卡拉支付通知记录");
|
log.warn("[拉卡拉订单更新] 订单ID为空,无法保存拉卡拉支付通知记录");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
log.debug("[拉卡拉订单更新] 解析订单ID: {}", orderId);
|
||||||
|
|
||||||
ShopOrderLkl record = new ShopOrderLkl();
|
ShopOrderLkl record = new ShopOrderLkl();
|
||||||
record.setOrder_id(orderId);
|
record.setOrder_id(orderId);
|
||||||
@ -224,40 +273,67 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
|
|||||||
// 设置必填字段并校验
|
// 设置必填字段并校验
|
||||||
String logNo = lklPayNotifyDataJson.getStr("log_no");
|
String logNo = lklPayNotifyDataJson.getStr("log_no");
|
||||||
if (StringUtils.isBlank(logNo)) {
|
if (StringUtils.isBlank(logNo)) {
|
||||||
log.warn("log_no 为空,无法保存拉卡拉支付通知记录");
|
log.warn("[拉卡拉订单更新] log_no为空,无法保存拉卡拉支付通知记录: orderId={}", orderId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
record.setLkl_log_no(logNo);
|
record.setLkl_log_no(logNo);
|
||||||
|
log.debug("[拉卡拉订单更新] 设置流水号: {}", logNo);
|
||||||
|
|
||||||
// 设置日期字段
|
// 设置日期字段
|
||||||
record.setLkl_log_date(DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyyMMdd"));
|
String logDate = DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyyMMdd");
|
||||||
|
record.setLkl_log_date(logDate);
|
||||||
|
log.debug("[拉卡拉订单更新] 设置日期字段: {}", logDate);
|
||||||
|
|
||||||
// 设置可选字段
|
// 设置可选字段
|
||||||
record.setLkl_trade_no(lklPayNotifyDataJson.getStr("trade_no"));
|
String tradeNo = lklPayNotifyDataJson.getStr("trade_no");
|
||||||
record.setTrade_status(lklPayNotifyDataJson.getStr("trade_status"));
|
String tradeStatus = lklPayNotifyDataJson.getStr("trade_status");
|
||||||
|
record.setLkl_trade_no(tradeNo);
|
||||||
|
record.setTrade_status(tradeStatus);
|
||||||
|
log.debug("[拉卡拉订单更新] 设置可选字段: tradeNo={} tradeStatus={}", tradeNo, tradeStatus);
|
||||||
|
|
||||||
// 新增的订单字段,lkl_sub_log_no,out_separate_no,split_amt 三字段无值,就给主单的值
|
// 新增的订单字段,lkl_sub_log_no,out_separate_no,split_amt 四个字段无值,就给主单的值
|
||||||
record.setLkl_sub_log_no(JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "split_log_no"));
|
String outSeparateNo = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "out_separate_no");
|
||||||
if (CheckUtil.isEmpty(record.getLkl_sub_log_no())) {
|
if (CheckUtil.isEmpty(outSeparateNo)) {
|
||||||
record.setLkl_sub_log_no(logNo);
|
outSeparateNo = orderId;
|
||||||
}
|
}
|
||||||
|
record.setOut_separate_no(outSeparateNo);
|
||||||
|
|
||||||
record.setOut_separate_no(JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "out_separate_no"));
|
String lklSubTradeNo = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "lkl_sub_trade_no");
|
||||||
if (CheckUtil.isEmpty(record.getOut_separate_no())) {
|
if (CheckUtil.isEmpty(lklSubTradeNo)) {
|
||||||
record.setOut_separate_no(orderId);
|
lklSubTradeNo = tradeNo;
|
||||||
}
|
}
|
||||||
|
record.setLkl_sub_trade_no(lklSubTradeNo);
|
||||||
|
|
||||||
record.setSplit_amt(JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "split_amt", Integer.class));
|
String lklSubLogNo = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "lkl_sub_log_no");
|
||||||
if (CheckUtil.isEmpty(record.getSplit_amt())) {
|
if (CheckUtil.isEmpty(lklSubLogNo)) {
|
||||||
record.setSplit_amt(record.getTotal_amt());
|
lklSubLogNo = logNo;
|
||||||
}
|
}
|
||||||
|
record.setLkl_sub_log_no(lklSubLogNo);
|
||||||
|
|
||||||
|
Integer splitAmt = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "split_amt", Integer.class);
|
||||||
|
if (CheckUtil.isEmpty(splitAmt)) {
|
||||||
|
splitAmt = record.getTotal_amt();
|
||||||
|
}
|
||||||
|
record.setSplit_amt(splitAmt);
|
||||||
|
|
||||||
|
log.debug("[拉卡拉订单更新] 设置订单字段: outSeparateNo={} lklSubTradeNo={} lklSubLogNo={} splitAmt={}",
|
||||||
|
outSeparateNo, lklSubTradeNo, lklSubLogNo, splitAmt);
|
||||||
|
|
||||||
// 安全地设置响应内容
|
// 安全地设置响应内容
|
||||||
record.setLkl_notify_resp(JSONUtil.toJsonStr(lklPayNotifyDataJson));
|
String notifyResp = JSONUtil.toJsonStr(lklPayNotifyDataJson);
|
||||||
|
record.setLkl_notify_resp(notifyResp);
|
||||||
|
log.debug("[拉卡拉订单更新] 设置通知响应内容,长度={}", notifyResp != null ? notifyResp.length() : 0);
|
||||||
|
|
||||||
return addOrUpdateByStoreOrder(record);
|
log.debug("[拉卡拉订单更新] 调用addOrUpdateByStoreOrder方法保存记录: orderId={}", orderId);
|
||||||
|
Boolean result = addOrUpdateByStoreOrder(record);
|
||||||
|
if (result) {
|
||||||
|
log.info("[拉卡拉订单更新] 拉卡拉订单记录保存成功: orderId={}", orderId);
|
||||||
|
} else {
|
||||||
|
log.error("[拉卡拉订单更新] 拉卡拉订单记录保存失败: orderId={}", orderId);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("修改拉卡拉支付通知记录出错", e);
|
log.error("[拉卡拉订单更新] 修改拉卡拉支付通知记录出错", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -323,24 +399,24 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据商户号、交易流水号、对账单流水号查询一条记录
|
* 根据商户号、子单交易流水号、子单对账单流水号查询一条记录
|
||||||
*
|
*
|
||||||
* @param lklMerchantNo 拉卡拉商户号
|
* @param lklMerchantNo 拉卡拉商户号
|
||||||
* @param lklTradeNo 原拉卡拉交易流水号
|
* @param lklSubTradeNo 原拉卡拉交易流水号
|
||||||
* @param lklSubLogNo 原拉卡拉对账单流水号
|
* @param lklSubLogNo 原拉卡拉对账单流水号
|
||||||
* @return ShopOrderLkl 拉卡拉订单记录
|
* @return ShopOrderLkl 拉卡拉订单记录
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public ShopOrderLkl getByLklMchNoAndTradeNoAndSubLogNo(String lklMerchantNo, String lklTradeNo, String lklSubLogNo) {
|
public ShopOrderLkl getByLklMchNoAndSubTradeNoAndSubLogNo(String lklMerchantNo, String lklSubTradeNo, String lklSubLogNo) {
|
||||||
// 检查参数是否全部为空
|
// 检查参数是否全部为空
|
||||||
if (StringUtils.isAllBlank(lklMerchantNo, lklTradeNo, lklSubLogNo)) {
|
if (StringUtils.isAllBlank(lklMerchantNo, lklSubTradeNo, lklSubLogNo)) {
|
||||||
log.warn("[拉卡拉订单查询] 参数校验失败:所有查询条件均为空");
|
log.warn("[拉卡拉订单查询] 参数校验失败:所有查询条件均为空");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
log.debug("[拉卡拉订单查询] 开始查询, 商户号={}, 交易号={}, 子订单流水号={}",
|
log.debug("[拉卡拉订单查询] 开始查询, 商户号={}, 子订单交易号={}, 子订单对账流水号={}",
|
||||||
lklMerchantNo, lklTradeNo, lklSubLogNo);
|
lklMerchantNo, lklSubTradeNo, lklSubLogNo);
|
||||||
|
|
||||||
QueryWrapper<ShopOrderLkl> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<ShopOrderLkl> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.orderByAsc("id");
|
queryWrapper.orderByAsc("id");
|
||||||
@ -351,25 +427,25 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
|
|||||||
log.debug("[拉卡拉订单查询] 添加商户号查询条件: {}", lklMerchantNo);
|
log.debug("[拉卡拉订单查询] 添加商户号查询条件: {}", lklMerchantNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StrUtil.isNotBlank(lklTradeNo)) {
|
if (StrUtil.isNotBlank(lklSubTradeNo)) {
|
||||||
queryWrapper.eq("lkl_trade_no", lklTradeNo);
|
queryWrapper.eq("lkl_sub_trade_no", lklSubTradeNo);
|
||||||
log.debug("[拉卡拉订单查询] 添加交易号查询条件: {}", lklTradeNo);
|
log.debug("[拉卡拉订单查询] 添加子订单交易号查询条件: {}", lklSubTradeNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StrUtil.isNotBlank(lklSubLogNo)) {
|
if (StrUtil.isNotBlank(lklSubLogNo)) {
|
||||||
queryWrapper.eq("lkl_sub_log_no", lklSubLogNo);
|
queryWrapper.eq("lkl_sub_log_no", lklSubLogNo);
|
||||||
log.debug("[拉卡拉订单查询] 添加子订单流水号查询条件: {}", lklSubLogNo);
|
log.debug("[拉卡拉订单查询] 添加子订单对账流水号查询条件: {}", lklSubLogNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShopOrderLkl result = findOne(queryWrapper);
|
ShopOrderLkl result = findOne(queryWrapper);
|
||||||
|
|
||||||
log.debug("[拉卡拉订单查询] 查询完成, 商户号={}, 交易号={}, 子订单流水号={}, 查询结果={}",
|
log.debug("[拉卡拉订单查询] 查询完成, 商户号={}, 子订单交易号={}, 子订单对账流水号={}, 查询结果={}",
|
||||||
lklMerchantNo, lklTradeNo, lklSubLogNo, result != null);
|
lklMerchantNo, lklSubTradeNo, lklSubLogNo, result != null);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("[拉卡拉订单查询] 系统异常, 商户号={}, 交易号={}, 子订单流水号={}",
|
log.error("[拉卡拉订单查询] 系统异常, 子订单商户号={}, 交易号={}, 子订单对账流水号={}",
|
||||||
lklMerchantNo, lklTradeNo, lklSubLogNo, e);
|
lklMerchantNo, lklSubTradeNo, lklSubLogNo, e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -314,26 +314,4 @@ public class StoreController extends BaseControllerImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * 列表查询
|
|
||||||
// * @return
|
|
||||||
// */
|
|
||||||
// @ApiOperation(value = "店铺分类表-分类强调区别, 类型强调共性-分页列表查询", notes = "店铺分类表-分类强调区别, 类型强调共性-分页列表查询")
|
|
||||||
// @RequestMapping(value = "/categoryTree", method = RequestMethod.GET)
|
|
||||||
// public CommonResult categoryTree(ShopBaseStoreCategory category) {
|
|
||||||
// QueryWrapper<ShopBaseStoreCategory> queryWrapper = new QueryWrapper<>();
|
|
||||||
// if (category.getStore_category_parent_id() != null)
|
|
||||||
// queryWrapper.eq("store_category_parent_id", category.getStore_category_parent_id());
|
|
||||||
//
|
|
||||||
// return CommonResult.success(shopBaseStoreCategoryService.getMobileCategoryTree(queryWrapper));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// @ApiOperation(value = "根据分类查询店铺", notes = "列表数据")
|
|
||||||
// @RequestMapping(value = "/listStores", method = RequestMethod.GET)
|
|
||||||
// public Page<ShopStoreBase> listStores(@RequestParam(name = "page", defaultValue = "1") Integer page,
|
|
||||||
// @RequestParam(name = "rows", defaultValue = "10") Integer rows) {
|
|
||||||
// return shopStoreBaseService.getMobileStoreList(page, rows);
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2383,6 +2383,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
|
|||||||
}
|
}
|
||||||
base.setPacking_fee(packingFee);
|
base.setPacking_fee(packingFee);
|
||||||
|
|
||||||
|
Integer ringtoneIsEnable = Convert.toInt(getParameter("ringtone_is_enable"));
|
||||||
|
if (ringtoneIsEnable == null || ringtoneIsEnable <= 0) {
|
||||||
|
base.setRingtone_is_enable(CommonConstant.Enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 (因为数据库保存的经纬度统一是GCJ02经纬度,所以需要转换 )
|
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 (因为数据库保存的经纬度统一是GCJ02经纬度,所以需要转换 )
|
||||||
base = bd09ToGcj02Gps(base);
|
base = bd09ToGcj02Gps(base);
|
||||||
@ -2541,6 +2546,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
|
|||||||
base.setPacking_fee(BigDecimal.ZERO);
|
base.setPacking_fee(BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Integer ringtoneIsEnable = Convert.toInt(getParameter("ringtone_is_enable"));
|
||||||
|
if (ringtoneIsEnable == null || ringtoneIsEnable <= 0) {
|
||||||
|
base.setRingtone_is_enable(CommonConstant.Enable);
|
||||||
|
}
|
||||||
|
|
||||||
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
|
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
|
||||||
return CommonResult.failed("打包费请控制在0到10元范围");
|
return CommonResult.failed("打包费请控制在0到10元范围");
|
||||||
}
|
}
|
||||||
@ -2734,6 +2744,14 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
|
|||||||
if (CheckUtil.isNotEmpty(store_id)) {
|
if (CheckUtil.isNotEmpty(store_id)) {
|
||||||
|
|
||||||
ShopStoreBase shopStoreBase = get(store_id);
|
ShopStoreBase shopStoreBase = get(store_id);
|
||||||
|
if (shopStoreBase == null) {
|
||||||
|
throw new ApiException("无法找到店铺信息!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CheckUtil.isEmpty(shopStoreBase.getRingtone_is_enable())) {
|
||||||
|
shopStoreBase.setRingtone_is_enable(CommonConstant.Enable);
|
||||||
|
}
|
||||||
|
|
||||||
row = Convert.toMap(Object.class, Object.class, shopStoreBase);
|
row = Convert.toMap(Object.class, Object.class, shopStoreBase);
|
||||||
ShopStoreInfo shopStoreInfo = shopStoreInfoService.get(store_id);
|
ShopStoreInfo shopStoreInfo = shopStoreInfoService.get(store_id);
|
||||||
if (shopStoreInfo != null) {
|
if (shopStoreInfo != null) {
|
||||||
|
|||||||
@ -5,7 +5,8 @@
|
|||||||
<sql id="Base_Column_List">
|
<sql id="Base_Column_List">
|
||||||
store_id
|
store_id
|
||||||
, user_id, store_name, store_grade_id, store_logo, store_slogan, store_domain, store_area, store_district_id,
|
, user_id, store_name, store_grade_id, store_logo, store_slogan, store_domain, store_area, store_district_id,
|
||||||
store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state, shop_parent_id,
|
store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state,
|
||||||
|
ringtone_is_enable, shop_parent_id,
|
||||||
store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags,
|
store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags,
|
||||||
store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode,
|
store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode,
|
||||||
split_ratio, packing_fee, created_at, updated_at
|
split_ratio, packing_fee, created_at, updated_at
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user