package pay import ( "context" "database/sql" "encoding/hex" "encoding/json" "fmt" "sim-server/app/main/api/internal/service" "sim-server/app/main/api/internal/svc" "sim-server/app/main/api/internal/types" "sim-server/app/main/model" "sim-server/common/ctxdata" "sim-server/common/xerr" "sim-server/pkg/lzkit/crypto" "os" "strings" "time" "github.com/Masterminds/squirrel" "github.com/google/uuid" "github.com/pkg/errors" "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" ) type PaymentLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } type PaymentTypeResp struct { amount float64 outTradeNo string description string orderID string // 订单ID,用于开发环境测试支付模式 userName string // 用户姓名(从查询缓存中获取) userMobile string // 用户手机号(从查询缓存中获取) } func NewPaymentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentLogic { return &PaymentLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, err error) { var paymentTypeResp *PaymentTypeResp var prepayData interface{} var orderID string // 检查是否为开发环境的测试支付模式 env := os.Getenv("ENV") isDevTestPayment := env == "development" && (req.PayMethod == "test" || req.PayMethod == "test_empty") isEmptyReportMode := env == "development" && req.PayMethod == "test_empty" l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { switch req.PayType { case "agent_vip": // 系统简化:已废弃会员充值功能 return errors.Wrapf(xerr.NewErrMsg("该功能已废弃"), "") case "query": paymentTypeResp, err = l.QueryOrderPayment(req, session) if err != nil { return err } case "agent_upgrade": // 系统简化:已废弃升级功能 return errors.Wrapf(xerr.NewErrMsg("该功能已废弃"), "") } // 开发环境测试支付模式:跳过实际支付流程 // 注意:订单状态更新在事务外进行,避免在事务中查询不到订单的问题 if isDevTestPayment { // 获取订单ID(从 QueryOrderPayment 返回的 orderID) if paymentTypeResp.orderID == "" { return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "开发测试模式,订单ID无效") } orderID = paymentTypeResp.orderID // 在事务中只记录订单ID,不更新订单状态 // 订单状态的更新和后续流程在事务提交后处理 logx.Infof("开发环境测试支付模式:订单 %s (ID: %s) 将在事务提交后更新状态", paymentTypeResp.outTradeNo, orderID) // 返回测试支付标识 prepayData = "test_payment_success" return nil } // 正常支付流程 var createOrderErr error if req.PayMethod == "wechat" { prepayData, createOrderErr = l.svcCtx.WechatPayService.CreateWechatOrder(l.ctx, paymentTypeResp.amount, paymentTypeResp.description, paymentTypeResp.outTradeNo) } else if req.PayMethod == "alipay" { prepayData, createOrderErr = l.svcCtx.AlipayService.CreateAlipayOrder(l.ctx, paymentTypeResp.amount, paymentTypeResp.description, paymentTypeResp.outTradeNo) } else if req.PayMethod == "easypay_alipay" { if l.svcCtx.EasyPayService == nil { return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "易支付服务未启用") } // 获取用户ID用于次数轮询模式 userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) if getUidErr != nil { // 如果获取用户ID失败,使用空字符串(会回退到天数轮询) userID = "" } easyPayResult, createOrderErr := l.svcCtx.EasyPayService.CreateEasyPayOrder(l.ctx, paymentTypeResp.amount, paymentTypeResp.description, paymentTypeResp.outTradeNo, userID) if createOrderErr == nil && easyPayResult != nil { prepayData = easyPayResult.PayURL // 将渠道ID存储到context中,后续创建订单时使用 ctx = context.WithValue(ctx, "easypay_cid", easyPayResult.CID) l.ctx = ctx } } else if req.PayMethod == "appleiap" { prepayData = l.svcCtx.ApplePayService.GetIappayAppID(paymentTypeResp.outTradeNo) } else if req.PayMethod == "yunyinSignPay" || req.PayMethod == "yunyinSignPay_wechat" || req.PayMethod == "yunyinSignPay_alipay" { logx.Infof("[云印签支付] 开始处理支付请求,支付方式: %s, 订单号: %s", req.PayMethod, paymentTypeResp.outTradeNo) if l.svcCtx.YunYinSignPayService == nil { logx.Errorf("[云印签支付] 支付服务未启用") return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "云印签支付服务未启用") } // 从查询缓存中获取用户姓名和手机号 if paymentTypeResp.userMobile == "" { logx.Errorf("[云印签支付] 查询缓存中未找到用户手机号,订单号: %s", paymentTypeResp.outTradeNo) return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查询缓存中未找到用户手机号,无法使用云印签支付") } // 获取用户ID userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) if getUidErr != nil { logx.Errorf("[云印签支付] 获取用户ID失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, getUidErr) return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取用户ID失败: %+v", getUidErr) } // 根据支付方式确定支付类型 payType := 0 // 默认微信支付 if req.PayMethod == "yunyinSignPay_alipay" { payType = 1 // 支付宝支付 } logx.Infof("[云印签支付] 支付参数,订单号: %s, 用户ID: %s, 用户手机: %s, 用户姓名: %s, 金额: %.2f, 支付类型: %d(0=微信,1=支付宝)", paymentTypeResp.outTradeNo, userID, paymentTypeResp.userMobile, paymentTypeResp.userName, paymentTypeResp.amount, payType) // 查询用户是否有未完成的签署(待签署且待支付) var yunYinSignPayResult *service.CreateYunYinSignPayOrderResult // 使用 SelectBuilder 查询未完成的签署订单(del_state 由系统自动处理) logx.Infof("[云印签支付] 查询用户未完成的签署订单,用户ID: %s", userID) unfinishedBuilder := l.svcCtx.YunyinSignPayOrderModel.SelectBuilder(). Where(squirrel.Eq{ "user_id": userID, "sign_status": 0, // 待签署 "pay_status": 0, // 待支付 }). OrderBy("create_time DESC"). Limit(1) unfinishedOrders, findUnfinishedErr := l.svcCtx.YunyinSignPayOrderModel.FindAll(l.ctx, unfinishedBuilder, "") var unfinishedOrder *model.YunyinSignPayOrder if findUnfinishedErr == nil && len(unfinishedOrders) > 0 { unfinishedOrder = unfinishedOrders[0] logx.Infof("[云印签支付] 找到未完成的签署订单,订单号: %s, 任务ID: %s, 参与者ID: %s, 金额: %.2f", paymentTypeResp.outTradeNo, unfinishedOrder.TaskId, unfinishedOrder.ParticipantId, unfinishedOrder.Amount) } else { if findUnfinishedErr != nil { logx.Infof("[云印签支付] 查询未完成签署订单失败,用户ID: %s, 错误: %v", userID, findUnfinishedErr) } else { logx.Infof("[云印签支付] 未找到未完成的签署订单,用户ID: %s, 将创建新签署流程", userID) } } if unfinishedOrder != nil { // 复用未完成的签署,只获取新的支付链接 logx.Infof("[云印签支付] 复用未完成的签署,订单号: %s, 任务ID: %s, 参与者ID: %s", paymentTypeResp.outTradeNo, unfinishedOrder.TaskId, unfinishedOrder.ParticipantId) // 获取token和操作ID(带缓存) logx.Infof("[云印签支付] 开始获取AccessToken,订单号: %s", paymentTypeResp.outTradeNo) accessToken, tokenErr := l.svcCtx.YunYinSignPayService.GetAccessToken(l.ctx) if tokenErr != nil { logx.Errorf("[云印签支付] 获取AccessToken失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, tokenErr) return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取云印签token失败: %+v", tokenErr) } logx.Infof("[云印签支付] 获取AccessToken成功,订单号: %s", paymentTypeResp.outTradeNo) logx.Infof("[云印签支付] 开始获取操作ID,订单号: %s", paymentTypeResp.outTradeNo) operationUserId, userIdErr := l.svcCtx.YunYinSignPayService.GetUserId(l.ctx, accessToken) if userIdErr != nil { logx.Errorf("[云印签支付] 获取操作ID失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, userIdErr) return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取云印签操作ID失败: %+v", userIdErr) } logx.Infof("[云印签支付] 获取操作ID成功,订单号: %s, 操作ID: %s", paymentTypeResp.outTradeNo, operationUserId) // 获取新的支付链接 logx.Infof("[云印签支付] 开始获取支付链接,订单号: %s, 参与者ID: %s, 支付类型: %d", paymentTypeResp.outTradeNo, unfinishedOrder.ParticipantId, payType) payURL, payURLErr := l.svcCtx.YunYinSignPayService.GetPaymentURL(l.ctx, accessToken, operationUserId, unfinishedOrder.ParticipantId, payType) if payURLErr != nil { logx.Errorf("[云印签支付] 获取支付链接失败,订单号: %s, 参与者ID: %s, 错误: %+v", paymentTypeResp.outTradeNo, unfinishedOrder.ParticipantId, payURLErr) return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取云印签支付链接失败: %+v", payURLErr) } logx.Infof("[云印签支付] 获取支付链接成功,订单号: %s, 支付链接: %s", paymentTypeResp.outTradeNo, payURL) yunYinSignPayResult = &service.CreateYunYinSignPayOrderResult{ PayURL: payURL, ParticipantID: unfinishedOrder.ParticipantId, TaskID: unfinishedOrder.TaskId, } logx.Infof("[云印签支付] 复用签署流程完成,订单号: %s, 任务ID: %s, 参与者ID: %s, 支付链接: %s", paymentTypeResp.outTradeNo, yunYinSignPayResult.TaskID, yunYinSignPayResult.ParticipantID, yunYinSignPayResult.PayURL) } else { // 没有未完成的签署,创建新的签署流程 logx.Infof("[云印签支付] 开始创建新签署流程,订单号: %s, 用户手机: %s, 用户姓名: %s, 金额: %.2f, 支付类型: %d", paymentTypeResp.outTradeNo, paymentTypeResp.userMobile, paymentTypeResp.userName, paymentTypeResp.amount, payType) var createOrderErr error yunYinSignPayResult, createOrderErr = l.svcCtx.YunYinSignPayService.CreateYunYinSignPayOrder( l.ctx, paymentTypeResp.userMobile, paymentTypeResp.userName, paymentTypeResp.amount, paymentTypeResp.outTradeNo, payType, ) if createOrderErr != nil { logx.Errorf("[云印签支付] 创建新签署流程失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, createOrderErr) return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 创建云印签支付订单失败: %+v", createOrderErr) } logx.Infof("[云印签支付] 创建新签署流程成功,订单号: %s, 任务ID: %s, 参与者ID: %s, 支付链接: %s", paymentTypeResp.outTradeNo, yunYinSignPayResult.TaskID, yunYinSignPayResult.ParticipantID, yunYinSignPayResult.PayURL) } prepayData = yunYinSignPayResult.PayURL logx.Infof("[云印签支付] 支付链接获取成功,订单号: %s, 支付链接: %s", paymentTypeResp.outTradeNo, yunYinSignPayResult.PayURL) // 将云印签信息存储到context中,后续创建订单和云印签订单记录时使用 ctx = context.WithValue(ctx, "yunyin_sign_pay_result", yunYinSignPayResult) ctx = context.WithValue(ctx, "yunyin_sign_pay_user_id", userID) ctx = context.WithValue(ctx, "yunyin_sign_pay_user_mobile", paymentTypeResp.userMobile) ctx = context.WithValue(ctx, "yunyin_sign_pay_user_name", paymentTypeResp.userName) ctx = context.WithValue(ctx, "yunyin_sign_pay_amount", paymentTypeResp.amount) ctx = context.WithValue(ctx, "yunyin_sign_pay_pay_type", payType) l.ctx = ctx logx.Infof("[云印签支付] 云印签信息已存储到context,订单号: %s, 任务ID: %s, 参与者ID: %s", paymentTypeResp.outTradeNo, yunYinSignPayResult.TaskID, yunYinSignPayResult.ParticipantID) } if createOrderErr != nil { return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 创建支付订单失败: %+v", createOrderErr) } return nil }) if err != nil { return nil, err } // 开发环境测试支付模式:事务提交后处理订单状态更新和后续流程 if isDevTestPayment && paymentTypeResp != nil && paymentTypeResp.orderID != "" { // 使用 goroutine 异步处理,确保事务已完全提交 go func() { // 短暂延迟,确保事务已完全提交到数据库 time.Sleep(200 * time.Millisecond) finalOrderID := paymentTypeResp.orderID // 查找订单并更新状态为已支付 order, findOrderErr := l.svcCtx.OrderModel.FindOne(context.Background(), finalOrderID) if findOrderErr != nil { logx.Errorf("开发测试模式,查找订单失败,订单ID: %s, 错误: %v", finalOrderID, findOrderErr) return } // 更新订单状态为已支付 order.Status = "paid" now := time.Now() order.PayTime = sql.NullTime{Time: now, Valid: true} // 空报告模式:在 PaymentPlatform 字段中标记,用于后续生成空报告 if isEmptyReportMode { order.PaymentPlatform = "test_empty" logx.Infof("开发环境空报告模式:订单 %s (ID: %s) 已标记为空报告模式", paymentTypeResp.outTradeNo, finalOrderID) } // 更新订单状态(在事务外执行) updateErr := l.svcCtx.OrderModel.UpdateWithVersion(context.Background(), nil, order) if updateErr != nil { logx.Errorf("开发测试模式,更新订单状态失败,订单ID: %s, 错误: %+v", finalOrderID, updateErr) return } logx.Infof("开发环境测试支付模式:订单 %s (ID: %s) 已自动标记为已支付", paymentTypeResp.outTradeNo, finalOrderID) // 再次短暂延迟,确保订单状态更新已提交 time.Sleep(100 * time.Millisecond) // 根据订单类型处理后续流程 if strings.HasPrefix(paymentTypeResp.outTradeNo, "U_") { // 系统简化:升级订单已废弃,跳过处理 logx.Infof("开发测试模式,升级订单已废弃,订单号: %s", paymentTypeResp.outTradeNo) } else { // 查询订单:发送支付成功通知任务,触发后续流程(生成报告和代理处理) if sendErr := l.svcCtx.AsynqService.SendQueryTask(finalOrderID); sendErr != nil { logx.Errorf("开发测试模式,发送支付成功通知任务失败,订单ID: %s, 错误: %+v", finalOrderID, sendErr) } else { logx.Infof("开发测试模式,已发送支付成功通知任务,订单ID: %s", finalOrderID) } } }() } switch v := prepayData.(type) { case string: // 如果 prepayData 是字符串类型,直接返回 return &types.PaymentResp{PrepayId: v, OrderNo: paymentTypeResp.outTradeNo}, nil default: return &types.PaymentResp{PrepayData: prepayData, OrderNo: paymentTypeResp.outTradeNo}, nil } } func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Session) (resp *PaymentTypeResp, err error) { userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) if getUidErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取用户信息失败, %+v", getUidErr) } outTradeNo := req.Id redisKey := fmt.Sprintf(types.QueryCacheKey, userID, outTradeNo) cache, cacheErr := l.svcCtx.Redis.GetCtx(l.ctx, redisKey) if cacheErr != nil { if cacheErr == redis.Nil { return nil, errors.Wrapf(xerr.NewErrMsg("订单已过期"), "生成订单, 缓存不存在, %+v", cacheErr) } return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取缓存失败, %+v", cacheErr) } var data types.QueryCacheLoad err = json.Unmarshal([]byte(cache), &data) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 解析缓存内容失败, %v", err) } // 解析查询参数,获取用户姓名和手机号(用于云印签支付) var userName, userMobile string if data.Params != "" { secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr == nil { decryptedData, decryptErr := crypto.AesDecrypt(data.Params, key) if decryptErr == nil { var params map[string]interface{} if unmarshalErr := json.Unmarshal(decryptedData, ¶ms); unmarshalErr == nil { if name, ok := params["name"].(string); ok { userName = name } if mobile, ok := params["mobile"].(string); ok { userMobile = mobile } } } } } product, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, data.Product) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查找产品错误: %v", err) } var amount float64 user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取用户信息失败: %v", err) } var agentLinkModel *model.AgentLink if data.AgentIdentifier != "" { var findAgentLinkErr error agentLinkModel, findAgentLinkErr = l.svcCtx.AgentLinkModel.FindOneByLinkIdentifier(l.ctx, data.AgentIdentifier) if findAgentLinkErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取代理链接失败: %+v", findAgentLinkErr) } amount = agentLinkModel.SetPrice } else { amount = product.SellPrice } if user.Inside == 1 { amount = 0.01 } order := model.Order{ Id: uuid.NewString(), OrderNo: outTradeNo, UserId: userID, ProductId: product.Id, PaymentPlatform: req.PayMethod, PaymentScene: "app", Amount: amount, Status: "pending", } // 如果是易支付,记录使用的渠道ID到备注字段 if req.PayMethod == "easypay_alipay" { if cid, ok := l.ctx.Value("easypay_cid").(string); ok && cid != "" { order.Remark = sql.NullString{String: fmt.Sprintf("易支付渠道号: %s", cid), Valid: true} } } _, insertOrderErr := l.svcCtx.OrderModel.Insert(l.ctx, session, &order) if insertOrderErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存订单失败: %+v", insertOrderErr) } orderID := order.Id // 如果是云印签支付,创建云印签订单记录 if req.PayMethod == "yunyinSignPay" || req.PayMethod == "yunyinSignPay_wechat" || req.PayMethod == "yunyinSignPay_alipay" { logx.Infof("[云印签支付] 开始创建云印签订单记录,订单号: %s, 订单ID: %s", outTradeNo, orderID) yunYinSignPayResult, ok := l.ctx.Value("yunyin_sign_pay_result").(*service.CreateYunYinSignPayOrderResult) if ok && yunYinSignPayResult != nil { userID, _ := l.ctx.Value("yunyin_sign_pay_user_id").(string) userMobile, _ := l.ctx.Value("yunyin_sign_pay_user_mobile").(string) userName, _ := l.ctx.Value("yunyin_sign_pay_user_name").(string) amount, _ := l.ctx.Value("yunyin_sign_pay_amount").(float64) payType, _ := l.ctx.Value("yunyin_sign_pay_pay_type").(int) logx.Infof("[云印签支付] 云印签订单数据,订单号: %s, 订单ID: %s, 用户ID: %s, 任务ID: %s, 参与者ID: %s, 金额: %.2f, 支付类型: %d", outTradeNo, orderID, userID, yunYinSignPayResult.TaskID, yunYinSignPayResult.ParticipantID, amount, payType) yunyinSignPayOrder := model.YunyinSignPayOrder{ Id: uuid.NewString(), OrderId: orderID, UserId: userID, TaskId: yunYinSignPayResult.TaskID, ParticipantId: yunYinSignPayResult.ParticipantID, Amount: amount, PayType: int64(payType), SignStatus: 0, // 待签署 PayStatus: 0, // 待支付 SourceOrderCode: outTradeNo, UserMobile: sql.NullString{String: userMobile, Valid: userMobile != ""}, UserName: sql.NullString{String: userName, Valid: userName != ""}, DelState: 0, Version: 0, } _, insertYunYinErr := l.svcCtx.YunyinSignPayOrderModel.Insert(l.ctx, session, &yunyinSignPayOrder) if insertYunYinErr != nil { logx.Errorf("[云印签支付] 保存云印签订单失败,订单号: %s, 订单ID: %s, 错误: %+v", outTradeNo, orderID, insertYunYinErr) return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存云印签订单失败: %+v", insertYunYinErr) } logx.Infof("[云印签支付] 云印签订单记录创建成功,订单号: %s, 订单ID: %s, 云印签订单ID: %s, 任务ID: %s, 参与者ID: %s", outTradeNo, orderID, yunyinSignPayOrder.Id, yunyinSignPayOrder.TaskId, yunyinSignPayOrder.ParticipantId) } else { logx.Errorf("[云印签支付] 未找到云印签支付结果,订单号: %s, 订单ID: %s", outTradeNo, orderID) } } // 如果是代理推广订单,创建完整的代理订单记录 if data.AgentIdentifier != "" && agentLinkModel != nil { // 获取产品配置(必须存在) productConfig, err := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, product.Id) if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单失败,产品配置不存在, productId: %s,请先在后台配置产品价格参数", product.Id) } return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 查询产品配置失败: %+v", err) } // 系统简化:移除等级加成,直接使用底价 actualBasePrice := productConfig.BasePrice // 计算提价成本(使用产品配置) priceThreshold := 0.0 priceFeeRate := 0.0 if productConfig.PriceThreshold.Valid { priceThreshold = productConfig.PriceThreshold.Float64 } if productConfig.PriceFeeRate.Valid { priceFeeRate = productConfig.PriceFeeRate.Float64 } priceCost := 0.0 if agentLinkModel.SetPrice > priceThreshold { priceCost = (agentLinkModel.SetPrice - priceThreshold) * priceFeeRate } // 计算代理收益 agentProfit := agentLinkModel.SetPrice - actualBasePrice - priceCost // 创建代理订单记录 agentOrder := model.AgentOrder{ Id: uuid.NewString(), AgentId: agentLinkModel.AgentId, OrderId: orderID, ProductId: product.Id, OrderAmount: amount, SetPrice: agentLinkModel.SetPrice, ActualBasePrice: actualBasePrice, PriceCost: priceCost, AgentProfit: agentProfit, ProcessStatus: 0, // 待处理 } _, agentOrderInsert := l.svcCtx.AgentOrderModel.Insert(l.ctx, session, &agentOrder) if agentOrderInsert != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存代理订单失败: %+v", agentOrderInsert) } } return &PaymentTypeResp{ amount: amount, outTradeNo: outTradeNo, description: product.ProductName, orderID: orderID, userName: userName, userMobile: userMobile, }, nil }