gosdk/unify/ad_sdk.go

257 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package unify
import (
"encoding/json"
"fmt"
"git.u8t.cn/open/gosdk/util"
"github.com/spf13/cast"
"net/url"
"strconv"
"strings"
"time"
)
type Sdk struct {
address string
token string
}
func NewAdApi(address string, token string) *Sdk {
if address == "" {
address = "http://127.0.0.1:9281"
}
return &Sdk{
address: address,
token: token,
}
}
func (s *Sdk) httpGet(url string) error {
body, err := util.HttpGet(url, map[string]string{
"x-token": s.token,
})
if err != nil {
return err
}
type rsp_t struct {
Code int `json:"code"`
Message string `json:"message"`
}
var rsp rsp_t
if err := json.Unmarshal(body, &rsp); err != nil {
return err
}
if rsp.Code != 0 {
return fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
}
return nil
}
func (s *Sdk) httpMatchGet(url string) (*Result, error) {
body, err := util.HttpGet(url, map[string]string{
"x-token": s.token,
})
if err != nil {
return nil, err
}
type rsp_t struct {
Code int `json:"code"`
Message string `json:"message"`
Data *Result `json:"data"`
}
var rsp rsp_t
if err := json.Unmarshal(body, &rsp); err != nil {
return nil, err
}
if rsp.Code != 0 {
return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
}
return rsp.Data, nil
}
func (s *Sdk) httpDataGet(url string) (map[string]interface{}, error) {
body, err := util.HttpGet(url, map[string]string{
"x-token": s.token,
})
if err != nil {
return nil, err
}
type rsp_t struct {
Code int `json:"code"`
Message string `json:"message"`
Data map[string]interface{} `json:"data"`
}
var rsp rsp_t
if err := json.Unmarshal(body, &rsp); err != nil {
return nil, err
}
if rsp.Code != 0 {
return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
}
return rsp.Data, nil
}
func (s *Sdk) Match(c *Request) (*Result, error) {
if err := c.Check(); err != nil {
return nil, err
}
params := url.Values{}
params.Add("os", strings.ToLower(c.Os))
params.Add("ip", c.Ip)
params.Add("ipv6", c.Ipv6)
params.Add("ua", c.Ua)
params.Add("model", c.Model)
params.Add("brand", c.Brand)
params.Add("cid", c.Cid)
params.Add("idfa", c.Idfa)
params.Add("paid", c.Paid)
params.Add("oaid", c.Oaid)
params.Add("imei", c.Imei)
params.Add("channel", c.Channel)
params.Add("version", c.Version)
params.Add("os_version", c.OsVersion)
params.Add("package", c.Package)
params.Add("did", c.Did)
params.Add("active", strconv.FormatBool(c.Active))
params.Add("active_time", c.ActiveTime)
if c.Extra != nil {
extra, _ := json.Marshal(c.Extra)
params.Add("extra", string(extra))
}
u := fmt.Sprintf("%s/api/ad/client/match?%s", s.address, params.Encode())
return s.httpMatchGet(u)
}
func (s *Sdk) Active(adId int64, extra map[string]string) error {
params := url.Values{}
params.Add("adId", strconv.FormatInt(adId, 10))
if extra != nil {
ex, _ := json.Marshal(extra)
params.Add("extra", string(ex))
}
url := fmt.Sprintf("%s/api/ad/client/active?%s",
s.address, params.Encode())
return s.httpGet(url)
}
/*
extra存放扩展数据,注册相关信息都填上
unionid、phone、openid、nickname
*/
func (s *Sdk) Register(adId int64, extra map[string]string) error {
params := url.Values{}
params.Add("adId", strconv.FormatInt(adId, 10))
if extra != nil {
ex, _ := json.Marshal(extra)
params.Add("extra", string(ex))
}
url := fmt.Sprintf("%s/api/ad/client/register?%s",
s.address, params.Encode())
return s.httpGet(url)
}
/*
extra存放扩展数据,支付相关信息都填上
支付金额:payFee (单位分)
支付方式:payType(weixin、alipay、apple)
支付位置:payLocation (内容自定义)
支付商品:goodsId、goodsName
*/
func (s *Sdk) Pay(adId int64, extra map[string]string) error {
params := url.Values{}
params.Add("adId", strconv.FormatInt(adId, 10))
if extra != nil {
ex, _ := json.Marshal(extra)
params.Add("extra", string(ex))
}
url := fmt.Sprintf("%s/api/ad/client/pay?%s",
s.address, params.Encode())
return s.httpGet(url)
}
func (s *Sdk) Relation(adId int64) (*AdRelation, error) {
params := url.Values{}
params.Add("adId", strconv.FormatInt(adId, 10))
url := fmt.Sprintf("%s/api/ad/client/relation?%s",
s.address, params.Encode())
var relation AdRelation
data, err := s.httpDataGet(url)
if err != nil {
return nil, err
}
res, _ := json.Marshal(data)
json.Unmarshal(res, &relation)
return &relation, nil
}
func (s *Sdk) GetAccountReport(startDay, endDay string, accountType string) ([]*AccountReport, error) {
if startDay == "" && endDay == "" {
startDay = time.Now().Format("2006-01-02")
endDay = startDay
}
reqUrl := fmt.Sprintf("%s/api/ad/account/report?startDay=%s&endDay=%s&accountType=%s",
s.address, startDay, endDay, accountType)
body, err := util.HttpGet(reqUrl, map[string]string{
"x-token": s.token,
})
if err != nil {
return nil, err
}
type rsp_t struct {
BaseResponse
Data []map[string]interface{} `json:"data"`
}
var rsp rsp_t
if err := json.Unmarshal(body, &rsp); err != nil {
return nil, err
}
if rsp.Code != 0 {
return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
}
results := make([]*AccountReport, 0)
for _, data := range rsp.Data {
r := new(AccountReport)
r.Id = cast.ToString(data["accounId"])
r.Name = cast.ToString(data["accounName"])
r.Type = cast.ToString(data["accounType"])
r.Day = cast.ToString(data["day"])
r.Cost = cast.ToFloat64(data["cost"])
r.Show = cast.ToInt64(data["show"])
r.Click = cast.ToInt64(data["click"])
r.Download = cast.ToInt64(data["download"])
r.Active = cast.ToInt64(data["active"])
r.Register = cast.ToInt64(data["register"])
r.Pay = cast.ToInt64(data["pay"])
r.PayAmount = cast.ToFloat64(data["payAmount"])
r.Balance = cast.ToFloat64(data["balance"])
results = append(results, r)
}
return results, nil
}