|
@@ -1,24 +1,78 @@
|
|
|
package svc
|
|
package svc
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
- "git.i2edu.net/i2/i2-bill-api/internal/config"
|
|
|
|
|
- "git.i2edu.net/i2/i2-bill-api/model"
|
|
|
|
|
- "git.i2edu.net/i2/i2-bill-erp/transformclient"
|
|
|
|
|
|
|
+ "time"
|
|
|
|
|
|
|
|
"git.i2edu.net/i2/go-zero/core/stores/sqlx"
|
|
"git.i2edu.net/i2/go-zero/core/stores/sqlx"
|
|
|
"git.i2edu.net/i2/go-zero/zrpc"
|
|
"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 != nil {
|
|
|
|
|
+ return "", err
|
|
|
|
|
+ }
|
|
|
|
|
+ if token == "" {
|
|
|
|
|
+ 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
|
|
|
|
|
+ }
|
|
|
|
|
+ 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
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
type ServiceContext struct {
|
|
type ServiceContext struct {
|
|
|
Config config.Config
|
|
Config config.Config
|
|
|
UserModel model.UserModel
|
|
UserModel model.UserModel
|
|
|
|
|
+ RdCli RdCli
|
|
|
|
|
+ Wechat *Wechat
|
|
|
Transformer transformclient.Transform
|
|
Transformer transformclient.Transform
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
|
|
- return &ServiceContext{
|
|
|
|
|
|
|
+ svc := &ServiceContext{
|
|
|
Config: c,
|
|
Config: c,
|
|
|
Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
|
|
Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
|
|
|
UserModel: model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache),
|
|
UserModel: model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache),
|
|
|
}
|
|
}
|
|
|
|
|
+ svc.RdCli = svc.UserModel.CacheStorage()
|
|
|
|
|
+ svc.Wechat = &Wechat{
|
|
|
|
|
+ RdCli: svc.RdCli,
|
|
|
|
|
+ c: c,
|
|
|
|
|
+ }
|
|
|
|
|
+ return svc
|
|
|
}
|
|
}
|