ocr 调试,todo

This commit is contained in:
Jack 2025-05-09 00:30:19 +08:00
parent 2407520ca5
commit 3974a08c85
10 changed files with 324 additions and 21 deletions

View File

@ -125,7 +125,7 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "入驻商家许可证图片的存储路径")
private String license_image;
@ApiModelProperty(value = "商家营业执照有效开始时间")
private String biz_license_period_begin;
@ -216,6 +216,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "商家的代理商ID")
private Long distributor_id;
@ApiModelProperty(value = "拉卡拉内部商户号")
private String lkl_mer_inner_no;
@ApiModelProperty(value = "拉卡拉银联商户号(唯一)")
private String lkl_mer_cup_no;

View File

@ -39,7 +39,7 @@ public class ContextUtil {
public static UserDto getCurrentUser() {
try {
UserDto loginUser = staticUserInfoService.getUser();
log.info("##### 当前登录用户:{}###", JsonUtil.object2json(loginUser));
// log.info("##### 当前登录用户:{}###", JsonUtil.object2json(loginUser));
return loginUser;
} catch (Exception e) {
System.out.println(e.getMessage());

View File

@ -32,6 +32,7 @@ import com.suisung.mall.shop.esign.utils.comm.EsignHttpHelper;
import com.suisung.mall.shop.esign.utils.comm.EsignHttpResponse;
import com.suisung.mall.shop.esign.utils.enums.EsignRequestType;
import com.suisung.mall.shop.esign.utils.exception.EsignDemoException;
import com.suisung.mall.shop.lakala.service.LakalaApiService;
import com.suisung.mall.shop.page.service.OssService;
import com.suisung.mall.shop.store.service.ShopMchEntryService;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
@ -92,6 +93,10 @@ public class EsignContractServiceImpl extends BaseServiceImpl<EsignContractMappe
@Resource
private ShopStoreBaseService shopStoreBaseService;
@Lazy
@Resource
private LakalaApiService lakalaApiService;
@Resource
private OssService ossService;
@ -293,9 +298,15 @@ public class EsignContractServiceImpl extends BaseServiceImpl<EsignContractMappe
boolean success = updateContractFlowStatusAndFileUrlBySignFlowId(signFlowId, CommonConstant.CONTRACT_SIGN_STA_FINISH, downloadUrl);
if (success && StrUtil.isNotBlank(downloadUrl)) {
// 1电子合同给商家申请分账功能使用务必检查是否申请过申请过忽略
Pair<Boolean, String> retPair = lakalaApiService.innerApplyLedgerMer(esignContract.getMch_mobile());
if (!retPair.getFirst()) {
log.error("商家申请分账功能失败:{}", retPair.getSecond());
}
// taskService.executeTask(() -> {
// 1电子合同给商家申请分账功能2商家绑定接收方
// 1电子合同给商家申请分账功能使用
// 新建一个正式的已审核通过的店铺
// Pair<Integer, String> retPair = shopStoreBaseService.merchEntryInfo2StoreInfo(esignContract.getMch_mobile());

View File

@ -49,6 +49,7 @@ public class LakalaController extends BaseControllerImpl {
return lakalaPayService.applyLedgerMer(paramsJSON);
}
@ApiOperation(value = "商户分账业务开通申请异步回调回调", notes = "商户分账业务开通申请异步回调回调")
@RequestMapping(value = "/ledger/applyLedgerMerNotify", method = RequestMethod.POST)
public JSONObject ledgerApplyLedgerMerNotify(HttpServletRequest request) {

View File

@ -10,6 +10,7 @@ package com.suisung.mall.shop.lakala.service;
import cn.hutool.json.JSONObject;
import com.suisung.mall.common.api.CommonResult;
import org.springframework.data.util.Pair;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -99,6 +100,14 @@ public interface LakalaApiService {
*/
CommonResult applyLedgerMer(JSONObject paramsJSON);
/**
* 内部调用商户分账业务开通申请
*
* @param merCupNo
* @return
*/
Pair<Boolean, String> innerApplyLedgerMer(String merCupNo);
/**
* 商户分账业务开通申请回调
* 参考https://o.lakala.com/#/home/document/detail?id=379

View File

@ -12,6 +12,8 @@ import cn.hutool.json.JSONArray;
import com.suisung.mall.common.modules.lakala.LklLedgerReceiver;
import com.suisung.mall.core.web.service.IBaseService;
import java.util.List;
public interface LklLedgerReceiverService extends IBaseService<LklLedgerReceiver> {
/**
@ -71,4 +73,13 @@ public interface LklLedgerReceiverService extends IBaseService<LklLedgerReceiver
* @return
*/
LklLedgerReceiver getByCondition(String LicenseNo, String ContactMobile, Long platformId);
/**
* 根据条件查询记录
*
* @param LicenseNo
* @param ContactMobile
* @return
*/
List<LklLedgerReceiver> getByCondition(String LicenseNo, String ContactMobile);
}

View File

@ -46,6 +46,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@ -449,6 +450,12 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
/**
* 商户分账业务开通申请
*
* @param paramsJSON
* @return
*/
@Override
public CommonResult applyLedgerMer(JSONObject paramsJSON) {
log.info("商户分账业务开通申请开始");
@ -462,9 +469,9 @@ public class LakalaApiServiceImpl implements LakalaApiService {
req.setVersion("2.0");
req.setOrderNo(StringUtils.genLklOrderNo(8));// 14位年月日时24小时制分秒+8位的随机数
req.setOrgCode(orgCode);
req.setMerInnerNo(paramsJSON.getStr("merInnerNo"));
req.setMerCupNo(paramsJSON.getStr("merCupNo"));
req.setContactMobile(paramsJSON.getStr("contactMobile"));
req.setMerInnerNo(paramsJSON.getStr("merInnerNo"));// 从进件申请返回的商户号
req.setMerCupNo(paramsJSON.getStr("merCupNo")); // 从进件申请返回的商户号
req.setContactMobile(paramsJSON.getStr("contactMobile")); // 商户入驻注册的手机号
// 分账比例为了考虑低价订单的运费占比高分账比例暂时定70%分账给商户30%分账给平台
// new BigDecimal(paramsJSON.getStr("splitLowestRatio"))
req.setSplitLowestRatio(BigDecimal.valueOf(70));
@ -512,6 +519,8 @@ public class LakalaApiServiceImpl implements LakalaApiService {
paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg"));
paramsJSON.set("audit_status_text", paramsJSON.get("remark"));
paramsJSON.set("mch_id", paramsJSON.get("mchId"));
// 新增数据
// JSON 对象的键名转换为下划线命名
LklLedgerMember lklLedgerMember = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMember.class);
@ -520,7 +529,112 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return CommonResult.success(null, "提交成功,待审核中!");
} catch (SDKException e) {
log.error("申请开通分账出错:", e);
throw new ApiException(I18nUtil._("申请开通分账出错!"), e);
throw new ApiException(I18nUtil._("商家申请开通分账出错!"), e);
}
}
@Override
public Pair<Boolean, String> innerApplyLedgerMer(String merCupNo) {
log.info("商户分账业务开通申请开始");
if (StringUtils.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(true, I18nUtil._("商家已经申请过了!"));
}
// 1. 配置初始化
initLKLSDK();
//2. 装配数据
V2MmsOpenApiLedgerApplyLedgerMerRequest req = new V2MmsOpenApiLedgerApplyLedgerMerRequest();
req.setVersion("2.0");
req.setOrderNo(StringUtils.genLklOrderNo(8));// 14位年月日时24小时制分秒+8位的随机数
req.setOrgCode(orgCode);
req.setMerInnerNo(shopMchEntry.getLkl_mer_inner_no());// 从进件申请返回的商户号
req.setMerCupNo(shopMchEntry.getLkl_mer_cup_no()); // 从进件申请返回的商户号
req.setContactMobile(shopMchEntry.getLogin_mobile()); // 商户入驻注册的手机号
// 分账比例为了考虑低价订单的运费占比高分账比例暂时定70%分账给商户30%分账给平台
// new BigDecimal(paramsJSON.getStr("splitLowestRatio"))
req.setSplitLowestRatio(BigDecimal.valueOf(70));
String fileName = "小发同城分账授权委托书.pdf";//paramsJSON.getStr("splitEntrustFileName");
req.setSplitEntrustFileName(fileName);
// 分账结算委托书文件上传到拉卡拉服务器
JSONObject fileUploadResp = uploadFile(req.getOrderNo(), "SPLIT_ENTRUST_FILE", StringUtils.getFileExt(fileName), UploadUtil.fileUrlToBase64(shopMchEntry.getContract_download_url()));
if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) {
throw new ApiException(I18nUtil._("小发同城分账授权委托书上传失败!"));
}
String splitEntrustFilePath = fileUploadResp.getStr("attFileId");
req.setSplitEntrustFilePath(splitEntrustFilePath); //比如G1/M00/06/64/CrFdEmBQc-aAGc_XAAAiIbS3WIE960.pdf;
String domain = projectDomain;
if (isProd()) {
domain += "/api";
}
// 给拉卡拉通知的回调地址
String retUrl = domain + "/mobile/shop/lakala/ledger/applyLedgerMerNotify";
req.setRetUrl(retUrl);
JSONObject paramsJSON = new JSONObject();
paramsJSON.put("orderNo", req.getOrderNo());
paramsJSON.put("org_code", orgCode);
paramsJSON.put("version", "2.0");
paramsJSON.put("ret_url", retUrl);
paramsJSON.put("mer_inner_no", req.getMerInnerNo());
paramsJSON.put("mer_cup_no", req.getMerCupNo());
paramsJSON.put("contact_mobile", shopMchEntry.getLogin_mobile());
paramsJSON.put("split_lowest_ratio", req.getSplitLowestRatio());
paramsJSON.put("split_range", "MARK");
paramsJSON.put("split_launch_mode", "MANUAL");
paramsJSON.put("settle_type", "01");
paramsJSON.put("split_rule_source", "TR");
paramsJSON.put("ele_contract_no", "");
paramsJSON.put("split_entrust_file_name", req.getSplitEntrustFileName());
paramsJSON.put("split_entrust_file_path", splitEntrustFilePath);
try {
//3. 发送请求
String responseStr = LKLSDK.httpPost(req);
// 成功返回示例{'retCode':'000000','retMsg':'申请已受理请等待审核结果','respData':{'version':'1.0','orderNo':'KFPT20230223181025407788734','orgCode':'1','applyId':681201215598657536}}
JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr);
if (StrUtil.isBlank(responseStr) || lakalaRespJSON == null) {
return Pair.of(false, I18nUtil._("无返回值,申请开通分账失败!"));
}
if (!lakalaRespJSON.getStr("retCode").equals(lklSuccessCode)) {
return Pair.of(false, lakalaRespJSON.getStr("retMsg"));
}
paramsJSON.set("apply_id", lakalaRespJSON.getByPath("respData.applyId"));
paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg"));
paramsJSON.set("audit_status_text", paramsJSON.get("remark"));
paramsJSON.set("mch_id", shopMchEntry.getId());
// 新增数据
// JSON 对象的键名转换为下划线命名
LklLedgerMember lklLedgerMemberNew = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMember.class);
lklLedgerMemberService.saveOrUpdateByMerCupNo(lklLedgerMemberNew);
return Pair.of(true, I18nUtil._("提交成功,待审核中!"));
} catch (SDKException e) {
log.error("申请开通分账出错:", e);
return Pair.of(false, I18nUtil._("商家申请开通分账出错!"));
// throw new ApiException(I18nUtil._("商家申请开通分账出错!"), e);
}
}
@ -582,9 +696,16 @@ public class LakalaApiServiceImpl implements LakalaApiService {
respData.put("retMsg", "操作成功!");
log.info("商户分账申请业务回调:处理成功");
// TODO 绑定接收方平台方和代理商绑定之前判断是否已经绑定过了
// 重要注商户分账申请业务成功后同时也会新增接收方绑定接收方平台方和代理商绑定之前判断是否已经绑定过了
JSONObject bindParamsJSON = new JSONObject();
bindParamsJSON.put("merInnerNo", paramsJSON.getStr("merInnerNo"));
bindParamsJSON.put("merCupNo", paramsJSON.getStr("merCupNo"));
Pair<Boolean, String> bindResult = innerApplyLedgerMerReceiverBind(bindParamsJSON);
if (bindResult.getFirst()) {
log.info("商户分账申请业务回调:", bindResult.getSecond());
} else {
log.error("商户分账申请业务回调:", bindResult.getSecond());
}
}
}
@ -700,7 +821,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
/**
* 分账关系绑定申请
* 商家与平台代理商分账关系绑定申请
* 参考https://o.lakala.com/#/home/document/detail?id=386
*
* @param paramsJSON
@ -790,6 +911,129 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
}
/**
* 内部调用分账关系绑定申请
* 参考https://o.lakala.com/#/home/document/detail?id=386
*
* @param paramsJSON
* @return
*/
public Pair<Boolean, String> innerApplyLedgerMerReceiverBind(JSONObject paramsJSON) {
// 检查分账方和接收方记录是否存在
if (lklLedgerMemberService.getByMerCupNo(paramsJSON.getStr("merCupNo")) == null) {
return Pair.of(false, I18nUtil._("绑定方不存在!"));
}
// 获取商家入驻记录
ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(paramsJSON.getStr("merCupNo"));
if (shopMchEntry == 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(paramsJSON.getStr("merCupNo"), paramsJSON.getStr("receiverNo"));
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(paramsJSON.getStr("merInnerNo"));
req.setMerCupNo(paramsJSON.getStr("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 (isProd()) {
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 = 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("entrust_file_name", entrustFileName);
paramsJSON.set("entrust_file_path", entrustFilePath);
try {
//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.saveOrUpdateByMerCupNoReceiverNo(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, "提交成功,待审核中!");
}
/**
* 分账关系绑定申请回调
* 参考https://o.lakala.com/#/home/document/detail?id=379
@ -832,7 +1076,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// TODO 新建一个正式的已审核通过的店铺 新建之前判断是否已经新建过了
// 新建一个正式的已审核通过的店铺
ShopMchEntry shopEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo);
if (shopEntry != null) {
if (shopEntry != null && !CommonConstant.Enable.equals(shopEntry.getStore_status())) {
String mchMobile = shopEntry.getLogin_mobile();
Pair<Integer, String> retPair = shopStoreBaseService.merchEntryInfo2StoreInfo(mchMobile);
if (retPair.getFirst() > 0) {

View File

@ -273,4 +273,24 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
return getOne(queryWrapper);
}
@Override
public List<LklLedgerReceiver> getByCondition(String LicenseNo, String ContactMobile) {
if (StrUtil.isBlank(LicenseNo) && StrUtil.isBlank(ContactMobile)) {
return null;
}
QueryWrapper<LklLedgerReceiver> queryWrapper = new QueryWrapper<>();
if (StrUtil.isNotBlank(LicenseNo)) {
queryWrapper.eq("license_no", LicenseNo);
}
if (StrUtil.isNotBlank(ContactMobile)) {
queryWrapper.eq("contact_mobile", ContactMobile);
}
queryWrapper.eq("status", CommonConstant.Enable);
return list(queryWrapper);
}
}

View File

@ -140,7 +140,9 @@ public class LklTkServiceImpl {
}
protected boolean isProd() {
return "prod".equalsIgnoreCase(profile);
return false;
// 生产环境的时候启动该配置
// return "prod".equalsIgnoreCase(profile);
}
/**
@ -156,17 +158,16 @@ public class LklTkServiceImpl {
* @return
*/
public CommonResult uploadOcrImg(MultipartFile file, String imgType) {
UserDto currentUser = getCurrentUser();
if (currentUser == null) {
currentUser = new UserDto();
}
if (file == null || StrUtil.isBlank(imgType)) {
return CommonResult.failed("上传文件或图片类型不能为空");
}
UserDto user = getCurrentUser();
if (user == null) {
return CommonResult.failed("请先登录");
}
CommonResult ossImgInfo = ossService.uploadFile(file, user);
CommonResult ossImgInfo = ossService.uploadFile(file, currentUser);
if (ossImgInfo == null) {
return CommonResult.failed("上传文件失败");
}
@ -511,8 +512,11 @@ public class LklTkServiceImpl {
}
// 公钥解密出来的数据
String data = decryptNotifyData(notifyPubKeyPath, reqBodyJSON.getStr("data"));
String notifyPubKey = LakalaUtil.getResourceFile(notifyPubKeyPath);
log.debug("解密公钥:{}", notifyPubKey);
String data = decryptNotifyData(notifyPubKey, reqBodyJSON.getStr("data"));
log.debug("拉卡拉进件异步通知返回解密后的参数:{}", data);
if (StrUtil.isBlank(data)) {
return new JSONObject().set("code", "500").set("message", "参数解密出错");
}

View File

@ -191,7 +191,7 @@ lakala:
#拉卡拉拓客进件配置
tk:
#服务地址
server_url: https://test.wsmsd.cn/sit/htkauth
server_url: https://test.wsmsd.cn
client_id: lsycs
client_secret: XPa1HB5d55Ig0qV8
api_pub_key_path: payKey/lakala/dev/tk_api_public_key.txt