From 9c9b33fc7cc1f7517308d38e7df06a56c3fc715b Mon Sep 17 00:00:00 2001
From: zjk <852185829@qq.com>
Date: 星期三, 05 八月 2026 16:33:13 +0800
Subject: [PATCH] Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/java/talent-card
---
talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java
index 50f2981..4f57f84 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java
@@ -11,6 +11,12 @@
import com.talentcard.server.business.DatabaseRows;
import com.talentcard.server.business.PageResult;
import com.talentcard.server.business.merchant.auth.MerchantPrincipal;
+import com.talentcard.server.business.payment.huifu.HuifuIndividualOnboardingCommand;
+import com.talentcard.server.business.payment.huifu.HuifuIndividualOnboardingGateway;
+import com.talentcard.server.business.payment.huifu.HuifuEnterpriseOnboardingCommand;
+import com.talentcard.server.business.payment.huifu.HuifuEnterpriseOnboardingGateway;
+import com.talentcard.server.business.payment.huifu.HuifuPaymentGatewayException;
+import com.talentcard.server.common.SensitiveDataCrypto;
import com.talentcard.server.common.BusinessException;
import com.talentcard.server.common.ErrorCode;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -20,8 +26,16 @@
@Service
public class MerchantSettlementService {
private final JdbcTemplate jdbc;
+ private final SensitiveDataCrypto sensitiveDataCrypto;
+ private final HuifuIndividualOnboardingGateway individualOnboardingGateway;
+ private final HuifuEnterpriseOnboardingGateway enterpriseOnboardingGateway;
- public MerchantSettlementService(JdbcTemplate jdbc) { this.jdbc = jdbc; }
+ public MerchantSettlementService(JdbcTemplate jdbc, SensitiveDataCrypto sensitiveDataCrypto, HuifuIndividualOnboardingGateway individualOnboardingGateway, HuifuEnterpriseOnboardingGateway enterpriseOnboardingGateway) {
+ this.jdbc = jdbc;
+ this.sensitiveDataCrypto = sensitiveDataCrypto;
+ this.individualOnboardingGateway = individualOnboardingGateway;
+ this.enterpriseOnboardingGateway = enterpriseOnboardingGateway;
+ }
@Transactional(readOnly = true)
public Map<String, Object> onboardingStatus(MerchantPrincipal principal) {
@@ -39,12 +53,44 @@
if (!active.isEmpty()) return onboarding(active.get(0));
boolean enterprise = "enterprise".equals(request.subjectType());
if (enterprise && (request.creditCode() == null || !request.creditCode().trim().matches("[0-9A-Z]{18}"))) throw new BusinessException(ErrorCode.BAD_REQUEST, "请输入18位统一社会信用代码");
+ if (enterprise && (request.subjectIdNumber() == null || !request.subjectIdNumber().trim().matches("(?:\\d{15}|\\d{17}[0-9X])"))) throw new BusinessException(ErrorCode.BAD_REQUEST, "请输入法人正确的身份证号");
+ if (enterprise && (request.subjectCertificateBeginDate() == null || request.subjectCertificateBeginDate().isBlank())) throw new BusinessException(ErrorCode.BAD_REQUEST, "请输入营业执照成立日期");
if (!enterprise && (request.subjectIdNumber() == null || !request.subjectIdNumber().trim().matches("(?:\\d{15}|\\d{17}[0-9X])"))) throw new BusinessException(ErrorCode.BAD_REQUEST, "请输入正确的身份证号");
String no = BusinessIdGenerator.next("MO");
- jdbc.update("insert into merchant_onboarding_application(merchant_id, store_id, application_no, subject_type, subject_name, credit_code, subject_id_no_masked, registered_region, registered_address, contact_name, contact_mobile, idempotency_key) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", principal.merchantId(), principal.storeId(), no, request.subjectType(), request.subjectName().trim(), clean(request.creditCode()), maskId(request.subjectIdNumber()), clean(request.registeredRegion()), clean(request.registeredAddress()), request.contactName().trim(), request.contactMobile().trim(), key.trim());
+ String certificateValidityType = certificateValidityType(request.subjectCertificateValidityType());
+ String certificateBeginDate = certificateBeginDate(request.subjectCertificateBeginDate());
+ jdbc.update("insert into merchant_onboarding_application(merchant_id, store_id, application_no, subject_type, subject_name, credit_code, subject_id_no_masked, subject_id_no_encrypted, subject_cert_validity_type, subject_cert_begin_date, registered_region, registered_address, contact_name, contact_mobile, idempotency_key) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", principal.merchantId(), principal.storeId(), no, request.subjectType(), request.subjectName().trim(), clean(request.creditCode()), maskId(request.subjectIdNumber()), sensitiveDataCrypto.encrypt(clean(request.subjectIdNumber()).toUpperCase()), certificateValidityType, certificateBeginDate, clean(request.registeredRegion()), clean(request.registeredAddress()), request.contactName().trim(), request.contactMobile().trim(), key.trim());
+ if ("individual".equals(request.subjectType())) submitIndividualOnboarding(no, request);
+ else submitEnterpriseOnboarding(no, request);
return onboarding(rows("select * from merchant_onboarding_application where application_no = ?", no).get(0));
}
+ private void submitEnterpriseOnboarding(String applicationNo, MerchantOnboardingRequest request) {
+ try {
+ HuifuEnterpriseOnboardingGateway.Result result = enterpriseOnboardingGateway.create(new HuifuEnterpriseOnboardingCommand(
+ applicationNo, request.subjectName().trim(), request.creditCode().trim(),
+ certificateValidityType(request.subjectCertificateValidityType()), certificateBeginDate(request.subjectCertificateBeginDate()),
+ clean(request.registeredRegion()), clean(request.registeredAddress()), request.contactName().trim(),
+ clean(request.subjectIdNumber()).toUpperCase(), certificateValidityType(request.subjectCertificateValidityType()),
+ certificateBeginDate(request.subjectCertificateBeginDate()), request.contactName().trim(), request.contactMobile().trim()));
+ if (result.accepted() && !result.huifuId().isBlank()) jdbc.update("update merchant_onboarding_application set status='approved', provider_huifu_id=?, reviewed_at=now(), reject_reason=null where application_no=? and status='pending'", result.huifuId(), applicationNo);
+ else if (!result.accepted()) jdbc.update("update merchant_onboarding_application set status='rejected', reject_reason=?, reviewed_at=now() where application_no=? and status='pending'", providerReason(result.code(), result.message()), applicationNo);
+ else jdbc.update("update merchant_onboarding_application set reject_reason=? where application_no=? and status='pending'", "Huifu accepted the request but did not return huifu_id", applicationNo);
+ } catch (HuifuPaymentGatewayException exception) {
+ jdbc.update("update merchant_onboarding_application set reject_reason=? where application_no=? and status='pending'", "Huifu submission outcome is pending confirmation", applicationNo);
+ }
+ }
+
+ private void submitIndividualOnboarding(String applicationNo, MerchantOnboardingRequest request) {
+ try {
+ HuifuIndividualOnboardingGateway.Result result = individualOnboardingGateway.create(new HuifuIndividualOnboardingCommand(applicationNo, request.subjectName().trim(), request.subjectIdNumber().trim().toUpperCase(), certificateValidityType(request.subjectCertificateValidityType()), certificateBeginDate(request.subjectCertificateBeginDate()), request.contactMobile().trim(), clean(request.registeredAddress())));
+ if (result.accepted() && !result.huifuId().isBlank()) jdbc.update("update merchant_onboarding_application set status='approved', provider_huifu_id=?, reviewed_at=now(), reject_reason=null where application_no=? and status='pending'", result.huifuId(), applicationNo);
+ else if (!result.accepted()) jdbc.update("update merchant_onboarding_application set status='rejected', reject_reason=?, reviewed_at=now() where application_no=? and status='pending'", providerReason(result), applicationNo);
+ else jdbc.update("update merchant_onboarding_application set reject_reason=? where application_no=? and status='pending'", "Huifu accepted the request but did not return huifu_id", applicationNo);
+ } catch (HuifuPaymentGatewayException exception) {
+ jdbc.update("update merchant_onboarding_application set reject_reason=? where application_no=? and status='pending'", "Huifu submission outcome is pending confirmation", applicationNo);
+ }
+ }
@Transactional(readOnly = true)
public List<Map<String, Object>> bankCards(MerchantPrincipal principal) {
store(principal);
@@ -117,6 +163,10 @@
private List<Map<String, Object>> rows(String sql, Object... args) { return DatabaseRows.normalize(jdbc.queryForList(sql, args)); }
private Long number(String value) { try { return Long.valueOf(value); } catch (Exception ignored) { throw new BusinessException(ErrorCode.BAD_REQUEST, "编号无效"); } }
private String clean(Object value) { return value == null ? "" : String.valueOf(value).trim(); }
+ private String certificateValidityType(String value) { return "long_term".equals(value) ? "1" : "0"; }
+ private String certificateBeginDate(String value) { return clean(value).replace("-", ""); }
+ private String providerReason(HuifuIndividualOnboardingGateway.Result result) { return providerReason(result.code(), result.message()); }
+ private String providerReason(String code, String message) { String value = clean(message); return value.isEmpty() ? "Huifu onboarding rejected: " + clean(code) : value; }
private String maskId(String id) { String value = clean(id); return value.length() < 8 ? "" : value.substring(0, 3) + "********" + value.substring(value.length() - 4); }
private String sha256(String value) { try { byte[] digest = MessageDigest.getInstance("SHA-256").digest(value.getBytes(StandardCharsets.UTF_8)); StringBuilder result = new StringBuilder(); for (byte valueByte : digest) result.append(String.format("%02x", valueByte)); return result.toString(); } catch (Exception exception) { throw new IllegalStateException("Unable to hash bank card", exception); } }
}
--
Gitblit v1.7.1