payment_controller.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package payment
  2. import (
  3. "errors"
  4. "eta/eta_mini_ht_api/common/exception"
  5. "eta/eta_mini_ht_api/common/utils/lock"
  6. "eta/eta_mini_ht_api/common/utils/redis"
  7. "eta/eta_mini_ht_api/controllers"
  8. orderService "eta/eta_mini_ht_api/domian/order"
  9. userService "eta/eta_mini_ht_api/domian/user"
  10. "eta/eta_mini_ht_api/service/facade"
  11. "eta/eta_mini_ht_api/service/order"
  12. "gorm.io/gorm"
  13. )
  14. import "eta/eta_mini_ht_api/service/user"
  15. type PaymentController struct {
  16. controllers.BaseController
  17. }
  18. // 支付
  19. type PayRequest struct {
  20. ProductOrderNo string `json:"productOrderNo"`
  21. }
  22. type PayResponse struct {
  23. ProductOrderNo string `json:"productOrderNo"`
  24. TradeOrderNo string `json:"tradeOrderNo"`
  25. }
  26. // PayOrder 支付订单
  27. // @Summary 支付订单
  28. // @Description 支付订单
  29. // @Success 200 {object} controllers.BaseResponse
  30. // @router /payOrder [post]
  31. func (pc *PaymentController) PayOrder() {
  32. controllers.Wrap(&pc.BaseController, func() (result *controllers.WrapData, err error) {
  33. result = pc.InitWrapData("创建支付订单失败")
  34. payRequest := new(PayRequest)
  35. pc.GetPostParams(payRequest)
  36. if payRequest.ProductOrderNo == "" {
  37. pc.FailedResult("订单编号不能为空", result)
  38. err = exception.New(exception.IllegalOrderNo)
  39. return
  40. }
  41. userInfo := pc.Data["user"].(user.User)
  42. defer func() {
  43. lock.ReleaseLock(redis.GeneratePaymentKey(payRequest.ProductOrderNo), pc.Data["threadId"].(string))
  44. }()
  45. if lock.AcquireLock(redis.GeneratePaymentKey(payRequest.ProductOrderNo), 10, pc.Data["threadId"].(string)) {
  46. //校验商品订单状态
  47. var productOrder orderService.ProductOrderDTO
  48. productOrder, err = order.GetProductOrderByUser(userInfo.Id, payRequest.ProductOrderNo)
  49. if err != nil {
  50. if errors.Is(err, gorm.ErrRecordNotFound) {
  51. pc.FailedResult("支付失败,商品订单信息不存在", result)
  52. err = exception.New(exception.IllegalOrderNo)
  53. } else {
  54. pc.FailedResult("支付失败,查询商品订单失败", result)
  55. err = exception.New(exception.IllegalOrderNo)
  56. }
  57. return
  58. }
  59. if productOrder.Status != "pending" {
  60. if productOrder.Status == "closed" {
  61. pc.FailedResult("支付失败,商品订单已关闭", result)
  62. err = exception.New(exception.IllegalOrderStatus)
  63. } else {
  64. pc.FailedResult("支付失败,商品订单状态异常", result)
  65. err = exception.New(exception.IllegalOrderStatus)
  66. }
  67. return
  68. }
  69. if productOrder.TradeNo != "" {
  70. tradeOrder, tradeErr := order.GetTradeOrderByNo(productOrder.TradeNo)
  71. if tradeErr != nil {
  72. err = exception.NewWithException(exception.PayTradeOrderFailed, tradeErr.Error())
  73. pc.FailedResult("支付失败,获取原支付订单信息失败", result)
  74. return
  75. }
  76. if tradeOrder.PaymentStatus != "failed" {
  77. err = exception.New(exception.PayTradeOrderFailed)
  78. pc.FailedResult("支付失败,商品订单支付中,请勿重复支付", result)
  79. return
  80. }
  81. }
  82. var officialUser userService.OfficialUserDTO
  83. officialUser, err = user.GetUserByTemplateUserId(userInfo.Id)
  84. if err != nil {
  85. pc.FailedResult("支付失败,正式用户信息不存在", result)
  86. }
  87. var tradeOrderNo string
  88. tradeOrderNo, err = facade.PayOrder(officialUser.ID, userInfo.Id, productOrder)
  89. if err != nil {
  90. pc.FailedResult("支付订单创建失败", result)
  91. err = exception.NewWithException(exception.CreatePaymentOrderFailed, err.Error())
  92. return
  93. }
  94. pc.SuccessResult("支付订单创建成功", PayResponse{
  95. ProductOrderNo: productOrder.OrderID,
  96. TradeOrderNo: tradeOrderNo,
  97. }, result)
  98. return
  99. } else {
  100. pc.FailedResult("商品订单处理中,请稍后再试", result)
  101. err = exception.New(exception.PaymentProcessingError)
  102. return
  103. }
  104. })
  105. }
  106. //退款
  107. //