Files
utility_go/package/pay/oppo/login.go
2025-07-24 18:33:54 +08:00

98 lines
3.2 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 oppo
import (
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/grand"
"io"
"net/url"
"strings"
)
const host = "https://iopen.game.heytapmobi.com"
// oppo参数类型
type LoginType struct {
Token string `json:"token"`
Ssoid string `json:"ssoid"`
Channel int `json:"channel"`
AdId string `json:"adId"`
}
//登录回复
type LoginResType struct {
ResultCode string `json:"resultCode" dc:"响应码,成功为 200"`
ResultMsg string `json:"resultMsg" dc:"响应信息"`
LoginToken string `json:"loginToken" dc:"透传的token"`
Ssoid string `json:"ssoid" dc:"透传的ssoid"`
//AppKey string `json:"appKey" dc:"秘钥key,因隐私安全规范,该字段目前已不返回信息"`
UserName string `json:"userName" dc:"用户ssoid绑定的账户昵称"`
//Email string `json:"email" dc:"因隐私安全规范,该字段目前已不返回信息"`
//MobileNumber string `json:"mobileNumber" dc:"因隐私安全规范,该字段目前已不返回信息"`
//CreateTime string `json:"createTime" dc:"因隐私安全规范,该字段目前已不返回信息"`
UserStatus string `json:"userStatus" dc:"用户状态NORMAL 表示正常"`
}
func (p *OppoType) FileIdInfo(ctx context.Context, oauthToken string, ssoid string) (res *LoginResType, err error) {
url := host + "/sdkopen/user/fileIdInfo"
header := p.GetHeader(oauthToken)
getHtml, err := g.Client().Header(header).Get(ctx, url, g.Map{
"token": oauthToken,
"fileId": ssoid,
})
getRes := getHtml.ReadAllString()
gjson.DecodeTo(getRes, &res)
//g.Log().Debugf(ctx, "当前登陆请求的:%v", res)
return
}
func (p *OppoType) GenParam(oauthToken, oauthTimestamp, oauthNonce string) string {
// 注意:拼接的顺序不能有改变,不然会导致联运方验签失败
params := []string{
"oauthConsumerKey=" + url.QueryEscape(p.AppKey),
"oauthToken=" + url.QueryEscape(oauthToken),
"oauthSignatureMethod=" + url.QueryEscape("HMAC-SHA1"),
"oauthTimestamp=" + url.QueryEscape(oauthTimestamp),
"oauthNonce=" + url.QueryEscape(oauthNonce),
"oauthVersion=" + url.QueryEscape("1.0"),
}
return strings.Join(params, "&") + "&"
}
// 生成签名
func (p *OppoType) GenOauthSignature(param string) string {
oauthSignatureKey := p.AppSecret + "&"
mac := hmac.New(sha1.New, []byte(oauthSignatureKey))
io.WriteString(mac, param)
signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))
return url.QueryEscape(signature)
}
func (p *OppoType) GetHeader(oauthToken string) (headers map[string]string) {
// 没有做过 urlEncode 的 token由游戏客户端调用 OPPO SDK 直接获取
//oauthToken := "TICKET_Ajnxxxxx"
oauthTimestamp := gtime.Now().TimestampStr()
oauthNonce := grand.S(5)
// 生成请求头参数和签名
param := p.GenParam(oauthToken, oauthTimestamp, oauthNonce)
oauthSignature := p.GenOauthSignature(param)
// 封装请求头
headers = map[string]string{
"param": param,
"oauthSignature": oauthSignature,
}
//fmt.Println("游戏服务端登录鉴权请求头为:", headers)
return
}