修改git.rosy.net.cn -> gitrosy.jxc4.com
This commit is contained in:
@@ -1,220 +1,219 @@
|
||||
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"
|
||||
|
||||
"gitrosy.jxc4.com/baseapi/platformapi"
|
||||
"gitrosy.jxc4.com/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
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ package unipushapi
|
||||
//import (
|
||||
// "testing"
|
||||
//
|
||||
// "git.rosy.net.cn/baseapi"
|
||||
// "git.rosy.net.cn/baseapi/utils"
|
||||
// "gitrosy.jxc4.com/baseapi"
|
||||
// "gitrosy.jxc4.com/baseapi/utils"
|
||||
// "go.uber.org/zap"
|
||||
//)
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user