package svc import ( "fmt" "path" "time" "git.i2edu.net/i2/go-zero/core/stores/sqlx" "git.i2edu.net/i2/go-zero/zrpc" "git.i2edu.net/i2/i2-bill-api/internal/config" "git.i2edu.net/i2/i2-bill-api/internal/utils" "git.i2edu.net/i2/i2-bill-api/model" "git.i2edu.net/i2/i2-bill-erp/transformclient" ) const cacheWechatTokenPrefix = "cache:wechat:token:" // RdCli defined type RdCli interface { SetCache(key string, v interface{}) error GetCache(key string, v interface{}) error SetWithExpire(key string, v interface{}, expire time.Duration) error } // Wechat defined type Wechat struct { RdCli RdCli c config.Config } // GetAccessToken defined func (wc *Wechat) GetAccessToken() (string, error) { token := "" err := wc.RdCli.GetCache(cacheWechatTokenPrefix, &token) if err == model.ErrRdsNotFound { req := utils.Get("https://api.weixin.qq.com/cgi-bin/token") req.Param("grant_type", "client_credential") req.Param("secret", wc.c.Weixin.Secret) req.Param("appid", wc.c.Weixin.Appid) var res = struct { AccessToken string `json:"access_token"` ExpiresIn int `json:"expires_in"` }{} err = req.ToJSON(&res) if err != nil { return "", err } fmt.Println(res) token = res.AccessToken err := wc.RdCli.SetWithExpire(cacheWechatTokenPrefix, res.AccessToken, time.Duration((res.ExpiresIn-60*2))*time.Second) if err != nil { return "", err } } return token, nil } // GetAccessToken defined func (wc *Wechat) GetQrCode(scene, page string) (string, error) { token, err := wc.GetAccessToken() if err != nil { return "", err } req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit") req.Param("access_token", token) ph := path.Join("asserts", "qrcode", scene+".png") err = req.ToFile(ph) if err != nil { return "", err } return ph, err } type ServiceContext struct { Config config.Config UserModel model.UserModel RdCli RdCli Wechat *Wechat Transformer transformclient.Transform } func NewServiceContext(c config.Config) *ServiceContext { svc := &ServiceContext{ Config: c, Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)), UserModel: model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache), } svc.RdCli = svc.UserModel.CacheStorage() svc.Wechat = &Wechat{ RdCli: svc.RdCli, c: c, } return svc }