Ver código fonte

feat: 印章授权支持按契约锁 companyId 定位企业

新增 CompanyLocateParams,印章静默授权与状态查询优先使用法人单位 id。

Co-authored-by: Cursor <cursoragent@cursor.com>
郭铭泽 1 semana atrás
pai
commit
e657f668d4
1 arquivos alterados com 62 adições e 5 exclusões
  1. 62 5
      auth.go

+ 62 - 5
auth.go

@@ -63,12 +63,42 @@ func (c *Client) CompanyCertificationURL(p OrgCertParams) (string, error) {
 	return resp.AuthURL, nil
 }
 
-// CompanyCertificationStatus 查询法人单位认证状态;未注册时 found=false。
+// CompanyLocateParams 定位契约锁法人单位;与开放平台一致:id > name > registerNo > openCompanyId。
+type CompanyLocateParams struct {
+	ID            string
+	OpenCompanyID string
+	Name          string
+	RegisterNo    string
+}
+
+func (p CompanyLocateParams) toCompanyRequest() (*common.CompanyRequest, error) {
+	switch {
+	case p.ID != "":
+		return &common.CompanyRequest{Id: p.ID}, nil
+	case p.Name != "":
+		return &common.CompanyRequest{Name: p.Name}, nil
+	case p.RegisterNo != "":
+		return &common.CompanyRequest{RegisterNo: p.RegisterNo}, nil
+	case p.OpenCompanyID != "":
+		return &common.CompanyRequest{OpenCompanyId: p.OpenCompanyID}, nil
+	default:
+		return nil, ErrInvalidParams
+	}
+}
+
+// CompanyCertificationStatus 按 openCompanyId 查询法人单位认证状态;未注册时 found=false。
 func (c *Client) CompanyCertificationStatus(openCompanyID string) (*CompanyAuthStatus, bool, error) {
+	return c.CompanyCertificationStatusFor(CompanyLocateParams{OpenCompanyID: openCompanyID})
+}
+
+// CompanyCertificationStatusFor 按多种键查询法人单位认证状态。
+func (c *Client) CompanyCertificationStatusFor(company CompanyLocateParams) (*CompanyAuthStatus, bool, error) {
+	fields, err := company.toStatusFields()
+	if err != nil {
+		return nil, false, err
+	}
 	var resp companyCertStatusResp
-	err := c.postMultipart("/companyauth/status", map[string]string{
-		"openCompanyId": openCompanyID,
-	}, "", nil, &resp)
+	err = c.postMultipart("/companyauth/status", fields, "", nil, &resp)
 	if err != nil {
 		return nil, false, err
 	}
@@ -81,15 +111,42 @@ func (c *Client) CompanyCertificationStatus(openCompanyID string) (*CompanyAuthS
 	return &resp.Result, true, nil
 }
 
+func (p CompanyLocateParams) toStatusFields() (map[string]string, error) {
+	switch {
+	case p.ID != "":
+		return map[string]string{"id": p.ID}, nil
+	case p.Name != "":
+		return map[string]string{"name": p.Name}, nil
+	case p.RegisterNo != "":
+		return map[string]string{"registerNo": p.RegisterNo}, nil
+	case p.OpenCompanyID != "":
+		return map[string]string{"openCompanyId": p.OpenCompanyID}, nil
+	default:
+		return nil, ErrInvalidParams
+	}
+}
+
 // CompanySealAuthURL 获取机构印章静默授权页;authEnd 为空则默认 1 年。
 func (c *Client) CompanySealAuthURL(openCompanyID, adminMobile string, authEnd time.Time) (string, error) {
+	return c.CompanySealAuthURLFor(CompanyLocateParams{OpenCompanyID: openCompanyID}, adminMobile, authEnd)
+}
+
+// CompanySealAuthURLFor 按法人单位定位参数获取印章静默授权页。
+func (c *Client) CompanySealAuthURLFor(company CompanyLocateParams, adminMobile string, authEnd time.Time) (string, error) {
+	if adminMobile == "" {
+		return "", ErrInvalidParams
+	}
+	companyReq, err := company.toCompanyRequest()
+	if err != nil {
+		return "", err
+	}
 	if authEnd.IsZero() {
 		authEnd = time.Now().Add(DefaultCompanySealAuthDuration)
 	}
 	timeEditable := false
 	req := v2auth_request.V2AuthCompanysignsilentUrlRequest{
 		SealMultipleRequest: &common.SealMultipleRequest{
-			Company: &common.CompanyRequest{OpenCompanyId: openCompanyID},
+			Company: companyReq,
 		},
 		AuthUser:           &common.SilentUserRequest{Mobile: adminMobile},
 		AuthInformation:    []string{"AUTHORIZE_SEAL", "AUTHORIZE_COMPANY_CERTIFICATE"},