From edd680602b2e8d4534686d7ba095b099efe63d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Mon, 20 Mar 2023 17:27:47 +0800 Subject: [PATCH] 1 --- platformapi/uinapp/uinapp_send_msg.go | 3 +- platformapi/uinapp/uinapp_token.go | 7 +- platformapi/unipushapi/unipushapi.go | 435 +++++++++++----------- platformapi/unipushapi/unipushapi_test.go | 83 +++-- 4 files changed, 265 insertions(+), 263 deletions(-) diff --git a/platformapi/uinapp/uinapp_send_msg.go b/platformapi/uinapp/uinapp_send_msg.go index b7a87ea0..f313cab1 100644 --- a/platformapi/uinapp/uinapp_send_msg.go +++ b/platformapi/uinapp/uinapp_send_msg.go @@ -20,14 +20,13 @@ type SendMsgRes struct { } func (a *API) SendMsgByUinApp(parma map[string]interface{}) error { - if err := a.CheckTokenIsExpire(); err != nil { + if _, err := a.CheckTokenIsExpire(); err != nil { return err } data, _ := json.Marshal(parma) fmt.Println(string(data)) result, err := a.AccessAPI(BaseUrl+a.appId, PushMsgByCid, http.MethodPost, parma) - fmt.Println(err.Error()) if err != nil && !strings.Contains(err.Error(), "success") { return err } diff --git a/platformapi/uinapp/uinapp_token.go b/platformapi/uinapp/uinapp_token.go index 2f638ec3..494ccbc9 100644 --- a/platformapi/uinapp/uinapp_token.go +++ b/platformapi/uinapp/uinapp_token.go @@ -122,10 +122,11 @@ func (a *API) GetUinAppToken() error { // CheckTokenIsExpire 校验头肯是否过期 // 注:鉴权接口每分钟最大调用量为100次,每天最大调用量为10万次,建议开发者妥善管理token,以免达到限制,影响推送.感觉不做缓存也够用了! -func (a *API) CheckTokenIsExpire() error { +func (a *API) CheckTokenIsExpire() (string, error) { // 没有token或者token过期了 if a.token == "" || a.expireTime == "" || utils.Str2Int64(a.expireTime) < (time.Now().UnixNano()/1e6) { - return a.GetUinAppToken() + a.GetUinAppToken() + return a.token, nil } - return nil + return a.token, nil } diff --git a/platformapi/unipushapi/unipushapi.go b/platformapi/unipushapi/unipushapi.go index cf8136d0..6cd92f33 100644 --- a/platformapi/unipushapi/unipushapi.go +++ b/platformapi/unipushapi/unipushapi.go @@ -1,219 +1,220 @@ package unipushapi -import ( - "crypto/sha256" - "encoding/hex" - "encoding/json" - "fmt" - "net/http" - "strings" - "sync" - "time" - - "git.rosy.net.cn/baseapi/platformapi" - "git.rosy.net.cn/baseapi/utils" -) - -const ( - prodURL = "https://restapi.getui.com/v2" - - authAction = "auth" - SuccessOffLine = "successed_offline" - SuccessONLine = "successed_online" -) - -type TokenInfo struct { - ExpireTime string `json:"expire_time"` - Token string `json:"token"` -} - -type API struct { - token string - appID string - appKey string - appSecret string - masterSecret string - - client *http.Client - config *platformapi.APIConfig - locker sync.RWMutex -} - -func New(appID, appKey, appSecret, masterSecret string, config ...*platformapi.APIConfig) *API { - curConfig := platformapi.DefAPIConfig - if len(config) > 0 { - curConfig = *config[0] - } - return &API{ - appID: appID, - appKey: appKey, - appSecret: appSecret, - masterSecret: masterSecret, - - client: &http.Client{Timeout: curConfig.ClientTimeout}, - config: &curConfig, - } -} - -func (a *API) signParam(appKey string, time int64, masterSecret string) (sig string) { - //方法一: - //创建一个基于SHA256算法的hash.Hash接口的对象 - hash := sha256.New() - //输入数据 - hash.Write([]byte(appKey + utils.Int64ToStr(time) + masterSecret)) - //计算哈希值 - bytes := hash.Sum(nil) - //将字符串编码为16进制格式,返回字符串 - hashCode := hex.EncodeToString(bytes) - //返回哈希值 - return hashCode -} - -func (a *API) AccessAPI(action string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) { - params := make(map[string]interface{}) - time := time.Now().UnixNano() / 1e6 - params["timestamp"] = utils.Int64ToStr(time) - params["appkey"] = a.appKey - params["sign"] = a.signParam(a.appKey, time, a.masterSecret) - result, _ := json.MarshalIndent(params, "", " ") - fullURL := utils.GenerateGetURL(prodURL+"/"+a.appID, action, nil) - err = platformapi.AccessPlatformAPIWithRetry(a.client, - func() *http.Request { - request, _ := http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(result))) - if action != authAction { - request.Header.Set("token", a.CBGetToken()) - } - request.Header.Set("Content-Type", "application/json;charset=utf-8") - return request - }, - a.config, - 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 { - if jsonResult1["msg"].(string) != "success" { - errLevel = platformapi.ErrLevelGeneralFail - err = utils.NewErrorCode(jsonResult1["msg"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["code"]))) - } - retVal = jsonResult1["data"].(map[string]interface{}) - } - return errLevel, err - }) - return retVal, err -} - -func (a *API) AccessAPI2(action string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) { - result, _ := json.MarshalIndent(bizParams, "", " ") - fullURL := utils.GenerateGetURL(prodURL+"/"+a.appID, action, nil) - err = platformapi.AccessPlatformAPIWithRetry(a.client, - func() *http.Request { - request, _ := http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(result))) - request.Header.Set("token", a.CBGetToken()) - request.Header.Set("Content-Type", "application/json;charset=utf-8") - return request - }, - a.config, - 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 { - if jsonResult1["msg"].(string) != "success" { - errLevel = platformapi.ErrLevelGeneralFail - err = utils.NewErrorCode(jsonResult1["msg"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["code"]))) - } - retVal = jsonResult1 - } - return errLevel, err - }) - return retVal, err -} - -func (a *API) CBSetToken(newToken string) bool { - curToken := a.CBGetToken() - if curToken != newToken { - a.locker.Lock() - defer a.locker.Unlock() - a.token = newToken - return true - } - return false -} - -func (a *API) CBGetToken() string { - a.locker.RLock() - defer a.locker.RUnlock() - return a.token -} - -func (a *API) CBRetrieveToken() (tokenInfo *TokenInfo, err error) { - result, err := a.AccessAPI("auth", nil) - if err != nil { - return nil, err - } - tokenInfo = &TokenInfo{ - Token: utils.Interface2String(result["token"]), - ExpireTime: utils.Interface2String(result["expire_time"]), - } - a.CBSetToken(tokenInfo.Token) - return tokenInfo, nil -} - -type PushMsg struct { - Notificatio Notification `json:"notification"` -} - -type Notification struct { - Title string `json:"title"` - Body string `json:"body"` - ClickType string `json:"click_type"` - URL string `json:"url"` -} - -type Audience struct { - CID []string `json:"cid"` -} - -type Settings struct { - TTL int `json:"ttl"` -} - -type Transmission struct { - Transmission string `json:"transmission"` -} - -func (a *API) PushToSingle(cid string, transmission bool, notification *Notification) (status string, err error) { - params := map[string]interface{}{ - "request_id": utils.GetUUID(), - "audience": &Audience{ - []string{cid}, - }, - } - if !transmission { - params["push_message"] = &PushMsg{ - Notificatio: Notification{ - Title: notification.Title, - Body: notification.Body, - ClickType: "startapp", //打开应用首页 - }, - } - } else { - params["push_message"] = &Transmission{ - Transmission: notification.Body, - } - } - result2, err := a.AccessAPI2("push/single/cid", params) - if err != nil { - return "", err - } else { - for _, v := range result2["data"].(map[string]interface{}) { - for _, vv := range v.(map[string]interface{}) { - if vv.(string) != "" { - status = vv.(string) - } - } - } - } - return status, nil -} +// +//import ( +// "crypto/sha256" +// "encoding/hex" +// "encoding/json" +// "fmt" +// "net/http" +// "strings" +// "sync" +// "time" +// +// "git.rosy.net.cn/baseapi/platformapi" +// "git.rosy.net.cn/baseapi/utils" +//) +// +//const ( +// prodURL = "https://restapi.getui.com/v2" +// +// authAction = "auth" +// SuccessOffLine = "successed_offline" +// SuccessONLine = "successed_online" +//) +// +//type TokenInfo struct { +// ExpireTime string `json:"expire_time"` +// Token string `json:"token"` +//} +// +//type API struct { +// token string +// appID string +// appKey string +// appSecret string +// masterSecret string +// +// client *http.Client +// config *platformapi.APIConfig +// locker sync.RWMutex +//} +// +//func New(appID, appKey, appSecret, masterSecret string, config ...*platformapi.APIConfig) *API { +// curConfig := platformapi.DefAPIConfig +// if len(config) > 0 { +// curConfig = *config[0] +// } +// return &API{ +// appID: appID, +// appKey: appKey, +// appSecret: appSecret, +// masterSecret: masterSecret, +// +// client: &http.Client{Timeout: curConfig.ClientTimeout}, +// config: &curConfig, +// } +//} +// +//func (a *API) signParam(appKey string, time int64, masterSecret string) (sig string) { +// //方法一: +// //创建一个基于SHA256算法的hash.Hash接口的对象 +// hash := sha256.New() +// //输入数据 +// hash.Write([]byte(appKey + utils.Int64ToStr(time) + masterSecret)) +// //计算哈希值 +// bytes := hash.Sum(nil) +// //将字符串编码为16进制格式,返回字符串 +// hashCode := hex.EncodeToString(bytes) +// //返回哈希值 +// return hashCode +//} +// +//func (a *API) AccessAPI(action string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) { +// params := make(map[string]interface{}) +// time := time.Now().UnixNano() / 1e6 +// params["timestamp"] = utils.Int64ToStr(time) +// params["appkey"] = a.appKey +// params["sign"] = a.signParam(a.appKey, time, a.masterSecret) +// result, _ := json.MarshalIndent(params, "", " ") +// fullURL := utils.GenerateGetURL(prodURL+"/"+a.appID, action, nil) +// err = platformapi.AccessPlatformAPIWithRetry(a.client, +// func() *http.Request { +// request, _ := http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(result))) +// if action != authAction { +// request.Header.Set("token", a.CBGetToken()) +// } +// request.Header.Set("Content-Type", "application/json;charset=utf-8") +// return request +// }, +// a.config, +// 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 { +// if jsonResult1["msg"].(string) != "success" { +// errLevel = platformapi.ErrLevelGeneralFail +// err = utils.NewErrorCode(jsonResult1["msg"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["code"]))) +// } +// retVal = jsonResult1["data"].(map[string]interface{}) +// } +// return errLevel, err +// }) +// return retVal, err +//} +// +//func (a *API) AccessAPI2(action string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) { +// result, _ := json.MarshalIndent(bizParams, "", " ") +// fullURL := utils.GenerateGetURL(prodURL+"/"+a.appID, action, nil) +// err = platformapi.AccessPlatformAPIWithRetry(a.client, +// func() *http.Request { +// request, _ := http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(result))) +// request.Header.Set("token", a.CBGetToken()) +// request.Header.Set("Content-Type", "application/json;charset=utf-8") +// return request +// }, +// a.config, +// 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 { +// if jsonResult1["msg"].(string) != "success" { +// errLevel = platformapi.ErrLevelGeneralFail +// err = utils.NewErrorCode(jsonResult1["msg"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["code"]))) +// } +// retVal = jsonResult1 +// } +// return errLevel, err +// }) +// return retVal, err +//} +// +//func (a *API) CBSetToken(newToken string) bool { +// curToken := a.CBGetToken() +// if curToken != newToken { +// a.locker.Lock() +// defer a.locker.Unlock() +// a.token = newToken +// return true +// } +// return false +//} +// +//func (a *API) CBGetToken() string { +// a.locker.RLock() +// defer a.locker.RUnlock() +// return a.token +//} +// +//func (a *API) CBRetrieveToken() (tokenInfo *TokenInfo, err error) { +// result, err := a.AccessAPI("auth", nil) +// if err != nil { +// return nil, err +// } +// tokenInfo = &TokenInfo{ +// Token: utils.Interface2String(result["token"]), +// ExpireTime: utils.Interface2String(result["expire_time"]), +// } +// a.CBSetToken(tokenInfo.Token) +// return tokenInfo, nil +//} +// +//type PushMsg struct { +// Notificatio Notification `json:"notification"` +//} +// +//type Notification struct { +// Title string `json:"title"` +// Body string `json:"body"` +// ClickType string `json:"click_type"` +// URL string `json:"url"` +//} +// +//type Audience struct { +// CID []string `json:"cid"` +//} +// +//type Settings struct { +// TTL int `json:"ttl"` +//} +// +//type Transmission struct { +// Transmission string `json:"transmission"` +//} +// +//func (a *API) PushToSingle(cid string, transmission bool, notification *Notification) (status string, err error) { +// params := map[string]interface{}{ +// "request_id": utils.GetUUID(), +// "audience": &Audience{ +// []string{cid}, +// }, +// } +// if !transmission { +// params["push_message"] = &PushMsg{ +// Notificatio: Notification{ +// Title: notification.Title, +// Body: notification.Body, +// ClickType: "startapp", //打开应用首页 +// }, +// } +// } else { +// params["push_message"] = &Transmission{ +// Transmission: notification.Body, +// } +// } +// result2, err := a.AccessAPI2("push/single/cid", params) +// if err != nil { +// return "", err +// } else { +// for _, v := range result2["data"].(map[string]interface{}) { +// for _, vv := range v.(map[string]interface{}) { +// if vv.(string) != "" { +// status = vv.(string) +// } +// } +// } +// } +// return status, nil +//} diff --git a/platformapi/unipushapi/unipushapi_test.go b/platformapi/unipushapi/unipushapi_test.go index 7b9be79a..13131b4b 100644 --- a/platformapi/unipushapi/unipushapi_test.go +++ b/platformapi/unipushapi/unipushapi_test.go @@ -1,43 +1,44 @@ package unipushapi -import ( - "testing" - - "git.rosy.net.cn/baseapi" - "git.rosy.net.cn/baseapi/utils" - "go.uber.org/zap" -) - -var ( - api *API - sugarLogger *zap.SugaredLogger -) - -func init() { - logger, _ := zap.NewDevelopment() - sugarLogger = logger.Sugar() - baseapi.Init(sugarLogger) - api = New("5lyyrvHODG6wC8Sdr3a9h", "iFrkUDmR2g5eqQpfh2kQ57", "WTn53qd6WAAdLMXfmXvzb7", "dGZcR0XGGg7H5Pd7FR3n47") - api.CBSetToken("cf74937695849a89bcb414e49f03702416b49024a49e7f62570280f99eb63b58") - // ef364b677911fa64d41a25d22d5e155065c4898046be65ddd627fa6c8cd87c2e -} - -func TestCBRetrieveToken(t *testing.T) { - result, err := api.CBRetrieveToken() - if err != nil { - t.Fatal(err.Error()) - } - t.Log(utils.Format4Output(result, false)) -} - -func TestPushToSingle(t *testing.T) { - result, err := api.PushToSingle("8aa96ba065a29a0135c5151819fb1666", false, &Notification{ - Title: "测试", - Body: "测测测", - }) - if err != nil { - t.Fatal(err.Error()) - } - t.Log(utils.Format4Output(result, false)) - // RASS_0911_1517001ff419d4699a0be17ac3f04a54 -} +// +//import ( +// "testing" +// +// "git.rosy.net.cn/baseapi" +// "git.rosy.net.cn/baseapi/utils" +// "go.uber.org/zap" +//) +// +//var ( +// api *API +// sugarLogger *zap.SugaredLogger +//) +// +//func init() { +// logger, _ := zap.NewDevelopment() +// sugarLogger = logger.Sugar() +// baseapi.Init(sugarLogger) +// api = New("5lyyrvHODG6wC8Sdr3a9h", "iFrkUDmR2g5eqQpfh2kQ57", "WTn53qd6WAAdLMXfmXvzb7", "dGZcR0XGGg7H5Pd7FR3n47") +// api.CBSetToken("cf74937695849a89bcb414e49f03702416b49024a49e7f62570280f99eb63b58") +// // ef364b677911fa64d41a25d22d5e155065c4898046be65ddd627fa6c8cd87c2e +//} +// +//func TestCBRetrieveToken(t *testing.T) { +// result, err := api.CBRetrieveToken() +// if err != nil { +// t.Fatal(err.Error()) +// } +// t.Log(utils.Format4Output(result, false)) +//} +// +//func TestPushToSingle(t *testing.T) { +// result, err := api.PushToSingle("8aa96ba065a29a0135c5151819fb1666", false, &Notification{ +// Title: "测试", +// Body: "测测测", +// }) +// if err != nil { +// t.Fatal(err.Error()) +// } +// t.Log(utils.Format4Output(result, false)) +// // RASS_0911_1517001ff419d4699a0be17ac3f04a54 +//}