auth.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package qiyuesuosdk
  2. import (
  3. "time"
  4. v2auth_request "git.sxidc.com/student-physical-examination/contract_lock_sdk/model/v2auth/request"
  5. v2auth_response "git.sxidc.com/student-physical-examination/contract_lock_sdk/model/v2auth/response"
  6. "git.sxidc.com/student-physical-examination/contract_lock_sdk/model/common"
  7. )
  8. type companyCertPageResp struct {
  9. apiResponse
  10. AuthURL string `json:"authurl"`
  11. }
  12. type companyCertStatusResp struct {
  13. apiResponse
  14. Result CompanyAuthStatus `json:"result"`
  15. }
  16. type companySealAuthURLResp struct {
  17. apiResponse
  18. Result v2auth_response.V2AuthCompanysignsilentUrlResponse `json:"result"`
  19. }
  20. type companyAuthRecordResp struct {
  21. apiResponse
  22. Result []common.AuthorizedSealRecordBean `json:"result"`
  23. }
  24. // CompanyCertificationURL 获取法人单位在线认证页 URL。
  25. func (c *Client) CompanyCertificationURL(p OrgCertParams) (string, error) {
  26. if p.OpenCompanyID == "" || p.Mobile == "" || p.CompanyName == "" || p.Charger == "" {
  27. return "", ErrInvalidParams
  28. }
  29. type reqBody struct {
  30. Name string `json:"name"`
  31. Charger string `json:"charger"`
  32. Mobile string `json:"mobile"`
  33. OpenCompanyId string `json:"openCompanyId"`
  34. Modes []string `json:"modes"`
  35. Customer bool `json:"customer"`
  36. }
  37. fields, err := structFormFields(reqBody{
  38. Name: p.CompanyName,
  39. Charger: p.Charger,
  40. Mobile: p.Mobile,
  41. OpenCompanyId: p.OpenCompanyID,
  42. Modes: []string{"AUTHFILE", "BANKPAY"},
  43. Customer: true,
  44. }, ",")
  45. if err != nil {
  46. return "", err
  47. }
  48. var resp companyCertPageResp
  49. err = c.postMultipart("/companyauth/pcpage", fields, "", nil, &resp)
  50. if err != nil {
  51. return "", err
  52. }
  53. if err = resp.err(); err != nil {
  54. return "", err
  55. }
  56. return resp.AuthURL, nil
  57. }
  58. // CompanyLocateParams 定位契约锁法人单位;与开放平台一致:id > name > registerNo > openCompanyId。
  59. type CompanyLocateParams struct {
  60. ID string
  61. OpenCompanyID string
  62. Name string
  63. RegisterNo string
  64. }
  65. func (p CompanyLocateParams) toCompanyRequest() (*common.CompanyRequest, error) {
  66. switch {
  67. case p.ID != "":
  68. return &common.CompanyRequest{Id: p.ID}, nil
  69. case p.Name != "":
  70. return &common.CompanyRequest{Name: p.Name}, nil
  71. case p.RegisterNo != "":
  72. return &common.CompanyRequest{RegisterNo: p.RegisterNo}, nil
  73. case p.OpenCompanyID != "":
  74. return &common.CompanyRequest{OpenCompanyId: p.OpenCompanyID}, nil
  75. default:
  76. return nil, ErrInvalidParams
  77. }
  78. }
  79. // CompanyCertificationStatus 按 openCompanyId 查询法人单位认证状态;未注册时 found=false。
  80. func (c *Client) CompanyCertificationStatus(openCompanyID string) (*CompanyAuthStatus, bool, error) {
  81. return c.CompanyCertificationStatusFor(CompanyLocateParams{OpenCompanyID: openCompanyID})
  82. }
  83. // CompanyCertificationStatusFor 按多种键查询法人单位认证状态。
  84. func (c *Client) CompanyCertificationStatusFor(company CompanyLocateParams) (*CompanyAuthStatus, bool, error) {
  85. fields, err := company.toStatusFields()
  86. if err != nil {
  87. return nil, false, err
  88. }
  89. var resp companyCertStatusResp
  90. err = c.postMultipart("/companyauth/status", fields, "", nil, &resp)
  91. if err != nil {
  92. return nil, false, err
  93. }
  94. if err = resp.err(); err != nil {
  95. if resp.Code == 2002002 {
  96. return nil, false, nil
  97. }
  98. return nil, false, err
  99. }
  100. return &resp.Result, true, nil
  101. }
  102. func (p CompanyLocateParams) toStatusFields() (map[string]string, error) {
  103. switch {
  104. case p.ID != "":
  105. return map[string]string{"id": p.ID}, nil
  106. case p.Name != "":
  107. return map[string]string{"name": p.Name}, nil
  108. case p.RegisterNo != "":
  109. return map[string]string{"registerNo": p.RegisterNo}, nil
  110. case p.OpenCompanyID != "":
  111. return map[string]string{"openCompanyId": p.OpenCompanyID}, nil
  112. default:
  113. return nil, ErrInvalidParams
  114. }
  115. }
  116. // CompanySealAuthURL 获取机构印章静默授权页;authEnd 为空则默认 1 年。
  117. func (c *Client) CompanySealAuthURL(openCompanyID, adminMobile string, authEnd time.Time) (string, error) {
  118. return c.CompanySealAuthURLFor(CompanyLocateParams{OpenCompanyID: openCompanyID}, adminMobile, authEnd)
  119. }
  120. // CompanySealAuthURLFor 按法人单位定位参数获取印章静默授权页。
  121. func (c *Client) CompanySealAuthURLFor(company CompanyLocateParams, adminMobile string, authEnd time.Time) (string, error) {
  122. if adminMobile == "" {
  123. return "", ErrInvalidParams
  124. }
  125. companyReq, err := company.toCompanyRequest()
  126. if err != nil {
  127. return "", err
  128. }
  129. if authEnd.IsZero() {
  130. authEnd = time.Now().Add(DefaultCompanySealAuthDuration)
  131. }
  132. timeEditable := false
  133. req := v2auth_request.V2AuthCompanysignsilentUrlRequest{
  134. SealMultipleRequest: &common.SealMultipleRequest{
  135. Company: companyReq,
  136. },
  137. AuthUser: &common.SilentUserRequest{Mobile: adminMobile},
  138. AuthInformation: []string{"AUTHORIZE_SEAL", "AUTHORIZE_COMPANY_CERTIFICATE"},
  139. AuthorizedMode: []string{"FACEAUTH", "PINAUTH"},
  140. AuthEndDate: authEnd.Format("2006-01-02"),
  141. AuthTimeModifiable: &timeEditable,
  142. }
  143. var resp companySealAuthURLResp
  144. if err := c.postJSON("/v2/auth/companysignsilent/url", req, &resp); err != nil {
  145. return "", err
  146. }
  147. if err := resp.err(); err != nil {
  148. return "", err
  149. }
  150. return resp.Result.Url, nil
  151. }
  152. // QueryCompanySealAuthRecords 查询机构静默授权记录;status 传 "EFFECT" 查有效授权。
  153. func (c *Client) QueryCompanySealAuthRecords(openCompanyID, status string) ([]AuthRecord, error) {
  154. req := v2auth_request.V2AuthSignsilentCompanyRecordRequest{
  155. AuthCompany: &common.CompanyRequest{OpenCompanyId: openCompanyID},
  156. Status: status,
  157. }
  158. var resp companyAuthRecordResp
  159. if err := c.postJSON("/v2/auth/signsilent/company/record", req, &resp); err != nil {
  160. return nil, err
  161. }
  162. if err := resp.err(); err != nil {
  163. return nil, err
  164. }
  165. out := make([]AuthRecord, 0, len(resp.Result))
  166. for _, item := range resp.Result {
  167. out = append(out, AuthRecord{
  168. Status: item.AuthorizedSealRecord.Status,
  169. StartTime: item.AuthorizedSealRecord.StartTime,
  170. EndTime: item.AuthorizedSealRecord.EndTime,
  171. AuthScope: item.AuthorizedSealRecord.AuthScope,
  172. })
  173. }
  174. return out, nil
  175. }
  176. // IsCompanySealAuthorized 是否存在有效机构印章静默授权。
  177. func (c *Client) IsCompanySealAuthorized(openCompanyID string) (bool, error) {
  178. records, err := c.QueryCompanySealAuthRecords(openCompanyID, "EFFECT")
  179. if err != nil {
  180. return false, err
  181. }
  182. return len(records) > 0, nil
  183. }