payment_service.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package payment
  2. import (
  3. "eta/eta_mini_ht_api/common/component/cache"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. "eta/eta_mini_ht_api/common/utils/payment"
  7. "eta/eta_mini_ht_api/common/utils/redis"
  8. orderService "eta/eta_mini_ht_api/domian/order"
  9. "fmt"
  10. "strings"
  11. )
  12. var (
  13. redisUtils = cache.GetInstance()
  14. )
  15. type WechatSDKParams struct {
  16. OrderNo string
  17. PrepayId string
  18. Timestamp string
  19. NonceStr string
  20. PaySign string
  21. SignType string
  22. }
  23. func CreatePaymentOrder(userId, templateUserId int, OrderNo string, tradeNo string) (err error) {
  24. //先获取当前商品订单的支付记录
  25. tradeOrderList, err := orderService.GetUnFailedTradeFlowByProductOrder(OrderNo)
  26. if len(tradeOrderList) > 0 {
  27. for _, tradeOrder := range tradeOrderList {
  28. if tradeOrder.PaymentStatus == "done" {
  29. logger.Error("当前商品订单已支付,无法再次发起支付")
  30. return exception.New(exception.PaymentDoneError)
  31. }
  32. if tradeOrder.PaymentStatus == "pending" {
  33. logger.Error("当前商品订单正在支付,无法再次发起支付")
  34. return exception.New(exception.PaymentProcessingError)
  35. }
  36. }
  37. }
  38. merchantId := redisUtils.GetString(redis.GenerateMerchantKey())
  39. if merchantId == "" {
  40. logger.Error("商户配置信息不存在,无法创建支付订单")
  41. err = exception.New(exception.MerchantInfoNotConfig)
  42. return
  43. }
  44. return orderService.CreateTradeOrder(userId, templateUserId, OrderNo, tradeNo, merchantId)
  45. }
  46. func GenerateProductOrderNo() string {
  47. return orderService.GenerateTradeOrderNo()
  48. }
  49. func DealWechatSDKParams(sdk WechatSDKParams) (err error) {
  50. keys, err := redisUtils.Keys(redis.GenerateWechatOrderToken("*"))
  51. if err != nil {
  52. err = fmt.Errorf("系统异常,获取支付订单失败")
  53. }
  54. var hitOrder bool
  55. var paymentParam payment.PaymentParam
  56. var redisErr error
  57. for _, key := range keys {
  58. paymentParam, redisErr = payment.GetPaymentParam(strings.TrimPrefix(key, "payment:token:"))
  59. if redisErr != nil {
  60. continue
  61. }
  62. if paymentParam.PayOrderNo == sdk.OrderNo {
  63. if paymentParam.Status != payment.PENDING {
  64. logger.Error("重复的推送消息")
  65. err = fmt.Errorf("当前订单正在处理中,请勿重复推送")
  66. return
  67. }
  68. paymentParam.PrepayId = sdk.PrepayId
  69. paymentParam.Timestamp = sdk.Timestamp
  70. paymentParam.NonceStr = sdk.NonceStr
  71. paymentParam.PaySign = sdk.PaySign
  72. paymentParam.SignType = sdk.SignType
  73. redisErr = payment.Ready(key, paymentParam)
  74. if redisErr == nil {
  75. hitOrder = true
  76. }
  77. break
  78. }
  79. }
  80. if !hitOrder {
  81. logger.Error("处理微信支付SDK失败,订单信息不存在/信息处理异常[%v]", redisErr)
  82. err = fmt.Errorf("处理微信支付SDK失败,订单信息不存在/信息处理异常")
  83. }
  84. return
  85. }