细条异步通知回调的流程

This commit is contained in:
Jack 2025-05-27 21:06:23 +08:00
parent 8d8c0b1c45
commit 8025800b65
10 changed files with 156 additions and 433 deletions

View File

@ -242,6 +242,8 @@ public class GeTuiPushServiceImpl implements GeTuiPushService {
return Pair.of(false, "个推推送失败:" + apiResult.getMsg());
}
log.debug("推送返回数据:{}", apiResult);
return Pair.of(true, "推送成功");
}
}

View File

@ -42,7 +42,8 @@ public class LakalaController extends BaseControllerImpl {
return lakalaPayService.applyLedgerMerEc(paramsJSON.getStr("mchMobile"));
// return lakalaPayService.LedgerMerEcDownload(975790666910121984L);
// geTuiPushService.pushToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "shop 发消息");
// return geTuiPushService.pushMessageToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "", "从 shop 发消息", "none", "");
// return "";
}

View File

@ -59,6 +59,15 @@ public interface LklLedgerMerReceiverBindService extends IBaseService<LklLedgerM
*/
List<LklLedgerMerReceiverBind> selectDistributorByMerCupNo(String merCupNo);
/**
* 判断商户是否已经绑定了分账接收方
*
* @param merCupNo
* @return
*/
Boolean hasBindReceiver(String merCupNo);
/**
* 更新审核结果
*

View File

@ -64,6 +64,13 @@ public interface LklLedgerReceiverService extends IBaseService<LklLedgerReceiver
*/
LklLedgerReceiver hasPlatformMch();
/**
* 获取平台方和代理商记录
*
* @return
*/
List<LklLedgerReceiver> selectPlatformAnDistributorList();
/**
* 根据条件查询记录
*

View File

@ -1027,106 +1027,12 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
/**
* 商户分账业务开通申请回调
* 参考https://o.lakala.com/#/home/document/detail?id=379
*
* @param request
* @return
*/
@Transactional
// @Override
public JSONObject applyLedgerMerNotifyTemp(HttpServletRequest request) {
log.debug("商户分账申请业务异步回调通知开始");
// 验签
String authorization = request.getHeader("Authorization");
String requestBody = LakalaUtil.getBody(request);
log.debug("商户分账申请业务异步回调返回request body参数{}", requestBody);
log.debug("商户分账申请业务异步回调返回authorization参数{}", authorization);
boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath);
if (!checkSuccess) {
log.error("商户分账申请业务回调:验签失败");
return JSONUtil.createObj().put("code", "FAIL").put("message", "验签失败!");
}
JSONObject paramsJSON = JSONUtil.parseObj(requestBody);
String errMsg = "商户分账申请业务回调:";
JSONObject respData = new JSONObject();
respData.put("code", "FAIL");
respData.put("message", "处理失败!");
if (paramsJSON != null) {
String applyId = paramsJSON.getStr("applyId");
String auditStatus = paramsJSON.getStr("auditStatus");
if (StrUtil.isBlank(applyId) || StrUtil.isBlank(auditStatus)) {
errMsg += "缺少返回必要参数";
log.error(errMsg + "applyId={}, auditStatus={}", applyId, auditStatus);
respData.put("message", errMsg);
return respData;
}
//auditStatus:1:通过2拒绝
if (!auditStatus.equals("1")) {
respData.put("message", "商户分账申请被驳回!");
return respData;
}
LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByApplyId(applyId, CommonConstant.Enable);
if (lklLedgerMember != null) {
respData.put("code", "SUCCESS");
respData.put("message", "商户分账申请已处理成功!");
log.debug("商户分账申请业务回调:已处理成功,不需再重新处理");
return respData;
}
// 更改本地分账记录状态数据
String merCupNo = paramsJSON.getStr("merCupNo");
Boolean success = lklLedgerMemberService.updateAuditResult(applyId,
paramsJSON.getStr("merInnerNo"),
paramsJSON.getStr("merCupNo"),
paramsJSON.getStr("entrustFileName"),
paramsJSON.getStr("entrustFilePath"),
paramsJSON.getStr("auditStatus"),
paramsJSON.getStr("auditStatusText"),
paramsJSON.getStr("remark")
);
if (success) {
// 重要注商户分账申请业务成功后同时也会新增接收方这时系统绑定接收方平台方和代理商绑定之前要判断是否已经绑定过了
JSONObject bindParamsJSON = new JSONObject();
bindParamsJSON.put("merInnerNo", paramsJSON.getStr("merInnerNo"));
bindParamsJSON.put("merCupNo", merCupNo);
Pair<Boolean, String> bindResult = innerApplyLedgerMerReceiverBind(bindParamsJSON);
if (!bindResult.getFirst()) {
errMsg += bindResult.getSecond();
log.error("商户{}预绑定接收方出错:{}", merCupNo, bindResult.getSecond());
shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerMember.getMch_id(), "", CommonConstant.MCH_APPR_STA_NOPASS, errMsg);
// respData.put("message", errMsg);
throw new ApiException(errMsg);
// return respData;
}
// 更新商家的hasApplySplit状态=1;
shopMchEntryService.updateMulStatus("", merCupNo, 0, 1, 0, 0, 0);
respData.put("code", "SUCCESS");
respData.put("message", "操作成功!");
log.debug("商户分账申请业务回调:处理成功");
return respData;
}
}
throw new ApiException("商户分账申请业务回调:操作失败!");
}
/**
* 商户分账业务开通申请回调
* 参考https://o.lakala.com/#/home/document/detail?id=379
* <p>
* 请求参数如{"applyId":979690235494612992,"merCupNo":"82263305411000X","retUrl":"https://mall.gpxscs.cn/api/mobile/shop/lakala/ledger/applyLedgerMerNotify","entrustFileName":"商家分账授权委托书.pdf","auditStatus":"1","merInnerNo":"4002025052750313055","remark":"测试环境","auditStatusText":"审核通过","uploadAttachType":"SPLIT_ENTRUST_FILE","entrustFilePath":"MMS/20250527/101844-1ad3345d49c048be86e1dac0163b044c.pdf"}
*
* @param request HTTP请求
* @return 处理结果JSON
@ -1134,7 +1040,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
@Transactional
@Override
public JSONObject applyLedgerMerNotify(HttpServletRequest request) {
log.debug("商户分账申请业务异步回调通知开始");
log.debug("商户分账业务申请异步回调通知开始");
// 验签
Pair<Boolean, String> checkResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath);
@ -1142,9 +1048,10 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond());
}
JSONObject paramsJSON = JSONUtil.parseObj(checkResult.getSecond());
// JSONObject paramsJSON = JSONUtil.parseObj(LakalaUtil.getBody(request));
if (paramsJSON == null) {
log.error("商户分账申请业务回调:请求参数为空");
log.error("商户分账业务申请回调:请求参数为空");
return JSONUtil.createObj().put("code", "FAIL").put("message", "请求参数为空");
}
@ -1153,19 +1060,19 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String merCupNo = paramsJSON.getStr("merCupNo");
if (StrUtil.isBlank(applyId) || StrUtil.isBlank(auditStatus) || StrUtil.isBlank(merCupNo)) {
String errMsg = "商户分账申请业务回调缺少必要参数applyId/auditStatus/merCupNo";
String errMsg = "商户分账业务申请回调缺少必要参数applyId/auditStatus/merCupNo";
log.error(errMsg + "applyId={}, auditStatus={}, merCupNo={}", applyId, auditStatus, merCupNo);
return JSONUtil.createObj().put("code", "FAIL").put("message", errMsg);
}
if (!auditStatus.equals("1")) {
log.warn("商户分账申请业务回调:审核未通过,状态={}", auditStatus);
log.warn("商户分账业务申请回调:审核未通过,状态={}", auditStatus);
return JSONUtil.createObj().put("code", "FAIL").put("message", "商户分账申请被驳回!");
}
LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByApplyId(applyId, CommonConstant.Enable);
if (lklLedgerMember != null) {
log.debug("商户分账申请业务回调已处理成功applyId={}", applyId);
if (lklLedgerMember != null && lklLedgerMerReceiverBindService.hasBindReceiver(merCupNo)) {
log.debug("商户分账业务申请回调已处理成功applyId={}", applyId);
return JSONUtil.createObj().put("code", "SUCCESS").put("message", "商户分账申请已处理成功!");
}
@ -1175,17 +1082,17 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String auditStatusText = paramsJSON.getStr("auditStatusText");
String remark = paramsJSON.getStr("remark");
Boolean updateSuccess = lklLedgerMemberService.updateAuditResult(
applyId, merInnerNo, merCupNo, entrustFileName, entrustFilePath,
auditStatus, auditStatusText, remark
);
if (!updateSuccess) {
log.error("商户分账申请业务回调更新审核结果失败applyId={}", applyId);
return JSONUtil.createObj().put("code", "FAIL").put("message", "更新审核结果失败");
}
try {
Boolean updateSuccess = lklLedgerMemberService.updateAuditResult(
applyId, merInnerNo, merCupNo, entrustFileName, entrustFilePath,
auditStatus, auditStatusText, remark
);
if (!updateSuccess) {
log.error("商户分账申请业务回调更新审核结果失败applyId={}", applyId);
return JSONUtil.createObj().put("code", "FAIL").put("message", "更新审核结果失败");
}
JSONObject bindParamsJSON = new JSONObject()
.put("merInnerNo", merInnerNo)
.put("merCupNo", merCupNo);
@ -1204,14 +1111,14 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return JSONUtil.createObj().put("code", "FAIL").put("message", errMsg);
}
} catch (Exception e) {
log.error("商户分账申请业务回调:绑定接收方异常", e);
return JSONUtil.createObj().put("code", "FAIL").put("message", "绑定接收方失败");
log.error("商户分账业务申请回调:", e);
return JSONUtil.createObj().put("code", "FAIL").put("message", "商户分账业务绑定或状态更新失败");
}
// 更新商家分账申请状态为已申请hasApplySplit=1
shopMchEntryService.updateMulStatus("", merCupNo, 0, 1, 0, 0, 0);
log.debug("商户分账申请业务回调处理成功applyId={}", applyId);
log.debug("商户分账业务申请回调处理成功applyId={}", applyId);
return JSONUtil.createObj().put("code", "SUCCESS").put("message", "操作成功!");
}
@ -1359,120 +1266,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
}
/**
* 分账接收方创建申请
* 参考https://o.lakala.com/#/home/document/detail?id=380
*
* @param paramsJSON
* @return
*/
// @Override
public CommonResult applyLedgerReceiverTemp(JSONObject paramsJSON) {
// 判断分账接收方记录是否存在存在就不再新建了
LklLedgerReceiver lklLedgerReceiverOld = lklLedgerReceiverService.getByCondition(paramsJSON.getStr("licenseNo"), paramsJSON.getStr("contactMobile"), paramsJSON.getLong("platformId"));
if (lklLedgerReceiverOld != null) {
return CommonResult.success(lklLedgerReceiverOld, "该接收方已创建过!");
}
// 1. 配置初始化
initLKLSDK();
//2. 装配数据
V2MmsOpenApiLedgerApplyLedgerReceiverRequest req = new V2MmsOpenApiLedgerApplyLedgerReceiverRequest();
String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数
req.setOrderNo(orderNo);
req.setOrgCode(orgCode);
req.setVersion("2.0");
String mchMobile = paramsJSON.getStr("contactMobile");
req.setReceiverName(paramsJSON.getStr("receiverName"));
req.setContactMobile(mchMobile);
req.setLicenseNo(paramsJSON.getStr("licenseNo"));
req.setLicenseName(paramsJSON.getStr("licenseName"));
req.setLegalPersonName(paramsJSON.getStr("legalPersonName"));
req.setLegalPersonCertificateType(paramsJSON.getStr("legalPersonCertificateType"));
req.setLegalPersonCertificateNo(paramsJSON.getStr("legalPersonCertificateNo"));
req.setAcctNo(paramsJSON.getStr("acctNo"));
req.setAcctName(paramsJSON.getStr("acctName"));
req.setAcctTypeCode(paramsJSON.getStr("acctTypeCode"));
req.setAcctCertificateType(paramsJSON.getStr("acctCertificateType"));
req.setAcctCertificateNo(paramsJSON.getStr("acctCertificateNo"));
req.setAcctOpenBankCode(paramsJSON.getStr("acctOpenBankCode"));
req.setAcctOpenBankName(paramsJSON.getStr("acctOpenBankName"));
req.setAcctClearBankCode(paramsJSON.getStr("acctClearBankCode"));
if (paramsJSON.getJSONArray("attachList") != null && paramsJSON.getJSONArray("attachList").size() > 0) {
List<V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo> attachList = new ArrayList<>();
V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo attachInfo = new V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo();
for (JSONObject attachJSON : paramsJSON.getJSONArray("attachList").jsonIter()) {
String fileName = attachJSON.getStr("attachName");
String attachType = attachJSON.getStr("attachType");
String fileBase64 = UploadUtil.fileUrlToBase64(attachJSON.getStr("attachStoreFile")); // 这个是 url 地址不是 base64 字节码
attachInfo.setAttachName(fileName);
attachInfo.setAttachType(attachType);
JSONObject fileUploadResp = uploadFile(StringUtils.genLklOrderNo(8), attachType,
StringUtils.getFileExt(fileName), fileBase64);
if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) {
log.error("附件:{},{} 上传失败!", fileName, attachType);
continue;
}
attachInfo.setAttachStorePath(fileUploadResp.getStr("attFileId"));
attachList.add(attachInfo);
}
req.setAttachList(attachList);
paramsJSON.set("attach_list", JSONUtil.toJsonStr(attachList));
}
paramsJSON.set("orderNo", orderNo);
paramsJSON.set("version", "2.0");
paramsJSON.set("org_code", orgCode);
try {
//3. 发送请求申请创建分账接收方
String responseStr = LKLSDK.httpPost(req);
JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr);
if (StrUtil.isBlank(responseStr) || lakalaRespJSON == null) {
return CommonResult.failed(I18nUtil._("创建分账接收方响应数据无效!"));
// throw new ApiException(I18nUtil._("创建分账接收方无响应!"));
}
if (!lakalaRespJSON.getStr("retCode").equals(lklSuccessCode)) {
return CommonResult.failed(I18nUtil._(lakalaRespJSON.getStr("retMsg")));
// throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg")));
}
paramsJSON.set("receiver_no", lakalaRespJSON.getByPath("respData.receiverNo"));
paramsJSON.set("org_id", lakalaRespJSON.getByPath("respData.orgId"));
paramsJSON.set("org_name", lakalaRespJSON.getByPath("respData.orgName"));
// 新增数据
// JSON 对象的键名转换为下划线命名
LklLedgerReceiver lklLedgerReceiver = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerReceiver.class);
// 新增或修改本地数据
Boolean success = lklLedgerReceiverService.addOrUpdateByReceiverNo(lklLedgerReceiver);
if (!success) {
log.error("接收方创建成功,但更新本地数据失败!");
return CommonResult.failed(I18nUtil._("接收方创建成功,但更新本地数据失败!"));
}
// 更新商户分账多个状态 has_apply_receiver=1
shopMchEntryService.updateMulStatus(mchMobile, "", 0, 0, 1, 0, 0);
return CommonResult.success(lklLedgerReceiver, "创建接收方成功!");
} catch (Exception e) {
log.error("接收方创建失败:{}", e);
throw new ApiException(I18nUtil._("创建接收方失败:{}"), e);
}
}
/**
* 商家与平台代理商分账关系绑定申请
@ -1491,141 +1284,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return CommonResult.success(null, "接收方绑定成功!");
}
/**
* 内部调用分账关系绑定申请废弃
* 参考https://o.lakala.com/#/home/document/detail?id=386
*
* @param paramsJSON
* @return
*/
public Pair<Boolean, String> innerApplyLedgerMerReceiverBindTemp(JSONObject paramsJSON) {
if (paramsJSON == null) {
return Pair.of(false, I18nUtil._("绑定参数有误!"));
}
String merCupNo = paramsJSON.getStr("merCupNo");
if (StrUtil.isBlank(merCupNo)) {
return Pair.of(false, I18nUtil._("商户参数不能为空!"));
}
// 获取商家入驻记录
ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo);
if (shopMchEntry == null) {
return Pair.of(false, I18nUtil._("商户入驻记录不存在!"));
}
// 检查分账方和接收方记录是否存在
LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByMerCupNo(merCupNo);
if (lklLedgerMember == null) {
return Pair.of(false, I18nUtil._("商家尚未做分账业务申请!"));
}
// 代理商Id平台默认为0
// Long platformId = shopMchEntry.getDistributor_id();
String entrustFileName = "小发同城合作协议书.pdf";
// String entrustFileUrl = shopMchEntry.getContract_download_url();
int successCnt = 0;
// 获取平台接收方记录可能多个记录平台+代理商
List<LklLedgerReceiver> lklLedgerReceiverList = lklLedgerReceiverService.getByCondition("", shopMchEntry.getLogin_mobile());
if (CollectionUtils.isEmpty(lklLedgerReceiverList)) {
return Pair.of(false, I18nUtil._("先新增接收方信息!"));
}
for (LklLedgerReceiver lklLedgerReceiver : lklLedgerReceiverList) {
LklLedgerMerReceiverBind lklLedgerMerReceiverBindOld = lklLedgerMerReceiverBindService.getByCondition(merCupNo, lklLedgerReceiver.getReceiver_no());
if (lklLedgerMerReceiverBindOld != null) {
// return Pair.of(false, "分账绑定关系已存在!");
continue;
}
// 1. 配置初始化
initLKLSDK();
//2. 装配数据
V2MmsOpenApiLedgerApplyBindRequest req = new V2MmsOpenApiLedgerApplyBindRequest();
String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数
req.setOrderNo(orderNo);
req.setOrgCode(orgCode);
req.setVersion("2.0");
req.setMerInnerNo(lklLedgerMember.getMer_inner_no());
req.setMerCupNo(merCupNo);
req.setReceiverNo(lklLedgerReceiver.getReceiver_no());
// String fileName = paramsJSON.getStr("entrustFileName");
//String splitEntrustFileBase64 = UploadUtil.fileUrlToBase64(entrustFileUrl); // 这个是 url 地址不是 base64 字节码
req.setEntrustFileName(entrustFileName);
String domain = projectDomain;
if (isProdProject()) {
domain += "/api";
}
// 给拉卡拉通知的回调地址
String retUrl = domain + "/mobile/shop/lakala/ledger/applyLedgerMerReceiverBindNotify";
req.setRetUrl(retUrl);
// 文件上传到拉卡拉服务器
// JSONObject fileUploadResp = uploadFile(orderNo,
// "SPLIT_COOPERATION_FILE",
// StringUtils.getFileExt(entrustFileName),
// splitEntrustFileBase64);
// if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) {
// // throw new ApiException(I18nUtil._("合作协议上传失败!"));
// log.error(I18nUtil._("合作协议上传失败!"));
// continue;
// }
String entrustFilePath = shopMchEntry.getLkl_ec_file_path();//fileUploadResp.getStr("attFileId");
req.setEntrustFilePath(entrustFilePath);
paramsJSON.set("orderNo", orderNo);
paramsJSON.set("version", "2.0");
paramsJSON.set("ret_url", retUrl);
paramsJSON.set("org_code", orgCode);
paramsJSON.set("merInnerNo", lklLedgerMember.getMer_inner_no());
paramsJSON.set("entrust_file_name", entrustFileName);
paramsJSON.set("entrust_file_path", entrustFilePath);
try {
log.debug("绑定接收方参数:{}", JSONUtil.toJsonStr(req));
//3. 发送请求
String responseStr = LKLSDK.httpPost(req);
JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr);
if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals(lklSuccessCode)) {
// throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg")));
log.error(I18nUtil._(lakalaRespJSON.getStr("retMsg")));
continue;
}
paramsJSON.set("apply_id", lakalaRespJSON.getByPath("respData.applyId"));
paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg"));
// 新增数据
// JSON 对象的键名转换为下划线命名
LklLedgerMerReceiverBind lklLedgerMerReceiverBind = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMerReceiverBind.class);
if (lklLedgerMerReceiverBindService.addOrUpdateByMerCupNoReceiverNo(lklLedgerMerReceiverBind)) {
successCnt += 1;
}
// return Pair.of(true, "提交成功,待审核中!");
} catch (SDKException e) {
log.error("分账绑定关系申请失败:", e);
// throw new ApiException(I18nUtil._("分账绑定关系申请失败!"), e);
// return Pair.of(false, "分账绑定关系申请失败!");
}
}
if (successCnt != lklLedgerReceiverList.size()) {
log.error("部分分账绑定关系提交成功");
return Pair.of(true, "部分提交成功,待审核中!");
}
return Pair.of(true, "提交成功,待审核中!");
}
/**
* 内部调用分账关系绑定申请优化版
@ -1652,12 +1310,13 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByMerCupNo(merCupNo);
if (lklLedgerMember == null) {
return Pair.of(false, I18nUtil._("商家尚未做分账业务申请"));
if (lklLedgerMember == null || !lklLedgerMember.getAudit_status().equals(CommonConstant.Enable)) {
return Pair.of(false, I18nUtil._("商家尚未申请分账业务"));
}
List<LklLedgerReceiver> receiverList = lklLedgerReceiverService.getByCondition("", shopMchEntry.getLogin_mobile());
if (CollectionUtils.isEmpty(receiverList)) {
// 是否有平台方或代理商记录
List<LklLedgerReceiver> receiverList = lklLedgerReceiverService.selectPlatformAnDistributorList();
if (CollectionUtil.isEmpty(receiverList)) {
return Pair.of(false, I18nUtil._("接收方信息为空"));
}
@ -1744,73 +1403,83 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
/**
* 分账关系绑定申请回调
* 参考https://o.lakala.com/#/home/document/detail?id=379
* 分账关系绑定申请回调通知处理方法
* 接收拉卡拉平台异步通知用于更新商家与接收方的绑定审核状态
* 参考https://o.lakala.com/#/home/document/detail?id=727
*
* @param request HTTP请求对象
* @return 处理结果JSON
* @return 返回处理结果JSON包含code和message字段
*/
@Transactional
@Override
public JSONObject applyLedgerMerReceiverBindNotify(HttpServletRequest request) {
log.debug("分账商家绑定接收方异步回调通知开始");
log.debug("商家绑定分账接收方异步通知回调开始");
// 1. 验签处理提前失败返回
// 验签
Pair<Boolean, String> checkResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath);
if (!checkResult.getFirst()) {
return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond());
try {
// 1. 验签操作验证拉卡拉回调签名是否合法
Pair<Boolean, String> checkResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath);
if (!checkResult.getFirst()) {
log.warn("验签失败: {}", checkResult.getSecond());
return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond());
}
// 2. 解析回调参数
JSONObject paramsJSON = JSONUtil.parseObj(checkResult.getSecond());
if (paramsJSON == null) {
log.error("商家绑定分账接收方异步通知参数转化失败");
return JSONUtil.createObj().put("code", "FAIL").put("message", "参数转换失败");
}
// 3. 提取核心参数
String merCupNo = paramsJSON.getStr("merCupNo");
String applyId = paramsJSON.getStr("applyId");
String auditStatus = paramsJSON.getStr("auditStatus");
// 4. 参数校验防止空值
if (org.apache.commons.lang3.StringUtils.isAnyBlank(merCupNo, applyId, auditStatus)) {
String errorMsg = String.format("关键参数缺失merCupNo=%s, applyId=%s, auditStatus=%s", merCupNo, applyId, auditStatus);
log.error(errorMsg);
return JSONUtil.createObj().put("code", "FAIL").put("message", "缺失关键参数");
}
// 5. 审核状态判断仅处理通过的情况
if (!"1".equals(auditStatus)) {
log.warn("商家绑定分账接收方异步通知,申请被驳回不做任何操作,返回状态:{}", auditStatus);
return JSONUtil.createObj().put("code", "FAIL").put("message", "申请被驳回不做任何操作");
}
// 6. 更新绑定记录的状态信息
Boolean updateSuccess = lklLedgerMerReceiverBindService.updateAuditResult(
applyId,
paramsJSON.getStr("merInnerNo"),
merCupNo,
paramsJSON.getStr("receiverNo"),
paramsJSON.getStr("entrustFileName"),
paramsJSON.getStr("entrustFilePath"),
auditStatus,
paramsJSON.getStr("auditStatusText"),
paramsJSON.getStr("remark")
);
if (!updateSuccess) {
log.error("更新绑定记录失败applyId{}", applyId);
return JSONUtil.createObj().put("code", "FAIL").put("message", "更新状态失败");
}
// 7. 成功后更新商户绑定状态为已绑定
shopMchEntryService.updateMulStatus("", merCupNo, 0, 0, 0, 1, 0);
// 8. 日志记录并返回成功响应
log.debug("商家绑定分账接收方异步通知处理完成merCupNo{}", merCupNo);
return JSONUtil.createObj().put("code", "SUCCESS").put("message", "操作成功");
} catch (Exception e) {
log.error("商家绑定分账接收方异步通知处理发生异常", e);
return JSONUtil.createObj().put("code", "FAIL").put("message", "系统异常");
}
JSONObject paramsJSON = JSONUtil.parseObj(checkResult.getSecond());
if (paramsJSON == null || !paramsJSON.containsKey("respData")) {
log.error("回调参数缺失respData字段");
return JSONUtil.createObj().put("code", "FAIL").put("message", "参数格式错误");
}
JSONObject respData = paramsJSON.getJSONObject("respData");
String merCupNo = respData.getStr("merCupNo");
String applyId = respData.getStr("applyId");
String auditStatus = respData.getStr("auditStatus");
// 3. 核心参数校验
if (org.apache.commons.lang3.StringUtils.isAnyBlank(merCupNo, applyId, auditStatus)) {
String errorMsg = "关键参数缺失merCupNo={}, applyId={}, auditStatus={}";
log.error(errorMsg, merCupNo, applyId, auditStatus);
return JSONUtil.createObj().put("code", "FAIL").put("message", "接收方绑定参数有误");
}
// 4. 审核状态判断
if (!"1".equals(auditStatus)) {
log.warn("绑定审核未通过,状态:{}", auditStatus);
return JSONUtil.createObj().put("code", "FAIL").put("message", "绑定接收方被驳回");
}
// 5. 更新绑定记录状态
Boolean updateSuccess = lklLedgerMerReceiverBindService.updateAuditResult(
applyId,
respData.getStr("merInnerNo"),
merCupNo,
respData.getStr("receiverNo"),
respData.getStr("entrustFileName"),
respData.getStr("entrustFilePath"),
auditStatus,
respData.getStr("auditStatusText"),
respData.getStr("remark")
);
if (!updateSuccess) {
log.error("更新绑定记录失败applyId{}", applyId);
return JSONUtil.createObj().put("code", "FAIL").put("message", "更新绑定状态失败");
}
// 6. 更新商家绑定状态
shopMchEntryService.updateMulStatus("", merCupNo, 0, 0, 0, 1, 0);
log.debug("分账商家绑定接收方回调处理完成merCupNo{}", merCupNo);
return JSONUtil.createObj().put("code", "SUCCESS").put("message", "操作成功");
}
/**
* 查询银行卡Bin信息
* 参考https://o.lakala.com/#/home/document/detail?id=179

View File

@ -12,7 +12,6 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.modules.lakala.LklLedgerMember;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.lakala.mapper.LklLedgerMemberMapper;
@ -117,8 +116,6 @@ public class LklLedgerMemberServiceImpl extends BaseServiceImpl<LklLedgerMemberM
updateWrapper.set("split_entrust_file_path", entrustFilePath);
updateWrapper.set("audit_status", auditStatus);
updateWrapper.set("audit_status_text", auditStatusText);
updateWrapper.set("has_esigned", CommonConstant.Enable); // 电子合同签署完成之后才能做分账申请
updateWrapper.set("has_apply_split", CommonConstant.Enable);
updateWrapper.set("remark", remark);
return update(updateWrapper);

View File

@ -131,6 +131,25 @@ public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl<LklLedg
return list;
}
/**
* 判断商户是否已经绑定了分账接收方
*
* @param merCupNo
* @return
*/
@Override
public Boolean hasBindReceiver(String merCupNo) {
if (StrUtil.isBlank(merCupNo)) {
return false;
}
QueryWrapper<LklLedgerMerReceiverBind> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mer_cup_no", merCupNo)
.eq("audit_status", CommonConstant.Enable);
return count(queryWrapper) > 0;
}
/**
* 更新审核结果
*

View File

@ -146,6 +146,7 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
if (platformId != null && platformId > 0) {
ids.add(platformId);
}
// 获取平台记录和代理商记录
List<EsignPlatformInfo> esignPlatformInfoList = esignPlatformInfoService.getDistributorAndPlatformByIds(ids.toArray(new Long[0]));
if (CollectionUtil.isEmpty(esignPlatformInfoList)) {
return null;
@ -157,7 +158,11 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
reqParam.put("receiverName", esignPlatformInfo.getLicense_company());
reqParam.put("contactMobile", esignPlatformInfo.getLegal_person_mobile());
reqParam.put("platformId", esignPlatformInfo.getId());
Long tempPlatformId = esignPlatformInfo.getId();
if (esignPlatformInfo.getLevel().equals(0)) {// 是平台的记录id 设置为0
tempPlatformId = 0L;
}
reqParam.put("platformId", tempPlatformId);
reqParam.put("licenseNo", esignPlatformInfo.getLicense_number());
reqParam.put("licenseName", esignPlatformInfo.getLicense_company());
reqParam.put("legalPersonName", esignPlatformInfo.getLegal_person_name());
@ -262,6 +267,18 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
return lklLedgerReceivers.get(0);
}
/**
* 获取平台方和代理商记录
*
* @return
*/
@Override
public List<LklLedgerReceiver> selectPlatformAnDistributorList() {
QueryWrapper<LklLedgerReceiver> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("platform_id", 0).eq("status", CommonConstant.Enable).orderByAsc("platform_id");
return list(queryWrapper);
}
/**
* 根据条件查询记录
*

View File

@ -156,7 +156,8 @@ lakala:
#拉卡拉平台证书
lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer
#机构代码
org_code: 1
org_code: 1951582
#1
#商户号, 测试商户号未开通分账功能的8222900539908Q9
merchant_no: 82229007392000A
#终端号
@ -184,4 +185,4 @@ esign:
debug: true
#客户端上传文件地址
client:
path: E:/data
path: E:/data

View File

@ -183,7 +183,8 @@ lakala:
#拉卡拉平台证书
lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer
#机构代码
org_code: 1
org_code: 1951582
#1
#商户号, 测试商户号未开通分账功能的8222900539908Q9
merchant_no: 82229007392000A
#终端号