package http import ( _ "embed" "encoding/json" "strings" "text/template" "time" "quyun/app/models" "quyun/app/requests" "quyun/database/schemas/public/model" "quyun/providers/wepay" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/log" "github.com/pkg/errors" ) type ListQuery struct { Keyword *string `query:"keyword"` } // @provider type posts struct { wepay *wepay.Client } // List posts // @Router / [get] // @Bind pagination query // @Bind query query // @Bind user local func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *ListQuery, user *model.Users) (*requests.Pager, error) { cond := models.Posts.BuildConditionWithKey(query.Keyword) return models.Posts.List(ctx.Context(), pagination, cond) } // Show // @Router /show/:id [get] // @Bind id path func (ctl *posts) Show(ctx fiber.Ctx, id int64) (*model.Posts, error) { return models.Posts.GetByID(ctx.Context(), id) } // Mine posts // @Router /mine [get] // @Bind pagination query // @Bind query query func (ctl *posts) Mine(ctx fiber.Ctx, pagination *requests.Pagination, query *ListQuery) (*requests.Pager, error) { log.Infof("Fetching posts for user with pagination: %+v and keyword: %v", pagination, query.Keyword) return models.Users.PostList(ctx.Context(), 1, pagination, query.Keyword) } //go:embed buy.html.tpl var buyTpl string // Buy // @Router /buy/:id [get] // @Bind id path func (ctl *posts) Buy(ctx fiber.Ctx, id int64) error { var userId int64 = 1 user, err := models.Users.GetByID(ctx.Context(), userId) if err != nil { return errors.Wrapf(err, " failed to get user: %d", userId) } post, err := models.Posts.GetByID(ctx.Context(), id) if err != nil { return errors.Wrapf(err, " failed to get post: %d", id) } // create order order, err := models.Orders.Create(ctx.Context(), userId, post.ID) if err != nil { return errors.Wrap(err, "订单创建失败") } prePayResp, err := ctl.wepay.V3TransactionJsapi(ctx.Context(), func(bm *wepay.BodyMap) { bm. Expire(30 * time.Minute). Description(post.Title). OutTradeNo(order.OrderNo). Payer(user.OpenID) }) if err != nil { log.Errorf("wepay.V3TransactionJsapi err: %v", err) return errors.Wrap(err, "微信支付失败") } signature, err := prePayResp.PaySignOfJSAPI() if err != nil { return errors.Wrap(err, "failed to get pay sign") } // render buyTpl with html/template tpl, err := template.New("buy").Parse(buyTpl) if err != nil { return errors.Wrap(err, "failed to parse template") } signatureBytes, err := json.Marshal(signature) if err != nil { return errors.Wrap(err, "failed to marshal signature") } var buf strings.Builder if err := tpl.Execute(&buf, map[string]interface{}{"signature": string(signatureBytes)}); err != nil { return errors.Wrap(err, "failed to execute template") } ctx.Set("Content-Type", "text/html; charset=utf-8") return ctx.SendString(buf.String()) }