Compare commits
No commits in common. "00f3429c84165defc818c26d72631d18c2444085" and "a31c20b173199c61a53a9334f9df9b4462bb736e" have entirely different histories.
00f3429c84
...
a31c20b173
|
|
@ -1,23 +0,0 @@
|
||||||
package cache
|
|
||||||
|
|
||||||
import "github.com/go-redis/redis"
|
|
||||||
|
|
||||||
var (
|
|
||||||
redisClient *redis.Client = nil
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewRedis() {
|
|
||||||
addr := "127.0.0.1:6379"
|
|
||||||
redis.NewClient(&redis.Options{})
|
|
||||||
|
|
||||||
redisClient = redis.NewClient(&redis.Options{
|
|
||||||
Addr: addr,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRedis() *redis.Client {
|
|
||||||
if redisClient == nil {
|
|
||||||
NewRedis()
|
|
||||||
}
|
|
||||||
return redisClient
|
|
||||||
}
|
|
||||||
|
|
@ -2,15 +2,11 @@ package weixin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
cache2 "git.u8t.cn/open/gosdk/cache"
|
|
||||||
"github.com/go-redis/redis"
|
|
||||||
uuid2 "github.com/google/uuid"
|
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -91,65 +87,6 @@ func (o *BaseSdk) getAccessToken() (string, error) {
|
||||||
return o.accessToken, nil
|
return o.accessToken, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// redis share version
|
|
||||||
func (o *BaseSdk) getAccessToken2() (string, error) {
|
|
||||||
redix := o.getRedis()
|
|
||||||
tokenKey := fmt.Sprintf("weixin_oa_access_token_v2_%s", o.appid)
|
|
||||||
lockKey := fmt.Sprintf("get_access_token_unique_%s", o.appid)
|
|
||||||
uuid := uuid2.New().String()
|
|
||||||
|
|
||||||
// get token
|
|
||||||
token := redix.Get(tokenKey).Val()
|
|
||||||
if token != "" {
|
|
||||||
return token, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// setEX and expire
|
|
||||||
// if not set key. wait 200ms and get again and retry 5 times
|
|
||||||
if ok := redix.SetNX(lockKey, uuid, 10*time.Second).Val(); !ok {
|
|
||||||
for i := range 5 {
|
|
||||||
time.Sleep(time.Duration(200*(i+2)) * time.Millisecond)
|
|
||||||
if token = redix.Get(tokenKey).Val(); token != "" {
|
|
||||||
return token, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "", fmt.Errorf("<get access_token v2> wait 5 times,but still not get token")
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if redix.Get(lockKey).Val() == uuid {
|
|
||||||
redix.Del(lockKey)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// get new token
|
|
||||||
url := fmt.Sprintf("%s?grant_type=client_credential&appid=%s&secret=%s", accessTokenUrl, o.appid, o.secret)
|
|
||||||
res, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
body, err := io.ReadAll(res.Body)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
g := gjson.ParseBytes(body)
|
|
||||||
|
|
||||||
token = g.Get("access_token").String()
|
|
||||||
if token == "" {
|
|
||||||
return "", fmt.Errorf("%d:%s", g.Get("errcode").Int(), g.Get("errmsg").String())
|
|
||||||
}
|
|
||||||
|
|
||||||
expire := g.Get("expires_in").Int() - 10
|
|
||||||
redix.Set(tokenKey, token, time.Second*time.Duration(expire))
|
|
||||||
|
|
||||||
return token, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *BaseSdk) getRedis() *redis.Client {
|
|
||||||
return cache2.GetRedis()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *BaseSdk) getUserInfoByCode(code string, auth bool) (*UserInfo, error) {
|
func (o *BaseSdk) getUserInfoByCode(code string, auth bool) (*UserInfo, error) {
|
||||||
url := fmt.Sprintf("%s?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
|
url := fmt.Sprintf("%s?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
|
||||||
code2AccessTokenUrl, o.appid, o.secret, code)
|
code2AccessTokenUrl, o.appid, o.secret, code)
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,11 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
"io"
|
"io"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type OaSdk struct {
|
type OaSdk struct {
|
||||||
|
|
@ -36,7 +35,7 @@ func (o *OaSdk) GetQrCode(sceneStr string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
marshal, _ := json.Marshal(params)
|
marshal, _ := json.Marshal(params)
|
||||||
accessToken, err := o.getAccessToken2()
|
accessToken, err := o.getAccessToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
@ -69,7 +68,7 @@ func (o *OaSdk) GetUserInfoByCodeNoAuth(code string) (*UserInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *OaSdk) GetUserInfoByOpenid(openid string) (*UserInfo, error) {
|
func (o *OaSdk) GetUserInfoByOpenid(openid string) (*UserInfo, error) {
|
||||||
accessToken, err := o.getAccessToken2()
|
accessToken, err := o.getAccessToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -116,7 +115,7 @@ func (o *OaSdk) UploadFileByByte(file []byte, ext string) (string, string, error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
token, err := o.getAccessToken2()
|
token, err := o.getAccessToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|
@ -156,7 +155,7 @@ func (o *OaSdk) UploadFileByByte(file []byte, ext string) (string, string, error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *OaSdk) CreateMenu(buttons []*OaMenuButton) error {
|
func (o *OaSdk) CreateMenu(buttons []*OaMenuButton) error {
|
||||||
accessToken, err := o.getAccessToken2()
|
accessToken, err := o.getAccessToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -183,7 +182,7 @@ func (o *OaSdk) CreateMenu(buttons []*OaMenuButton) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *OaSdk) DeleteMenu() error {
|
func (o *OaSdk) DeleteMenu() error {
|
||||||
accessToken, err := o.getAccessToken2()
|
accessToken, err := o.getAccessToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue