go-common/app/job/main/passport-sns/dao/qq.go
2019-04-22 18:49:16 +08:00

64 lines
1.8 KiB
Go

package dao
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
"go-common/app/job/main/passport-sns/model"
"go-common/library/log"
)
const (
_qqGetUnionidUrl = "https://graph.qq.com/oauth2.0/get_unionid"
_respCodeSuccess = 0
_respCodeInvalidOpenid = 100050
_respCodeInvalidOpenidLength = 100058
)
// QQUnionID .
func (d *Dao) QQUnionID(c context.Context, openID string) (unionID string, err error) {
var (
res *http.Response
bs []byte
params = url.Values{}
)
params.Set("client_id", model.OldAppID)
params.Set("openid", openID)
if res, err = http.Get(_qqGetUnionidUrl + "?" + params.Encode()); err != nil {
log.Error("d.QQUnionID error(%+v) openID(%s)", err, openID)
return "", err
}
defer res.Body.Close()
if bs, err = ioutil.ReadAll(res.Body); err != nil {
log.Error("ioutil.ReadAll() error(%+v) openID(%s)", err, openID)
return "", err
}
respStr := string(bs)
if strings.HasPrefix(respStr, "callback") {
start := strings.Index(respStr, "{")
end := strings.Index(respStr, "}")
respStr = respStr[start : end+1]
}
unionRes := new(model.QQUnionIDResp)
if err = json.Unmarshal([]byte(respStr), unionRes); err != nil {
log.Error("json.Unmarshal() error(%+v) respStr(%s) openID(%s)", err, respStr, openID)
return "", err
}
if unionRes.Code == _respCodeSuccess && unionRes.UnionID != "" {
return unionRes.UnionID, nil
}
log.Error("request qq get_unionid failed with code(%d) desc(%s) openID(%s)", unionRes.Code, unionRes.Description, openID)
if unionRes.Code == _respCodeInvalidOpenidLength || unionRes.Code == _respCodeInvalidOpenid {
return "", nil
}
return "", fmt.Errorf("request qq get_unionid failed with code(%d) desc(%s) openID(%s)", unionRes.Code, unionRes.Description, openID)
}