Ai
4 Star 11 Fork 7

夏季的风/go-push-sdk-手机消息推送SDK

Create your Gitee Account
Explore and code with more than 13.5 million developers,Free private repositories !:)
Sign up
文件
Clone or Download
message_push.go 3.79 KB
Copy Edit Raw Blame History
lingbinbin authored 2021-11-23 15:13 +08:00 . *修改推送客户端加缓存功能
package xiaomi_channel
import (
"context"
"fmt"
"gitee.com/ling-bin/go-push-sdk/push/common/http"
"gitee.com/ling-bin/go-push-sdk/push/common/intent"
"gitee.com/ling-bin/go-push-sdk/push/common/json"
"gitee.com/ling-bin/go-push-sdk/push/common/message"
"gitee.com/ling-bin/go-push-sdk/push/errcode"
"gitee.com/ling-bin/go-push-sdk/push/setting"
"net/url"
"strconv"
"strings"
)
const (
urlPush = "https://api.xmpush.xiaomi.com/v3/message/regid"
urlPushTest = "https://sandbox.xmpush.xiaomi.com/v2/message/regid"
timeout = 5
passThroughTypeZero = 0 // 0 表示通知栏消息
passThroughTypeOne = 1 // 1 表示透传消息
notifyEffectTwo = "2" // 通知栏点击后打开app的任一Activity
deviceTokenMax = 100 // 单次最大设备推送量
deviceTokenMin = 1
)
type PushClient struct {
httpClient *http.Client
conf *setting.ConfigXiaomi
}
func NewPushClient(conf *setting.ConfigXiaomi) (setting.PushClientInterface, error) {
errCheck := checkConf(conf)
if errCheck != nil {
return nil, errCheck
}
return &PushClient{
conf: conf,
httpClient: http.NewClient(timeout),
}, nil
}
func checkConf(conf *setting.ConfigXiaomi) error {
if conf.AppPkgName == "" {
return errcode.ErrXiaomiAppPkgNameEmpty
}
if conf.AppSecret == "" {
return errcode.ErrXiaomiAppSecretEmpty
}
return nil
}
func (p *PushClient) checkParam(pushRequest *setting.PushMessageRequest) error {
if err := message.CheckMessageParam(pushRequest, deviceTokenMin, deviceTokenMax, false); err != nil {
return err
}
// 其余参数检查
return nil
}
func (p *PushClient) PushNotice(ctx context.Context, pushRequest *setting.PushMessageRequest) (interface{}, error) {
errCheck := p.checkParam(pushRequest)
if errCheck != nil {
return nil, errCheck
}
return p.pushNotice(ctx, pushRequest)
}
func (p *PushClient) pushNotice(ctx context.Context, pushRequest *setting.PushMessageRequest) (*PushMessageResponse, error) {
msg := p.buildMessage(pushRequest)
pushUrl := p.buildUrl()
body, err := p.buildRequest(ctx, pushUrl, msg)
if err != nil {
return nil, err
}
return p.parseBody(body)
}
func (p *PushClient) buildMessage(pushRequest *setting.PushMessageRequest) map[string]string {
messageMap := map[string]string{
"payload": url.QueryEscape(pushRequest.Message.Content),
"restricted_package_name": p.conf.AppPkgName,
"pass_through": strconv.Itoa(passThroughTypeZero),
"title": pushRequest.Message.Title,
"description": pushRequest.Message.Content,
"registration_id": strings.Join(pushRequest.DeviceTokens, ","),
"extra.notify_effect": notifyEffectTwo,
"extra.intent_uri": intent.GenerateIntent(p.conf.AppPkgName, pushRequest.Message.Extra),
}
if pushRequest.Message.CallBack != "" {
messageMap["extra.callback"] = pushRequest.Message.CallBack
if pushRequest.Message.CallbackParam != "" {
messageMap["extra.callback.param"] = pushRequest.Message.CallbackParam
}
}
return messageMap
}
func (p *PushClient) parseBody(body []byte) (*PushMessageResponse, error) {
resp := &PushMessageResponse{}
err := json.UnmarshalByte(body, resp)
if err != nil {
return nil, errcode.ErrXiaomiParseBody
}
return resp, nil
}
func (p *PushClient) buildRequest(ctx context.Context, uri string, data map[string]string) ([]byte, error) {
request, err := p.httpClient.BuildRequest(ctx, "POST", uri, data)
if err != nil {
return nil, err
}
request.Header.Set("Authorization", fmt.Sprintf("key=%s", p.conf.AppSecret))
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
return p.httpClient.Do(ctx, request)
}
func (p *PushClient) buildUrl() string {
return urlPush
}
func (p *PushClient) GetAccessToken(ctx context.Context) (interface{}, error) {
return nil, nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/ling-bin/go-push-sdk.git
git@gitee.com:ling-bin/go-push-sdk.git
ling-bin
go-push-sdk
go-push-sdk-手机消息推送SDK
v1.2.13

Search