Browse Source

创建商品订单

kobe6258 6 months ago
parent
commit
7c281224b9

+ 7 - 2
common/exception/exc_enums.go

@@ -78,6 +78,7 @@ const (
 	SubscribeFailed
 	GenerateOrderNoFailed
 	IllegalOrderNo
+	GetOrderListFailed
 )
 
 // WechatErrCode 微信
@@ -115,6 +116,8 @@ const (
 	MerchantErrCode int = iota + 70000
 	ProductInfoError
 	IllegalProductId
+
+	IllegalProductOrderId
 )
 const (
 	WebhookErrCode int = iota + 80000
@@ -175,6 +178,7 @@ var ErrorMap = map[int]string{
 	SubscribeFailed:                    "订阅失败",
 	GenerateOrderNoFailed:              "生成订单号",
 	IllegalOrderNo:                     "非法的产品订单号",
+	GetOrderListFailed:                 "获取产品订单列表失败",
 	//微信
 	WeChatServerError:    "微信服务器发生错误",
 	WechatUserInfoFailed: "获取微信用户信息失败",
@@ -199,8 +203,9 @@ var ErrorMap = map[int]string{
 	GetAnalystMediaListFailed: "查询研究员媒体列表失败",
 	BindMobileFailed:          "绑定手机号失败",
 	//商户
-	ProductInfoError: "获取商品信息失败",
-	IllegalProductId: "非法的产品ID",
+	ProductInfoError:      "获取商品信息失败",
+	IllegalProductId:      "非法的产品ID",
+	IllegalProductOrderId: "非法的产品订单ID",
 	//webhook
 	SyncRiskError:     "同步风险等级失败",
 	GetCapTokenFailed: "获取cap token失败",

+ 64 - 4
controllers/user/subscribe_controller.go

@@ -2,6 +2,7 @@ package user
 
 import (
 	"eta/eta_mini_ht_api/common/exception"
+	"eta/eta_mini_ht_api/common/utils/page"
 	"eta/eta_mini_ht_api/controllers"
 	"eta/eta_mini_ht_api/service/facade"
 	"eta/eta_mini_ht_api/service/order"
@@ -13,7 +14,7 @@ import (
 )
 
 type SubscribeController struct {
-	controllers.BaseController
+	controllers.ListController
 }
 
 var (
@@ -60,7 +61,7 @@ func orderNoRateLimitFilter(userId int) (code int) {
 		code = http.StatusBadRequest
 		return
 	}
-	if !orderRateLimiter.Allow(userId) {
+	if !orderNoRateLimiter.Allow(userId) {
 		code = http.StatusTooManyRequests
 		return
 	}
@@ -98,6 +99,64 @@ func (sc *SubscribeController) GetOrderNo() {
 	})
 }
 
+// OrderDetail  获取订单号
+// @Summary  获取订单号
+// @Description  获取订单号
+// @Success 200 {object} controllers.BaseResponse
+// @router /subscribe/orderDetail [get]
+func (sc *SubscribeController) GetOrderDetail(orderId int) {
+	controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
+		result = sc.InitWrapData("获取订单号失败")
+		userInfo := sc.Data["user"].(user.User)
+		if orderId <= 0 {
+			err = exception.New(exception.IllegalProductOrderId)
+			sc.FailedResult("获取订单详情失败,产品编号非法", result)
+			return
+		}
+		orderDetail, err := order.GetOrderDetail(orderId, userInfo.Id)
+		if err != nil {
+			sc.FailedResult("获取订单详情失败", result)
+		}
+		sc.SuccessResult("获取订单详情成功", orderDetail, result)
+		return
+	})
+}
+
+// GetOrderList  获取用户订单号列表
+// @Summary   获取用户订单号列表
+// @Description   获取用户订单号列表
+// @Success 200 {object} controllers.BaseResponse
+// @router /subscribe/orderList [get]
+func (sc *SubscribeController) GetOrderList() {
+	controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
+		result = sc.InitWrapData("分页查询订单列表失败")
+		userInfo := sc.Data["user"].(user.User)
+		pageRes := page.Page{
+			Current:  sc.PageInfo.Current,
+			PageSize: sc.PageInfo.PageSize,
+		}
+
+		pageRes.Total, pageRes.LatestId = order.GetTotalPageCountByUserId(userInfo.Id)
+		if sc.PageInfo.LatestId == 0 {
+			sc.PageInfo.LatestId = pageRes.LatestId
+		} else {
+			pageRes.LatestId = sc.PageInfo.LatestId
+			pageRes.Total = sc.PageInfo.Total
+		}
+		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
+		list, err := order.GetOrderPage(sc.PageInfo, userInfo.Id)
+		if err != nil {
+			sc.FailedResult("分页查询报告列表失败", result)
+			return
+		}
+		orders := new(page.PageResult)
+		orders.Data = list
+		orders.Page = pageRes
+		sc.SuccessResult("查询报告列表成功", orders, result)
+		return
+	})
+}
+
 // SubscribeProduct  订阅产品
 // @Summary 订阅产品
 // @Description 订阅产品
@@ -125,6 +184,7 @@ func (sc *SubscribeController) SubscribeProduct() {
 			sc.FailedResult("操作太频繁了,请稍后再试", result)
 			return
 		}
+		//校验是否已经购买并且在有效期内
 		//是否开户
 		//未开户
 		officialUser, err := user.GetUserByTemplateUserId(userInfo.Id)
@@ -133,7 +193,7 @@ func (sc *SubscribeController) SubscribeProduct() {
 				result.Ret = AccountNotOpen
 				sc.FailedResult("用户未开通账户", result)
 			} else {
-				sc.FailedResult("订阅产品失败", result)
+				sc.FailedResult("获取用户账户信息失败", result)
 			}
 			return
 		}
@@ -151,7 +211,7 @@ func (sc *SubscribeController) SubscribeProduct() {
 			return
 		}
 		//主动发起查询最新风险测评(获取失败用系统中原有的测评信息)
-		code, err := facade.CheckUserRiskLevel(userInfo.Id, subscribeReq.ProductId)
+		code, err := facade.CheckUserRiskLevel(userInfo.Id, subscribeReq.ProductId, officialUser)
 		if err != nil {
 			result.Ret = code
 			sc.FailedResult("校验用户风险等级失败", result)

+ 82 - 24
domian/order/product_order.go

@@ -1,6 +1,8 @@
 package order
 
 import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/utils/page"
 	orderDao "eta/eta_mini_ht_api/models/order"
 	"fmt"
 	"math/rand"
@@ -8,19 +10,35 @@ import (
 )
 
 type ProductOrderDTO struct {
-	ID            int
-	OrderID       string
-	UserID        int
-	ProductID     int
-	TotalAmount   string
+	ID           int
+	OrderID      string
+	UserID       int
+	ProductID    int
+	TotalAmount  string
+	ProductPrice string
+	ProductName  string
+	PaymentWay   string
+	Status       string
+	CreatedTime  string
+}
+
+type ProductOrderDetailDTO struct {
+	ProductOrderDTO
 	TransactionID int
-	RefundAmount  string
-	PaymentTime   time.Time
-	Status        string
+	PaymentTime   string
 	RefundStatus  string
 	Remark        string
 }
 
+var (
+	transProductOrderStatus = map[orderDao.OrderStatus]string{
+		orderDao.OrderStatusClosed:   "已关闭",
+		orderDao.OrderStatusPaid:     "已支付",
+		orderDao.OrderStatusPending:  "待支付",
+		orderDao.OrderStatusRefunded: "已退款",
+	}
+)
+
 func GenerateProductOrderNo() string {
 	timestamp := time.Now().UnixNano() / 1000000 // 毫秒级时间戳
 	// 生成随机数
@@ -39,28 +57,68 @@ func CreateProductOrder(orderDTO ProductOrderDTO) (orderNo string, err error) {
 
 func convertProductOrderDTO(order orderDao.ProductOrder) ProductOrderDTO {
 	return ProductOrderDTO{
-		ID:            order.ID,
-		OrderID:       order.OrderID,
-		UserID:        order.UserID,
-		ProductID:     order.ProductID,
-		TotalAmount:   order.TotalAmount,
+		ID:          order.ID,
+		OrderID:     order.OrderID,
+		UserID:      order.UserID,
+		ProductID:   order.ProductID,
+		TotalAmount: order.TotalAmount,
+		PaymentWay:  string(order.PaymentWay),
+		Status:      transProductOrderStatus[order.Status],
+		CreatedTime: order.CreatedTime.Format(time.DateTime),
+	}
+}
+func convertProductOrderDetailDTO(order orderDao.ProductOrder) ProductOrderDetailDTO {
+	return ProductOrderDetailDTO{
+		ProductOrderDTO: ProductOrderDTO{
+			ID:          order.ID,
+			OrderID:     order.OrderID,
+			UserID:      order.UserID,
+			ProductID:   order.ProductID,
+			TotalAmount: order.TotalAmount,
+			PaymentWay:  string(order.PaymentWay),
+			Status:      transProductOrderStatus[order.Status],
+			CreatedTime: order.CreatedTime.Format(time.DateTime),
+		},
 		TransactionID: order.TransactionID,
-		RefundAmount:  order.RefundAmount,
-		PaymentTime:   order.PaymentTime,
+		PaymentTime:   order.PaymentTime.Format(time.DateTime),
+		RefundStatus:  string(order.RefundStatus),
 		Remark:        order.Remark,
 	}
 }
 
 func convertProductOrder(order ProductOrderDTO) orderDao.ProductOrder {
 	return orderDao.ProductOrder{
-		ID:            order.ID,
-		OrderID:       order.OrderID,
-		UserID:        order.UserID,
-		ProductID:     order.ProductID,
-		TotalAmount:   order.TotalAmount,
-		TransactionID: order.TransactionID,
-		RefundAmount:  order.RefundAmount,
-		PaymentTime:   order.PaymentTime,
-		Remark:        order.Remark,
+		ID:          order.ID,
+		OrderID:     order.OrderID,
+		UserID:      order.UserID,
+		ProductID:   order.ProductID,
+		TotalAmount: order.TotalAmount,
+	}
+}
+
+func GetTotalPageCountByUserId(userId int) (total int64, latestId int64) {
+	return orderDao.GetTotalPageCountByUserId(userId)
+}
+
+func GetOrderPage(pageInfo page.PageInfo, userId int) (orderDTOS []ProductOrderDTO, err error) {
+	offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
+	orderList, err := orderDao.GetOrderPage(pageInfo.LatestId, offset, pageInfo.PageSize, userId)
+	if err != nil {
+		logger.Error("分页查询订单列表失败:%v", err)
+		return
+	}
+	for _, order := range orderList {
+		orderDTOS = append(orderDTOS, convertProductOrderDTO(order))
 	}
+	return
+}
+
+func GetOrderDetail(orderId int, userId int) (orderDTO ProductOrderDetailDTO, err error) {
+	order, err := orderDao.GetOrderDetail(orderId, userId)
+	if err != nil {
+		logger.Error("查询订单详情失败:%v", err)
+		return
+	}
+	orderDTO = convertProductOrderDetailDTO(order)
+	return
 }

+ 0 - 3
middleware/auth_middleware.go

@@ -9,7 +9,6 @@ import (
 	stringUtils "eta/eta_mini_ht_api/common/utils/string"
 	"eta/eta_mini_ht_api/controllers"
 	"eta/eta_mini_ht_api/service/user"
-	"fmt"
 	"github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/server/web/context"
 	"strings"
@@ -201,9 +200,7 @@ func allowed(path string) bool {
 		}
 		src := baseUrl + p
 		if strings.HasSuffix(p, "*") {
-
 			target := src[:len(src)-1]
-			fmt.Println("target:" + target)
 			if strings.HasPrefix(path, target) {
 				return true
 			}

+ 50 - 14
models/order/product_order.go

@@ -2,6 +2,7 @@ package order
 
 import (
 	"errors"
+	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/models"
 	"github.com/go-sql-driver/mysql"
 	"gorm.io/gorm"
@@ -10,6 +11,7 @@ import (
 
 type OrderStatus string
 type RefundStatus string
+type PaymentStatus string
 
 const (
 	//订单状态
@@ -23,23 +25,27 @@ const (
 	RefundStatusPending   RefundStatus = "pending"
 	RefundStatusFailed    RefundStatus = "failed"
 	RefundtatusProcessing RefundStatus = "processing"
+
+	WechatPayWay PaymentStatus = "wechat"
+	AliPayWay    PaymentStatus = "alipay"
 )
 
 type ProductOrder struct {
-	ID            int          `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
-	OrderID       string       `gorm:"column:order_id;size:255;comment:'订单编号'" json:"order_id"`
-	UserID        int          `gorm:"column:user_id;default:null;comment:'用户id'" json:"user_id"`
-	ProductID     int          `gorm:"column:product_id;default:null;comment:'产品id'" json:"product_id"`
-	TotalAmount   string       `gorm:"column:total_amount;size:255;default:null;comment:'金额'" json:"total_amount"`
-	TransactionID int          `gorm:"column:transaction_id;default:null;comment:'支付订单'" json:"transaction_id"`
-	RefundAmount  string       `gorm:"column:refund_amount;size:255;default:null;comment:'退款金额'" json:"refund_amount"`
-	PaymentTime   time.Time    `gorm:"column:payment_time;default:null;comment:'支付时间'" json:"payment_time"`
-	Status        OrderStatus  `gorm:"column:status;type:enum('pending','processing','paid','closed','refunded');default:'pending';comment:'订单状态'" json:"status"`
-	RefundStatus  RefundStatus `gorm:"column:refund_status;type:enum('pending','processing','failed','success');default:'pending';comment:'退款状态'" json:"refund_status"`
-	Remark        string       `gorm:"column:remark;size:255;default:null;comment:'备注'" json:"remark"`
-	IsDeleted     int          `gorm:"column:is_deleted;size:1;default:0;comment:'是否删除'" json:"is_deleted"`
-	CreatedTime   time.Time    `gorm:"column:created_time;default:null;comment:'创建时间'" json:"created_time"`
-	UpdateTime    time.Time    `gorm:"column:update_time;default:null;comment:'更新时间'" json:"update_time"`
+	ID            int           `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
+	OrderID       string        `gorm:"column:order_id;size:255;comment:'订单编号'" json:"order_id"`
+	UserID        int           `gorm:"column:user_id;default:null;comment:'用户id'" json:"user_id"`
+	ProductID     int           `gorm:"column:product_id;default:null;comment:'产品id'" json:"product_id"`
+	TotalAmount   string        `gorm:"column:total_amount;size:255;default:null;comment:'金额'" json:"total_amount"`
+	TransactionID int           `gorm:"column:transaction_id;default:null;comment:'支付订单'" json:"transaction_id"`
+	RefundAmount  string        `gorm:"column:refund_amount;size:255;default:null;comment:'退款金额'" json:"refund_amount"`
+	PaymentWay    PaymentStatus `gorm:"column:payment_way;enum('wechat','alipay');default:null;comment:'支付渠道'"`
+	PaymentTime   time.Time     `gorm:"column:payment_time;default:null;comment:'支付时间'" json:"payment_time"`
+	Status        OrderStatus   `gorm:"column:status;type:enum('pending','processing','paid','closed','refunded');default:'pending';comment:'订单状态'" json:"status"`
+	RefundStatus  RefundStatus  `gorm:"column:refund_status;type:enum('pending','processing','failed','success');default:null;comment:'退款状态'" json:"refund_status"`
+	Remark        string        `gorm:"column:remark;size:255;default:null;comment:'备注'" json:"remark"`
+	IsDeleted     int           `gorm:"column:is_deleted;size:1;default:0;comment:'是否删除'" json:"is_deleted"`
+	CreatedTime   time.Time     `gorm:"column:created_time;default:null;comment:'创建时间'" json:"created_time"`
+	UpdateTime    time.Time     `gorm:"column:update_time;default:null;comment:'更新时间'" json:"update_time"`
 }
 
 func (pr *ProductOrder) BeforeCreate(db *gorm.DB) (err error) {
@@ -58,3 +64,33 @@ func CreateProductOrder(order ProductOrder) (orderNo string, err error) {
 	orderNo = order.OrderID
 	return
 }
+
+func GetTotalPageCountByUserId(userId int) (total int64, latestId int64) {
+	db := models.Main()
+	err := db.Model(&ProductOrder{}).Select("count(*)").Where("user_id = ? and is_deleted=0 ", userId).Scan(&total).Error
+	if err != nil {
+		logger.Error("查询订单总数失败:%v", err)
+		return 0, 0
+	}
+	err = db.Model(&ProductOrder{}).Select("MAX(id)").Where("user_id = ? and is_deleted=0", userId).Scan(&latestId).Error
+	if err != nil {
+		logger.Error("查询订单最新订单失败:%v", err)
+		return 0, 0
+	}
+	return
+}
+
+func GetOrderPage(latestId int64, offset int, size int, userId int) (orderList []ProductOrder, err error) {
+	db := models.Main()
+	err = db.Model(&ProductOrder{}).Select("*").Where("id<=? and user_id = ? and is_deleted=0 order by created_time desc", latestId, userId).Offset(offset).Limit(size).Find(&orderList).Error
+	if err != nil {
+		logger.Error("查询订单总数失败:%v", err)
+	}
+	return
+}
+
+func GetOrderDetail(orderId int, userId int) (order ProductOrder, err error) {
+	db := models.Main()
+	err = db.Model(&ProductOrder{}).Select("*").Where("id = ? and user_id = ? and is_deleted=0 ", orderId, userId).First(&order).Error
+	return
+}

+ 20 - 0
routers/commentsRouter.go

@@ -274,6 +274,26 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:SubscribeController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:SubscribeController"],
+        beego.ControllerComments{
+            Method: "GetOrderDetail",
+            Router: `/subscribe/orderDetail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("orderId"),
+			),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:SubscribeController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:SubscribeController"],
+        beego.ControllerComments{
+            Method: "GetOrderList",
+            Router: `/subscribe/orderList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:SubscribeController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:SubscribeController"],
         beego.ControllerComments{
             Method: "GetOrderNo",

+ 2 - 11
service/facade/ht_account_service.go

@@ -5,6 +5,7 @@ import (
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/exception"
 	permissionService "eta/eta_mini_ht_api/domian/config"
+	userService "eta/eta_mini_ht_api/domian/user"
 	"eta/eta_mini_ht_api/service/product"
 	"eta/eta_mini_ht_api/service/user"
 	"fmt"
@@ -27,7 +28,7 @@ func SyncRiskInfo(mobile string) (info string, err error) {
 	return "", nil
 }
 
-func CheckUserRiskLevel(templateUserId int, productId int) (code int, err error) {
+func CheckUserRiskLevel(templateUserId int, productId int, officialUser userService.OfficialUserDTO) (code int, err error) {
 	//是否完成风测
 	//风测是否过期
 	//风测等级是否符合
@@ -54,16 +55,6 @@ func CheckUserRiskLevel(templateUserId int, productId int) (code int, err error)
 	if userErr != nil {
 		logger.Error("获取临时用户信息失败:%v,userId:%v", userErr, templateUserId)
 	}
-	officialUser, err := user.GetUserByTemplateUserId(templateUserId)
-	if err != nil {
-		if userErr != nil {
-			logger.Error("获取正式用户信息失败:%v,templateUserId:%v", userErr, templateUserId)
-			code = 200
-			err = exception.New(exception.OfficialUserFoundError)
-			return
-
-		}
-	}
 	customerInfo, err := htApi.GetCustomerRiskLevelInfo(api.ClientSuitInfoReq{
 		ClientName: officialUser.RealName,
 		IdKind:     officialUser.IdKind,

+ 60 - 10
service/order/order_service.go

@@ -4,25 +4,31 @@ import (
 	"errors"
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/exception"
+	"eta/eta_mini_ht_api/common/utils/page"
 	productService "eta/eta_mini_ht_api/domian/merchant"
 	orderService "eta/eta_mini_ht_api/domian/order"
 	userService "eta/eta_mini_ht_api/domian/user"
 	"eta/eta_mini_ht_api/service/user"
+	"fmt"
 	"gorm.io/gorm"
+	"sync"
 	"time"
 )
 
+const (
+	permanentlyValid = "永久有效"
+)
+
 type ProductOrderInfo struct {
 	Buyer       BuyerInfo   `json:"buyer"`
 	ProductInfo ProductInfo `json:"productInfo"`
 	OrderNo     string      `json:"orderNo"`
 }
 type ProductInfo struct {
-	Name      string
-	Type      string
-	Price     string
-	BeginDate string
-	EndDate   string
+	Name          string
+	Type          string
+	Price         string
+	ValidDuration string
 }
 type BuyerInfo struct {
 	Name     string
@@ -71,12 +77,19 @@ func CreateProductOrder(templateUser user.User, productId int, orderNo string) (
 		Mobile:   templateUser.Mobile,
 		AreaCode: templateUser.AreaCode,
 	}
+	var duration string
+	if !productInfo.IsPermanent {
+		beginDate := time.Now().Format(time.DateOnly)
+		endDate := time.Now().Add(time.Duration(productInfo.ValidDays*24) * time.Hour).Format(time.DateOnly)
+		duration = fmt.Sprintf("%s~%s", beginDate, endDate)
+	} else {
+		duration = permanentlyValid
+	}
 	product := ProductInfo{
-		Name:      productInfo.Title,
-		Type:      productInfo.Type,
-		Price:     productInfo.Price.String(),
-		BeginDate: time.Now().Format(time.DateOnly),
-		EndDate:   time.Now().Add(time.Duration(productInfo.ValidDays*24) * time.Hour).Format(time.DateOnly),
+		Name:          productInfo.Title,
+		Type:          productInfo.Type,
+		Price:         productInfo.Price.String(),
+		ValidDuration: duration,
 	}
 	orderInfo = ProductOrderInfo{
 		Buyer:       buyer,
@@ -85,3 +98,40 @@ func CreateProductOrder(templateUser user.User, productId int, orderNo string) (
 	}
 	return
 }
+
+func GetTotalPageCountByUserId(userId int) (total int64, latestId int64) {
+	return orderService.GetTotalPageCountByUserId(userId)
+}
+
+func GetOrderPage(pageInfo page.PageInfo, userId int) (orderList []orderService.ProductOrderDTO, err error) {
+	orderList, err = orderService.GetOrderPage(pageInfo, userId)
+	if err != nil {
+		err = exception.NewWithException(exception.GetOrderListFailed, err.Error())
+	}
+	var wg sync.WaitGroup
+	wg.Add(len(orderList))
+	logger.Info("获取产品信息")
+	for i := 0; i < len(orderList); i++ {
+		go func(order *orderService.ProductOrderDTO) {
+			defer wg.Done()
+			product, pdErr := productService.GetMerchantProductById(order.ProductID)
+			if pdErr != nil {
+				logger.Error("获取产品信息失败:%v", err)
+			}
+			order.ProductName = product.Title
+		}(&orderList[i])
+	}
+	wg.Wait()
+	return
+}
+
+func GetOrderDetail(productId int, userId int) (order orderService.ProductOrderDetailDTO, err error) {
+	order, err = orderService.GetOrderDetail(productId, userId)
+	productInfo, err := productService.GetMerchantProductById(order.ProductID)
+	if err != nil {
+		return
+	}
+	order.ProductName = productInfo.Title
+	order.ProductPrice = productInfo.Price.String()
+	return
+}