From 06b5aa97ec01a4edb2fb6d9ee98198a4af86815f Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 18:32:55 +0800 Subject: [PATCH 1/7] f --- .../api/services/processors/yysy/yysybe08_processor.go | 6 +++--- .../api/services/processors/yysy/yysybe08test_processor.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/domains/api/services/processors/yysy/yysybe08_processor.go b/internal/domains/api/services/processors/yysy/yysybe08_processor.go index 76efd63..20d5298 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08_processor.go @@ -34,9 +34,9 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors if err != nil { // 使用实时接口(app_id 和 app_secret)重试 respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false) - // 重试仍失败:阿里云身份证二要素兜底,返回原始 body;兜底仍失败则按阿里云错误类型返回(与 YYSY3M8S 对数脉的分流一致) + // 重试仍失败:阿里云身份证二要素兜底,返回 data;兜底仍失败则按阿里云错误类型返回(与 YYSY3M8S 对数脉的分流一致) if err != nil { - rawBytes, aerr := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) + dataBytes, aerr := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) if aerr != nil { if errors.Is(aerr, alicloud.ErrDatasource) { return nil, errors.Join(processors.ErrDatasource, aerr) @@ -46,7 +46,7 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors } return nil, errors.Join(processors.ErrSystem, aerr) } - return rawBytes, nil + return dataBytes, nil } } diff --git a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go index 1c29861..3341f81 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go @@ -9,7 +9,7 @@ import ( "tyapi-server/internal/domains/api/services/processors" ) -// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口原始 body(不做字段映射) +// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口 data(不做字段映射) func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { var paramsDto dto.YYSYBE08Req if err := json.Unmarshal(params, ¶msDto); err != nil { @@ -23,7 +23,7 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) } -// callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应体原文,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用 +// callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应 data,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用 func callAliyunIDCardCheckRaw(ctx context.Context, deps *processors.ProcessorDependencies, name, idCard string) ([]byte, error) { _ = ctx reqData := map[string]interface{}{ From df6a51ae6213380aff955d9d890f2705b7efc888 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 18:36:42 +0800 Subject: [PATCH 2/7] f --- internal/container/container.go | 7 +-- .../external/alicloud/alicloud_factory.go | 49 +++++++++++++++++++ .../external/alicloud/alicloud_service.go | 45 ++++++++++++++++- 3 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 internal/infrastructure/external/alicloud/alicloud_factory.go diff --git a/internal/container/container.go b/internal/container/container.go index 451a843..dce5338 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -412,11 +412,8 @@ func NewContainer() *Container { ) }, // AlicloudService - 阿里云服务 - func(cfg *config.Config) *alicloud.AlicloudService { - return alicloud.NewAlicloudService( - cfg.Alicloud.Host, - cfg.Alicloud.AppCode, - ) + func(cfg *config.Config) (*alicloud.AlicloudService, error) { + return alicloud.NewAlicloudServiceWithConfig(cfg) }, sharedhttp.NewGinRouter, ipgeo.NewLocator, diff --git a/internal/infrastructure/external/alicloud/alicloud_factory.go b/internal/infrastructure/external/alicloud/alicloud_factory.go new file mode 100644 index 0000000..9259174 --- /dev/null +++ b/internal/infrastructure/external/alicloud/alicloud_factory.go @@ -0,0 +1,49 @@ +package alicloud + +import ( + "tyapi-server/internal/config" + "tyapi-server/internal/shared/external_logger" +) + +// NewAlicloudServiceWithConfig 使用配置创建阿里云服务,并启用外部服务调用日志 +func NewAlicloudServiceWithConfig(cfg *config.Config) (*AlicloudService, error) { + loggingConfig := external_logger.ExternalServiceLoggingConfig{ + Enabled: true, + LogDir: "./logs/external_services", + ServiceName: "alicloud", + UseDaily: false, + EnableLevelSeparation: true, + LevelConfigs: map[string]external_logger.ExternalServiceLevelFileConfig{ + "info": { + MaxSize: 100, + MaxBackups: 3, + MaxAge: 28, + Compress: true, + }, + "error": { + MaxSize: 100, + MaxBackups: 3, + MaxAge: 28, + Compress: true, + }, + "warn": { + MaxSize: 100, + MaxBackups: 3, + MaxAge: 28, + Compress: true, + }, + }, + } + + logger, err := external_logger.NewExternalServiceLogger(loggingConfig) + if err != nil { + return nil, err + } + + return NewAlicloudService( + cfg.Alicloud.Host, + cfg.Alicloud.AppCode, + logger, + ), nil +} + diff --git a/internal/infrastructure/external/alicloud/alicloud_service.go b/internal/infrastructure/external/alicloud/alicloud_service.go index 86e5fdc..bfd852d 100644 --- a/internal/infrastructure/external/alicloud/alicloud_service.go +++ b/internal/infrastructure/external/alicloud/alicloud_service.go @@ -1,6 +1,7 @@ package alicloud import ( + "crypto/md5" "errors" "fmt" "io" @@ -8,6 +9,8 @@ import ( "net/url" "strings" "time" + + "tyapi-server/internal/shared/external_logger" ) var ( @@ -24,25 +27,47 @@ type AlicloudConfig struct { // AlicloudService 阿里云服务 type AlicloudService struct { config AlicloudConfig + logger *external_logger.ExternalServiceLogger } // NewAlicloudService 创建阿里云服务实例 -func NewAlicloudService(host, appCode string) *AlicloudService { +func NewAlicloudService(host, appCode string, logger ...*external_logger.ExternalServiceLogger) *AlicloudService { + var serviceLogger *external_logger.ExternalServiceLogger + if len(logger) > 0 { + serviceLogger = logger[0] + } return &AlicloudService{ config: AlicloudConfig{ Host: host, AppCode: appCode, }, + logger: serviceLogger, } } +// generateRequestID 生成请求ID +func (a *AlicloudService) generateRequestID() string { + timestamp := time.Now().UnixNano() + hash := md5.Sum([]byte(fmt.Sprintf("%d_%s", timestamp, a.config.Host))) + return fmt.Sprintf("alicloud_%x", hash[:8]) +} + // CallAPI 调用阿里云API的通用方法 // path: API路径(如 "api-mall/api/id_card/check") // params: 请求参数 func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (respBytes []byte, err error) { + startTime := time.Now() + requestID := a.generateRequestID() + transactionID := "" + // 构建请求URL reqURL := a.config.Host + "/" + path + // 记录请求日志 + if a.logger != nil { + a.logger.LogRequest(requestID, transactionID, path, reqURL) + } + // 构建请求参数 formData := url.Values{} for key, value := range params { @@ -52,6 +77,9 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r // 创建HTTP请求 req, err := http.NewRequest("POST", reqURL, strings.NewReader(formData.Encode())) if err != nil { + if a.logger != nil { + a.logger.LogError(requestID, transactionID, path, errors.Join(ErrSystem, err), params) + } return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error()) } @@ -78,8 +106,14 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r } if isTimeout { + if a.logger != nil { + a.logger.LogError(requestID, transactionID, path, errors.Join(ErrDatasource, fmt.Errorf("API请求超时: %s", err.Error())), params) + } return nil, fmt.Errorf("%w: API请求超时: %s", ErrDatasource, err.Error()) } + if a.logger != nil { + a.logger.LogError(requestID, transactionID, path, errors.Join(ErrSystem, err), params) + } return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error()) } defer resp.Body.Close() @@ -87,9 +121,18 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r // 读取响应体 body, err := io.ReadAll(resp.Body) if err != nil { + if a.logger != nil { + a.logger.LogError(requestID, transactionID, path, errors.Join(ErrSystem, err), params) + } return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error()) } + // 记录响应日志(不记录具体响应数据) + if a.logger != nil { + duration := time.Since(startTime) + a.logger.LogResponse(requestID, transactionID, path, resp.StatusCode, duration) + } + // 直接返回原始响应body,让调用方自己处理 return body, nil } From 947a983c679a1d3cfd0000738afd043458cc443a Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 18:47:04 +0800 Subject: [PATCH 3/7] f --- .../processors/yysy/yysybe08test_processor.go | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go index 3341f81..e54e680 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go @@ -9,7 +9,7 @@ import ( "tyapi-server/internal/domains/api/services/processors" ) -// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口 data(不做字段映射) +// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应映射为 ctidRequest.ctidAuth 格式 func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { var paramsDto dto.YYSYBE08Req if err := json.Unmarshal(params, ¶msDto); err != nil { @@ -20,7 +20,57 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces return nil, errors.Join(processors.ErrInvalidParam, err) } - return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) + respBytes, err := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) + if err != nil { + return nil, err + } + + var aliyunData struct { + Result int `json:"result"` + Desc string `json:"desc"` + } + if err := json.Unmarshal(respBytes, &aliyunData); err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + var resultCode, verifyResult, resultMsg string + switch aliyunData.Result { + case 0: + resultCode = "0XXX" + verifyResult = "一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "成功" + } + case 1: + resultCode = "5XXX" + verifyResult = "不一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "不一致" + } + default: + resultCode = "5XXX" + verifyResult = "不一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "不一致" + } + } + + response := map[string]interface{}{ + "ctidRequest": map[string]interface{}{ + "ctidAuth": map[string]interface{}{ + "idCard": paramsDto.IDCard, + "name": paramsDto.Name, + "resultCode": resultCode, + "resultMsg": resultMsg, + "verifyResult": verifyResult, + }, + }, + } + + return json.Marshal(response) } // callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应 data,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用 From 040f6eef6522736e9e6512df56964753c93fcc44 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 18:51:51 +0800 Subject: [PATCH 4/7] f --- .../processors/yysy/yysybe08_processor.go | 57 ++++++++++++++++++- .../processors/yysy/yysybe08test_processor.go | 54 +----------------- 2 files changed, 58 insertions(+), 53 deletions(-) diff --git a/internal/domains/api/services/processors/yysy/yysybe08_processor.go b/internal/domains/api/services/processors/yysy/yysybe08_processor.go index 20d5298..5d82dc0 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08_processor.go @@ -46,7 +46,62 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors } return nil, errors.Join(processors.ErrSystem, aerr) } - return dataBytes, nil + var aliyunData struct { + Result int `json:"result"` + Desc string `json:"desc"` + } + if err := json.Unmarshal(dataBytes, &aliyunData); err != nil { + errorResponse := map[string]interface{}{ + "ctidRequest": map[string]interface{}{ + "ctidAuth": map[string]interface{}{ + "idCard": paramsDto.IDCard, + "name": paramsDto.Name, + "resultCode": "500", + "resultMsg": "响应解析失败", + "verifyResult": "", + }, + }, + } + return json.Marshal(errorResponse) + } + + var resultCode, verifyResult, resultMsg string + switch aliyunData.Result { + case 0: + resultCode = "0XXX" + verifyResult = "一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "成功" + } + case 1: + resultCode = "5XXX" + verifyResult = "不一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "不一致" + } + default: + resultCode = "5XXX" + verifyResult = "不一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "不一致" + } + } + + response := map[string]interface{}{ + "ctidRequest": map[string]interface{}{ + "ctidAuth": map[string]interface{}{ + "idCard": paramsDto.IDCard, + "name": paramsDto.Name, + "resultCode": resultCode, + "resultMsg": resultMsg, + "verifyResult": verifyResult, + }, + }, + } + return json.Marshal(response) } } diff --git a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go index e54e680..3341f81 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go @@ -9,7 +9,7 @@ import ( "tyapi-server/internal/domains/api/services/processors" ) -// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应映射为 ctidRequest.ctidAuth 格式 +// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口 data(不做字段映射) func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { var paramsDto dto.YYSYBE08Req if err := json.Unmarshal(params, ¶msDto); err != nil { @@ -20,57 +20,7 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces return nil, errors.Join(processors.ErrInvalidParam, err) } - respBytes, err := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) - if err != nil { - return nil, err - } - - var aliyunData struct { - Result int `json:"result"` - Desc string `json:"desc"` - } - if err := json.Unmarshal(respBytes, &aliyunData); err != nil { - return nil, errors.Join(processors.ErrSystem, err) - } - - var resultCode, verifyResult, resultMsg string - switch aliyunData.Result { - case 0: - resultCode = "0XXX" - verifyResult = "一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "成功" - } - case 1: - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } - default: - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } - } - - response := map[string]interface{}{ - "ctidRequest": map[string]interface{}{ - "ctidAuth": map[string]interface{}{ - "idCard": paramsDto.IDCard, - "name": paramsDto.Name, - "resultCode": resultCode, - "resultMsg": resultMsg, - "verifyResult": verifyResult, - }, - }, - } - - return json.Marshal(response) + return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) } // callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应 data,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用 From a96c153286260505c8f01b10c037bb1bbe4c16ba Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 18:56:30 +0800 Subject: [PATCH 5/7] f --- .../processors/yysy/yysybe08_processor.go | 26 +++-------- .../processors/yysy/yysybe08test_processor.go | 46 ++++++++++++++++++- 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/internal/domains/api/services/processors/yysy/yysybe08_processor.go b/internal/domains/api/services/processors/yysy/yysybe08_processor.go index 5d82dc0..dcacab1 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08_processor.go @@ -47,7 +47,7 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors return nil, errors.Join(processors.ErrSystem, aerr) } var aliyunData struct { - Result int `json:"result"` + Result *int `json:"result"` Desc string `json:"desc"` } if err := json.Unmarshal(dataBytes, &aliyunData); err != nil { @@ -66,21 +66,14 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors } var resultCode, verifyResult, resultMsg string - switch aliyunData.Result { - case 0: + switch { + case aliyunData.Result != nil && *aliyunData.Result == 0: resultCode = "0XXX" verifyResult = "一致" resultMsg = aliyunData.Desc if resultMsg == "" { resultMsg = "成功" } - case 1: - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } default: resultCode = "5XXX" verifyResult = "不一致" @@ -108,7 +101,7 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors // 解析数脉 /v4/id_card/check 的 data 内容(CallAPIForm 返回的即 data 对象) // 数卖响应: result 0-一致 1-不一致 2-无记录(预留); desc 如 "一致"/"不一致" var shumaiData struct { - Result int `json:"result"` + Result *int `json:"result"` OrderNo string `json:"order_no"` Desc string `json:"desc"` Sex string `json:"sex"` @@ -135,21 +128,14 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors // 按数卖 result 验证结果处理: 0-一致 1-不一致 2-无记录(预留) // resultCode: 0XXX=一致, 5XXX=不一致/无记录 var resultCode, verifyResult, resultMsg string - switch shumaiData.Result { - case 0: // 一致(收费) + switch { + case shumaiData.Result != nil && *shumaiData.Result == 0: // 一致(收费) resultCode = "0XXX" verifyResult = "一致" resultMsg = shumaiData.Desc if resultMsg == "" { resultMsg = "成功" } - case 1: // 不一致(收费) - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = shumaiData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } default: resultCode = "5XXX" verifyResult = "不一致" diff --git a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go index 3341f81..7a20ad4 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go @@ -9,7 +9,7 @@ import ( "tyapi-server/internal/domains/api/services/processors" ) -// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口 data(不做字段映射) +// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应映射为 ctidRequest.ctidAuth 格式 func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { var paramsDto dto.YYSYBE08Req if err := json.Unmarshal(params, ¶msDto); err != nil { @@ -20,7 +20,49 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces return nil, errors.Join(processors.ErrInvalidParam, err) } - return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) + respBytes, err := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) + if err != nil { + return nil, err + } + + var aliyunData struct { + Result *int `json:"result"` + Desc string `json:"desc"` + } + if err := json.Unmarshal(respBytes, &aliyunData); err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + var resultCode, verifyResult, resultMsg string + switch { + case aliyunData.Result != nil && *aliyunData.Result == 0: + resultCode = "0XXX" + verifyResult = "一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "成功" + } + default: + resultCode = "5XXX" + verifyResult = "不一致" + resultMsg = aliyunData.Desc + if resultMsg == "" { + resultMsg = "不一致" + } + } + + response := map[string]interface{}{ + "ctidRequest": map[string]interface{}{ + "ctidAuth": map[string]interface{}{ + "idCard": paramsDto.IDCard, + "name": paramsDto.Name, + "resultCode": resultCode, + "resultMsg": resultMsg, + "verifyResult": verifyResult, + }, + }, + } + return json.Marshal(response) } // callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应 data,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用 From 895b38ab882cfd2d97b097dd62f638a4fd5919d0 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 19:01:26 +0800 Subject: [PATCH 6/7] f --- .../processors/yysy/yysybe08_processor.go | 99 +++++++++++-------- .../processors/yysy/yysybe08test_processor.go | 22 +---- .../external/alicloud/alicloud_service.go | 13 ++- 3 files changed, 66 insertions(+), 68 deletions(-) diff --git a/internal/domains/api/services/processors/yysy/yysybe08_processor.go b/internal/domains/api/services/processors/yysy/yysybe08_processor.go index dcacab1..d5a5cf4 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08_processor.go @@ -4,6 +4,8 @@ import ( "context" "encoding/json" "errors" + "strconv" + "strings" "tyapi-server/internal/domains/api/dto" "tyapi-server/internal/domains/api/services/processors" @@ -47,8 +49,8 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors return nil, errors.Join(processors.ErrSystem, aerr) } var aliyunData struct { - Result *int `json:"result"` - Desc string `json:"desc"` + Result interface{} `json:"result"` + Desc string `json:"desc"` } if err := json.Unmarshal(dataBytes, &aliyunData); err != nil { errorResponse := map[string]interface{}{ @@ -65,23 +67,7 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors return json.Marshal(errorResponse) } - var resultCode, verifyResult, resultMsg string - switch { - case aliyunData.Result != nil && *aliyunData.Result == 0: - resultCode = "0XXX" - verifyResult = "一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "成功" - } - default: - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } - } + resultCode, verifyResult, resultMsg := mapIDCardCheckResult(aliyunData.Result, aliyunData.Desc) response := map[string]interface{}{ "ctidRequest": map[string]interface{}{ @@ -101,12 +87,12 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors // 解析数脉 /v4/id_card/check 的 data 内容(CallAPIForm 返回的即 data 对象) // 数卖响应: result 0-一致 1-不一致 2-无记录(预留); desc 如 "一致"/"不一致" var shumaiData struct { - Result *int `json:"result"` - OrderNo string `json:"order_no"` - Desc string `json:"desc"` - Sex string `json:"sex"` - Birthday string `json:"birthday"` - Address string `json:"address"` + Result interface{} `json:"result"` + OrderNo string `json:"order_no"` + Desc string `json:"desc"` + Sex string `json:"sex"` + Birthday string `json:"birthday"` + Address string `json:"address"` } if err := json.Unmarshal(respBytes, &shumaiData); err != nil { @@ -127,23 +113,7 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors // 按数卖 result 验证结果处理: 0-一致 1-不一致 2-无记录(预留) // resultCode: 0XXX=一致, 5XXX=不一致/无记录 - var resultCode, verifyResult, resultMsg string - switch { - case shumaiData.Result != nil && *shumaiData.Result == 0: // 一致(收费) - resultCode = "0XXX" - verifyResult = "一致" - resultMsg = shumaiData.Desc - if resultMsg == "" { - resultMsg = "成功" - } - default: - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = shumaiData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } - } + resultCode, verifyResult, resultMsg := mapIDCardCheckResult(shumaiData.Result, shumaiData.Desc) // 构建目标格式的响应 response := map[string]interface{}{ @@ -160,3 +130,48 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors return json.Marshal(response) } + +func mapIDCardCheckResult(rawResult interface{}, desc string) (resultCode, verifyResult, resultMsg string) { + if isResultZero(rawResult) { + resultCode = "0XXX" + verifyResult = "一致" + resultMsg = desc + if resultMsg == "" { + resultMsg = "成功" + } + return + } + + resultCode = "5XXX" + verifyResult = "不一致" + resultMsg = desc + if resultMsg == "" { + resultMsg = "不一致" + } + return +} + +func isResultZero(v interface{}) bool { + switch r := v.(type) { + case float64: + return r == 0 + case int: + return r == 0 + case int32: + return r == 0 + case int64: + return r == 0 + case json.Number: + n, err := r.Int64() + return err == nil && n == 0 + case string: + s := strings.TrimSpace(r) + if s == "" { + return false + } + n, err := strconv.ParseFloat(s, 64) + return err == nil && n == 0 + default: + return false + } +} diff --git a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go index 7a20ad4..1fe360b 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go @@ -26,30 +26,14 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces } var aliyunData struct { - Result *int `json:"result"` - Desc string `json:"desc"` + Result interface{} `json:"result"` + Desc string `json:"desc"` } if err := json.Unmarshal(respBytes, &aliyunData); err != nil { return nil, errors.Join(processors.ErrSystem, err) } - var resultCode, verifyResult, resultMsg string - switch { - case aliyunData.Result != nil && *aliyunData.Result == 0: - resultCode = "0XXX" - verifyResult = "一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "成功" - } - default: - resultCode = "5XXX" - verifyResult = "不一致" - resultMsg = aliyunData.Desc - if resultMsg == "" { - resultMsg = "不一致" - } - } + resultCode, verifyResult, resultMsg := mapIDCardCheckResult(aliyunData.Result, aliyunData.Desc) response := map[string]interface{}{ "ctidRequest": map[string]interface{}{ diff --git a/internal/infrastructure/external/alicloud/alicloud_service.go b/internal/infrastructure/external/alicloud/alicloud_service.go index bfd852d..913c28d 100644 --- a/internal/infrastructure/external/alicloud/alicloud_service.go +++ b/internal/infrastructure/external/alicloud/alicloud_service.go @@ -97,14 +97,13 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r isTimeout := false if netErr, ok := err.(interface{ Timeout() bool }); ok && netErr.Timeout() { isTimeout = true - } else if errStr := err.Error(); - errStr == "context deadline exceeded" || - errStr == "timeout" || - errStr == "Client.Timeout exceeded" || - errStr == "net/http: request canceled" { + } else if errStr := err.Error(); errStr == "context deadline exceeded" || + errStr == "timeout" || + errStr == "Client.Timeout exceeded" || + errStr == "net/http: request canceled" { isTimeout = true } - + if isTimeout { if a.logger != nil { a.logger.LogError(requestID, transactionID, path, errors.Join(ErrDatasource, fmt.Errorf("API请求超时: %s", err.Error())), params) @@ -140,4 +139,4 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r // GetConfig 获取配置信息 func (a *AlicloudService) GetConfig() AlicloudConfig { return a.config -} \ No newline at end of file +} From 9a1cf0d1d158156765cfbbf6ce1f04add2ac70fe Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 21 Mar 2026 19:08:11 +0800 Subject: [PATCH 7/7] f --- .../processors/yysy/yysybe08_processor.go | 47 +------------------ .../processors/yysy/yysybe08test_processor.go | 33 +++++++------ 2 files changed, 20 insertions(+), 60 deletions(-) diff --git a/internal/domains/api/services/processors/yysy/yysybe08_processor.go b/internal/domains/api/services/processors/yysy/yysybe08_processor.go index d5a5cf4..3045315 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08_processor.go @@ -9,7 +9,6 @@ import ( "tyapi-server/internal/domains/api/dto" "tyapi-server/internal/domains/api/services/processors" - "tyapi-server/internal/infrastructure/external/alicloud" ) // ProcessYYSYBE08Request YYSYBE08 API处理方法 - 使用数脉二要素验证 @@ -36,51 +35,9 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors if err != nil { // 使用实时接口(app_id 和 app_secret)重试 respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false) - // 重试仍失败:阿里云身份证二要素兜底,返回 data;兜底仍失败则按阿里云错误类型返回(与 YYSY3M8S 对数脉的分流一致) + // 重试仍失败:阿里云身份证二要素兜底,并直接返回统一映射响应 if err != nil { - dataBytes, aerr := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) - if aerr != nil { - if errors.Is(aerr, alicloud.ErrDatasource) { - return nil, errors.Join(processors.ErrDatasource, aerr) - } - if errors.Is(aerr, alicloud.ErrSystem) { - return nil, errors.Join(processors.ErrSystem, aerr) - } - return nil, errors.Join(processors.ErrSystem, aerr) - } - var aliyunData struct { - Result interface{} `json:"result"` - Desc string `json:"desc"` - } - if err := json.Unmarshal(dataBytes, &aliyunData); err != nil { - errorResponse := map[string]interface{}{ - "ctidRequest": map[string]interface{}{ - "ctidAuth": map[string]interface{}{ - "idCard": paramsDto.IDCard, - "name": paramsDto.Name, - "resultCode": "500", - "resultMsg": "响应解析失败", - "verifyResult": "", - }, - }, - } - return json.Marshal(errorResponse) - } - - resultCode, verifyResult, resultMsg := mapIDCardCheckResult(aliyunData.Result, aliyunData.Desc) - - response := map[string]interface{}{ - "ctidRequest": map[string]interface{}{ - "ctidAuth": map[string]interface{}{ - "idCard": paramsDto.IDCard, - "name": paramsDto.Name, - "resultCode": resultCode, - "resultMsg": resultMsg, - "verifyResult": verifyResult, - }, - }, - } - return json.Marshal(response) + return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) } } diff --git a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go index 1fe360b..93e06d4 100644 --- a/internal/domains/api/services/processors/yysy/yysybe08test_processor.go +++ b/internal/domains/api/services/processors/yysy/yysybe08test_processor.go @@ -7,6 +7,7 @@ import ( "tyapi-server/internal/domains/api/dto" "tyapi-server/internal/domains/api/services/processors" + "tyapi-server/internal/infrastructure/external/alicloud" ) // ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应映射为 ctidRequest.ctidAuth 格式 @@ -20,9 +21,22 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces return nil, errors.Join(processors.ErrInvalidParam, err) } - respBytes, err := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) + return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard) +} + +// callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),并映射为 ctidRequest.ctidAuth 响应 +func callAliyunIDCardCheckRaw(ctx context.Context, deps *processors.ProcessorDependencies, name, idCard string) ([]byte, error) { + _ = ctx + reqData := map[string]interface{}{ + "name": name, + "idcard": idCard, + } + respBytes, err := deps.AlicloudService.CallAPI("api-mall/api/id_card/check", reqData) if err != nil { - return nil, err + if errors.Is(err, alicloud.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + return nil, errors.Join(processors.ErrSystem, err) } var aliyunData struct { @@ -34,12 +48,11 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces } resultCode, verifyResult, resultMsg := mapIDCardCheckResult(aliyunData.Result, aliyunData.Desc) - response := map[string]interface{}{ "ctidRequest": map[string]interface{}{ "ctidAuth": map[string]interface{}{ - "idCard": paramsDto.IDCard, - "name": paramsDto.Name, + "idCard": idCard, + "name": name, "resultCode": resultCode, "resultMsg": resultMsg, "verifyResult": verifyResult, @@ -48,13 +61,3 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces } return json.Marshal(response) } - -// callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应 data,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用 -func callAliyunIDCardCheckRaw(ctx context.Context, deps *processors.ProcessorDependencies, name, idCard string) ([]byte, error) { - _ = ctx - reqData := map[string]interface{}{ - "name": name, - "idcard": idCard, - } - return deps.AlicloudService.CallAPI("api-mall/api/id_card/check", reqData) -}