htfutures_trade_controller.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package web_hook
  2. import (
  3. logger "eta/eta_mini_ht_api/common/component/log"
  4. "eta/eta_mini_ht_api/common/exception"
  5. "eta/eta_mini_ht_api/controllers"
  6. orderService "eta/eta_mini_ht_api/domian/order"
  7. paymentService "eta/eta_mini_ht_api/service/payment"
  8. "eta/eta_mini_ht_api/service/product"
  9. )
  10. const (
  11. PaymentChannelWechat = "wechat"
  12. PaymentChannelAlipay = "alipay"
  13. PaymentStatusClosed = "closed"
  14. PaymentStatusSuccess = "success"
  15. PaymentStatusFailed = "failed"
  16. )
  17. var (
  18. statusMap = map[string]bool{
  19. PaymentStatusClosed: false,
  20. PaymentStatusSuccess: true,
  21. PaymentStatusFailed: false,
  22. }
  23. channelMap = map[string]int{
  24. PaymentChannelWechat: 1,
  25. PaymentChannelAlipay: 1,
  26. }
  27. )
  28. type HTFuturesTradeController struct {
  29. controllers.WebHookController
  30. }
  31. type PaymentOrderReq struct {
  32. Status string `json:"status"`
  33. OrderNo string `json:"order_no"`
  34. PaymentChannel string `json:"payment_channel"`
  35. }
  36. type RefundOrderReq struct {
  37. Status string `json:"status"`
  38. OrderNo string `json:"order_no"`
  39. }
  40. type WechatSDKParamsReq struct {
  41. OrderNo string `json:"order_no"`
  42. PrepayId string `json:"prepay_id"`
  43. Timestamp string `json:"timestamp"`
  44. NonceStr string `json:"nonce_str"`
  45. PaySign string `json:"pay_sign"`
  46. SignType string `json:"sign_type"`
  47. }
  48. // InformPaymentResult 支付通知接口
  49. // @Summary 支付通知接口
  50. // @Description 支付通知接口
  51. // @Success 200 {object} controllers.BaseResponse
  52. // @router /v1/payment/informPaymentResult [post]
  53. func (h *HTFuturesTradeController) InformPaymentResult() {
  54. controllers.WrapWebhook(&h.WebHookController, func() (result *controllers.WrapData, err error) {
  55. result = h.InitWrapData("支付结果处理失败")
  56. req := new(PaymentOrderReq)
  57. h.GetPostParams(req)
  58. logger.Info("支付结果通知: %v", req)
  59. if _, ok := channelMap[req.PaymentChannel]; !ok {
  60. logger.Warn("支付结果通知: %v", req)
  61. err = exception.NewWithException(exception.PaymentChannelError, "未知的支付渠道")
  62. h.FailedResult("支付结果通知: %v", result)
  63. return
  64. }
  65. if success, ok := statusMap[req.Status]; !ok {
  66. logger.Warn("支付结果通知: %v", req)
  67. err = exception.NewWithException(exception.PaymentStatusError, "未知的支付状态结果")
  68. h.FailedResult("支付结果通知: %v", result)
  69. return
  70. } else {
  71. if success {
  72. productOrder, _ := orderService.DealPayment(req.OrderNo, req.PaymentChannel, req.Status, orderService.PaySuccess)
  73. //privateKey, err := authUtils.ParsePrivateKey(htConfig.GetWebhookPrivateKey())
  74. _ = product.OpenProduct(productOrder)
  75. } else {
  76. _, _ = orderService.DealPayment(req.OrderNo, req.PaymentChannel, req.Status, orderService.PayFail)
  77. }
  78. result = h.InitWrapData("支付结果应答成功")
  79. h.SuccessResult("success", nil, result)
  80. return
  81. }
  82. })
  83. }
  84. // InformRefundResult 退款通知接口
  85. // @Summary 退款通知接口
  86. // @Description 退款通知接口
  87. // @Success 200 {object} controllers.BaseResponse
  88. // @router /v1/payment/informRefundResult [post]
  89. func (h *HTFuturesTradeController) InformRefundResult() {
  90. controllers.WrapWebhook(&h.WebHookController, func() (result *controllers.WrapData, err error) {
  91. result = h.InitWrapData("退款订单处理失败")
  92. refundReq := new(RefundOrderReq)
  93. h.GetPostParams(refundReq)
  94. logger.Warn("退款结果通知: %v", refundReq)
  95. if success, ok := statusMap[refundReq.Status]; !ok {
  96. err = exception.NewWithException(exception.PaymentStatusError, "未知的支付状态结果")
  97. h.FailedResult("支付结果通知: %v", result)
  98. return
  99. } else {
  100. if success {
  101. productOrder, RefundErr := orderService.DealRefund(refundReq.OrderNo, refundReq.Status, orderService.RefundSuccess)
  102. if RefundErr != nil {
  103. logger.Error("退款订单处理失败: %v", err)
  104. err = exception.NewWithException(exception.RefundDealFail, err.Error())
  105. h.FailedResult("退款订单处理失败", result)
  106. return
  107. }
  108. //处理退款订单
  109. _ = product.CloseProduct(productOrder)
  110. } else {
  111. _, RefundErr := orderService.DealRefund(refundReq.OrderNo, refundReq.Status, orderService.RefundFail)
  112. if RefundErr != nil {
  113. logger.Error("退款订单处理失败: %v", err)
  114. err = exception.NewWithException(exception.RefundDealFail, RefundErr.Error())
  115. h.FailedResult("退款订单处理失败", result)
  116. return
  117. }
  118. }
  119. //创建meta_info
  120. //htConfig := config.GetConfig(contants.HT).(*config.HTBizConfig)
  121. //webhookRequest := new(WebhookRequest)
  122. //h.GetPostParams(webhookRequest)
  123. //privateKey, err := authUtils.ParsePrivateKey(htConfig.GetWebhookPrivateKey())
  124. //if err != nil {
  125. // err = exception.NewWithException(exception.SysError, err.Error())
  126. // logger.Error("解析私钥失败: %v", err)
  127. // h.FailedResult("解析私钥失败", result)
  128. // return
  129. //}
  130. //decodeData, err := authUtils.DecryptWithRSA(privateKey, webhookRequest.Data)
  131. //if err != nil {
  132. // err = exception.NewWithException(exception.SysError, err.Error())
  133. // logger.Error("解密请求体失败: %v", err)
  134. // h.FailedResult("解密请求体失败", result)
  135. // return
  136. //}
  137. //syncCustomerRiskLevelReq := new(SyncCustomerRiskLevelReq)
  138. //err = json.Unmarshal(decodeData, syncCustomerRiskLevelReq)
  139. //if err != nil {
  140. // err = exception.NewWithException(exception.SyncRiskError, err.Error())
  141. // logger.Error("解析请求体失败: %v", err)
  142. // h.FailedResult("解析请求体失败", result)
  143. // return
  144. //}
  145. result = h.InitWrapData("退款结果应答成功")
  146. h.SuccessResult("success", nil, result)
  147. return
  148. }
  149. })
  150. }
  151. // InformWechatPaymentResult 支付通知接口
  152. // @Summary 支付通知接口
  153. // @Description 支付通知接口
  154. // @Success 200 {object} controllers.BaseResponse
  155. // @router /v1/payment/sendWechatSDKParams [post]
  156. func (h *HTFuturesTradeController) InformWechatPaymentResult() {
  157. controllers.WrapWebhook(&h.WebHookController, func() (result *controllers.WrapData, err error) {
  158. result = h.InitWrapData("微信支付SDK参数处理失败")
  159. sdkParams := new(WechatSDKParamsReq)
  160. h.GetPostParams(sdkParams)
  161. logger.Info("微信支付SDK参数通知: %v", sdkParams)
  162. err = paymentService.DealWechatSDKParams(paymentService.WechatSDKParams{
  163. NonceStr: sdkParams.NonceStr,
  164. OrderNo: sdkParams.OrderNo,
  165. PaySign: sdkParams.PaySign,
  166. PrepayId: sdkParams.PrepayId,
  167. SignType: sdkParams.SignType,
  168. Timestamp: sdkParams.Timestamp,
  169. })
  170. if err != nil {
  171. logger.Error("微信支付SDK参数处理失败: %v", err)
  172. err = exception.NewWithException(exception.GetWechatSDKParamsFailed, err.Error())
  173. h.FailedResult("微信支付SDK参数处理失败", result)
  174. return
  175. }
  176. result = h.InitWrapData("微信支付SDK参数处理成功")
  177. h.SuccessResult("success", sdkParams, result)
  178. return
  179. })
  180. }