do_api_user_login_logic.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package User
  2. import (
  3. "context"
  4. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  5. "github.com/zeromicro/go-zero/core/errorx"
  6. "time"
  7. "wechat-api/ent"
  8. "wechat-api/ent/wxcarduser"
  9. "wechat-api/internal/svc"
  10. "wechat-api/internal/types"
  11. "wechat-api/internal/utils/dberrorhandler"
  12. "wechat-api/internal/utils/jwt"
  13. mini "github.com/ArtisanCloud/PowerWeChat/v2/src/miniProgram"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. type DoApiUserLoginLogic struct {
  17. logx.Logger
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewDoApiUserLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DoApiUserLoginLogic {
  22. return &DoApiUserLoginLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx}
  26. }
  27. func (l *DoApiUserLoginLogic) DoApiUserLogin(req *types.UserLoginReq) (*types.UserLoginResp, error) {
  28. var err error
  29. Appid := l.svcCtx.Config.Miniprogram.Appid
  30. Secret := l.svcCtx.Config.Miniprogram.Secret
  31. //RedisAddr := l.svcCtx.Config.Miniprogram.Redisaddr
  32. // 1. 初始化小程序应用实例
  33. app, err := mini.NewMiniProgram(&mini.UserConfig{
  34. AppID: Appid, // 小程序、公众号或者企业微信的appid
  35. Secret: Secret, // 商户号 appID
  36. HttpDebug: true,
  37. Debug: false,
  38. // 可选,不传默认走程序内存
  39. //Cache: kernel.NewRedisClient(&kernel.RedisOptions{
  40. // Addr: RedisAddr,
  41. // Password: "",
  42. // DB: 0,
  43. //}),
  44. })
  45. if err != nil {
  46. return nil, errorx.NewApiInternalError("init wechat miniprogram failed")
  47. }
  48. // 2. 调用小程序的授权登陆接口
  49. code := *req.JsCode // 前端小程序登录时,从微信获取的code
  50. resp, err := app.Auth.Session(code)
  51. if err != nil {
  52. return nil, errorx.NewApiInternalError("wechat login error")
  53. }
  54. if resp.ErrCode != 0 {
  55. return nil, errorx.NewApiInternalError(resp.ErrMSG)
  56. }
  57. userInfo, err := l.svcCtx.DB.WxCardUser.Query().Where(wxcarduser.OpenID(resp.OpenID)).First(l.ctx)
  58. if err != nil {
  59. if ent.IsNotFound(err) {
  60. userInfo, err = l.svcCtx.DB.WxCardUser.Create().
  61. SetOpenID(resp.OpenID).
  62. SetUnionID(resp.UnionID).
  63. SetSessionKey(resp.SessionKey).
  64. Save(l.ctx)
  65. if err != nil {
  66. return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
  67. }
  68. } else {
  69. return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
  70. }
  71. } else {
  72. _, err = l.svcCtx.DB.WxCardUser.Update().Where(wxcarduser.OpenID(resp.OpenID)).SetSessionKey(resp.SessionKey).Save(l.ctx)
  73. if err != nil {
  74. return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
  75. }
  76. }
  77. //TODO 这里需要改成实际用户的数据
  78. dataArray := make([]jwt.Option, 0)
  79. dataArray = append(dataArray, jwt.Option{
  80. Key: "userId",
  81. Val: userInfo.ID,
  82. })
  83. token, err := jwt.NewJwtToken(
  84. l.svcCtx.Config.Auth.AccessSecret,
  85. time.Now().Unix(),
  86. 86400*30,
  87. dataArray...,
  88. )
  89. if err != nil {
  90. return nil, errorx.NewInvalidArgumentError(err.Error())
  91. }
  92. return &types.UserLoginResp{
  93. BaseDataInfo: types.BaseDataInfo{
  94. Code: 0,
  95. Msg: errormsg.Success,
  96. },
  97. Data: types.UserToken{
  98. ID: &userInfo.ID,
  99. Token: &token,
  100. Avatar: &userInfo.Avatar,
  101. Nickname: &userInfo.Nickname,
  102. },
  103. }, nil
  104. }