From 4a9f7e3bce49b6c4292edcc7f28d1b80be9a488b Mon Sep 17 00:00:00 2001 From: RockYang Date: Fri, 8 Dec 2023 19:43:13 +0800 Subject: [PATCH] feat: add HuPiPay payment support --- api/core/app_server.go | 39 +++-- api/core/types/config.go | 20 ++- api/handler/admin/order_handler.go | 2 + api/handler/payment_handler.go | 220 +++++++++++++++++++------ api/handler/test_handler.go | 40 +++++ api/main.go | 12 +- api/res/img/wechat-pay.jpg | Bin 0 -> 5850 bytes api/service/payment/hupipay_serive.go | 72 ++++++++ web/src/assets/iconfont/iconfont.css | 10 +- web/src/assets/iconfont/iconfont.js | 2 +- web/src/assets/iconfont/iconfont.json | 7 + web/src/assets/iconfont/iconfont.ttf | Bin 14596 -> 14900 bytes web/src/assets/iconfont/iconfont.woff | Bin 10036 -> 10244 bytes web/src/assets/iconfont/iconfont.woff2 | Bin 8800 -> 9040 bytes web/src/views/Member.vue | 106 +++++++++--- 15 files changed, 427 insertions(+), 103 deletions(-) create mode 100644 api/handler/test_handler.go create mode 100644 api/res/img/wechat-pay.jpg create mode 100644 api/service/payment/hupipay_serive.go diff --git a/api/core/app_server.go b/api/core/app_server.go index 943f1cc4..f0b5d07a 100644 --- a/api/core/app_server.go +++ b/api/core/app_server.go @@ -156,6 +156,7 @@ func authorizeMiddleware(s *AppServer, client *redis.Client) gin.HandlerFunc { c.Request.URL.Path == "/api/mj/jobs" || c.Request.URL.Path == "/api/invite/hits" || c.Request.URL.Path == "/api/sd/jobs" || + strings.HasPrefix(c.Request.URL.Path, "/test/") || strings.HasPrefix(c.Request.URL.Path, "/api/sms/") || strings.HasPrefix(c.Request.URL.Path, "/api/captcha/") || strings.HasPrefix(c.Request.URL.Path, "/api/payment/") || @@ -238,26 +239,28 @@ func parameterHandlerMiddleware() gin.HandlerFunc { return } - // process POST JSON request body - bodyBytes, err := io.ReadAll(c.Request.Body) - if err != nil { - c.Next() - return - } + if strings.Contains(contentType, "application/json") { + // process POST JSON request body + bodyBytes, err := io.ReadAll(c.Request.Body) + if err != nil { + c.Next() + return + } - // 还原请求体 - c.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) - // 将请求体解析为 JSON - var jsonData map[string]interface{} - if err := c.ShouldBindJSON(&jsonData); err != nil { - c.Next() - return - } + // 还原请求体 + c.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) + // 将请求体解析为 JSON + var jsonData map[string]interface{} + if err := c.ShouldBindJSON(&jsonData); err != nil { + c.Next() + return + } - // 对 JSON 数据中的字符串值去除两端空格 - trimJSONStrings(jsonData) - // 更新请求体 - c.Request.Body = io.NopCloser(bytes.NewBufferString(utils.JsonEncode(jsonData))) + // 对 JSON 数据中的字符串值去除两端空格 + trimJSONStrings(jsonData) + // 更新请求体 + c.Request.Body = io.NopCloser(bytes.NewBufferString(utils.JsonEncode(jsonData))) + } c.Next() } diff --git a/api/core/types/config.go b/api/core/types/config.go index 1a337a63..59c89589 100644 --- a/api/core/types/config.go +++ b/api/core/types/config.go @@ -22,8 +22,9 @@ type AppConfig struct { WeChatBot bool // 是否启用微信机器人 SdConfig StableDiffusionConfig // sd 绘画配置 - XXLConfig XXLConfig - AlipayConfig AlipayConfig + XXLConfig XXLConfig + AlipayConfig AlipayConfig + HuPiPayConfig HuPiPayConfig } type ChatPlusApiConfig struct { @@ -40,10 +41,6 @@ type MidJourneyConfig struct { ChanelId string // Chanel ID } -type WeChatConfig struct { - Enabled bool -} - type StableDiffusionConfig struct { Enabled bool ApiURL string @@ -61,7 +58,7 @@ type AliYunSmsConfig struct { } type AlipayConfig struct { - Enabled bool // 是否启用该服务 + Enabled bool // 是否启用该支付通道 SandBox bool // 是否沙盒环境 AppId string // 应用 ID UserId string // 支付宝用户 ID @@ -72,6 +69,15 @@ type AlipayConfig struct { NotifyURL string // 异步通知回调 } +type HuPiPayConfig struct { //虎皮椒第四方支付配置 + Enabled bool // 是否启用该支付通道 + Name string // 支付名称,如:wechat/alipay + AppId string // App ID + AppSecret string // app 密钥 + NotifyURL string // 异步通知回调 + PayURL string // 支付网关 +} + type XXLConfig struct { // XXL 任务调度配置 Enabled bool ServerAddr string diff --git a/api/handler/admin/order_handler.go b/api/handler/admin/order_handler.go index 4ec4537a..229dd2a2 100644 --- a/api/handler/admin/order_handler.go +++ b/api/handler/admin/order_handler.go @@ -44,6 +44,8 @@ func (h *OrderHandler) List(c *gin.Context) { end := utils.Str2stamp(data.PayTime[1] + " 00:00:00") session = session.Where("pay_time >= ? AND pay_time <= ?", start, end) } + session = session.Where("status = ?", types.OrderPaidSuccess) + var total int64 session.Model(&model.Order{}).Count(&total) var items []model.Order diff --git a/api/handler/payment_handler.go b/api/handler/payment_handler.go index fb9d6ba8..a75e2ccd 100644 --- a/api/handler/payment_handler.go +++ b/api/handler/payment_handler.go @@ -21,31 +21,37 @@ import ( const ( PayWayAlipay = "支付宝" - PayWayWechat = "微信支付" + PayWayXunHu = "虎皮椒" ) // PaymentHandler 支付服务回调 handler type PaymentHandler struct { BaseHandler - alipayService *payment.AlipayService - snowflake *service.Snowflake - db *gorm.DB - fs embed.FS - lock sync.Mutex + alipayService *payment.AlipayService + huPiPayService *payment.HuPiPayService + snowflake *service.Snowflake + db *gorm.DB + fs embed.FS + lock sync.Mutex } -func NewPaymentHandler(server *core.AppServer, alipayService *payment.AlipayService, snowflake *service.Snowflake, db *gorm.DB, fs embed.FS) *PaymentHandler { - h := PaymentHandler{lock: sync.Mutex{}} +func NewPaymentHandler(server *core.AppServer, alipayService *payment.AlipayService, huPiPayService *payment.HuPiPayService, snowflake *service.Snowflake, db *gorm.DB, fs embed.FS) *PaymentHandler { + h := PaymentHandler{ + alipayService: alipayService, + huPiPayService: huPiPayService, + snowflake: snowflake, + fs: fs, + db: db, + lock: sync.Mutex{}, + } h.App = server - h.alipayService = alipayService - h.snowflake = snowflake - h.db = db - h.fs = fs return &h } -func (h *PaymentHandler) Alipay(c *gin.Context) { +func (h *PaymentHandler) DoPay(c *gin.Context) { orderNo := h.GetTrim(c, "order_no") + payWay := h.GetTrim(c, "pay_way") + if orderNo == "" { resp.ERROR(c, types.InvalidArgs) return @@ -60,21 +66,61 @@ func (h *PaymentHandler) Alipay(c *gin.Context) { // 更新扫码状态 h.db.Model(&order).UpdateColumn("status", types.OrderScanned) - // 生成支付链接 - notifyURL := h.App.Config.AlipayConfig.NotifyURL - returnURL := "" // 关闭同步回跳 - amount := fmt.Sprintf("%.2f", order.Amount) + if payWay == "alipay" { // 支付宝 + // 生成支付链接 + notifyURL := h.App.Config.AlipayConfig.NotifyURL + returnURL := "" // 关闭同步回跳 + amount := fmt.Sprintf("%.2f", order.Amount) - uri, err := h.alipayService.PayUrlMobile(order.OrderNo, notifyURL, returnURL, amount, order.Subject) - if err != nil { - resp.ERROR(c, "error with generate pay url: "+err.Error()) + uri, err := h.alipayService.PayUrlMobile(order.OrderNo, notifyURL, returnURL, amount, order.Subject) + if err != nil { + resp.ERROR(c, "error with generate pay url: "+err.Error()) + return + } + + c.Redirect(302, uri) return - } + } else if payWay == "hupi" { // 虎皮椒支付 + params := map[string]string{ + "version": "1.1", + "trade_order_id": orderNo, + "total_fee": fmt.Sprintf("%f", order.Amount), + "title": order.Subject, + "notify_url": h.App.Config.HuPiPayConfig.NotifyURL, + "return_url": "", + "wap_name": "极客学长", + "callback_url": "", + } - c.Redirect(302, uri) + res, err := h.huPiPayService.Pay(params) + if err != nil { + resp.ERROR(c, "error with generate pay url: "+err.Error()) + return + } + + var r struct { + Openid int64 `json:"openid"` + UrlQrcode string `json:"url_qrcode"` + URL string `json:"url"` + ErrCode int `json:"errcode"` + ErrMsg string `json:"errmsg"` + } + err = utils.JsonDecode(res, &r) + if err != nil { + resp.ERROR(c, "error with decode payment result: "+err.Error()) + return + } + + if r.ErrCode != 0 { + resp.ERROR(c, "error with generate pay url: "+r.ErrMsg) + return + } + c.Redirect(302, r.URL) + } + resp.ERROR(c, "Invalid operations") } -// OrderQuery 清单状态查询 +// OrderQuery 查询订单状态 func (h *PaymentHandler) OrderQuery(c *gin.Context) { var data struct { OrderNo string `json:"order_no"` @@ -111,16 +157,12 @@ func (h *PaymentHandler) OrderQuery(c *gin.Context) { resp.SUCCESS(c, gin.H{"status": order.Status}) } -// AlipayQrcode 生成支付宝支付 URL 二维码 -func (h *PaymentHandler) AlipayQrcode(c *gin.Context) { - if !h.App.SysConfig.EnabledAlipay || h.alipayService == nil { - resp.ERROR(c, "当前支付通道已经关闭,请联系管理员开通!") - return - } - +// PayQrcode 生成支付 URL 二维码 +func (h *PaymentHandler) PayQrcode(c *gin.Context) { var data struct { - ProductId uint `json:"product_id"` - UserId int `json:"user_id"` + PayWay string `json:"pay_way"` // 支付方式 + ProductId uint `json:"product_id"` + UserId int `json:"user_id"` } if err := c.ShouldBindJSON(&data); err != nil { resp.ERROR(c, types.InvalidArgs) @@ -146,6 +188,10 @@ func (h *PaymentHandler) AlipayQrcode(c *gin.Context) { return } + payWay := PayWayAlipay + if data.PayWay == "hupi" { + payWay = PayWayXunHu + } // 创建订单 remark := types.OrderRemark{ Days: product.Days, @@ -162,7 +208,7 @@ func (h *PaymentHandler) AlipayQrcode(c *gin.Context) { Subject: product.Name, Amount: product.Price - product.Discount, Status: types.OrderNotPaid, - PayWay: PayWayAlipay, + PayWay: payWay, Remark: utils.JsonEncode(remark), } res = h.db.Create(&order) @@ -171,19 +217,30 @@ func (h *PaymentHandler) AlipayQrcode(c *gin.Context) { return } - // 生成二维码图片 - file, err := h.fs.Open("res/img/alipay.jpg") + var logo string + if data.PayWay == "alipay" { + logo = "res/img/alipay.jpg" + } else if data.PayWay == "hupi" { + if h.App.Config.HuPiPayConfig.Name == "wechat" { + logo = "res/img/wechat-pay.jpg" + } else { + logo = "res/img/alipay.jpg" + } + } + + file, err := h.fs.Open(logo) if err != nil { - resp.ERROR(c, err.Error()) + resp.ERROR(c, "error with open qrcode log file: "+err.Error()) return } + parse, err := url.Parse(h.App.Config.AlipayConfig.NotifyURL) if err != nil { resp.ERROR(c, err.Error()) return } - imageURL := fmt.Sprintf("%s://%s/api/payment/alipay?order_no=%s", parse.Scheme, parse.Host, orderNo) + imageURL := fmt.Sprintf("%s://%s/api/payment/doPay?order_no=%s&pay_way=%s", parse.Scheme, parse.Host, orderNo, data.PayWay) imgData, err := utils.GenQrcode(imageURL, 400, file) if err != nil { resp.ERROR(c, err.Error()) @@ -193,6 +250,7 @@ func (h *PaymentHandler) AlipayQrcode(c *gin.Context) { resp.SUCCESS(c, gin.H{"order_no": orderNo, "image": fmt.Sprintf("data:image/jpg;base64, %s", imgDataBase64), "url": imageURL}) } +// AlipayNotify 支付宝支付回调 func (h *PaymentHandler) AlipayNotify(c *gin.Context) { err := c.Request.ParseForm() if err != nil { @@ -212,27 +270,46 @@ func (h *PaymentHandler) AlipayNotify(c *gin.Context) { h.lock.Lock() defer h.lock.Unlock() - var order model.Order - res := h.db.Where("order_no = ?", r.OutTradeNo).First(&order) - if res.Error != nil { - logger.Error(res.Error) + err = h.notify(r.OutTradeNo) + if err != nil { c.String(http.StatusOK, "fail") return } + + c.String(http.StatusOK, "success") +} + +// 异步通知回调公共逻辑 +func (h *PaymentHandler) notify(orderNo string) error { + var order model.Order + res := h.db.Where("order_no = ?", orderNo).First(&order) + if res.Error != nil { + err := fmt.Errorf("error with fetch order: %v", res.Error) + logger.Error(err) + return err + } + + // 已支付订单,直接返回 + if order.Status == types.OrderPaidSuccess { + return nil + } + var user model.User res = h.db.First(&user, order.UserId) if res.Error != nil { - logger.Error(res.Error) - c.String(http.StatusOK, "fail") - return + err := fmt.Errorf("error with fetch user info: %v", res.Error) + logger.Error(err) + return err } + var remark types.OrderRemark - err = utils.JsonDecode(order.Remark, &remark) + err := utils.JsonDecode(order.Remark, &remark) if err != nil { - logger.Error(res.Error) - c.String(http.StatusOK, "fail") - return + err := fmt.Errorf("error with decode order remark: %v", err) + logger.Error(err) + return err } + // 1. 点卡:days == 0, calls > 0 // 2. vip 套餐:days > 0, calls == 0 if remark.Days > 0 { @@ -256,18 +333,57 @@ func (h *PaymentHandler) AlipayNotify(c *gin.Context) { // 更新用户信息 res = h.db.Updates(&user) if res.Error != nil { - logger.Error(res.Error) - c.String(http.StatusOK, "fail") - return + err := fmt.Errorf("error with update user info: %v", res.Error) + logger.Error(err) + return err } // 更新订单状态 order.PayTime = time.Now().Unix() order.Status = types.OrderPaidSuccess - h.db.Updates(&order) + res = h.db.Updates(&order) + if res.Error != nil { + err := fmt.Errorf("error with update order info: %v", res.Error) + logger.Error(err) + return err + } // 更新产品销量 h.db.Model(&model.Product{}).Where("id = ?", order.ProductId).UpdateColumn("sales", gorm.Expr("sales + ?", 1)) + return nil +} + +// GetPayWays 获取支付方式 +func (h *PaymentHandler) GetPayWays(c *gin.Context) { + data := gin.H{} + if h.App.Config.AlipayConfig.Enabled { + data["alipay"] = gin.H{"name": "alipay"} + } + if h.App.Config.HuPiPayConfig.Enabled { + data["hupi"] = gin.H{"name": h.App.Config.HuPiPayConfig.Name} + } + resp.SUCCESS(c, data) +} + +// HuPiPayNotify 虎皮椒支付异步回调 +func (h *PaymentHandler) HuPiPayNotify(c *gin.Context) { + err := c.Request.ParseForm() + if err != nil { + c.String(http.StatusOK, "fail") + return + } + + orderNo := c.Request.Form.Get("trade_order_id") + logger.Infof("收到订单支付回调,订单 NO:%s", orderNo) + // TODO 是否要保存订单交易流水号 + h.lock.Lock() + defer h.lock.Unlock() + + err = h.notify(orderNo) + if err != nil { + c.String(http.StatusOK, "fail") + return + } c.String(http.StatusOK, "success") } diff --git a/api/handler/test_handler.go b/api/handler/test_handler.go new file mode 100644 index 00000000..58d2a668 --- /dev/null +++ b/api/handler/test_handler.go @@ -0,0 +1,40 @@ +package handler + +import ( + "chatplus/service" + "github.com/gin-gonic/gin" +) + +type TestHandler struct { + snowflake *service.Snowflake +} + +func NewTestHandler(snowflake *service.Snowflake) *TestHandler { + return &TestHandler{snowflake: snowflake} +} + +func (h *TestHandler) TestPay(c *gin.Context) { + //appId := "" //Appid + //appSecret := "" //密钥 + //var host = "https://api.xunhupay.com/payment/do.html" //跳转支付页接口URL + //client := payment.NewXunHuPay(appId, appSecret) //初始化调用 + // + ////支付参数,appid、time、nonce_str和hash这四个参数不用传,调用的时候执行方法内部已经处理 + //orderNo, _ := h.snowflake.Next() + //params := map[string]string{ + // "version": "1.1", + // "trade_order_id": orderNo, + // "total_fee": "0.1", + // "title": "测试支付", + // "notify_url": "http://xxxxxxx.com", + // "return_url": "http://localhost:8888", + // "wap_name": "极客学长", + // "callback_url": "", + //} + // + //execute, err := client.Execute(host, params) //执行支付操作 + //if err != nil { + // logger.Error(err) + //} + //resp.SUCCESS(c, execute) +} diff --git a/api/main.go b/api/main.go index f81976fa..40116c1b 100644 --- a/api/main.go +++ b/api/main.go @@ -192,6 +192,7 @@ func main() { }), fx.Provide(payment.NewAlipayService), + fx.Provide(payment.NewHuPiPay), fx.Provide(service.NewSnowflake), fx.Provide(service.NewXXLJobExecutor), fx.Invoke(func(exec *service.XXLJobExecutor, config *types.AppConfig) { @@ -318,10 +319,12 @@ func main() { }), fx.Invoke(func(s *core.AppServer, h *handler.PaymentHandler) { group := s.Engine.Group("/api/payment/") - group.GET("alipay", h.Alipay) + group.GET("doPay", h.DoPay) + group.GET("payWays", h.GetPayWays) group.POST("query", h.OrderQuery) - group.POST("alipay/qrcode", h.AlipayQrcode) + group.POST("qrcode", h.PayQrcode) group.POST("alipay/notify", h.AlipayNotify) + group.POST("hupipay/notify", h.HuPiPayNotify) }), fx.Invoke(func(s *core.AppServer, h *admin.ProductHandler) { group := s.Engine.Group("/api/admin/product/") @@ -353,6 +356,11 @@ func main() { group.GET("hits", h.Hits) }), + fx.Provide(handler.NewTestHandler), + fx.Invoke(func(s *core.AppServer, h *handler.TestHandler) { + group := s.Engine.Group("/test/") + group.GET("pay", h.TestPay) + }), fx.Invoke(func(s *core.AppServer, db *gorm.DB) { err := s.Run(db) if err != nil { diff --git a/api/res/img/wechat-pay.jpg b/api/res/img/wechat-pay.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db398396e7d2f1ab1ee1f565e953ee1564e7c9b4 GIT binary patch literal 5850 zcmbW4cT`kOvcUV!oxqTX9A(IHKtOVk90Vjsku(gMAx9AvkxzmWBqLE234($W&7!Cv zN=~8#0VASFP*C2C?&`OD&hC5X)gL{-uCBUWRb6*Z-<|QDIeI5keSLQ;8%rZob3*_@ z0MMJ5`;$Wu%m4(FBg1Ws_3%#4E_h5oKmaU219<>Ei4ma|wnlbJJF*H090LY4Bt>{gPAW}G)!a*^Sp;Y|}h1t9Usf<8UIh+z8 zg}JEg`-^3M+WcZ2DtiZ$y(u=-m_xmTy{X(y;giu(Bnrdk6i$iuC&f^Bn8G4KQNjKc z-lQ;FFv&9l03BH@8^eLj zO8I}we_i}-_1}Sdw!bV^t$&^w#L@Rh_s92-E~E+o)ip|Ovi|72iU4Rk0RY$JADu`A z08GgMv_Ab?J{;73@r#TMRhN^CiHVW*ClO_-1^q4mtHE!}{|tZIPnNph@7m!FNIsrX zL6LZBQHdczAyMJ@h)_==2~YUT3$HR{sEO?y`XSDI0)4^Z_I*9e`cSC@awKb2G;}0P36P zD6sUa?)u0wMf@aVLu7f+^0q6zK zzzCQEGhhL{11n%1Y(Wr&ffyiGh#L}sL?LNN0aAsuAw$R=n*skO+d5I8|X9i4FMzQ5o`#4gcw2&p^DH&m?7*C2NAxAFho2e z8F3m>h^Rs|AX*W35WR>I#0=scVhsi`9n1j>!UR|q)`u-&7uW|5hZEs6I3KQp8{tm4 z2OffF;P>!XBpS(z#3Knv4WtRu9!W%oArp}q$YSJ0WGk{8IfR@=t{{J)7*KpDX_Pw3 z6y=2SMa7^}Q2D3}sB5VEs1eixY8{P6bD+i1Drgh5Gdci$2%Uj0MK_^uqX*FQ=rs%m z!;O)~Xkjcdo|s5X3Z@9tfVqVk#4KPoY3OJKXcTCSXk2K>G)Xl1G<7sLX$EPQXtuD- zSW&Dx))MQDjl*VQtFfKfr`QGT7A=leoK}n0jy8by7;PbKBkg_K=d`PIbaX;=YIN3g z{&Yv_3h6G>J*1nZ`%2G3FGa6U?@Av!)bGhvxTnRJ=lnBtl8nOc~hGQDTUGK(?mGkY>8GM6xS zFpn{>;aG9p*3Y)W&ceQj-GM!py@dS+`wR!nA;w|K5yX+n(abT*@r{$8Qmm z!;)x8RmnifQpsmh2q`5gKdBO_r_u;%WoduuQt1I1l#H4TS*A*6j6hG&B}5bI3A3^s zvgWc$vTd@U}> zcEwM7r1y~al$^q#5)ZvKZPM78|}W5;F2N zsyA9ORx&Cy@9@5EGkP;yvtqM3b1Cz1^G*wd#XgHO z7SH#K?kDeWvjmo=mS-%dt;DUuth%hx)>hUf){8dsHVHO8wyd`9wsp4ac6xT1c2o8e z_EGkC9he+k9cmpm91R?E9A}*5oDMtnI`cUDJGZ-FTpV03xU3y8Jdk%_!BxpM#dY+c z_`%qNkKB0Ng4}MnGr4=Zw|JmD96jnhwmmI9t321dOuf!}tq}Ez1;lsWI^Mb7Z%A6C z9MY1HmQRk)YhNwjGrn*9_WI@fz4zDmFZTZwU=mOsun}k(SQEGtx(c7?=-41`LDri9LfsfXo-t%RF}Ux;KD zIDL0|e)@I>G2`(m`BR0bc24`8?$1=tEXzV?k+Vj#_hw(r!R5r~%%8D1)0&IVP0Rg~ z=brZ{e@}jS0c}B4!AzlfVSABCQC87*v0w2>iC#(5S-!KWXE#c{O9#tz${Nf0%hSuh zRrptoR~lEgR*6;RpF^LEKDSuyP~CH0^?dCGo(t(0zSodzW-i)X?536ZBcZXfiK8j~GPoRd`Rx^tE2GV3&39W=TN{;1=z>f^Rv<=)mlrM_!Vl%8DcSMG0p zs`9k`ncB0?0nLG%gL?<>3>geP7&aa59oauJFls+KKIS?$Gwwb9dLn4z(`5AI*3{AG zsOM?Z%+vWV_+C`KlziDVqdaqC)?l`8&US8Uo;d&RRm7|9h2%ws#r!3KrP|jDudlx` zdh_ht@Px*lRaCTW@`RYfVk9{jnD+`~(Kkarn0j5Db`M z1dOKM3;roPQy>{2ehW+?7)cpnBnn9t6dLtY&}a;X27^Ikv9z>UEd9R<1j8^2iNd1M zSO!`wEdvuHMVOd=8vWyk{@3hZ{eI7O?gAVQ*bUTS2nP^22*yD>-Jp+hwL!qt&!K+` z4dvqpiNZj%(7&&sF#w5xQ4kF?02qLPDEJR2h?)y!nT8pUV-aLy=iua`?16v~NEnHs z=&AD428X6pi$$Il!))!T5LPLqXT!#U&raH7r<5bCXv?Xh%0jV2ps+{`2KDRN5Do!g zL3!&i7G_<~W7!INHpoh^B-WKHcZ9+R+3-14&58!7yTT%Sly)WoJtY$a4#rVjk7&nY zOK;)rIyg1j*`W#=?ZZt)&RpFv=^v%je5U5L{dN20=Tn^@ zJ{z39ZNY@}c%O1#>aRUmH)*F5LMug4Wwq)Zq(iasQ`^MARFKS9;&Mmjf zV>)e_J?(tOa7)|Xij##$#A?LGi%R-!8U%2;`GH)fUA(FKVG7*(iS3$K9rY|kv(?2R zX7&PWVkrDFkM>TEO6tQ6o6jjv9X1(g^`{#X+A|Iw%#Gdr85B$nO8#i&-l}X^v-yz* z&S{R|TYim8OVEb9CHHL26LcR@@^w7qD06DL+>dk(SguuqqpEB?J~RT zbFi_%QxRz~*TeNW+~aHfOyOd)hs-KQj4M7e!Q)qK5H&V?y8%o0<%9&`dgYf5Q>Wu3 z**TAnMoxB4_(qHIs3xC1*=!imejvSvB{Ab1>Q>-s>4?oSN7wLPsk!L;dFF$am%f!- zUZ|SVvH6gn+ShZ@J|Kcn(rVU1BN%r2YSm=Cd_ye zv)(Oeg;Y6Q8-4O^s=z1kR}KgSdM~iG<35aMQhOc~MZYnUAfOPDwTPh^XV%Mc*mRC? zQ_4~15ym*lGkP$m-#4}iJf?8qcyWNR;Ohl8IAJo5%>8AcNwG;x!iI4ysAByws84K0yjTX=YWy=#Vf~m4;@T(m8>po*a1~HrM(%JQ)g#$9Asig)p2KCMbx^s8I-{{rI!^>VD-ylzd!Y0LWc5RjuIFZgQ4 zgR814nmq`i4Lq|3UWIe>{vu`1&(*(0>_Qj!#BQOlw;)rjy2--&er&Zjf+e!(eD`#A z63eaVBDzW|;b!i+0MgXK(##)t{x*VJ1c5HJ9S1S58a6 zy~$Lh^*RDh4ho>@c6Aszk*77^Z8B~bZN%8_6{4YsJ7kEl;YTAU_A>@1B`NGm(lyE) z7FJtm_q|Fj>4n*X(&g!qzDNdd{disZr-d8fn_s{uwfYlnz%4IVKYNwmG$M7<0W;Fe zlskK3^jd6^@2>Ni8Wq|>&74duyo##PujOAo&R^2*u6Fln|Cag6l|NaQ-AH9_k5oYL zN_@!tjZs?pG>I$6ll>dJ8?mCMX-~J;KCQa5dUq+N3eeSt_~<^f+#@g~{yA`V!kfG0 zB%=~^a|f7NAaFhOm9{9yuEKREw9bPQA{9L5A&El|KSk&iNg~(nuIuNPKMt-sYR4VH zF(*zu=Ut-7I#DXqsBt!XK|%-ophOGwhu?wRrv07zujMHHO#r+{b$)Bh|S#@>iZ2Bzm;FG3h(wF8-LEj6Hi#dm+k!#;QXIuQTBPPj5 z=1ahMKwd{_9-xIEYq_C;QOrDdk=1v%Bt&3H*PAFlZ;lBM9( z)y*c{yp}_CM}UIz@$mUdlZJbZ$DIT5POscq_MwEIKey@k2;WV*qQ=#IwP`f;Q)l_f z75r!XDkgjB{gpS$V_l*_hrz9e4+e)Uic0k_>D+#|P?hBx71Eq&+w@+fa39RymZMjo zVzDwXy#Hm9*E5cyp1%SZjrY%0yn7%%^iYNH{a!~5>f6e)^OJ&rFB#|U#>+Z8lG=IR zvfDj&+`leex$fH%{VMJf=`#n}Ql@xA@u{?$xZCy3hQoSOpOzWU=brd9;WvIczpCHS zER;>^&YZBDvD@He#8Bq&k6hQ_rPdEd1pQQ*OL2l{J_sHwFuYt^jk|EFW;$dSdh&Mg z)`aHALn4I_=R8FW@vgr(U)ZjBHdDSjKy9g#E*5<{lI{&lfpI4 zZPg`pQ(Q7?-`TVBuHha|=2vxpA@<9Kjl?%`M3kKF-ui9}_2t{d(?Y$$Uz!{fJ+d+q2FnR@j*BkUO*1vN)4VG9m)`6390%Hi zMzEjaTq7^=4$D-U62k^^f2_oxCKh02_79k`Von=~Iy>*LNK#8;!U&#y{Jifa$u6+1 zCa3$p~Nd4@lcH6fApHM)K(sEUm)MEOMKc zWei_PYi`qNwSN^Yz)JH?^}TD^c=nO$1Fc<&okzdB#*nAqr9E)KeAhI$oz5.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}")}catch(l){console&&console.log(l)}}t=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?s(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,h=a.document,e=!1,z(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,m())})}function m(){e||(e=!0,i())}function z(){try{h.documentElement.doScroll("left")}catch(l){return void setTimeout(z,50)}m()}}(window); \ No newline at end of file +window._iconfont_svg_string_4125778='',function(a){var l=(l=document.getElementsByTagName("script"))[l.length-1],c=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,h,e,s=function(l,c){c.parentNode.insertBefore(l,c)};if(c&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}t=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?s(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,h=a.document,e=!1,z(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,m())})}function m(){e||(e=!0,i())}function z(){try{h.documentElement.doScroll("left")}catch(l){return void setTimeout(z,50)}m()}}(window); \ No newline at end of file diff --git a/web/src/assets/iconfont/iconfont.json b/web/src/assets/iconfont/iconfont.json index 951e07cf..6e99ab74 100644 --- a/web/src/assets/iconfont/iconfont.json +++ b/web/src/assets/iconfont/iconfont.json @@ -5,6 +5,13 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "1486848", + "name": "支付宝支付", + "font_class": "alipay", + "unicode": "e634", + "unicode_decimal": 58932 + }, { "icon_id": "845789", "name": "笑脸", diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf index 4715297f65e1df7f32a25bd20919856ef9f4ceb4..df9a3753dd711555a4f1400aaee4bc39b7077217 100644 GIT binary patch delta 1357 zcmZ{jTTEP46o&sjbLPSf!!Wl4!T@tYPMOh>%P>15^%7$&Mp25hGQ50PgR%-l10M|)wniK9% zj1~6RNc;5c!m*22D?bC`7RTpj=AJ8Tt^CIQt}Mq-%odIn#em3jy^-VCONH5q`gi-^ z=TX~u=Tvd-72iUseRu%aeuA6cIk}eHnS$V6VjLO1aKzvL2fPL+fE#bU`u%^l@@Hkq zxM^SI*bSSS<)gk!m0QKN@@?_Kj&s#9#2MJDz58fAy!9LmG0&aD7=iA8aEcTaMXZE~!(8vG4!3ANz6OF6|)h)__{La4(#&V4$6TB+!C5J?elD z+YsX|el#$aI)oWdCxY}XfKV%$kl19OcAt{W4EjvHCE6;NQZ{5LQ*mXorY9rshiYXP{TkVqm)TT zxzIuz*DyLrwMZBzWJ<$`A@A2PcF2r|DnNE?5Tj)UDOBzxD@Z|&ARp9FEyzI)N^W+B zG?Wl>L_;wl$2F=<(?|)C)R(|FtJ$wRl^ixSL}X~)Kk8WsRHUemA? zs6ViRD`L_XwoTf8vhT648ZpOBXTS4z*Vpc-`*O{qr^kEP`$g?_UzcyM?_%9yf1`iW zzga(4e>;#0EC*YIXG062Tj48_&&;6NVP0<7$1`n}N@dv)_GSJAPqAnM*^EfW6LlgI z2)Byfc+a57TkTfK>2f9$Rz~D=sx_DmW}C?6<9)q-Ns=EFJ47VT*6VbcK9R6GtPZ`k zw}+egwSm4vxjU=5Lw&Ti#RneW?)Gf`GB-B%*u+Ran{zlK&DouWUAg$fZAo)${>#lx zVXJXJD^S6A%?}j@MEFj0B%P@9I*j^YQ_R{kvis5e(C*L0U;4=E(W$)|V=4D!XQrv? z>ArL_V@7M7b#BwUYup-5PdW_OVtTYVVIF*@DUysfnjzEY4+X4Ii=}y~=xXT_sq&lo W10IovvoP~Qv2gs-jeJtDxbZK3d?Q-` delta 1035 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±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 LgWwkmzirY0bt;u$ delta 9567 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 diff --git a/web/src/views/Member.vue b/web/src/views/Member.vue index 45750f56..dcf779b0 100644 --- a/web/src/views/Member.vue +++ b/web/src/views/Member.vue @@ -41,7 +41,7 @@ @@ -113,7 +123,7 @@ title="充值订单支付">
- +
@@ -130,9 +140,10 @@ - 请打开手机支付宝扫码支付 + 请打开手机{{ payName }}扫码支付
+ @@ -152,6 +163,7 @@ import RewardVerify from "@/components/RewardVerify.vue"; import {useRouter} from "vue-router"; import {removeUserToken} from "@/store/session"; import UserOrder from "@/components/UserOrder.vue"; +import CountDown from "@/components/CountDown.vue"; const listBoxHeight = window.innerHeight - 97 const list = ref([]) @@ -171,11 +183,15 @@ const isLogin = ref(false) const router = useRouter() const curPayProduct = ref(null) const activeOrderNo = ref("") -const countDown = ref(null) +const countDownRef = ref(null) const orderTimeout = ref(1800) const loading = ref(true) const orderPayInfoText = ref("") +const payWays = ref({}) +const payName = ref("支付宝") +const curPay = ref("alipay") // 当前支付方式 + onMounted(() => { checkSession().then(_user => { @@ -200,9 +216,48 @@ onMounted(() => { }).catch(e => { ElMessage.error("获取系统配置失败:" + e.message) }) + + httpGet("/api/payment/payWays").then(res => { + payWays.value = res.data + }).catch(e => { + ElMessage.error("获取支付方式失败:" + e.message) + }) }) -const orderPay = (row) => { +// refresh payment qrcode +const refreshPayCode = () => { + if (curPay.value === 'alipay') { + alipay() + } else if (curPay.value === 'hupi') { + huPiPay() + } +} + +const genPayQrcode = () => { + loading.value = true + text.value = "" + httpPost("/api/payment/qrcode", { + pay_way: curPay.value, + product_id: curPayProduct.value.id, + user_id: user.value.id + }).then(res => { + showPayDialog.value = true + qrcode.value = res.data['image'] + activeOrderNo.value = res.data['order_no'] + queryOrder(activeOrderNo.value) + loading.value = false + // 重置计数器 + if (countDownRef.value) { + countDownRef.value.resetTimer() + } + }).catch(e => { + ElMessage.error("生成支付订单失败:" + e.message) + }) +} + +const alipay = (row) => { + payName.value = "支付宝" + curPay.value = "alipay" if (!user.value.id) { showLoginDialog.value = true return @@ -210,21 +265,22 @@ const orderPay = (row) => { if (row) { curPayProduct.value = row } - loading.value = true - text.value = "" - httpPost("/api/payment/alipay/qrcode", {product_id: curPayProduct.value.id, user_id: user.value.id}).then(res => { - showPayDialog.value = true - qrcode.value = res.data['image'] - activeOrderNo.value = res.data['order_no'] - queryOrder(activeOrderNo.value) - loading.value = false - // 重置计数器 - if (countDown.value) { - countDown.value.resetTimer() - } - }).catch(e => { - ElMessage.error("生成支付订单失败:" + e.message) - }) + genPayQrcode() +} + +// 虎皮椒支付 +const huPiPay = (row) => { + payName.value = payWays.value["hupi"]["name"] === "wechat" ? '微信' : '支付宝' + curPay.value = "hupi" + if (!user.value.id) { + showLoginDialog.value = true + return + } + if (row) { + curPayProduct.value = row + } + genPayQrcode() + } const queryOrder = (orderNo) => { @@ -416,6 +472,16 @@ const logout = function () { } } + + .pay-way { + padding 10px 0 + display flex + justify-content: space-between + + .iconfont { + margin-right 5px + } + } } &:hover {