This commit is contained in:
2026-01-25 14:35:50 +08:00
parent 168a7c7f5f
commit 32336e4ba0
7 changed files with 139 additions and 80 deletions

View File

@@ -38,11 +38,15 @@ func ProcessIVYZ2A8BRequest(ctx context.Context, params []byte, deps *processors
"name": paramsDto.Name,
}
//走政务接口 - 使用 app_id2 和 app_secret2
deps.ShumaiService.UseGovernment()
// 以表单方式调用数脉 API参数在 CallAPIForm 内转为 application/x-www-form-urlencoded
apiPath := "/v4/id_card/check" // 接口路径,根据数脉文档填写(如 v4/xxx
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData)
// 先尝试使用政务接口app_id2 和 app_secret2
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, true)
if err != nil {
// 使用实时接口app_id 和 app_secret重试
respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false)
// 如果重试后仍然失败,或者原本就是查无记录错误,返回错误
if err != nil {
if errors.Is(err, shumai.ErrNotFound) {
// 查无记录情况
@@ -58,6 +62,7 @@ func ProcessIVYZ2A8BRequest(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
}
}
// 将数脉返回的新格式映射为原有 API 输出格式
oldFormat, err := mapIVYZ2A8BShumaiToOld(respBytes)

View File

@@ -25,11 +25,15 @@ func ProcessIVYZN2P8Request(ctx context.Context, params []byte, deps *processors
"name": paramsDto.Name,
}
//走政务接口 - 使用 app_id2 和 app_secret2
deps.ShumaiService.UseGovernment()
// 以表单方式调用数脉 API参数在 CallAPIForm 内转为 application/x-www-form-urlencoded
apiPath := "/v4/id_card/check" // 接口路径,根据数脉文档填写(如 v4/xxx
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData)
// 先尝试使用政务接口app_id2 和 app_secret2
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, true)
if err != nil {
// 使用实时接口app_id 和 app_secret重试
respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false)
// 如果重试后仍然失败,返回错误
if err != nil {
if errors.Is(err, shumai.ErrNotFound) {
// 查无记录情况
@@ -45,6 +49,7 @@ func ProcessIVYZN2P8Request(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
}
}
return respBytes, nil
}

View File

@@ -53,9 +53,14 @@ func ProcessYYSY09CDRequest(ctx context.Context, params []byte, deps *processors
"mobile": paramsDto.MobileNo,
}
deps.ShumaiService.UseGovernment()
apiPath := "/v4/mobile_three/check"
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData)
// 先尝试使用政务接口app_id2 和 app_secret2
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, true)
if err != nil {
// 使用实时接口app_id 和 app_secret重试
respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false)
// 如果重试后仍然失败,返回错误
if err != nil {
if errors.Is(err, shumai.ErrDatasource) {
return nil, errors.Join(processors.ErrDatasource, err)
@@ -65,6 +70,7 @@ func ProcessYYSY09CDRequest(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
}
}
out, err := mapShumaiMobileThreeToYYSY09CD(respBytes)
if err != nil {

View File

@@ -42,9 +42,14 @@ func ProcessYYSY9A1BRequest(ctx context.Context, params []byte, deps *processors
}
// 以表单方式调用数脉 API参数在 CallAPIForm 内转为 application/x-www-form-urlencoded
deps.ShumaiService.UseGovernment()
apiPath := "/v4/mobile_three/check"
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData)
// 先尝试使用政务接口app_id2 和 app_secret2
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, true)
if err != nil {
// 使用实时接口app_id 和 app_secret重试
respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false)
// 如果重试后仍然失败,返回错误
if err != nil {
if errors.Is(err, shumai.ErrDatasource) {
return nil, errors.Join(processors.ErrDatasource, err)
@@ -54,6 +59,7 @@ func ProcessYYSY9A1BRequest(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
}
}
// 将数脉 data 映射为最终返回格式
out, err := mapShumaiMobileThreeToYYSY9A1B(respBytes)

View File

@@ -25,14 +25,16 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors
"name": paramsDto.Name,
}
// 走政务接口 - 使用 app_id2 和 app_secret2
deps.ShumaiService.UseGovernment()
// 以表单方式调用数脉 API参数在 CallAPIForm 内转为 application/x-www-form-urlencoded
apiPath := "/v4/id_card/check"
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData)
// 先尝试使用政务接口app_id2 和 app_secret2
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, true)
if err != nil {
// 使用实时接口app_id 和 app_secret重试
respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false)
// 如果重试后仍然失败,处理错误响应 - 转换为目标格式
if err != nil {
// 处理错误响应 - 转换为目标格式
errorMsg := err.Error()
if errorMsg == "" {
errorMsg = "请求失败"
@@ -50,6 +52,7 @@ func ProcessYYSYBE08Request(ctx context.Context, params []byte, deps *processors
}
return json.Marshal(errorResponse)
}
}
// 解析数脉 /v4/id_card/check 的 data 内容CallAPIForm 返回的即 data 对象)
// 数卖响应: result 0-一致 1-不一致 2-无记录(预留); desc 如 "一致"/"不一致"

View File

@@ -27,9 +27,14 @@ func ProcessYYSYH6D2Request(ctx context.Context, params []byte, deps *processors
}
// 以表单方式调用数脉 API参数在 CallAPIForm 内转为 application/x-www-form-urlencoded
deps.ShumaiService.UseGovernment()
apiPath := "/v4/mobile_three/check" // 接口路径,根据数脉文档填写(如 v4/xxx
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData)
// 先尝试使用政务接口app_id2 和 app_secret2
respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, true)
if err != nil {
// 使用实时接口app_id 和 app_secret重试
respBytes, err = deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData, false)
// 如果重试后仍然失败,返回错误
if err != nil {
if errors.Is(err, shumai.ErrDatasource) {
// 数据源错误
@@ -42,5 +47,6 @@ func ProcessYYSYH6D2Request(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
}
}
return respBytes, nil
}

View File

@@ -79,6 +79,13 @@ func (s *ShumaiService) generateRequestID() string {
return fmt.Sprintf("shumai_%x", hash[:8])
}
// generateRequestIDWithAppID 根据指定的 AppID 生成请求ID用于不依赖全局状态的情况
func (s *ShumaiService) generateRequestIDWithAppID(appID string) string {
timestamp := time.Now().UnixNano()
hash := md5.Sum([]byte(fmt.Sprintf("%d_%s", timestamp, appID)))
return fmt.Sprintf("shumai_%x", hash[:8])
}
// getCurrentAppID 获取当前使用的 AppID
func (s *ShumaiService) getCurrentAppID() string {
if s.useGovernment && s.config.AppID2 != "" {
@@ -118,12 +125,33 @@ func (s *ShumaiService) GetConfig() ShumaiConfig {
// CallAPIForm 以表单方式调用数脉 APIapplication/x-www-form-urlencoded
// 在方法内部将 reqFormData 转为表单:先写入业务参数,再追加 appid、timestamp、sign。
// 签名算法md5(appid&timestamp&app_security)32 位小写,不足补 0。
func (s *ShumaiService) CallAPIForm(ctx context.Context, apiPath string, reqFormData map[string]interface{}) ([]byte, error) {
// useGovernment 可选参数true 表示使用政务接口app_id2false 表示使用实时接口app_id
// 如果未提供参数,则使用全局状态(通过 UseGovernment()/UseNormal() 设置)
func (s *ShumaiService) CallAPIForm(ctx context.Context, apiPath string, reqFormData map[string]interface{}, useGovernment ...bool) ([]byte, error) {
// 确定是否使用政务接口:如果提供了参数则使用参数值,否则使用全局状态
var useGov bool
if len(useGovernment) > 0 {
useGov = useGovernment[0]
} else {
// 未提供参数时,使用全局状态以保持向后兼容
useGov = s.useGovernment
}
startTime := time.Now()
requestID := s.generateRequestID()
timestamp := strconv.FormatInt(time.Now().UnixMilli(), 10)
appID := s.getCurrentAppID()
appSecret := s.getCurrentAppSecret()
// 根据参数选择使用的 AppID 和 AppSecret而不是依赖全局状态
var appID, appSecret string
if useGov && s.config.AppID2 != "" {
appID = s.config.AppID2
appSecret = s.config.AppSecret2
} else {
appID = s.config.AppID
appSecret = s.config.AppSecret
}
// 使用指定的 AppID 生成请求ID
requestID := s.generateRequestIDWithAppID(appID)
sign := GenerateSignForm(appID, timestamp, appSecret)
var transactionID string