do_api_user_login_logic.go 2.8 KB

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