Files
baseapi/platformapi/enterprise_wechat/wechat_client.go
邹宗楠 2ed93fe209 1
2022-10-22 22:45:36 +08:00

144 lines
3.8 KiB
Go

package enterprise_wechat
import (
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi"
"git.rosy.net.cn/baseapi/utils"
"net/http"
"strings"
"sync"
"time"
)
// 通讯录
func New(corpId, corpSecret string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
curConfig = *config[0]
}
return &API{
corpId: corpId,
corpSecret: corpSecret,
locker: sync.RWMutex{},
client: &http.Client{Timeout: curConfig.ClientTimeout},
config: &curConfig,
}
}
// 会话
func NewMin(corpId, corpSecret string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
curConfig = *config[0]
}
return &API{
corpId: corpId,
corpSecret: corpSecret,
locker: sync.RWMutex{},
client: &http.Client{Timeout: curConfig.ClientTimeout},
config: &curConfig,
}
}
// 获取token
type EnterpriseToken struct {
ErrCode int `json:"errcode"` // 错误码
ErrMsg string `json:"errmsg"` // 错误消息
AccessToken string `json:"access_token"` // 权限说明
ExpiresIn int64 `json:"expires_in"` // 过期时间
}
func (a *API) SetToken(token string) {
a.locker.Lock()
defer a.locker.Unlock()
a.accessToken = token
}
func (a *API) SetExpiresInTime(int2 int64) {
a.locker.Lock()
defer a.locker.Unlock()
a.expiresIn = time.Now().Unix() + int2
}
func (a *API) ReturnToken() string {
a.locker.Lock()
defer a.locker.Unlock()
return a.accessToken
}
// 获取access_token
func (a *API) GetAccessToken() (tokenInfo *EnterpriseToken, err error) {
parameter := make(map[string]interface{}, 2)
parameter["corpid"] = a.corpId
parameter["corpsecret"] = a.corpSecret
result, err := a.AccessAPI(WeChatBaseApi, GetToken, http.MethodGet, parameter)
if err != nil {
return nil, err
}
accessToken := &EnterpriseToken{}
if err := utils.Map2StructByJson(result, &accessToken, false); err != nil {
return nil, err
}
if accessToken.ErrCode != 0 {
return nil, errors.New(accessToken.ErrMsg)
}
a.SetToken(accessToken.AccessToken)
a.SetExpiresInTime(accessToken.ExpiresIn)
return accessToken, err
}
// 数据发送
func (a *API) AccessAPI(baseUrl, actionApi, method string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) {
data, err := json.Marshal(bizParams) // 序列化
if err != nil {
return nil, err
}
// 发送请求
sendUrl := func() *http.Request {
var request *http.Request
if http.MethodPost == method {
// 全路径请求参数
fullURL := utils.GenerateGetURL(baseUrl, actionApi, map[string]interface{}{"access_token": a.accessToken})
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(data)))
} else {
request, _ = http.NewRequest(http.MethodGet, utils.GenerateGetURL(baseUrl, actionApi, bizParams), nil)
}
request.Header.Set("Content-Type", "application/json")
return request
}
// 数据解析
dataMarshal := func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
if jsonResult1 == nil {
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
}
if err != nil {
return "", err
}
if utils.MustInterface2Int64(jsonResult1["errcode"]) != 0 {
errLevel = platformapi.ErrLevelGeneralFail
err = utils.NewErrorCode(jsonResult1["errmsg"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["errcode"])))
}
retVal = jsonResult1
return errLevel, err
}
err = platformapi.AccessPlatformAPIWithRetry(a.client, sendUrl, a.config, dataMarshal)
return retVal, err
}
// 检查token是否应该更新
func (a *API) CheckAccessTokenExpiresIn() {
if a.expiresIn == 0 || a.expiresIn <= time.Now().Unix() || a.accessToken == "" {
a.GetAccessToken()
}
return
}