youtu_grpc/app/auth_service/pkg/douyin/douyin_openapi.go

153 lines
4.0 KiB
Go
Raw Normal View History

2025-02-06 15:35:23 +08:00
package douyin
import (
"encoding/json"
"fmt"
accessToken "gitea.youtukeji.com.cn/youtu/openapi-helper/douyin/access-token"
util2 "gitea.youtukeji.com.cn/youtu/openapi-helper/douyin/util"
"github.com/silenceper/wechat/v2/cache"
"io"
"net/http"
)
const (
code2Session = "https://minigame.zijieapi.com/mgplatform/api/apps/jscode2session" // 小程序登录地址
)
// DouYinOpenApiConfig 实例化配置
type DouYinOpenApiConfig struct {
AppId string
AppSecret string
AccessToken accessToken.AccessToken
Cache cache.Cache
IsSandbox bool
Token string
Salt string
}
// DouYinOpenApi 基类
type DouYinOpenApi struct {
Config DouYinOpenApiConfig
BaseApi string
}
// NewDouYinOpenApi 实例化一个抖音openapi实例
func NewDouYinOpenApi(config DouYinOpenApiConfig) *DouYinOpenApi {
if config.Cache == nil {
config.Cache = cache.NewMemory()
}
if config.AccessToken == nil {
config.AccessToken = accessToken.NewDefaultAccessToken(config.AppId, config.AppSecret, config.Cache, config.IsSandbox)
}
return &DouYinOpenApi{
Config: config,
}
}
// GetApiUrl 获取api地址
func (d *DouYinOpenApi) GetApiUrl(url string) string {
return fmt.Sprintf("%s%s", d.BaseApi, url)
}
// Get 获取数据
func (d *DouYinOpenApi) Get(url string, params any) (data []byte, err error) {
paramsStr, err := util2.StructToQueryParams(params)
if err != nil {
return
}
fullURL := fmt.Sprintf("%s?%s", url, paramsStr)
res, err := http.Get(fullURL)
if err != nil {
return
}
defer res.Body.Close() // 关闭连接
data, err = io.ReadAll(res.Body)
if err != nil {
return
}
return
}
// PostJson 封装公共的请求方法
func (d *DouYinOpenApi) PostJson(api string, params any, response any) (err error) {
body, err := util2.PostJSON(api, params)
if err != nil {
return
}
err = json.Unmarshal(body, &response)
if err != nil {
return
}
return
}
// Code2SessionParams 小程序登录 所需参数
type Code2SessionParams struct {
Appid string `json:"appid,omitempty"`
Secret string `json:"secret,omitempty"`
AnonymousCode string `json:"anonymous_code,omitempty"`
Code string `json:"code,omitempty"`
}
type Code2SessionResponse struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
Message string `json:"message,omitempty"`
AnonymousOpenid string `json:"anonymous_openid"`
Error int `json:"error"`
Openid string `json:"openid"`
SessionKey string `json:"session_key"`
Unionid string `json:"unionid"`
}
type Code2SessionResponseData struct {
SessionKey string `json:"session_key,omitempty"`
Openid string `json:"openid,omitempty"`
AnonymousOpenid string `json:"anonymous_openid,omitempty"`
UnionId string `json:"unionid,omitempty"`
}
// Code2Session 小程序登录
func (d *DouYinOpenApi) Code2Session(code, anonymousCode string) (code2SessionResponse Code2SessionResponse, err error) {
params := Code2SessionParams{
Appid: d.Config.AppId,
Secret: d.Config.AppSecret,
AnonymousCode: anonymousCode,
Code: code,
}
b, err := d.Get(code2Session, params)
if err != nil {
return
}
err = json.Unmarshal(b, &code2SessionResponse)
if err != nil {
return
}
return code2SessionResponse, nil
}
type Record struct {
Aid string `json:"aid"`
Cost int `json:"cost"`
Did string `json:"did"`
EventName string `json:"event_name"`
EventTime string `json:"event_time"`
OpenID string `json:"open_id"`
ID int `json:"id"`
}
// GetEcpmParams 获取ECPM参数
type GetEcpmParams struct {
AppId string `json:"app_id" form:"app_id"`
OpenId string `json:"open_id" form:"open_id"`
AccessToken string `json:"access_token" form:"access_token"`
DateHour string `json:"date_hour" form:"date_hour"`
PageSize int `json:"page_size" form:"page_size"`
PageNo int `json:"page_no" form:"page_no"`
}
// GetAccessToken 获取accessToken
func (d *DouYinOpenApi) GetAccessToken() (string, error) {
return d.Config.AccessToken.GetAccessToken()
}