This commit is contained in:
2026-07-27 12:37:29 +08:00
parent dc9a98e893
commit 9429e4f6e0
20 changed files with 1066 additions and 61 deletions

View File

@@ -88,19 +88,23 @@ func (s *CertificationApplicationServiceImpl) SelectSignPlatform(
return nil, err
}
transactorName, transactorMobile, transactorID := pickTransactorFromRecord(record)
clientCorpID := strings.TrimSpace(record.UnifiedSocialCode)
authReq := &ports.EnterpriseAuthRequest{
ClientCorpID: record.UnifiedSocialCode,
ClientUserID: record.LegalPersonID,
ClientCorpID: clientCorpID,
ClientUserID: transactorID,
CompanyName: record.CompanyName,
UnifiedSocialCode: record.UnifiedSocialCode,
LegalPersonName: record.LegalPersonName,
LegalPersonID: record.LegalPersonID,
TransactorName: record.LegalPersonName,
TransactorMobile: record.LegalPersonPhone,
TransactorID: record.LegalPersonID,
TransactorName: transactorName,
TransactorMobile: transactorMobile,
TransactorID: transactorID,
}
// 选平台时先落库种子数据clientCorpId/USCC供后续 /corp/get 与签署复用
s.ensureFadadaCorpAuthSeed(ctx, cert, record, clientCorpID)
authRes, alreadyVerified, err := s.generateEnterpriseAuthOrDetectVerifiedWithProvider(ctx, provider, authReq)
authRes, alreadyVerified, err := s.generateEnterpriseAuthOrDetectVerifiedWithProvider(ctx, provider, authReq, cert, record)
if err != nil {
return nil, fmt.Errorf("生成企业认证链接失败: %w", err)
}
@@ -166,7 +170,20 @@ func (s *CertificationApplicationServiceImpl) HandleFadadaCallback(ctx context.C
zap.String("event", ev.Event),
zap.Bool("auth_passed", ev.AuthPassed),
zap.Bool("sign_completed", ev.SignCompleted),
zap.String("sign_flow_id", ev.SignFlowID))
zap.String("sign_flow_id", ev.SignFlowID),
zap.String("open_corp_id", ev.OpenCorpID),
zap.String("client_corp_id", ev.ClientCorpID))
// 授权成功:落库 openCorpId / clientCorpId
if ev.AuthPassed && (strings.TrimSpace(ev.OpenCorpID) != "" || strings.TrimSpace(ev.ClientCorpID) != "") {
rec := entities.NewFadadaCorpAuthRecord("", "", s.fadadaAppID(), ev.OrgName, "", ev.ClientCorpID)
rec.ApplyAuthStatus(ev.OpenCorpID, ev.ClientCorpID, "authorized", "", "", nil, "callback_auth_passed")
if s.fadadaCorpAuthRecordRepo != nil {
if err := s.fadadaCorpAuthRecordRepo.UpsertByBizKey(ctx, rec); err != nil {
s.logger.Warn("回调落库法大大授权信息失败", zap.Error(err))
}
}
}
// 认证完成主要依赖 ConfirmAuth / details 轮询;签署完成按任务 ID 兜底推进
if ev.SignCompleted && ev.SignFlowID != "" {
@@ -186,19 +203,59 @@ func (s *CertificationApplicationServiceImpl) generateEnterpriseAuthOrDetectVeri
ctx context.Context,
provider ports.SignPlatformProvider,
authReq *ports.EnterpriseAuthRequest,
cert *entities.Certification,
record *entities.EnterpriseInfoSubmitRecord,
) (*ports.AuthLinkResult, bool, error) {
userID := ""
if cert != nil {
userID = cert.UserID
}
// 1) 正式查授权POST /corp/get三选一库 openCorpId > USCC corpIdentNo > 库 clientCorpId
authQuery := s.resolveCorpAuthQueryForGet(ctx, userID, authReq.UnifiedSocialCode, authReq.ClientCorpID)
s.logger.Info("查询企业授权状态入参",
zap.String("company_name", authReq.CompanyName),
zap.String("open_corp_id", authQuery.OpenCorpID),
zap.String("corp_ident_no", authQuery.CorpIdentNo),
zap.String("client_corp_id", authQuery.ClientCorpID),
zap.String("platform", string(provider.Platform())))
authStatus, qErr := provider.QueryCorpAuthStatus(ctx, authQuery)
if qErr != nil {
s.logger.Warn("查询企业授权状态失败,将继续尝试获取授权链接",
zap.String("company_name", authReq.CompanyName),
zap.String("uscc", authReq.UnifiedSocialCode),
zap.String("platform", string(provider.Platform())),
zap.Error(qErr))
} else if authStatus != nil && authStatus.Supported {
s.persistFadadaCorpAuthStatus(ctx, cert, record, authStatus, "corp_get_select_platform")
if authStatus.Authorized {
s.logger.Info("查询企业授权状态为已授权,跳过认证链接并视为认证完成",
zap.String("company_name", authReq.CompanyName),
zap.String("uscc", authReq.UnifiedSocialCode),
zap.String("platform", string(provider.Platform())),
zap.String("binding_status", authStatus.BindingStatus),
zap.String("open_corp_id", authStatus.OpenCorpID),
zap.String("ident_status", authStatus.IdentStatus))
return nil, true, nil
}
}
// 2) 未授权或不支持查询:走获取授权链接
authRes, err := provider.GenerateEnterpriseAuth(ctx, authReq)
if err == nil {
return authRes, false, nil
}
// 法大大企业已对本应用授权210002= 授权已完成,直接跳过授权页
// 3) 兜底get-auth-url 返回授权范围重复获取210002/210013
if isEnterpriseAlreadyAuthorizedErr(err) {
s.logger.Info("第三方返回企业已授权,跳过认证链接并视为认证完成",
s.logger.Info("获取授权链接返回重复授权错误码,跳过认证链接并视为认证完成",
zap.String("company_name", authReq.CompanyName),
zap.String("uscc", authReq.UnifiedSocialCode),
zap.String("platform", string(provider.Platform())),
zap.Error(err))
// 再查一次 /corp/get尽量把 openCorpId 落库
if authStatus2, qErr2 := provider.QueryCorpAuthStatus(ctx, authQuery); qErr2 == nil && authStatus2 != nil {
s.persistFadadaCorpAuthStatus(ctx, cert, record, authStatus2, "corp_get_after_duplicate_auth")
}
return nil, true, nil
}