payment_controller.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. payUtils "eta/eta_mini_ht_api/common/utils/payment"
  7. "eta/eta_mini_ht_api/common/utils/redis"
  8. "eta/eta_mini_ht_api/controllers"
  9. orderDomian "eta/eta_mini_ht_api/domian/order"
  10. userDomian "eta/eta_mini_ht_api/domian/user"
  11. "eta/eta_mini_ht_api/service/facade"
  12. "eta/eta_mini_ht_api/service/order"
  13. "gorm.io/gorm"
  14. )
  15. import "eta/eta_mini_ht_api/service/user"
  16. type PaymentController struct {
  17. controllers.BaseController
  18. }
  19. // 支付
  20. type PayRequest struct {
  21. ProductOrderNo string `json:"productOrderNo"`
  22. }
  23. type PayResponse struct {
  24. ProductOrderNo string `json:"productOrderNo"`
  25. TradeOrderNo string `json:"tradeOrderNo"`
  26. PaymentToken string `json:"paymentToken"`
  27. }
  28. // PayOrder 支付订单
  29. // @Summary 支付订单
  30. // @Description 支付订单
  31. // @Success 200 {object} controllers.BaseResponse
  32. // @router /payOrder [post]
  33. func (pc *PaymentController) PayOrder() {
  34. controllers.Wrap(&pc.BaseController, func() (result *controllers.WrapData, err error) {
  35. result = pc.InitWrapData("创建支付订单失败")
  36. payRequest := new(PayRequest)
  37. pc.GetPostParams(payRequest)
  38. if payRequest.ProductOrderNo == "" {
  39. pc.FailedResult("订单编号不能为空", result)
  40. err = exception.New(exception.IllegalOrderNo)
  41. return
  42. }
  43. userInfo := pc.Data["user"].(user.User)
  44. defer func() {
  45. lock.ReleaseLock(redis.GeneratePaymentKey(payRequest.ProductOrderNo), pc.Data["threadId"].(string))
  46. }()
  47. if lock.AcquireLock(redis.GeneratePaymentKey(payRequest.ProductOrderNo), 10, pc.Data["threadId"].(string)) {
  48. //校验商品订单状态
  49. var productOrder orderDomian.ProductOrderDTO
  50. productOrder, err = order.GetProductOrderByUser(userInfo.Id, payRequest.ProductOrderNo)
  51. if err != nil {
  52. if errors.Is(err, gorm.ErrRecordNotFound) {
  53. pc.FailedResult("支付失败,商品订单信息不存在", result)
  54. err = exception.New(exception.IllegalOrderNo)
  55. } else {
  56. pc.FailedResult("支付失败,查询商品订单失败", result)
  57. err = exception.New(exception.IllegalOrderNo)
  58. }
  59. return
  60. }
  61. if productOrder.Status != "pending" {
  62. if productOrder.Status == "closed" {
  63. pc.FailedResult("支付失败,商品订单已关闭", result)
  64. err = exception.New(exception.IllegalOrderStatus)
  65. } else {
  66. pc.FailedResult("支付失败,商品订单状态异常", result)
  67. err = exception.New(exception.IllegalOrderStatus)
  68. }
  69. return
  70. }
  71. //1、未发起支付,2、支付到一半退出了,3、支付中
  72. if productOrder.TradeNo != "" {
  73. tradeOrder, tradeErr := order.GetTradeOrderByNo(productOrder.TradeNo)
  74. if tradeErr != nil {
  75. err = exception.NewWithException(exception.PayTradeOrderFailed, tradeErr.Error())
  76. pc.FailedResult("支付失败,获取原支付订单信息失败", result)
  77. return
  78. }
  79. if tradeOrder.PaymentStatus != "failed" {
  80. err = exception.New(exception.PayTradeOrderFailed)
  81. pc.FailedResult("支付失败,商品订单支付中,请勿重复支付", result)
  82. return
  83. }
  84. }
  85. //检查商品状态
  86. err = order.CheckProductStatus(productOrder)
  87. if err != nil {
  88. pc.FailedResult("支付失败,商品状态异常", result)
  89. return
  90. }
  91. var officialUser userDomian.OfficialUserDTO
  92. officialUser, err = user.GetUserByTemplateUserId(userInfo.Id)
  93. if err != nil {
  94. pc.FailedResult("支付失败,正式用户信息不存在", result)
  95. }
  96. var payOrderDTO facade.PayOrderDTO
  97. payOrderDTO, err = facade.PayOrder(officialUser.ID, userInfo.Id, productOrder)
  98. if err != nil {
  99. pc.FailedResult("支付订单创建失败", result)
  100. err = exception.NewWithException(exception.CreatePaymentOrderFailed, err.Error())
  101. return
  102. }
  103. pc.SuccessResult("支付订单创建成功", payOrderDTO, result)
  104. return
  105. } else {
  106. pc.FailedResult("商品订单处理中,请稍后再试", result)
  107. err = exception.New(exception.PaymentProcessingError)
  108. return
  109. }
  110. })
  111. }
  112. // PayOrderStatus 获取微信订单状态
  113. // @Summary 获取微信订单状态
  114. // @Description 获取微信订单状态
  115. // @Success 200 {object} controllers.BaseResponse
  116. // @router /payOrderStatus [get]
  117. func (pc *PaymentController) PayOrderStatus(token string) {
  118. controllers.Wrap(&pc.BaseController, func() (result *controllers.WrapData, err error) {
  119. result = pc.InitWrapData("获取微信订单信息失败")
  120. if token == "" {
  121. pc.FailedResult("token", result)
  122. err = exception.New(exception.IllegalWechatToken)
  123. return
  124. }
  125. paymentParams, err := payUtils.GetPaymentParam(token)
  126. if err != nil {
  127. pc.FailedResult("微信订单信息不存在", result)
  128. err = exception.NewWithException(exception.GetPaymentTokenFailed, err.Error())
  129. return
  130. }
  131. if paymentParams.Status == payUtils.EXPIRED {
  132. pc.FailedResult("订单超时,请重新支付", result)
  133. err = exception.New(exception.GetPaymentTokenFailed)
  134. return
  135. }
  136. if paymentParams.Status == payUtils.USED {
  137. pc.FailedResult("请勿重复发起微信支付", result)
  138. err = exception.New(exception.GetPaymentTokenFailed)
  139. return
  140. }
  141. if paymentParams.Status == payUtils.PENDING {
  142. pc.FailedResult("微信支付发起中,请耐心等待", result)
  143. err = exception.New(exception.GetPaymentTokenFailed)
  144. return
  145. }
  146. if paymentParams.Status == payUtils.READY {
  147. //查询到就绪之后将token状态重置为已用
  148. pc.SuccessResult("支付订单创建成功", paymentParams, result)
  149. return
  150. }
  151. return
  152. })
  153. }
  154. //