fix(realname): 业务 code 优先于 HTTP 状态码,并区分额度耗尽

实测服务商业务失败时 HTTP 状态码会跟着变(身份证号错误返回 400
且 result 为 null),按状态码判断会把第三方异常误判成入参错误。
改为以业务 code 为准,仅在拿不到 code 时退回状态码与网关错误头。

额度耗尽(x-ca-error-code=B403MQ)此前与限流同样提示「请求过于频繁,
请稍后再试」,但重试不会恢复,新增 ErrProviderQuotaExhausted 并提示
联系客服。网关错误原因只在响应头,一并带进错误信息便于排查。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yml2213
2026-10-02 12:03:52 +08:00
co-authored by Cursor
parent 0b220829bb
commit 281bb4be59
5 changed files with 123 additions and 28 deletions
@@ -79,6 +79,8 @@ func writeRealnameError(c *gin.Context, err error) {
response.ServiceUnavailable(c, "实名认证服务未配置")
case errors.Is(err, ErrProviderRateLimited):
response.Error(c, http.StatusTooManyRequests, "realname_rate_limited", "实名认证请求过于频繁,请稍后再试")
case errors.Is(err, ErrProviderQuotaExhausted):
response.Error(c, http.StatusServiceUnavailable, "realname_quota_exhausted", "实名认证服务额度已用尽,请联系客服处理")
case errors.Is(err, ErrProviderUnavailable):
response.Error(c, http.StatusBadGateway, "realname_provider_unavailable", "实名认证服务调用失败,请稍后重试或联系客服处理")
default: