package handler import ( "net/http" "github.com/gin-gonic/gin" "github.com/skip2/go-qrcode" "gorm.io/gorm" "github.com/wangjia/pay/internal/model" "github.com/wangjia/pay/internal/util" ) type PageHandler struct { db *gorm.DB webDir string } func NewPageHandler(db *gorm.DB, webDir string) *PageHandler { return &PageHandler{db: db, webDir: webDir} } // ResultPage GET /result —— 支付结果页(return_url 落地)。 func (h *PageHandler) ResultPage(c *gin.Context) { c.File(h.webDir + "/result.html") } // QRCode GET /qrcode?text=xxx —— 把任意字符串渲染成二维码 PNG(用于展示支付宝扫码码串)。 func (h *PageHandler) QRCode(c *gin.Context) { text := c.Query("text") if text == "" { util.RespondError(c, http.StatusBadRequest, "bad_request", "缺少 text 参数") return } png, err := qrcode.Encode(text, qrcode.Medium, 256) if err != nil { util.RespondError(c, http.StatusInternalServerError, "qr_failed", err.Error()) return } c.Data(http.StatusOK, "image/png", png) } // ListProducts GET /api/v1/products —— 上架套餐列表(金额来自服务端)。 func (h *PageHandler) ListProducts(c *gin.Context) { var products []model.Product if err := h.db.Where("active = ?", true).Order("sort asc, id asc").Find(&products).Error; err != nil { util.RespondError(c, http.StatusInternalServerError, "list_failed", err.Error()) return } out := make([]gin.H, 0, len(products)) for _, p := range products { out = append(out, gin.H{ "id": p.ID, "name": p.Name, "description": p.Description, "price": p.Price, "biz_code": p.BizCode, // 业务方按 biz_code 查 product_id }) } util.RespondSuccess(c, out) }