package payment import ( "eta/eta_mini_ht_api/common/component/cache" logger "eta/eta_mini_ht_api/common/component/log" "eta/eta_mini_ht_api/common/exception" "eta/eta_mini_ht_api/common/utils/payment" "eta/eta_mini_ht_api/common/utils/redis" orderService "eta/eta_mini_ht_api/domian/order" "fmt" "strings" ) var ( redisUtils = cache.GetInstance() ) type WechatSDKParams struct { OrderNo string PrepayId string Timestamp string NonceStr string PaySign string SignType string } func CreatePaymentOrder(userId, templateUserId int, OrderNo string, tradeNo string) (err error) { //先获取当前商品订单的支付记录 tradeOrderList, err := orderService.GetUnFailedTradeFlowByProductOrder(OrderNo) if len(tradeOrderList) > 0 { for _, tradeOrder := range tradeOrderList { if tradeOrder.PaymentStatus == "done" { logger.Error("当前商品订单已支付,无法再次发起支付") return exception.New(exception.PaymentDoneError) } if tradeOrder.PaymentStatus == "pending" { logger.Error("当前商品订单正在支付,无法再次发起支付") return exception.New(exception.PaymentProcessingError) } } } merchantId := redisUtils.GetString(redis.GenerateMerchantKey()) if merchantId == "" { logger.Error("商户配置信息不存在,无法创建支付订单") err = exception.New(exception.MerchantInfoNotConfig) return } return orderService.CreateTradeOrder(userId, templateUserId, OrderNo, tradeNo, merchantId) } func GenerateProductOrderNo() string { return orderService.GenerateTradeOrderNo() } func DealWechatSDKParams(sdk WechatSDKParams) (err error) { keys, err := redisUtils.Keys(redis.GenerateWechatOrderToken("*")) if err != nil { err = fmt.Errorf("系统异常,获取支付订单失败") } var hitOrder bool var paymentParam payment.PaymentParam var redisErr error for _, key := range keys { paymentParam, redisErr = payment.GetPaymentParam(strings.TrimPrefix(key, "payment:token:")) if redisErr != nil { continue } if paymentParam.PayOrderNo == sdk.OrderNo { if paymentParam.Status != payment.PENDING { logger.Error("重复的推送消息") err = fmt.Errorf("当前订单正在处理中,请勿重复推送") return } paymentParam.PrepayId = sdk.PrepayId paymentParam.Timestamp = sdk.Timestamp paymentParam.NonceStr = sdk.NonceStr paymentParam.PaySign = sdk.PaySign paymentParam.SignType = sdk.SignType redisErr = payment.Ready(key, paymentParam) if redisErr == nil { hitOrder = true } break } } if !hitOrder { logger.Error("处理微信支付SDK失败,订单信息不存在/信息处理异常[%v]", redisErr) err = fmt.Errorf("处理微信支付SDK失败,订单信息不存在/信息处理异常") } return }