2024-10-21 17:27:46 +08:00
|
|
|
package weixin
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"github.com/tidwall/gjson"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
)
|
|
|
|
|
|
|
|
type OaSdk struct {
|
|
|
|
BaseSdk
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewOaSdk(appid, secret string) *OaSdk {
|
|
|
|
return &OaSdk{
|
|
|
|
BaseSdk{
|
|
|
|
appid: appid,
|
|
|
|
secret: secret,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o *OaSdk) GetQrCode(sceneStr string) (string, error) {
|
|
|
|
params := make(map[string]interface{})
|
|
|
|
params["expire_seconds"] = 1728000 //20天
|
|
|
|
params["action_name"] = "QR_STR_SCENE"
|
|
|
|
params["action_info"] = map[string]interface{}{
|
|
|
|
"scene": map[string]interface{}{
|
|
|
|
"scene_str": sceneStr, // sceneStr不超过64个字符
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
marshal, _ := json.Marshal(params)
|
|
|
|
accessToken, err := o.getAccessToken()
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
url := fmt.Sprintf("?access_token=%s", oaQrCodeCreateUrl, accessToken)
|
2024-10-21 18:05:01 +08:00
|
|
|
res, err := http.Post(url, "application/json", bytes.NewBuffer(marshal))
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
2024-10-21 17:27:46 +08:00
|
|
|
defer res.Body.Close()
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
g := gjson.ParseBytes(body)
|
|
|
|
|
|
|
|
qrcodeUrl := g.Get("url").String()
|
|
|
|
if qrcodeUrl == "" {
|
|
|
|
return "", fmt.Errorf("%d:%s", g.Get("errcode").Int(), g.Get("errmsg").String())
|
|
|
|
}
|
|
|
|
return qrcodeUrl, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o *BaseSdk) GetUserInfoByCode(code string) (*UserInfo, error) {
|
|
|
|
return o.getUserInfoByCode(code)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o *OaSdk) GetUserInfoByOpenid(openid string) (*UserInfo, error) {
|
|
|
|
accessToken, err := o.getAccessToken()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
url := fmt.Sprintf("%s?access_token=%s&openid=%s&lang=zh_CN",
|
|
|
|
userInfoByOpenid, accessToken, openid)
|
|
|
|
res, err := http.Get(url)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer res.Body.Close()
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
g := gjson.ParseBytes(body)
|
|
|
|
errcode := g.Get("errcode").Int()
|
|
|
|
if errcode != 0 {
|
|
|
|
return nil, fmt.Errorf("%d:%s", errcode, g.Get("errmsg").String())
|
|
|
|
}
|
|
|
|
user := new(UserInfo)
|
|
|
|
user.Unionid = g.Get("unionid").String()
|
|
|
|
user.Nickname = g.Get("nickname").String()
|
|
|
|
user.Province = g.Get("province").String()
|
|
|
|
user.City = g.Get("city").String()
|
|
|
|
user.Country = g.Get("country").String()
|
|
|
|
user.HeadUrl = g.Get("headimgurl").String()
|
|
|
|
user.Sex = int(g.Get("sex").Int())
|
|
|
|
user.Openid = openid
|
|
|
|
return user, nil
|
|
|
|
}
|