From 347c44ce019a51e2a608f51ff62565389a95059d Mon Sep 17 00:00:00 2001 From: duyu Date: Fri, 26 Jul 2024 10:52:53 +0800 Subject: [PATCH] fix --- .DS_Store | Bin 0 -> 6148 bytes .../controllers/transfersys/transfersys.go | 7 ++ app/http/middlewares/sign_verify.go | 20 +++- app/services/transfersys/transfersys.go | 7 ++ .../transfersys/transfersys_callback.go | 92 ++++++++++++++++++ app/utils/rdbdq/rdbdq.go | 45 +++++++++ 6 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 .DS_Store create mode 100644 app/services/transfersys/transfersys_callback.go create mode 100644 app/utils/rdbdq/rdbdq.go diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..da07aa6853bb7b7687f6e861317c0d52c61a4ec7 GIT binary patch literal 6148 zcmeH~J!%6%427R!7lt%jx}3%b$PET#pTHN0A&|z{CXm!~^gR7ES*H$5cmnB-G%I%Z zD|S`@Z2$T80!#olbXV*=%*>dtaK;_?uhYl%a=X5>;#J@&VrHyNnC;iLL0pQvfVyTmjO&;ssLc!1UOG})p;=82 zR;?Ceh}WZ?+UmMqI#RP8R>OzYoz15hnq@nzF`-!xQ4j$Um=RcIKKc27r2jVm&svm< zfC&6E0=7P!4tu^-ovjbA=k?dB`g+i*aXG_}p8zI)6mRKa+;6_1_R^8c3Qa!(fk8n8 H{*=Hspa&6( literal 0 HcmV?d00001 diff --git a/app/http/controllers/transfersys/transfersys.go b/app/http/controllers/transfersys/transfersys.go index d044ae5..8f0bd25 100644 --- a/app/http/controllers/transfersys/transfersys.go +++ b/app/http/controllers/transfersys/transfersys.go @@ -1,6 +1,7 @@ package orders import ( + "strconv" "time" common "com.snow.auto_monitor/app/http/controllers" @@ -83,6 +84,12 @@ func FinishOrder(c *gin.Context) { return } + err = transServ.AddCallback(strconv.Itoa(int(orders.Id))) + if err != nil { + common.Error(c, 400, "添加回调失败") + return + } + response := &transEnt.FinishOrderResp{ Id: orders.Id, } diff --git a/app/http/middlewares/sign_verify.go b/app/http/middlewares/sign_verify.go index 76d325a..2234a47 100644 --- a/app/http/middlewares/sign_verify.go +++ b/app/http/middlewares/sign_verify.go @@ -25,7 +25,7 @@ func getMD5Hash(input string) string { return hex.EncodeToString(hash[:]) } -func GenMD5Sign(data map[string]interface{}, secretKey string) (string,string) { +func GenMD5Sign(data map[string]interface{}, secretKey string) (string, string) { keys := make([]string, 0, len(data)) for key := range data { if key != "sign" && key != "Sign" { @@ -45,7 +45,7 @@ func GenMD5Sign(data map[string]interface{}, secretKey string) (string,string) { rawStr += "&key=" + secretKey // fmt.Println(rawStr) sign := strings.ToUpper(getMD5Hash(rawStr)) - return sign,rawStr + return sign, rawStr } func VerifySign() gin.HandlerFunc { @@ -83,7 +83,7 @@ func VerifySign() gin.HandlerFunc { } //验证签名是否正确 data["time_stamp"] = int(data["time_stamp"].(float64)) - hash,rawStr := GenMD5Sign(data, merchant.PrivateKey) + hash, rawStr := GenMD5Sign(data, merchant.PrivateKey) // fmt.Println(hash) logger.Info(c, "RawStr", rawStr) logger.Info(c, "Sign", hash) @@ -95,3 +95,17 @@ func VerifySign() gin.HandlerFunc { } } } + +func GetMD5Sign(data map[string]interface{}) (string, string) { + merchanId := data["merchantId"].(int64) + merchant, has, err := mermod.GetInstance().GetById(merchanId) + if err != nil { + return "", "" + } + if !has { + return "", "" + } + //验证签名是否正确 + hash, rawStr := GenMD5Sign(data, merchant.PrivateKey) + return hash, rawStr +} diff --git a/app/services/transfersys/transfersys.go b/app/services/transfersys/transfersys.go index 358673b..e62cde1 100644 --- a/app/services/transfersys/transfersys.go +++ b/app/services/transfersys/transfersys.go @@ -2,10 +2,12 @@ package transfersys import ( "errors" + "time" mermod "com.snow.auto_monitor/app/models/merchant" models "com.snow.auto_monitor/app/models/orders" promod "com.snow.auto_monitor/app/models/product" + "com.snow.auto_monitor/app/utils/rdbdq" ) func GetOrder() (res *models.Orders, err error) { @@ -44,3 +46,8 @@ func FinishOrder(orders *models.Orders) (affected int64, err error) { affected, err = models.GetInstance().SetDealingOrder(orders) return } + +func AddCallback(order_id string) (err error) { + err = rdbdq.WriteOne("1_"+order_id, time.Now().Add(1*time.Second).Unix()) + return +} diff --git a/app/services/transfersys/transfersys_callback.go b/app/services/transfersys/transfersys_callback.go new file mode 100644 index 0000000..2fe5843 --- /dev/null +++ b/app/services/transfersys/transfersys_callback.go @@ -0,0 +1,92 @@ +package transfersys + +import ( + "context" + "fmt" + "io/ioutil" + "net/http" + "strconv" + "strings" + "time" + + "com.snow.auto_monitor/app/http/middlewares" + orderServ "com.snow.auto_monitor/app/services/orders" + "com.snow.auto_monitor/app/utils/rdbdq" + "github.com/qit-team/snow-core/log/logger" +) + +func DoCallBack() { + fmt.Println("开始执行周期任务:DoCallBack") + + // 创建一个新的Ticker,每3秒钟触发一次 + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() // 在函数结束时停止Ticker + for range ticker.C { + for i := 0; i < 10; i++ { + res, err := rdbdq.ReadLatestOne() + if err != nil { + logger.Error(context.TODO(), "middlewares", err) + continue + } + if res != "" { + // fmt.Println("获取到的数据:", res) + wait_time, err := strconv.Atoi(strings.Split(res, "_")[0]) + if err != nil { + logger.Error(context.TODO(), "middlewares", err) + continue + } + order_id, err := strconv.Atoi(strings.Split(res, "_")[1]) + if err != nil { + logger.Error(context.TODO(), "middlewares", err) + continue + } + order, err := orderServ.GetById(int64(order_id)) + if err != nil { + logger.Error(context.TODO(), "middlewares", err) + continue + } + // fmt.Println(order) + contentType := "application/x-www-form-urlencoded" + status := "01" + if order.Status != 1 { + status = "03" + } + datamap := map[string]interface{}{ + "merchantId": order.MerchantId, + "outTradeNo": order.OutTradeNo, + "status": status, + "rechargeAccount": order.RechargeAccount, + } + sign, _ := middlewares.GetMD5Sign(datamap) + data := fmt.Sprintf("merchantId=%d&outTradeNo=%s&status=%s&rechargeAccount=%s&sign=%s", order.MerchantId, order.OutTradeNo, status, order.RechargeAccount, sign) + // fmt.Println(data) + notifyUrl := "http://openapi.1688sup.com/notify/JingRongZhuanDan" + resp, err := http.Post(notifyUrl, contentType, strings.NewReader(data)) + if err != nil { + logger.Error(context.TODO(), "middlewares", err) + return + } + defer resp.Body.Close() + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + logger.Error(context.TODO(), "middlewares", err) + return + } + if string(b) != "success" && wait_time < 1024 { + wait_time = wait_time * 4 + err = rdbdq.WriteOne(strconv.FormatInt(int64(wait_time), 10)+"_"+strconv.FormatInt(int64(order_id), 10), + time.Now().Add(time.Duration(wait_time)*time.Second).Unix()) + if err != nil { + logger.Error(context.TODO(), "middlewares", string(b)) + logger.Error(context.TODO(), "middlewares", err) + return + } + } + } + } + } +} + +func init() { + go DoCallBack() +} diff --git a/app/utils/rdbdq/rdbdq.go b/app/utils/rdbdq/rdbdq.go new file mode 100644 index 0000000..cd8904b --- /dev/null +++ b/app/utils/rdbdq/rdbdq.go @@ -0,0 +1,45 @@ +package rdbdq + +import ( + "context" + "fmt" + "time" + + goredis "github.com/go-redis/redis/v8" + "github.com/qit-team/snow-core/redis" +) + +func WriteOne(value string, executeIime int64) (err error) { + rdb := redis.GetRedis(redis.SingletonMain) + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + + err = rdb.ZAdd(ctx, "dealy_queue", &goredis.Z{ + Score: float64(executeIime), + Member: value, + }).Err() + return +} + +func ReadLatestOne() (res string, err error) { + rdb := redis.GetRedis(redis.SingletonMain) + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + + // XReadGroup,读取消费者中消息 + tasks, err := rdb.ZRangeByScore(ctx, "dealy_queue", &goredis.ZRangeBy{ + Min: "-inf", + Max: fmt.Sprintf("%d", time.Now().Unix()), + }).Result() + if err != nil { + return "", err + } + + if len(tasks) > 0 { + res := tasks[0] + err = rdb.ZRem(ctx, "dealy_queue", res).Err() + return res, nil + } + + return "", nil +}