- service/dto/controller 各拆 18 文件,一表一文件;跨表编排留在 outfit_generation_task_service - controller 共享 struct(outfit/member)保 /outfit/*、/member/* 前缀,路由零漂移(28 路径 diff 为空) - 修复 4 个缺失 g.Meta handler:/user/profile、/avatar/get、/body-measurement/get、/hairstyle/list 从 ALL 收敛为 GET - 工具包并入 agent/ 单包(weather/imagegen/avatar/scoring),NewCache 泛化 NewTTLCache - 虎皮椒支付适配器内联 service/payment_order_service.go,member 服务拆 4 表文件 - 冒烟 21 路径全绿 + 客户端 dart analyze 零 error
71 lines
2.3 KiB
Go
71 lines
2.3 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
commonHttp "slogan-agent/common"
|
|
"slogan-agent/styleagent/model/dto"
|
|
"slogan-agent/styleagent/service"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/ghttp"
|
|
)
|
|
|
|
// OrderCreate 下单 → 返回支付 URL
|
|
func (c *member) OrderCreate(ctx context.Context, req *dto.MemberOrderCreateReq) (res *dto.MemberOrderCreateRes, err error) {
|
|
order, payURL, err := service.PaymentOrderService.CreateMemberOrder(ctx, commonHttp.GetUserId(g.RequestFromCtx(ctx)), req.PlanId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.MemberOrderCreateRes{OrderNo: order.OrderNo, PayUrl: payURL}, nil
|
|
}
|
|
|
|
// OrderStatus 订单状态(App 轮询)
|
|
func (c *member) OrderStatus(ctx context.Context, req *dto.MemberOrderStatusReq) (res *dto.MemberOrderStatusRes, err error) {
|
|
order, err := service.PaymentOrderService.OrderStatus(ctx, req.OrderNo)
|
|
if err != nil || order == nil {
|
|
return nil, errors.New("订单不存在")
|
|
}
|
|
paidAt := ""
|
|
if order.PaidAt != nil {
|
|
paidAt = order.PaidAt.Format("Y-m-d H:i:s")
|
|
}
|
|
return &dto.MemberOrderStatusRes{Status: order.Status, TradeNo: order.TradeNo, PaidAt: paidAt}, nil
|
|
}
|
|
|
|
// MemberNotify 虎皮棋支付回调:验签 → 幂等开通 → 返回裸文本 "success"
|
|
// 虎皮棋要求回调响应体为字面 "success",故不走统一 JSON 包装(main.go 手动绑定)
|
|
func MemberNotify(r *ghttp.Request) {
|
|
ctx := r.Context()
|
|
body := r.GetBodyString()
|
|
hash := r.Get("hash").String()
|
|
orderNo := r.Get("trade_order_id").String()
|
|
remoteIP := r.GetClientIp()
|
|
|
|
params := make(map[string]string)
|
|
for k, v := range r.GetRequestMap() {
|
|
params[k] = fmt.Sprint(v)
|
|
}
|
|
ok := service.PaymentOrderService.VerifyNotify(params, hash, g.Cfg().MustGet(ctx, "payment.xunhu_appsecret", "").String())
|
|
|
|
if !ok {
|
|
_ = service.PayNotifyLogService.Insert(ctx, orderNo, body, hash, remoteIP, "bad_sign")
|
|
r.Response.Write("fail")
|
|
r.ExitAll()
|
|
return
|
|
}
|
|
|
|
state, err := service.PaymentOrderService.HandlePaidNotify(ctx, orderNo, r.Get("transaction_id").String(), body)
|
|
_ = service.PayNotifyLogService.Insert(ctx, orderNo, body, hash, remoteIP, state)
|
|
// duplicate(幂等重复回调)同样返回 success,避免支付渠道无限重试
|
|
if err != nil || state == "no_order" {
|
|
r.Response.Write("fail")
|
|
r.ExitAll()
|
|
return
|
|
}
|
|
r.Response.Write("success")
|
|
r.ExitAll()
|
|
}
|