f
This commit is contained in:
@@ -1033,6 +1033,7 @@ func (s *ProductApplicationServiceImpl) getDTOMap() map[string]interface{} {
|
||||
"YYSY09CD": &dto.YYSY09CDReq{},
|
||||
"IVYZ0B03": &dto.IVYZ0B03Req{},
|
||||
"YYSYBE08": &dto.YYSYBE08Req{},
|
||||
"YYSYBE08TEST": &dto.YYSYBE08Req{},
|
||||
"YYSYD50F": &dto.YYSYD50FReq{},
|
||||
"YYSYF7DB": &dto.YYSYF7DBReq{},
|
||||
"IVYZ9A2B": &dto.IVYZ9A2BReq{},
|
||||
|
||||
@@ -248,6 +248,7 @@ func registerAllProcessors(combService *comb.CombService) {
|
||||
"YYSY4B37": yysy.ProcessYYSY4B37Request,
|
||||
"YYSY6F2E": yysy.ProcessYYSY6F2ERequest,
|
||||
"YYSYBE08": yysy.ProcessYYSYBE08Request,
|
||||
"YYSYBE08TEST": yysy.ProcessYYSYBE08testRequest, // 二要素(阿里云市场),与 YYSYBE08 入参一致
|
||||
"YYSYF7DB": yysy.ProcessYYSYF7DBRequest,
|
||||
"YYSY4F2E": yysy.ProcessYYSY4F2ERequest,
|
||||
"YYSY8B1C": yysy.ProcessYYSY8B1CRequest,
|
||||
|
||||
@@ -115,6 +115,7 @@ func (s *FormConfigServiceImpl) getDTOStruct(ctx context.Context, apiCode string
|
||||
"YYSY09CD": &dto.YYSY09CDReq{},
|
||||
"IVYZ0B03": &dto.IVYZ0B03Req{},
|
||||
"YYSYBE08": &dto.YYSYBE08Req{},
|
||||
"YYSYBE08TEST": &dto.YYSYBE08Req{},
|
||||
"YYSYD50F": &dto.YYSYD50FReq{},
|
||||
"YYSYF7DB": &dto.YYSYF7DBReq{},
|
||||
"IVYZ9A2B": &dto.IVYZ9A2BReq{},
|
||||
|
||||
@@ -7,6 +7,8 @@ import (
|
||||
|
||||
"tyapi-server/internal/domains/api/dto"
|
||||
"tyapi-server/internal/domains/api/services/processors"
|
||||
"tyapi-server/internal/infrastructure/external/alicloud"
|
||||
"tyapi-server/internal/infrastructure/external/shumai"
|
||||
)
|
||||
|
||||
// ProcessYYSYBE08Request YYSYBE08 API处理方法 - 使用数脉二要素验证
|
||||
@@ -33,24 +35,19 @@ 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 对数脉的分流一致)
|
||||
if err != nil {
|
||||
errorMsg := err.Error()
|
||||
if errorMsg == "" {
|
||||
errorMsg = "请求失败"
|
||||
rawBytes, aerr := callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard)
|
||||
if aerr != nil {
|
||||
if errors.Is(aerr, alicloud.ErrDatasource) {
|
||||
return nil, errors.Join(processors.ErrDatasource, aerr)
|
||||
}
|
||||
errorResponse := map[string]interface{}{
|
||||
"ctidRequest": map[string]interface{}{
|
||||
"ctidAuth": map[string]interface{}{
|
||||
"idCard": paramsDto.IDCard,
|
||||
"name": paramsDto.Name,
|
||||
"resultCode": "5XXX",
|
||||
"resultMsg": "数据源请求异常无记录",
|
||||
"verifyResult": "",
|
||||
},
|
||||
},
|
||||
if errors.Is(aerr, alicloud.ErrSystem) {
|
||||
return nil, errors.Join(processors.ErrSystem, aerr)
|
||||
}
|
||||
return json.Marshal(errorResponse)
|
||||
return nil, errors.Join(processors.ErrSystem, aerr)
|
||||
}
|
||||
return rawBytes, nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,158 +0,0 @@
|
||||
package yysy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestYYSYBE08ResponseStructure(t *testing.T) {
|
||||
// 测试响应结构构建逻辑
|
||||
resultCode := "1001"
|
||||
resultMsg := "验证通过"
|
||||
verifyResult := "一致"
|
||||
|
||||
// 模拟阿里云返回result=0(一致)的情况
|
||||
alicloudResult := 0
|
||||
if alicloudResult == 0 {
|
||||
// 验证成功
|
||||
resultCode = "1001"
|
||||
resultMsg = "验证通过"
|
||||
verifyResult = "一致"
|
||||
} else {
|
||||
// 验证失败
|
||||
resultCode = "1002"
|
||||
resultMsg = "身份证号不匹配"
|
||||
verifyResult = "不一致"
|
||||
}
|
||||
|
||||
// 构建响应结构
|
||||
response := map[string]interface{}{
|
||||
"ctidRequest": map[string]interface{}{
|
||||
"ctidAuth": map[string]interface{}{
|
||||
"resultCode": resultCode,
|
||||
"resultMsg": resultMsg,
|
||||
"name": "张荣宏",
|
||||
"idCard": "45212220000827423X",
|
||||
"verifyResult": verifyResult,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// 序列化为JSON
|
||||
jsonData, err := json.Marshal(response)
|
||||
if err != nil {
|
||||
t.Fatalf("JSON序列化失败: %v", err)
|
||||
}
|
||||
|
||||
// 验证JSON结构
|
||||
var parsedResponse map[string]interface{}
|
||||
if err := json.Unmarshal(jsonData, &parsedResponse); err != nil {
|
||||
t.Fatalf("JSON反序列化失败: %v", err)
|
||||
}
|
||||
|
||||
// 验证字段存在
|
||||
ctidRequest, exists := parsedResponse["ctidRequest"]
|
||||
if !exists {
|
||||
t.Fatal("响应中缺少ctidRequest字段")
|
||||
}
|
||||
|
||||
ctidAuth, exists := ctidRequest.(map[string]interface{})["ctidAuth"]
|
||||
if !exists {
|
||||
t.Fatal("响应中缺少ctidAuth字段")
|
||||
}
|
||||
|
||||
authData := ctidAuth.(map[string]interface{})
|
||||
|
||||
// 验证字段值
|
||||
expectedFields := map[string]string{
|
||||
"resultCode": "1001",
|
||||
"resultMsg": "验证通过",
|
||||
"name": "张荣宏",
|
||||
"idCard": "45212220000827423X",
|
||||
"verifyResult": "一致",
|
||||
}
|
||||
|
||||
for field, expectedValue := range expectedFields {
|
||||
if authData[field] != expectedValue {
|
||||
t.Errorf("字段%s期望值为%s,实际为%s", field, expectedValue, authData[field])
|
||||
}
|
||||
}
|
||||
|
||||
t.Logf("测试成功,响应结构: %s", string(jsonData))
|
||||
}
|
||||
|
||||
func TestYYSYBE08ResponseStructure_Failure(t *testing.T) {
|
||||
// 测试验证失败的情况
|
||||
resultCode := "1002"
|
||||
resultMsg := "身份证号不匹配"
|
||||
verifyResult := "不一致"
|
||||
|
||||
// 模拟阿里云返回result=1(不一致)的情况
|
||||
alicloudResult := 1
|
||||
if alicloudResult == 0 {
|
||||
// 验证成功
|
||||
resultCode = "1001"
|
||||
resultMsg = "验证通过"
|
||||
verifyResult = "一致"
|
||||
} else {
|
||||
// 验证失败
|
||||
resultCode = "1002"
|
||||
resultMsg = "身份证号不匹配"
|
||||
verifyResult = "不一致"
|
||||
}
|
||||
|
||||
// 构建响应结构
|
||||
response := map[string]interface{}{
|
||||
"ctidRequest": map[string]interface{}{
|
||||
"ctidAuth": map[string]interface{}{
|
||||
"resultCode": resultCode,
|
||||
"resultMsg": resultMsg,
|
||||
"name": "张三",
|
||||
"idCard": "110101199001011235",
|
||||
"verifyResult": verifyResult,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// 序列化为JSON
|
||||
jsonData, err := json.Marshal(response)
|
||||
if err != nil {
|
||||
t.Fatalf("JSON序列化失败: %v", err)
|
||||
}
|
||||
|
||||
// 验证JSON结构
|
||||
var parsedResponse map[string]interface{}
|
||||
if err := json.Unmarshal(jsonData, &parsedResponse); err != nil {
|
||||
t.Fatalf("JSON反序列化失败: %v", err)
|
||||
}
|
||||
|
||||
// 验证字段存在
|
||||
ctidRequest, exists := parsedResponse["ctidRequest"]
|
||||
if !exists {
|
||||
t.Fatal("响应中缺少ctidRequest字段")
|
||||
}
|
||||
|
||||
ctidAuth, exists := ctidRequest.(map[string]interface{})["ctidAuth"]
|
||||
if !exists {
|
||||
t.Fatal("响应中缺少ctidAuth字段")
|
||||
}
|
||||
|
||||
authData := ctidAuth.(map[string]interface{})
|
||||
|
||||
// 验证字段值
|
||||
expectedFields := map[string]string{
|
||||
"resultCode": "1002",
|
||||
"resultMsg": "身份证号不匹配",
|
||||
"name": "张三",
|
||||
"idCard": "110101199001011235",
|
||||
"verifyResult": "不一致",
|
||||
}
|
||||
|
||||
for field, expectedValue := range expectedFields {
|
||||
if authData[field] != expectedValue {
|
||||
t.Errorf("字段%s期望值为%s,实际为%s", field, expectedValue, authData[field])
|
||||
}
|
||||
}
|
||||
|
||||
t.Logf("测试成功,失败响应结构: %s", string(jsonData))
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package yysy
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
|
||||
"tyapi-server/internal/domains/api/dto"
|
||||
"tyapi-server/internal/domains/api/services/processors"
|
||||
)
|
||||
|
||||
// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口原始 body(不做字段映射)
|
||||
func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) {
|
||||
var paramsDto dto.YYSYBE08Req
|
||||
if err := json.Unmarshal(params, ¶msDto); err != nil {
|
||||
return nil, errors.Join(processors.ErrSystem, err)
|
||||
}
|
||||
|
||||
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
|
||||
return nil, errors.Join(processors.ErrInvalidParam, err)
|
||||
}
|
||||
|
||||
return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard)
|
||||
}
|
||||
|
||||
// callAliyunIDCardCheckRaw POST api-mall/api/id_card/check(form: name、idcard),返回响应体原文,供 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)
|
||||
}
|
||||
Reference in New Issue
Block a user