diff --git a/backend/app/http/auth.go b/backend/app/http/auth.go index 48f7ed0..b7bd4fc 100644 --- a/backend/app/http/auth.go +++ b/backend/app/http/auth.go @@ -72,7 +72,7 @@ func (ctl *auth) Login(ctx fiber.Ctx, code, state, redirect string) error { Scope: token.Scope, }), } - user, err := models.Users.GetUserByOpenIDOrCreate(ctx.Context(), token.Openid, userModel) + user, err := models.Users.GetUserByOpenIDOrCreate(ctx.Context(), token.GetOpenID(), userModel) if err != nil { return errors.Wrap(err, "failed to get user by openid") } diff --git a/backend/app/http/provider.gen.go b/backend/app/http/provider.gen.go index 21ec8ca..843f797 100755 --- a/backend/app/http/provider.gen.go +++ b/backend/app/http/provider.gen.go @@ -80,5 +80,16 @@ func Provide(opts ...opt.Option) error { }); err != nil { return err } + if err := container.Container.Provide(func( + wechat *wechat.Client, + ) (*wechats, error) { + obj := &wechats{ + wechat: wechat, + } + + return obj, nil + }); err != nil { + return err + } return nil } diff --git a/backend/app/http/wechat.go b/backend/app/http/wechat.go new file mode 100644 index 0000000..4ae8264 --- /dev/null +++ b/backend/app/http/wechat.go @@ -0,0 +1,19 @@ +package http + +import ( + "quyun/database/schemas/public/model" + "quyun/providers/wechat" + + "github.com/gofiber/fiber/v3" +) + +// @provider +type wechats struct { + wechat *wechat.Client +} + +// @Router /wechat/js-ticket [get] +// @Bind user local +func (ctl *wechats) GetTicket(ctx fiber.Ctx, user *model.Users) (string, error) { + return ctl.wechat.GetJSTicket(user.AuthToken.Data.AccessToken) +} diff --git a/backend/app/models/users.go b/backend/app/models/users.go index 04bf924..70b36d2 100644 --- a/backend/app/models/users.go +++ b/backend/app/models/users.go @@ -153,19 +153,20 @@ func (m *usersModel) Create(ctx context.Context, userModel *model.Users) (*model } // Update updates an existing user -func (m *usersModel) Update(ctx context.Context, id int64, model *model.Users) error { - model.UpdatedAt = time.Now() +func (m *usersModel) Update(ctx context.Context, id int64, userModel *model.Users) (*model.Users, error) { + userModel.UpdatedAt = time.Now() tbl := table.Users - stmt := tbl.UPDATE(tbl.MutableColumns.Except(tbl.CreatedAt, tbl.DeletedAt)).MODEL(model).WHERE(tbl.ID.EQ(Int64(id))) + stmt := tbl.UPDATE(tbl.MutableColumns.Except(tbl.CreatedAt, tbl.DeletedAt)).MODEL(userModel).WHERE(tbl.ID.EQ(Int64(id))).RETURNING(tbl.AllColumns) m.log.Infof("sql: %s", stmt.DebugSql()) - _, err := stmt.ExecContext(ctx, db) - if err != nil { + var updatedUser model.Users + + if err := stmt.QueryContext(ctx, db, &updatedUser); err != nil { m.log.Errorf("error updating user: %v", err) - return err + return nil, err } - return nil + return &updatedUser, nil } // DeleteByID soft deletes a user by ID @@ -277,8 +278,6 @@ func (m *usersModel) GetUserByOpenIDOrCreate(ctx context.Context, openID string, user, err := m.GetUserByOpenID(ctx, openID) if err != nil { if errors.Is(err, qrm.ErrNoRows) { - // Create User - user, err = m.Create(ctx, userModel) if err != nil { return nil, errors.Wrap(err, "failed to create user") @@ -286,6 +285,12 @@ func (m *usersModel) GetUserByOpenIDOrCreate(ctx context.Context, openID string, } else { return nil, errors.Wrap(err, "failed to get user") } + } else { + userModel.OpenID = user.OpenID + user, err = m.Update(ctx, user.ID, userModel) + if err != nil { + return nil, errors.Wrap(err, "failed to update user") + } } return user, nil } diff --git a/backend/providers/wechat/wechat.go b/backend/providers/wechat/wechat.go index 38a3496..69eceb2 100644 --- a/backend/providers/wechat/wechat.go +++ b/backend/providers/wechat/wechat.go @@ -243,3 +243,28 @@ func (we *Client) AuthorizeUserInfo(accessToken, openID string) (*AuthorizeUserI return &data, nil } + +// GetJSTicket +func (we *Client) GetJSTicket(token string) (string, error) { + var data struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` + Ticket string `json:"ticket"` + ExpiresIn int `json:"expires_in"` + } + + params := map[string]string{ + "access_token": token, + "type": "jsapi", + } + _, err := we.client.R().SetSuccessResult(&data).SetQueryParams(params).Get("/cgi-bin/ticket/getticket") + if err != nil { + return "", errors.Wrap(err, "call /cgi-bin/ticket/getticket failed") + } + + if data.Errcode != 0 { + return "", errors.New("get wechat ticket failed: " + data.Errmsg) + } + + return data.Ticket, nil +} diff --git a/backend/providers/wechat/wechat_test.go b/backend/providers/wechat/wechat_test.go index 73afae4..a24bb9c 100644 --- a/backend/providers/wechat/wechat_test.go +++ b/backend/providers/wechat/wechat_test.go @@ -84,3 +84,14 @@ func TestClient_AuthorizeUserInfo(t *testing.T) { t.Logf("user: %+v", user) }) } + +func Test_GetJsTicket(t *testing.T) { + Convey("Test GetJsTicket", t, func() { + token := "" + ticket, err := getClient().GetJSTicket(token) + So(err, ShouldBeNil) + So(ticket, ShouldNotBeEmpty) + + t.Log("Js Ticket:", ticket) + }) +}