This commit is contained in:
2026-03-21 19:11:11 +08:00
5 changed files with 189 additions and 59 deletions

View File

@@ -4,10 +4,11 @@ import (
"context"
"encoding/json"
"errors"
"strconv"
"strings"
"tyapi-server/internal/domains/api/dto"
"tyapi-server/internal/domains/api/services/processors"
"tyapi-server/internal/infrastructure/external/alicloud"
)
// ProcessYYSYBE08Request YYSYBE08 API处理方法 - 使用数脉二要素验证
@@ -34,31 +35,21 @@ 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 {
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)
}
if errors.Is(aerr, alicloud.ErrSystem) {
return nil, errors.Join(processors.ErrSystem, aerr)
}
return nil, errors.Join(processors.ErrSystem, aerr)
}
return rawBytes, nil
return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard)
}
}
// 解析数脉 /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 {
@@ -79,30 +70,7 @@ 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: // 一致(收费)
resultCode = "0XXX"
verifyResult = "一致"
resultMsg = shumaiData.Desc
if resultMsg == "" {
resultMsg = "成功"
}
case 1: // 不一致(收费)
resultCode = "5XXX"
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{}{
@@ -119,3 +87,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
}
}

View File

@@ -7,9 +7,10 @@ import (
"tyapi-server/internal/domains/api/dto"
"tyapi-server/internal/domains/api/services/processors"
"tyapi-server/internal/infrastructure/external/alicloud"
)
// ProcessYYSYBE08testRequest 与 YYSYBE08 相同入参,底层使用阿里云市场身份证二要素校验;响应为阿里云接口原始 body不做字段映射
// 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, &paramsDto); err != nil {
@@ -23,12 +24,40 @@ func ProcessYYSYBE08testRequest(ctx context.Context, params []byte, deps *proces
return callAliyunIDCardCheckRaw(ctx, deps, paramsDto.Name, paramsDto.IDCard)
}
// callAliyunIDCardCheckRaw POST api-mall/api/id_card/checkform: name、idcard返回响应体原文,供 YYSYBE08TEST 与 YYSYBE08 数脉失败兜底共用
// callAliyunIDCardCheckRaw POST api-mall/api/id_card/checkform: 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,
}
return deps.AlicloudService.CallAPI("api-mall/api/id_card/check", reqData)
respBytes, err := deps.AlicloudService.CallAPI("api-mall/api/id_card/check", reqData)
if err != nil {
if errors.Is(err, alicloud.ErrDatasource) {
return nil, errors.Join(processors.ErrDatasource, err)
}
return nil, errors.Join(processors.ErrSystem, err)
}
var aliyunData struct {
Result interface{} `json:"result"`
Desc string `json:"desc"`
}
if err := json.Unmarshal(respBytes, &aliyunData); err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
resultCode, verifyResult, resultMsg := mapIDCardCheckResult(aliyunData.Result, aliyunData.Desc)
response := map[string]interface{}{
"ctidRequest": map[string]interface{}{
"ctidAuth": map[string]interface{}{
"idCard": idCard,
"name": name,
"resultCode": resultCode,
"resultMsg": resultMsg,
"verifyResult": verifyResult,
},
},
}
return json.Marshal(response)
}