8
0

feat(www,web): 新增 RefreshUserSessionID 与 web.ForceOut

重置密码副作用配套:
- services/www 新增 RefreshUserSessionID(清 www 登录态,apisdk.gaore.com /user/sdk_passport.php)及无凭证 NewClient
- 新建 services/web 包,ForceOut 清官网 web 登录态(web.gaore.com /web/users/force_out)
端点/参数/签名与老综合后台 GaoreSDK 1:1 对齐
This commit is contained in:
huangqz 2026-06-17 10:05:05 +08:00
parent 34fbd24365
commit 252e5953f3
4 changed files with 164 additions and 0 deletions

42
services/web/client.go Normal file
View File

@ -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
}

44
services/web/force_out.go Normal file
View File

@ -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_outsign=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{},
}
}

View File

@ -1,6 +1,8 @@
package www package www
import ( import (
"strings"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
) )
@ -25,6 +27,13 @@ type Client struct {
sdk.Client 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) { func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) {
client = &Client{} client = &Client{}
err = client.InitWithAccessKey(accesskey, secrect, source) err = client.InitWithAccessKey(accesskey, secrect, source)
@ -42,3 +51,17 @@ func (c *Client) GetUserInfo(req *GetPwdRequest) (response *GetPwdResponse, err
err = c.DoAction(req, response) err = c.DoAction(req, response)
return 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
}

View File

@ -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.phpsign=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{},
}
}