| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | package serviceimport (	"bytes"	"city_chips/internal/repository"	"city_chips/pkg/helper/rsaEncrypt"	"encoding/json"	"errors"	"fmt"	"github.com/spf13/viper"	"github.com/tidwall/gjson"	"io"	"io/ioutil"	"net/http")type ConferenceService interface {	GetToken() (string, error)	SendRequest(client HTTPClient, method, url string, body interface{}) ([]byte, error)}func NewConferenceService(service *Service, conferenceRepository repository.ConferenceRepository, conf *viper.Viper) ConferenceService {	return &conferenceService{		Service:              service,		conferenceRepository: conferenceRepository,		conf:                 conf,	}}type conferenceService struct {	*Service	conferenceRepository repository.ConferenceRepository	conf                 *viper.Viper}type HTTPClient interface {	Do(req *http.Request) (*http.Response, error)}// SendRequest 发送HTTP请求,并返回响应数据或错误信息。func (s *conferenceService) SendRequest(client HTTPClient, method, url string, body interface{}) ([]byte, error) {	token, err := s.GetToken()	if err != nil {		return nil, err	}	token = "Bearer " + token	var requestBody io.Reader	if body != nil {		jsonBytes, err := json.Marshal(body)		if err != nil {			return nil, err		}		requestBody = bytes.NewBuffer(jsonBytes)	}	req, err := http.NewRequest(method, url, requestBody)	if err != nil {		return nil, err	}	if method == "POST" {		req.Header.Set("Content-Type", "application/json")	} else if method == "GET" {		req.Header.Set("Content-Type", "application/json")	}	if token != "" {		req.Header.Set("Authorization", token)	}	resp, err := client.Do(req)	if err != nil {		return nil, err	}	defer resp.Body.Close()	responseBody, err := io.ReadAll(resp.Body)	if err != nil {		return nil, err	}	if resp.StatusCode >= 400 {		return nil, fmt.Errorf("bad status: %s", resp.Status)	}	return responseBody, nil}func (s *conferenceService) GetToken() (string, error) {	baseUrl := s.conf.GetString("conference.baseurl")	getPublicKey := baseUrl + s.conf.GetString("conference.getPublicKey")	login := baseUrl + s.conf.GetString("conference.login")	// 准备登录数据	s.conf.GetString("conference.mobile")	loginData := map[string]string{		"mobile":   s.conf.GetString("conference.mobile"),		"password": s.conf.GetString("conference.password"),	}	jsonStr, err := json.Marshal(loginData)	if err != nil {		return "", nil	}	token, err := rsaEncrypt.GetToken(getPublicKey, jsonStr)	// 构造请求参数	data := map[string]string{		"admin":       "0",		"client_type": "web",		"secret":      token,	}	jsonData, _ := json.Marshal(data)	// 发送登录请求	resp, err := http.Post(login, "application/json", bytes.NewBuffer(jsonData))	if err != nil {		return "", err	}	defer resp.Body.Close()	body, err := ioutil.ReadAll(resp.Body)	if err != nil {		return "", err	}	if gjson.Get(string(body), "code").Int() == 0 {		s := gjson.Get(string(body), "data.token").String()		return s, nil	}	return "", errors.New("获取token失败")}
 |