package weixin import ( "encoding/json" butil "enterprise/base/util" "errors" "fmt" log "github.com/sirupsen/logrus" "github.com/spf13/cast" "time" ) var ( urlGetToken = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" urlGetCheckinRlue = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcorpcheckinoption" urlGetCheckinData = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata" urlConvertOpenid = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid" ) type QyWeixin struct { CorpId string Secret string Agent string Token string tokenExpire int64 } func NewQyWeixin(corpId, secret, agent string) *QyWeixin { return &QyWeixin{ CorpId: corpId, Secret: secret, Agent: agent, } } func (q *QyWeixin) GetToken() string { if time.Now().Unix() <= q.tokenExpire-600 { return q.Token } q.refreshToken() return q.Token } func (q *QyWeixin) GetOpenid(userid string) (string, error) { if err := q.refreshToken(); err != nil { return "", err } reqUrl := fmt.Sprintf("%s?access_token=%s", urlConvertOpenid, q.GetToken()) rspBody, err := butil.HttpPostJson(reqUrl, nil, []byte(fmt.Sprintf(`{"userid" : "%s"}`, userid))) if err != nil { log.Errorf("httpPost url[%s] error :%s", reqUrl, err.Error()) return "", err } result := make(map[string]interface{}) if err := json.Unmarshal(rspBody, &result); err != nil { log.Errorf("http url[%s] result[%s] error :%s", reqUrl, string(rspBody), err.Error()) return "", err } if cast.ToInt(result["errcode"]) != 0 { log.Errorf("http url[%s] result[%s] error ", reqUrl, string(rspBody)) return "", errors.New(string(rspBody)) } return cast.ToString(result["openid"]), nil } func (q *QyWeixin) refreshToken() error { if time.Now().Unix() <= q.tokenExpire-600 { return nil } reqUrl := fmt.Sprintf("%s?corpid=%s&corpsecret=%s", urlGetToken, q.CorpId, q.Secret) rspBody, err := butil.HttpGet(reqUrl, nil) if err != nil { log.Errorf("http url[%s] error :%s", reqUrl, err.Error()) return err } result := make(map[string]interface{}) if err := json.Unmarshal(rspBody, &result); err != nil { log.Errorf("http url[%s] result[%s] error :%s", reqUrl, string(rspBody), err.Error()) return err } if cast.ToInt(result["errcode"]) != 0 { log.Errorf("http url[%s] result[%s] error ", reqUrl, string(rspBody)) return errors.New(string(rspBody)) } q.Token = cast.ToString(result["access_token"]) q.tokenExpire = time.Now().Unix() + cast.ToInt64(result["expires_in"]) return nil }