servicecontext.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. fmt.Println("---66", err)
  40. if err != nil {
  41. return "", err
  42. }
  43. fmt.Println(res)
  44. token = res.AccessToken
  45. err := wc.RdCli.SetWithExpire(cacheWechatTokenPrefix, res.AccessToken, time.Duration((res.ExpiresIn-60*2))*time.Second)
  46. if err != nil {
  47. return "", err
  48. }
  49. }
  50. return token, nil
  51. }
  52. // GetAccessToken defined
  53. func (wc *Wechat) GetQrCode(scene, page string) (string, error) {
  54. token, err := wc.GetAccessToken()
  55. if err != nil {
  56. return "", err
  57. }
  58. req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit")
  59. req.Param("access_token", token)
  60. ph := path.Join("asserts", "qrcode", scene+".png")
  61. err = req.ToFile(ph)
  62. if err != nil {
  63. return "", err
  64. }
  65. return ph, err
  66. }
  67. type ServiceContext struct {
  68. Config config.Config
  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. Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
  78. UserModel: model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache),
  79. }
  80. svc.RdCli = svc.UserModel.CacheStorage()
  81. svc.Wechat = &Wechat{
  82. RdCli: svc.RdCli,
  83. c: c,
  84. }
  85. return svc
  86. }