package wechat import ( "allapp-go/pkg/common" "allapp-go/pkg/requestx" "fmt" "sync" "github.com/gofiber/fiber/v3/client" ) type jwtManager struct { appid string secret string } var ( manager *jwtManager once sync.Once ) func Init(appid string, secret string) { once.Do(func() { manager = &jwtManager{ appid: appid, secret: secret, } }) } func getManager() *jwtManager { if manager == nil { panic("wechat未初始化,请先调用Init") } return manager } func GetWechatAccess(code string) (openid string, accessToken string, err error) { bodyData, bodyCode, err := requestx.Get( "https://api.weixin.qq.com/sns/oauth2/access_token", client.Config{ Param: map[string]string{ "appid": getManager().appid, "secret": getManager().secret, "code": code, "grant_type": "authorization_code", }, }, ) if err != nil { return "", "", err } if bodyCode != 200 { return "", "", fmt.Errorf("微信Http请求失败: %d", bodyCode) } accessMap, err := common.JSONStringToMap(bodyData) if err != nil { return "", "", err } accessToken, _ = accessMap["access_token"].(string) openid, _ = accessMap["openid"].(string) if accessToken == "" || openid == "" { return "", "", fmt.Errorf("获取微信登录凭证失败: %s", bodyData) } return } func GetWechatUserInfo(accessToken, openid string) (nickname, avatar string, err error) { bodyData, bodyCode, err := requestx.Get( "https://api.weixin.qq.com/sns/userinfo", client.Config{ Param: map[string]string{ "access_token": accessToken, "openid": openid, }, }, ) if err != nil { return "", "", err } if bodyCode != 200 { return "", "", fmt.Errorf("微信Http请求失败") } userMap, err := common.JSONStringToMap(bodyData) if err != nil { return "", "", err } nickname, _ = userMap["nickname"].(string) avatar, _ = userMap["headimgurl"].(string) return }