diff --git a/services/web/client.go b/services/web/client.go new file mode 100644 index 0000000..3756130 --- /dev/null +++ b/services/web/client.go @@ -0,0 +1,42 @@ +package web + +import ( + "strings" + + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" +) + +const ( + VERSION = "2020-01-01" +) + +// HOST 官网 web 服务域名(带 ".",SDK 不会再追加 .gaore.com) +var HOST = requests.Host{ + Default: "web.gaore.com", +} + +type Client struct { + sdk.Client +} + +func NewClient() (client *Client, err error) { + client = new(Client) + err = client.Init() + return +} + +// ForceOut 清除玩家官网 web 登录 session,返回远端原始响应 +// 对齐老综合后台 GaoreSDK web->force_out +func (c *Client) ForceOut(userName string, ts int64) (response string, err error) { + req := CreateForceOutReq(userName, ts) + resp := CreateForceOutResp() + err = c.DoAction(req, resp) + if err != nil && strings.Contains(err.Error(), "json Unmarshal:") { + // 远端返回非 JSON(如纯文本),直接取原始响应 + return resp.GetHttpContentString(), nil + } else if err != nil { + return "", err + } + return resp.GetHttpContentString(), nil +} diff --git a/services/web/force_out.go b/services/web/force_out.go new file mode 100644 index 0000000..33ea316 --- /dev/null +++ b/services/web/force_out.go @@ -0,0 +1,44 @@ +package web + +import ( + "fmt" + + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" +) + +// forceOutSignKey 老综合后台业务层计算 sign 用的固定盐 +const forceOutSignKey = "user_session_20220505" + +type ForceOutReq struct { + *requests.RpcRequest +} + +type ForceOutResp struct { + *responses.BaseResponse +} + +// CreateForceOutReq 创建官网强制下线请求 +// POST web.gaore.com/web/users/force_out,sign=md5(user_name+time+"user_session_20220505") +func CreateForceOutReq(userName string, ts int64) *ForceOutReq { + sign := utils.Md5(fmt.Sprintf("%s%d%s", userName, ts, forceOutSignKey)) + + req := &ForceOutReq{ + RpcRequest: &requests.RpcRequest{}, + } + req.InitWithApiInfo(HOST, VERSION, "/web/users/force_out") + req.FormParams = map[string]string{ + "user_name": userName, + "time": fmt.Sprintf("%d", ts), + "sign": sign, + } + req.Method = requests.POST + return req +} + +func CreateForceOutResp() *ForceOutResp { + return &ForceOutResp{ + BaseResponse: &responses.BaseResponse{}, + } +} diff --git a/services/www/client.go b/services/www/client.go index 51f6dfa..d53b5d6 100644 --- a/services/www/client.go +++ b/services/www/client.go @@ -1,6 +1,8 @@ package www import ( + "strings" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" ) @@ -25,6 +27,13 @@ type Client struct { sdk.Client } +// NewClient 无凭证客户端(用于自带签名的表单接口,如 refreshUserSessionId) +func NewClient() (client *Client, err error) { + client = &Client{} + err = client.Init() + return +} + func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) { client = &Client{} err = client.InitWithAccessKey(accesskey, secrect, source) @@ -42,3 +51,17 @@ func (c *Client) GetUserInfo(req *GetPwdRequest) (response *GetPwdResponse, err err = c.DoAction(req, response) return } + +// RefreshUserSessionID 刷新用户 session(清 www 登录态),返回远端原始响应 +func (c *Client) RefreshUserSessionID(uname string) (response string, err error) { + req := CreateRefreshUserSessionIDReq(uname) + resp := CreateRefreshUserSessionIDResp() + err = c.DoAction(req, resp) + if err != nil && strings.Contains(err.Error(), "json Unmarshal:") { + // 远端返回非 JSON(如纯文本),直接取原始响应 + return resp.GetHttpContentString(), nil + } else if err != nil { + return "", err + } + return resp.GetHttpContentString(), nil +} diff --git a/services/www/refresh_session.go b/services/www/refresh_session.go new file mode 100644 index 0000000..8dd49a0 --- /dev/null +++ b/services/www/refresh_session.go @@ -0,0 +1,55 @@ +package www + +import ( + "fmt" + "time" + + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" +) + +// 对齐老综合后台 GaoreSDK www->refreshUserSessionId 的固定 appid=20 验签 +const ( + refreshSessionAppID = "20" + refreshSessionAppKey = "yWpx3hWQHFhSnTCj#20#6KuRKuaAjLJ5sYRy" +) + +// refreshSessionHost 老 PHP SDK 打的是 apisdk.gaore.com,与本包默认 HOST(apisdk.9ooo.cn) 不同, +// 此处显式固定到 apisdk.gaore.com,与老综合后台 1:1 对齐。 +var refreshSessionHost = requests.Host{Default: "apisdk.gaore.com"} + +type RefreshUserSessionIDReq struct { + *requests.RpcRequest +} + +type RefreshUserSessionIDResp struct { + *responses.BaseResponse +} + +// CreateRefreshUserSessionIDReq 刷新用户 www session(使官网/9ooo 登录态失效) +// POST /user/sdk_passport.php,sign=md5(appkey+time) +func CreateRefreshUserSessionIDReq(uname string) *RefreshUserSessionIDReq { + ts := time.Now().Unix() + sign := utils.Md5(refreshSessionAppKey + fmt.Sprintf("%d", ts)) + + req := &RefreshUserSessionIDReq{ + RpcRequest: &requests.RpcRequest{}, + } + req.InitWithApiInfo(refreshSessionHost, VERSION, "/user/sdk_passport.php") + req.FormParams = map[string]string{ + "appid": refreshSessionAppID, + "time": fmt.Sprintf("%d", ts), + "do": "refreshUserSessionId", + "uname": uname, + "sign": sign, + } + req.Method = requests.POST + return req +} + +func CreateRefreshUserSessionIDResp() *RefreshUserSessionIDResp { + return &RefreshUserSessionIDResp{ + BaseResponse: &responses.BaseResponse{}, + } +}