@ -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