diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java
new file mode 100644
index 00000000..762768a9
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java
@@ -0,0 +1,13 @@
+package com.bsd.pjcloud.thirdparty.dto.lb;
+
+import lombok.Data;
+
+@Data
+public class LbH5LoginDto {
+
+ /**
+ * 用户手机号
+ */
+ private String phone;
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java
new file mode 100644
index 00000000..6beb1955
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java
@@ -0,0 +1,18 @@
+package com.bsd.pjcloud.thirdparty.vo.lb;
+
+import lombok.Data;
+
+@Data
+public class LbH5LoginVo {
+
+ private Integer code;
+
+ private String msg;
+
+ private String h5Url;
+
+ public boolean isSuccess() {
+ return code == 200;
+ }
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
index 34dfa75e..bfa98f44 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
@@ -115,6 +115,12 @@
jjwt
0.9.1
+
+
+ org.bouncycastle
+ bcprov-jdk15to18
+ 1.66
+
javax.xml.bind
jaxb-api
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java
new file mode 100644
index 00000000..c29fad84
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java
@@ -0,0 +1,26 @@
+package com.bsd.pjcloud.thirdparty.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "lb")
+@Data
+public class LbConfig {
+
+ /**
+ * 请求基础路径
+ */
+ private String baseUrl;
+
+ private String appId;
+
+ private String appSecret;
+
+ /**
+ * 企业编号
+ */
+ private String companyNumber;
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java
new file mode 100644
index 00000000..5d20678d
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java
@@ -0,0 +1,28 @@
+package com.bsd.pjcloud.thirdparty.controller.lb;
+
+import com.bsd.pjcloud.common.core.util.R;
+import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto;
+import com.bsd.pjcloud.thirdparty.service.ThirdLbApiService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/third-lb")
+@Tag(description = "third-lb", name = "宁波银行对接")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class ThirdLbApiController {
+
+ private final ThirdLbApiService thirdLbApiService;
+
+ @Operation(summary = "美好生活登录", description = "美好生活登录")
+ @PostMapping("/h5-login")
+ public R H5Login(@RequestBody LbH5LoginDto dto) {
+ return R.ok(thirdLbApiService.h5Login(dto));
+ }
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java
new file mode 100644
index 00000000..0543042b
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java
@@ -0,0 +1,16 @@
+package com.bsd.pjcloud.thirdparty.service;
+
+import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto;
+import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo;
+
+/**
+ * @author liusiyang_dxm
+ * @since 2025/4/29
+ */
+public interface ThirdLbApiService {
+
+ /**
+ * 美好生活登录
+ */
+ LbH5LoginVo h5Login(LbH5LoginDto dto);
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java
new file mode 100644
index 00000000..52b7a3e9
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java
@@ -0,0 +1,69 @@
+package com.bsd.pjcloud.thirdparty.service.impl.lb;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONUtil;
+import com.bsd.pjcloud.thirdparty.config.LbConfig;
+import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto;
+import com.bsd.pjcloud.thirdparty.service.ThirdLbApiService;
+import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi;
+import com.bsd.pjcloud.thirdparty.utils.lb.api.LbApi;
+import com.bsd.pjcloud.thirdparty.vo.ks.KsBaseVo;
+import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Service
+@Validated
+@Slf4j
+@RequiredArgsConstructor
+public class ThirdLbApiServiceImpl implements ThirdLbApiService {
+
+ private static final String TAG = "宁波银行api";
+
+ private final LbConfig lbConfig;
+
+ @Override
+ public LbH5LoginVo h5Login(LbH5LoginDto dto) {
+ LbH5LoginVo ksBaseVo = new LbH5LoginVo();
+ String phone = dto.getPhone();
+ String signPhone = phone;
+ long timeMillis = System.currentTimeMillis();
+ String signature = apiCountersign(dto.getPhone(), timeMillis);
+ Map queryMap = new HashMap<>();
+ queryMap.put("companyNumber", lbConfig.getCompanyNumber());
+ queryMap.put("appId", lbConfig.getAppId());
+ queryMap.put("phone", signPhone);
+ queryMap.put("timestamp", String.valueOf(timeMillis));
+ queryMap.put("signature", signature);
+ // 发送请求
+ DoorApi.Api h5Login = LbApi.H5_LOGIN;
+ try {
+ String res = HttpRequest.post(lbConfig.getBaseUrl() + h5Login.getUrl()).contentType(h5Login.getContentType()).body(JSONUtil.toJsonStr(queryMap)).execute().body();
+ if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空");
+ ksBaseVo = JSONUtil.toBean(res, LbH5LoginVo.class);
+ } catch (Exception e) {
+ String error = String.format("|%s||skuSubmit|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
+ log.error(error);
+ }
+ return ksBaseVo;
+ }
+
+
+ // 加签
+ public String apiCountersign(String phone, Long timestamp) {
+ String str = String.format("companyNumber=%s&appId=%s&phone=%s×tamp=%s&secret=%s");
+ str = String.format(str, lbConfig.getCompanyNumber(), lbConfig.getAppId(), phone, timestamp, lbConfig.getAppSecret());
+ // 使用 SHA-256 进行哈希计算,并返回十六进制字符串。
+ String sha256 = DigestUtils.sha256Hex(str);
+ return sha256;
+ }
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java
new file mode 100644
index 00000000..6f006dd0
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java
@@ -0,0 +1,34 @@
+package com.bsd.pjcloud.thirdparty.utils.lb.api;
+
+import com.bsd.pjcloud.thirdparty.constant.door.ThirdDoorApiTypeEnum;
+import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.UtilityClass;
+import org.apache.http.client.methods.HttpPost;
+
+
+@UtilityClass
+public class LbApi {
+
+ // 美好生活登录(直连模式)
+ public static final DoorApi.Api H5_LOGIN = DoorApi.Api.builder().url("/mall/xhr/authLogin/thirdApp").bizType(ThirdDoorApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+
+ // 美好生活登录(分行中转模式)
+ public static final DoorApi.Api H5_LOGIN_OPEN = DoorApi.Api.builder().url("/mall/xhr/authLogin/thirdAppOpen").bizType(ThirdDoorApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build();
+
+ @Data
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class Api {
+ private String url;
+
+ private String method;
+
+ private String contentType;
+
+ }
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
index 5d9cd073..b512bd02 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
@@ -88,7 +88,11 @@ zy:
# callback-base-url: http://h1yzkslmyx.ny.takin.cc
# callback-recognition-url: /third/third-ks/callback/recognition
# callback-sku-url: /third/third-ks/callback/sku
-
+lb:
+ base-url: https://elss-sit.nbcb.com.cn
+ app-id: c4b0a38e9ba5419eab9b651dd23db462
+ app-secret: iW9H6BT2AMXg2XnN2Eq+r6ISossJNNh97nyLwrrOrDY=
+ company-number: p6VQYhHZ
sms:
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java
index f448f0f4..6f00156c 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java
@@ -35,6 +35,22 @@ public class MchCatgoryController {
private final MchCatgoryService mchCatgoryService;
+ /* ************************************* start 移动端 start ************************************* */
+
+ @Operation(summary = "app下拉查询", description = "app下拉查询")
+ @GetMapping("/app/select")
+ public R appSelect(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
+ .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType())
+ .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName())
+ .orderByDesc(MchCatgoryEntity::getSort)
+ .orderByDesc(MchCatgoryEntity::getCreateTime)
+ .orderByDesc(MchCatgoryEntity::getId);
+ return R.ok(mchCatgoryService.list(page, wrapper));
+ }
+
+ /* ************************************* end 移动端 end ************************************* */
+
@Operation(summary = "下拉查询(没有权限)", description = "下拉查询(没有权限)")
@GetMapping("/select")
public R select(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) {
diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml
index 370543bf..62469d3b 100644
--- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml
+++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml
@@ -78,7 +78,7 @@
and a.parent_id = #{dto.parentId}
-
+
and a.parent_id = -1