conference.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package service
  2. import (
  3. "bytes"
  4. "city_chips/internal/repository"
  5. "city_chips/pkg/helper/rsaEncrypt"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "github.com/spf13/viper"
  10. "github.com/tidwall/gjson"
  11. "io"
  12. "io/ioutil"
  13. "net/http"
  14. )
  15. type ConferenceService interface {
  16. GetToken() (string, error)
  17. SendRequest(client HTTPClient, method, url string, body interface{}) ([]byte, error)
  18. }
  19. func NewConferenceService(service *Service, conferenceRepository repository.ConferenceRepository, conf *viper.Viper) ConferenceService {
  20. return &conferenceService{
  21. Service: service,
  22. conferenceRepository: conferenceRepository,
  23. conf: conf,
  24. }
  25. }
  26. type conferenceService struct {
  27. *Service
  28. conferenceRepository repository.ConferenceRepository
  29. conf *viper.Viper
  30. }
  31. type HTTPClient interface {
  32. Do(req *http.Request) (*http.Response, error)
  33. }
  34. // SendRequest 发送HTTP请求,并返回响应数据或错误信息。
  35. func (s *conferenceService) SendRequest(client HTTPClient, method, url string, body interface{}) ([]byte, error) {
  36. token, err := s.GetToken()
  37. if err != nil {
  38. return nil, err
  39. }
  40. token = "Bearer " + token
  41. var requestBody io.Reader
  42. if body != nil {
  43. jsonBytes, err := json.Marshal(body)
  44. if err != nil {
  45. return nil, err
  46. }
  47. requestBody = bytes.NewBuffer(jsonBytes)
  48. }
  49. req, err := http.NewRequest(method, url, requestBody)
  50. if err != nil {
  51. return nil, err
  52. }
  53. if method == "POST" {
  54. req.Header.Set("Content-Type", "application/json")
  55. } else if method == "GET" {
  56. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  57. }
  58. if token != "" {
  59. req.Header.Set("Authorization", token)
  60. }
  61. resp, err := client.Do(req)
  62. if err != nil {
  63. return nil, err
  64. }
  65. defer resp.Body.Close()
  66. responseBody, err := io.ReadAll(resp.Body)
  67. if err != nil {
  68. return nil, err
  69. }
  70. if resp.StatusCode >= 400 {
  71. return nil, fmt.Errorf("bad status: %s", resp.Status)
  72. }
  73. return responseBody, nil
  74. }
  75. func (s *conferenceService) GetToken() (string, error) {
  76. baseUrl := s.conf.GetString("conference.baseurl")
  77. getPublicKey := baseUrl + s.conf.GetString("conference.getPublicKey")
  78. login := baseUrl + s.conf.GetString("conference.login")
  79. // 准备登录数据
  80. s.conf.GetString("conference.mobile")
  81. loginData := map[string]string{
  82. "mobile": s.conf.GetString("conference.mobile"),
  83. "password": s.conf.GetString("conference.password"),
  84. }
  85. jsonStr, err := json.Marshal(loginData)
  86. if err != nil {
  87. return "", nil
  88. }
  89. token, err := rsaEncrypt.GetToken(getPublicKey, jsonStr)
  90. // 构造请求参数
  91. data := map[string]string{
  92. "admin": "0",
  93. "client_type": "web",
  94. "secret": token,
  95. }
  96. jsonData, _ := json.Marshal(data)
  97. // 发送登录请求
  98. resp, err := http.Post(login, "application/json", bytes.NewBuffer(jsonData))
  99. if err != nil {
  100. return "", err
  101. }
  102. defer resp.Body.Close()
  103. body, err := ioutil.ReadAll(resp.Body)
  104. if err != nil {
  105. return "", err
  106. }
  107. if gjson.Get(string(body), "code").Int() == 0 {
  108. s := gjson.Get(string(body), "data.token").String()
  109. return s, nil
  110. }
  111. return "", errors.New("获取token失败")
  112. }