后台用户管理新增“人工实名

This commit is contained in:
yml2213
2026-06-28 01:06:35 +08:00
parent 21aabd77f1
commit 18eba36ef9
12 changed files with 453 additions and 16 deletions
@@ -79,7 +79,7 @@ func (p *CloudMarketProvider) Start(ctx context.Context, req StartRequest) (Prov
resp, err := p.client.Do(httpReq)
if err != nil {
return ProviderResult{}, fmt.Errorf("realname cloud market request failed: %w", err)
return ProviderResult{}, fmt.Errorf("%w: realname cloud market request failed: %v", ErrProviderUnavailable, err)
}
defer resp.Body.Close()
@@ -165,7 +165,7 @@ func cloudMarketHTTPError(statusCode int, reason string) error {
func parseCloudMarketResult(raw json.RawMessage) (int, error) {
if len(raw) == 0 || string(raw) == "null" {
return 0, fmt.Errorf("realname cloud market result missing")
return 0, fmt.Errorf("%w: realname cloud market result missing", ErrProviderUnavailable)
}
var number int
if err := json.Unmarshal(raw, &number); err == nil {
@@ -184,7 +184,7 @@ func parseCloudMarketResult(raw json.RawMessage) (int, error) {
return 110, nil
}
}
return 0, fmt.Errorf("realname cloud market result invalid: %s", string(raw))
return 0, fmt.Errorf("%w: realname cloud market result invalid: %s", ErrProviderUnavailable, string(raw))
}
func firstNonEmpty(values ...string) string {
@@ -28,7 +28,7 @@ func TestCloudMarketProviderStartVerified(t *testing.T) {
defer server.Close()
provider, err := NewCloudMarketProvider(CloudMarketConfig{
URL: server.URL,
URL: server.URL,
AppCode: "test-code",
Encryptor: &crypto.MockEncryptor{},
})
@@ -62,7 +62,7 @@ func TestCloudMarketProviderStartRejected(t *testing.T) {
defer server.Close()
provider, err := NewCloudMarketProvider(CloudMarketConfig{
URL: server.URL,
URL: server.URL,
AppCode: "test-code",
Encryptor: &crypto.MockEncryptor{},
})
@@ -93,7 +93,7 @@ func TestCloudMarketProviderStartRateLimited(t *testing.T) {
defer server.Close()
provider, err := NewCloudMarketProvider(CloudMarketConfig{
URL: server.URL,
URL: server.URL,
AppCode: "test-code",
Encryptor: &crypto.MockEncryptor{},
})
@@ -110,3 +110,28 @@ func TestCloudMarketProviderStartRateLimited(t *testing.T) {
t.Fatalf("期望限流错误,实际:%v", err)
}
}
func TestCloudMarketProviderStartUnavailableOnInvalidResult(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(`{"request_id":"TID999","status":"OK","result":"busy"}`))
}))
defer server.Close()
provider, err := NewCloudMarketProvider(CloudMarketConfig{
URL: server.URL,
AppCode: "test-code",
Encryptor: &crypto.MockEncryptor{},
})
if err != nil {
t.Fatalf("创建 Provider 失败:%v", err)
}
_, err = provider.Start(t.Context(), StartRequest{
UserID: 1,
Name: "赵六",
IDNo: "110101199001011234",
})
if !errors.Is(err, ErrProviderUnavailable) {
t.Fatalf("期望服务不可用错误,实际:%v", err)
}
}
+2 -2
View File
@@ -79,8 +79,8 @@ func writeRealnameError(c *gin.Context, err error) {
case errors.Is(err, ErrProviderRateLimited):
response.Error(c, http.StatusTooManyRequests, "realname_rate_limited", "实名认证请求过于频繁,请稍后再试")
case errors.Is(err, ErrProviderUnavailable):
response.Error(c, http.StatusBadGateway, "realname_provider_unavailable", "实名认证服务调用失败,请稍后再试")
response.Error(c, http.StatusBadGateway, "realname_provider_unavailable", "实名认证服务调用失败,请稍后重试或联系客服处理")
default:
response.Error(c, http.StatusInternalServerError, "internal_error", "实名认证服务暂时不可用")
response.Error(c, http.StatusInternalServerError, "internal_error", "实名认证服务暂时不可用,请稍后重试或联系客服处理")
}
}