diff --git a/mall-common/src/main/java/com/suisung/mall/common/service/impl/GeTuiPushServiceImpl.java b/mall-common/src/main/java/com/suisung/mall/common/service/impl/GeTuiPushServiceImpl.java index b4f488a9..9dd4eeac 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/service/impl/GeTuiPushServiceImpl.java +++ b/mall-common/src/main/java/com/suisung/mall/common/service/impl/GeTuiPushServiceImpl.java @@ -242,6 +242,8 @@ public class GeTuiPushServiceImpl implements GeTuiPushService { return Pair.of(false, "个推推送失败:" + apiResult.getMsg()); } + log.debug("推送返回数据:{}", apiResult); + return Pair.of(true, "推送成功"); } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java index 4a57805b..5c5b890b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java @@ -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 ""; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java index f1a5a965..3396aa56 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java @@ -59,6 +59,15 @@ public interface LklLedgerMerReceiverBindService extends IBaseService selectDistributorByMerCupNo(String merCupNo); + + /** + * 判断商户是否已经绑定了分账接收方 + * + * @param merCupNo + * @return + */ + Boolean hasBindReceiver(String merCupNo); + /** * 更新审核结果 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerReceiverService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerReceiverService.java index 6efa80e8..8ef43983 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerReceiverService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerReceiverService.java @@ -64,6 +64,13 @@ public interface LklLedgerReceiverService extends IBaseService selectPlatformAnDistributorList(); + /** * 根据条件查询记录 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index 73c9c818..34e81d9d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -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 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 + *

+ * 请求参数如:{"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 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 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 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 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 receiverList = lklLedgerReceiverService.getByCondition("", shopMchEntry.getLogin_mobile()); - if (CollectionUtils.isEmpty(receiverList)) { + // 是否有平台方或代理商记录 + List 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 checkResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath); - if (!checkResult.getFirst()) { - return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond()); + try { + // 1. 验签操作:验证拉卡拉回调签名是否合法 + Pair 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 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMemberServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMemberServiceImpl.java index e008867f..a190833a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMemberServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMemberServiceImpl.java @@ -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 queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mer_cup_no", merCupNo) + .eq("audit_status", CommonConstant.Enable); + + return count(queryWrapper) > 0; + } + /** * 更新审核结果 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java index 4d7f2927..89e04a32 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java @@ -146,6 +146,7 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl 0) { ids.add(platformId); } + // 获取平台记录和代理商记录 List esignPlatformInfoList = esignPlatformInfoService.getDistributorAndPlatformByIds(ids.toArray(new Long[0])); if (CollectionUtil.isEmpty(esignPlatformInfoList)) { return null; @@ -157,7 +158,11 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl selectPlatformAnDistributorList() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.ge("platform_id", 0).eq("status", CommonConstant.Enable).orderByAsc("platform_id"); + return list(queryWrapper); + } + /** * 根据条件查询记录 * diff --git a/mall-shop/src/main/resources/bootstrap-local.yml b/mall-shop/src/main/resources/bootstrap-local.yml index 7dd1406f..84a793ea 100644 --- a/mall-shop/src/main/resources/bootstrap-local.yml +++ b/mall-shop/src/main/resources/bootstrap-local.yml @@ -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 \ No newline at end of file + path: E:/data \ No newline at end of file diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index e0c242cb..3aaa4188 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -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 #终端号