拉卡拉联调 bug 修复

This commit is contained in:
Jack 2025-05-14 16:13:54 +08:00
parent d1c6630ef5
commit b377244cb4
9 changed files with 79 additions and 35 deletions

View File

@ -13,6 +13,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.esign.service.EsignContractFillingFileService; import com.suisung.mall.shop.esign.service.EsignContractFillingFileService;
import com.suisung.mall.shop.esign.service.EsignContractService; import com.suisung.mall.shop.esign.service.EsignContractService;
import com.suisung.mall.shop.esign.service.EsignPlatformInfoService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -36,11 +37,14 @@ public class EsignController extends BaseControllerImpl {
@Resource @Resource
private EsignContractService esignContractService; private EsignContractService esignContractService;
@Resource
private EsignPlatformInfoService esignPlatformInfoService;
@ApiOperation(value = "测试填充模版控件", notes = "测试填充模版控件") @ApiOperation(value = "测试填充模版控件", notes = "测试填充模版控件")
@RequestMapping(value = "/testcase", method = RequestMethod.POST) @RequestMapping(value = "/testcase", method = RequestMethod.POST)
public Object testCase() { public Object testCase() {
//return esignContractFillingFileService.fillDocTemplate("13128997057", "91450881MADEQ92533"); //return esignContractFillingFileService.fillDocTemplate("13128997057", "91450881MADEQ92533");
return esignContractService.getSignedContractFileUrl("27e8dad5491d4d9ab4bc6f8154ae8ff5"); return esignPlatformInfoService.getDistributorAndPlatformByIds(1L);
} }
@ApiOperation(value = "管理员发起签署电子合同流程", notes = "基于文件发起签署电子合同") @ApiOperation(value = "管理员发起签署电子合同流程", notes = "基于文件发起签署电子合同")

View File

@ -32,7 +32,7 @@ public interface EsignPlatformInfoService {
* @param ids * @param ids
* @return * @return
*/ */
List<EsignPlatformInfo> getDistributorInfoByIds(Long... ids); List<EsignPlatformInfo> getDistributorAndPlatformByIds(Long... ids);
/** /**
* 根据分类和营业执照号获取平台方信息 * 根据分类和营业执照号获取平台方信息

View File

@ -220,8 +220,8 @@ public class EsignContractServiceImpl extends BaseServiceImpl<EsignContractMappe
Integer code = jsonObject.getInt("code"); Integer code = jsonObject.getInt("code");
String signFlowId = (String) jsonObject.getByPath("data.signFlowId"); String signFlowId = (String) jsonObject.getByPath("data.signFlowId");
if (code == null || code != 0 || StrUtil.isBlank(signFlowId)) { if (code == null || code != 0 || StrUtil.isBlank(signFlowId)) {
log.error("e签宝请求失败返回状态码:{}", createByDocTemplate.getStatus()); log.error("e签宝请求失败返回status码{}", code);
return Pair.of(false, "e签宝请求失败,状态码:" + createByDocTemplate.getStatus()); return Pair.of(false, "e签宝请求失败!");
} }
//合同签署状态-1预备数据阶段0-等待签署1-已部分签署2-已完成所有签署方完成签署3-已撤销发起方撤销签署任务5-已过期签署截止日到期后触发7-已拒签签署方拒绝签署 //合同签署状态-1预备数据阶段0-等待签署1-已部分签署2-已完成所有签署方完成签署3-已撤销发起方撤销签署任务5-已过期签署截止日到期后触发7-已拒签签署方拒绝签署

View File

@ -33,28 +33,44 @@ public class EsignPlatformInfoServiceImpl extends BaseServiceImpl<EsignPlatformI
*/ */
@Override @Override
public EsignPlatformInfo getDistributorInfoById(Long id) { public EsignPlatformInfo getDistributorInfoById(Long id) {
List<EsignPlatformInfo> list = getDistributorInfoByIds(id); if (id == null || id <= 0) {
if (CollectionUtil.isEmpty(list)) {
return null; return null;
} }
return list.get(0); QueryWrapper<EsignPlatformInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", id)
.gt("level", 0)
.eq("status", CommonConstant.Enable).orderByAsc("level");
List<EsignPlatformInfo> esignPlatformInfos = list(queryWrapper);
if (CollectionUtil.isEmpty(esignPlatformInfos)) {
return null;
}
return esignPlatformInfos.get(0);
} }
/** /**
* 根据ID获取代理商信息 * 根据一个或多个代理商自增ID获取代理商和平台记录无论怎么都要获取一条平台方的记录
* *
* @param ids * @param ids
* @return * @return
*/ */
@Override @Override
public List<EsignPlatformInfo> getDistributorInfoByIds(Long... ids) { public List<EsignPlatformInfo> getDistributorAndPlatformByIds(Long... ids) {
if (ids == null || ids.length == 0) { QueryWrapper<EsignPlatformInfo> queryWrapper = new QueryWrapper<>();
return null; queryWrapper.eq("status", CommonConstant.Enable).orderByAsc("level");
if (ids != null && ids.length > 0) {
queryWrapper.and(wrapper -> {
wrapper.in("id", ids).gt("level", 0);
wrapper.or(wrapperOr -> {
wrapperOr.eq("level", 0);
});
});
} else {
queryWrapper.eq("level", 0);
} }
QueryWrapper<EsignPlatformInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.in("id", ids).eq("status", CommonConstant.Enable);
List<EsignPlatformInfo> esignPlatformInfos = list(queryWrapper); List<EsignPlatformInfo> esignPlatformInfos = list(queryWrapper);
if (CollectionUtil.isEmpty(esignPlatformInfos)) { if (CollectionUtil.isEmpty(esignPlatformInfos)) {
return null; return null;

View File

@ -135,11 +135,10 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
@Override @Override
public JSONArray buildApplyLedgerReceiverReqParams(Long platformId) { public JSONArray buildApplyLedgerReceiverReqParams(Long platformId) {
List<Long> ids = new ArrayList<>(); List<Long> ids = new ArrayList<>();
ids.add(0L); if (platformId != null && platformId > 0) {
if (ObjectUtil.isNotEmpty(platformId)) {
ids.add(platformId); ids.add(platformId);
} }
List<EsignPlatformInfo> esignPlatformInfoList = esignPlatformInfoService.getDistributorInfoByIds(ids.toArray(new Long[0])); List<EsignPlatformInfo> esignPlatformInfoList = esignPlatformInfoService.getDistributorAndPlatformByIds(ids.toArray(new Long[0]));
if (CollectionUtil.isEmpty(esignPlatformInfoList)) { if (CollectionUtil.isEmpty(esignPlatformInfoList)) {
return null; return null;
} }
@ -167,6 +166,7 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
reqParam.put("acctOpenBankName", esignPlatformInfo.getRec_acc_bank_name()); reqParam.put("acctOpenBankName", esignPlatformInfo.getRec_acc_bank_name());
reqParam.put("acctClearBankCode", esignPlatformInfo.getRec_acc_clear_bank_no()); reqParam.put("acctClearBankCode", esignPlatformInfo.getRec_acc_clear_bank_no());
//文件类型参考https://o.lakala.com/#/home/document/detail?id=90
JSONArray attachList = new JSONArray(); JSONArray attachList = new JSONArray();
if (StrUtil.isNotBlank(esignPlatformInfo.getLicense_image())) { if (StrUtil.isNotBlank(esignPlatformInfo.getLicense_image())) {
JSONObject BUSINESS_LICENCE = new JSONObject(); JSONObject BUSINESS_LICENCE = new JSONObject();

View File

@ -110,9 +110,6 @@ public class LklTkServiceImpl {
public static String encryptNotifyData(String priKey, String data) { public static String encryptNotifyData(String priKey, String data) {
ByteArrayOutputStream out = null; ByteArrayOutputStream out = null;
try { try {
// pubKey 去掉 空格制表符\t换行符\n回车符\r
priKey = priKey.replaceAll("\\s+", "");
logger.debug("拉卡拉tk加密私钥{}", priKey); logger.debug("拉卡拉tk加密私钥{}", priKey);
logger.debug("拉卡拉tk待加密data数据{}", data); logger.debug("拉卡拉tk待加密data数据{}", data);
@ -138,7 +135,6 @@ public class LklTkServiceImpl {
// 编码为Base64字符串 // 编码为Base64字符串
String encryptDataStr = Base64.getEncoder().encodeToString(out.toByteArray()); String encryptDataStr = Base64.getEncoder().encodeToString(out.toByteArray());
logger.debug("拉卡拉tk数据加密结果{}", encryptDataStr); logger.debug("拉卡拉tk数据加密结果{}", encryptDataStr);
return encryptDataStr; return encryptDataStr;
} catch (Exception e) { } catch (Exception e) {
@ -173,8 +169,6 @@ public class LklTkServiceImpl {
try { try {
logger.debug("拉卡拉tk解密公钥{}", pubKey); logger.debug("拉卡拉tk解密公钥{}", pubKey);
logger.debug("拉卡拉tk待解密data数据{}", data); logger.debug("拉卡拉tk待解密data数据{}", data);
// pubKey 去掉 空格制表符\t换行符\n回车符\r
pubKey = pubKey.replaceAll("\\s+", "");
Base64.Decoder decoder = Base64.getDecoder(); Base64.Decoder decoder = Base64.getDecoder();
byte[] keyBytes = decoder.decode(pubKey.getBytes(StandardCharsets.UTF_8)); byte[] keyBytes = decoder.decode(pubKey.getBytes(StandardCharsets.UTF_8));
byte[] dataBytes = decoder.decode(data.getBytes(StandardCharsets.UTF_8)); byte[] dataBytes = decoder.decode(data.getBytes(StandardCharsets.UTF_8));
@ -522,6 +516,12 @@ public class LklTkServiceImpl {
if (SETTLE_ID_CARD_BEHIND != null) { if (SETTLE_ID_CARD_BEHIND != null) {
attachments.put(SETTLE_ID_CARD_BEHIND); // 法人身份证国徽面 attachments.put(SETTLE_ID_CARD_BEHIND); // 法人身份证国徽面
} }
JSONObject BUSINESS_LICENCE = updatePhoto(shopMchEntry.getBiz_license_image(), "BUSINESS_LICENCE", false);
if (BUSINESS_LICENCE != null) {
attachments.put(BUSINESS_LICENCE); // 营业执照
}
} else { } else {
JSONObject ID_CARD_FRONT = updatePhoto(shopMchEntry.getIndividual_id_images(), "ID_CARD_FRONT", false); JSONObject ID_CARD_FRONT = updatePhoto(shopMchEntry.getIndividual_id_images(), "ID_CARD_FRONT", false);
if (ID_CARD_FRONT != null) { if (ID_CARD_FRONT != null) {
@ -534,10 +534,6 @@ public class LklTkServiceImpl {
} }
} }
JSONObject BUSINESS_LICENCE = updatePhoto(shopMchEntry.getBiz_license_image(), "BUSINESS_LICENCE", false);
if (BUSINESS_LICENCE != null) {
attachments.put(BUSINESS_LICENCE); // 营业执照
}
JSONObject SHOP_OUTSIDE_IMG = updatePhoto(shopMchEntry.getFront_facade_image(), "SHOP_OUTSIDE_IMG", false); JSONObject SHOP_OUTSIDE_IMG = updatePhoto(shopMchEntry.getFront_facade_image(), "SHOP_OUTSIDE_IMG", false);
if (SHOP_OUTSIDE_IMG != null) { if (SHOP_OUTSIDE_IMG != null) {
@ -614,7 +610,7 @@ public class LklTkServiceImpl {
} }
// 公钥解密出来的数据 // 公钥解密出来的数据
String notifyPubKey = LakalaUtil.getResourceFile(notifyPubKeyPath); String notifyPubKey = LakalaUtil.getResourceFileWithEndSeq(notifyPubKeyPath, false);
String data = decryptNotifyData(notifyPubKey, srcData); String data = decryptNotifyData(notifyPubKey, srcData);
if (StrUtil.isBlank(data)) { if (StrUtil.isBlank(data)) {
return new JSONObject().set("code", "500").set("message", "密文解密出错!"); return new JSONObject().set("code", "500").set("message", "密文解密出错!");
@ -631,10 +627,10 @@ public class LklTkServiceImpl {
// 给商家入驻表增加拉卡拉的商户号和拉卡拉返回的数据 // 给商家入驻表增加拉卡拉的商户号和拉卡拉返回的数据
String merCupNo = dataJSON.getStr("externalCustomerNo"); //拉卡拉外部商户号 String merCupNo = dataJSON.getStr("externalCustomerNo"); //拉卡拉外部商户号
String merInnerNo = dataJSON.getStr("customerNo"); //拉卡拉内部商户号 String merInnerNo = dataJSON.getStr("customerNo"); //拉卡拉内部商户号
ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo); ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerInnerNo(merInnerNo);
if (ObjectUtil.isEmpty(shopMchEntry)) { if (ObjectUtil.isEmpty(shopMchEntry)) {
logger.error("拉卡拉进件异步通知:返回的外部商户号:{} 入驻信息不存在!", merCupNo); logger.error("拉卡拉进件异步通知:返回的内部商户号:{} 入驻信息不存在!", merInnerNo);
return new JSONObject().set("code", "500").set("message", "外部商户号:" + merCupNo + " 入驻信息不存在"); return new JSONObject().set("code", "500").set("message", "内部商户号:" + merInnerNo + " 入驻信息不存在");
} }
Boolean success = shopMchEntryService.updateMerchEntryLklAuditStatusByLklMerCupNo(merInnerNo, merCupNo, CommonConstant.Enable, data); Boolean success = shopMchEntryService.updateMerchEntryLklAuditStatusByLklMerCupNo(merInnerNo, merCupNo, CommonConstant.Enable, data);

View File

@ -52,22 +52,26 @@ public class LakalaUtil {
/** /**
* 读取证书文件内容 * 读取证书文件内容
* 末尾会有换行符
* *
* @param fileName recource 文件夹下的路径palyKey/wx/lakala_public_key.cer * @param fileName recource 文件夹下的路径palyKey/wx/lakala_public_key.cer
* @return * @return
*/ */
public static String getResourceFile(String fileName) { public static String getResourceFile(String fileName) {
return getResourceFileWithEndSeq(fileName, true);
}
public static String getResourceFileWithEndSeq(String fileName, boolean keepLineBreaks) {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
try (InputStream inputStream = new ClassPathResource(fileName).getInputStream(); try (InputStream inputStream = new ClassPathResource(fileName).getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
String line; String line;
String endSeq = keepLineBreaks ? "\n" : "";
while ((line = bufferedReader.readLine()) != null) { while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n"); stringBuilder.append(line).append(endSeq);
} }
String content = stringBuilder.toString(); return stringBuilder.toString();
// log.info("证书内容:{}", content);
return content;
} catch (IOException e) { } catch (IOException e) {
// 记录异常信息 // 记录异常信息
log.error(e.getMessage()); log.error(e.getMessage());

View File

@ -117,6 +117,14 @@ public interface ShopMchEntryService {
*/ */
ShopMchEntry getShopMerchEntryByMerCupNo(String merCupNo); ShopMchEntry getShopMerchEntryByMerCupNo(String merCupNo);
/**
* 根据拉卡拉内部商户号获取有效的商家入驻申请记录
*
* @param merInnerNo
* @return
*/
ShopMchEntry getShopMerchEntryByMerInnerNo(String merInnerNo);
/** /**
* 根据商家注册的手机号更新合同签署状态和合同下载地址 * 根据商家注册的手机号更新合同签署状态和合同下载地址
* *

View File

@ -689,6 +689,22 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return recordList.get(0); return recordList.get(0);
} }
@Override
public ShopMchEntry getShopMerchEntryByMerInnerNo(String merInnerNo) {
if (StrUtil.isBlank(merInnerNo)) {
return null;
}
QueryWrapper<ShopMchEntry> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("lkl_mer_inner_no", merInnerNo).eq("status", CommonConstant.Enable).orderByAsc("id");
List<ShopMchEntry> recordList = list(queryWrapper);
if (CollectionUtil.isEmpty(recordList)) {
return null;
}
return recordList.get(0);
}
/** /**
* 根据商家注册的手机号更新合同签署状态和合同下载地址 * 根据商家注册的手机号更新合同签署状态和合同下载地址
* *