servicecontext.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package svc
  2. import (
  3. "fmt"
  4. "path"
  5. "time"
  6. "git.i2edu.net/i2/go-zero/core/stores/sqlx"
  7. "git.i2edu.net/i2/go-zero/zrpc"
  8. "git.i2edu.net/i2/i2-bill-api/internal/config"
  9. "git.i2edu.net/i2/i2-bill-api/internal/utils"
  10. "git.i2edu.net/i2/i2-bill-api/model"
  11. "git.i2edu.net/i2/i2-bill-erp/transformclient"
  12. )
  13. const cacheWechatTokenPrefix = "cache:wechat:token:"
  14. // RdCli defined
  15. type RdCli interface {
  16. SetCache(key string, v interface{}) error
  17. GetCache(key string, v interface{}) error
  18. SetWithExpire(key string, v interface{}, expire time.Duration) error
  19. }
  20. // Wechat defined
  21. type Wechat struct {
  22. RdCli RdCli
  23. c config.Config
  24. }
  25. // GetAccessToken defined
  26. func (wc *Wechat) GetAccessToken() (string, error) {
  27. token := ""
  28. err := wc.RdCli.GetCache(cacheWechatTokenPrefix, &token)
  29. if err == model.ErrRdsNotFound {
  30. req := utils.Get("https://api.weixin.qq.com/cgi-bin/token")
  31. req.Param("grant_type", "client_credential")
  32. req.Param("secret", wc.c.Weixin.Secret)
  33. req.Param("appid", wc.c.Weixin.Appid)
  34. var res = struct {
  35. AccessToken string `json:"access_token"`
  36. ExpiresIn int `json:"expires_in"`
  37. }{}
  38. err = req.ToJSON(&res)
  39. if err != nil {
  40. return "", err
  41. }
  42. fmt.Println(res)
  43. token = res.AccessToken
  44. err := wc.RdCli.SetWithExpire(cacheWechatTokenPrefix, res.AccessToken, time.Duration((res.ExpiresIn-60*2))*time.Second)
  45. if err != nil {
  46. return "", err
  47. }
  48. }
  49. return token, nil
  50. }
  51. // GetAccessToken defined
  52. func (wc *Wechat) GetQrCode(scene, page string) (string, error) {
  53. token, err := wc.GetAccessToken()
  54. if err != nil {
  55. return "", err
  56. }
  57. req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit")
  58. req.Param("access_token", token)
  59. ph := path.Join("asserts", "qrcode", scene+".png")
  60. err = req.ToFile(ph)
  61. if err != nil {
  62. return "", err
  63. }
  64. return ph, err
  65. }
  66. type ServiceContext struct {
  67. Config config.Config
  68. SqlConn sqlx.SqlConn
  69. UserModel model.UserModel
  70. RdCli RdCli
  71. Wechat *Wechat
  72. Transformer transformclient.Transform
  73. }
  74. func NewServiceContext(c config.Config) *ServiceContext {
  75. svc := &ServiceContext{
  76. Config: c,
  77. SqlConn: sqlx.NewMysql(c.DataSource),
  78. Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
  79. }
  80. svc.UserModel = model.NewUserModel(svc.SqlConn, c.Cache)
  81. svc.RdCli = svc.UserModel.CacheStorage()
  82. svc.Wechat = &Wechat{
  83. RdCli: svc.RdCli,
  84. c: c,
  85. }
  86. return svc
  87. }