71 lines
1.9 KiB
Go
71 lines
1.9 KiB
Go
package dao
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
|
|
"go-common/app/service/main/passport-sns/model"
|
|
"go-common/library/ecode"
|
|
"go-common/library/log"
|
|
)
|
|
|
|
const (
|
|
_weiboAuthorizeUrl = "https://api.weibo.com/oauth2/authorize"
|
|
_weiboAccessTokenUrl = "https://api.weibo.com/oauth2/access_token"
|
|
)
|
|
|
|
// WeiboAuthorize .
|
|
func (d *Dao) WeiboAuthorize(c context.Context, appID, redirectURL, display string) (url string) {
|
|
return fmt.Sprintf(_weiboAuthorizeUrl+"?client_id=%s&redirect_uri=%s&scope=all", appID, redirectURL)
|
|
}
|
|
|
|
// WeiboOauth2Info .
|
|
func (d *Dao) WeiboOauth2Info(c context.Context, code, redirectUrl string, app *model.SnsApps) (res *model.Oauth2Info, err error) {
|
|
accessResp, err := d.weiboAccessToken(c, code, app.AppID, app.AppSecret, redirectUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
res = &model.Oauth2Info{
|
|
Token: accessResp.Token,
|
|
Refresh: accessResp.Refresh,
|
|
Expires: time.Now().Unix() + accessResp.Expires,
|
|
OpenID: accessResp.OpenID,
|
|
UnionID: accessResp.OpenID,
|
|
}
|
|
return
|
|
}
|
|
|
|
// weiboAccessToken .
|
|
func (d *Dao) weiboAccessToken(c context.Context, code, appID, appSecret, redirectUrl string) (resp *model.WeiboAccessResp, err error) {
|
|
var (
|
|
res *http.Response
|
|
params = url.Values{}
|
|
)
|
|
params.Set("client_id", appID)
|
|
params.Set("client_secret", appSecret)
|
|
params.Set("grant_type", "authorization_code")
|
|
params.Set("code", code)
|
|
params.Set("redirect_uri", redirectUrl)
|
|
|
|
res, err = d.client.PostForm(_weiboAccessTokenUrl, params)
|
|
if err != nil {
|
|
log.Error("d.weiboAccessToken error(%+v) code(%s) appID(%s)", err, code, appID)
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
dc := json.NewDecoder(res.Body)
|
|
resp = new(model.WeiboAccessResp)
|
|
if err = dc.Decode(resp); err != nil {
|
|
return
|
|
}
|
|
if resp.Code == _respCodeSuccess {
|
|
return resp, nil
|
|
}
|
|
log.Error("request weibo failed with code(%d) desc(%s)", resp.Code, resp.Description)
|
|
return nil, ecode.PassportSnsRequestErr
|
|
}
|