From 11459f73427534b78753e61f515a60874fc975e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Fri, 31 Jul 2026 13:45:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=86=92=E7=83=9F=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=EF=BC=88=E6=94=AF=E4=BB=98=E5=93=8D=E5=BA=94=E8=A7=A3=E6=9E=90?= =?UTF-8?q?/=E4=BC=9A=E5=91=98=E7=A9=BA=E6=8C=87=E9=92=88/=E5=B9=82?= =?UTF-8?q?=E7=AD=89=E5=9B=9E=E8=B0=83=E8=BF=94=E5=9B=9E=20success?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- styleagent/controller/member_controller.go | 3 ++- styleagent/payment/gateway.go | 9 ++++++++- styleagent/service/member_service.go | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/styleagent/controller/member_controller.go b/styleagent/controller/member_controller.go index a095f05..23e6346 100644 --- a/styleagent/controller/member_controller.go +++ b/styleagent/controller/member_controller.go @@ -90,7 +90,8 @@ func MemberNotify(r *ghttp.Request) { _ = dao.PayNotifyLog.Insert(ctx, &entity.PayNotifyLog{ OrderNo: orderNo, Body: body, Sign: hash, RemoteIp: remoteIP, Status: state, }) - if err != nil || state != "ok" { + // duplicate(幂等重复回调)同样返回 success,避免支付渠道无限重试 + if err != nil || state == "no_order" { r.Response.Write("fail") r.ExitAll() return diff --git a/styleagent/payment/gateway.go b/styleagent/payment/gateway.go index 6155187..422804d 100644 --- a/styleagent/payment/gateway.go +++ b/styleagent/payment/gateway.go @@ -5,6 +5,7 @@ import ( "crypto/md5" "crypto/rand" "encoding/hex" + "encoding/json" "errors" "fmt" "sort" @@ -65,7 +66,13 @@ func CreateOrder(ctx context.Context, orderNo string, amountFen int) (payURL str Errmsg string `json:"errmsg"` Url string `json:"url"` } - if _, err := g.Client().SetTimeout(10 * time.Second).Post(context.Background(), cfg.ApiBase+"/payment/do.html", params, &resp); err != nil { + // 注意:Post 的最后一个参数不会自动解析响应体,需手动读取后反序列化 + respRaw, err := g.Client().SetTimeout(10 * time.Second).Post(context.Background(), cfg.ApiBase+"/payment/do.html", params) + if err != nil { + return "", fmt.Errorf("虎皮棋下单失败: %w", err) + } + defer respRaw.Close() + if err := json.Unmarshal(respRaw.ReadAll(), &resp); err != nil { return "", fmt.Errorf("虎皮棋下单失败: %w", err) } if resp.Errcode != 0 { diff --git a/styleagent/service/member_service.go b/styleagent/service/member_service.go index 1864c1f..be78cdc 100644 --- a/styleagent/service/member_service.go +++ b/styleagent/service/member_service.go @@ -101,7 +101,11 @@ func (s *memberService) HandlePaidNotify(ctx context.Context, orderNo, tradeNo, days = plan.DurationDays } um, _ := dao.UserMember.GetByUser(ctx, order.UserId) - expireAt := NextExpire(um.ExpireAt, days) + var oldExpire *gtime.Time + if um != nil { + oldExpire = um.ExpireAt + } + expireAt := NextExpire(oldExpire, days) if err := dao.UserMember.Upsert(ctx, order.UserId, order.PlanId, expireAt, consts.MemberSourceVipPay); err != nil { return "no_order", err }