auth.go 8.2 KB

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