servicecontext.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. UserModel model.UserModel
  69. RdCli RdCli
  70. Wechat *Wechat
  71. Transformer transformclient.Transform
  72. }
  73. func NewServiceContext(c config.Config) *ServiceContext {
  74. svc := &ServiceContext{
  75. Config: c,
  76. Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
  77. UserModel: model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache),
  78. }
  79. svc.RdCli = svc.UserModel.CacheStorage()
  80. svc.Wechat = &Wechat{
  81. RdCli: svc.RdCli,
  82. c: c,
  83. }
  84. return svc
  85. }