package websrv import ( "encoding/base64" "encoding/json" "errors" "fmt" "reflect" "strconv" "time" "xiawan/wx/clientsdk/baseutils" "xiawan/wx/srv/srvconfig" ) func createParamData(paramMap map[string]string) []byte { retString := "" for key, value := range paramMap { retString = retString + key + "=" + value + "&" } retBytes := []byte(retString) count := len(retBytes) retBytes = retBytes[0 : count-1] return retBytes } func getBaseParamMap(taskInfo *TaskInfo) map[string]string { retMap := make(map[string]string) curTime := strconv.Itoa(int(time.Now().UnixNano() / 1000000000)) head := curTime + taskInfo.SignKey hsWebTime := curTime + baseutils.RandomBigHexString(20) apiKey := baseutils.Md5Value(head) retMap["name"] = taskInfo.Name retMap["app_number"] = taskInfo.AppNumber retMap["apikey"] = apiKey retMap["hswebtime"] = hsWebTime retMap["time"] = curTime return retMap } // UploadTaskStatus 上传任务状态 func UploadTaskStatus(webTask *WebTask) error { baseParamMap := getBaseParamMap(webTask.TaskInfo) baseParamMap["name"] = webTask.UserInfo.NickName baseParamMap["task_id"] = webTask.TaskInfo.TaskID baseParamMap["account"] = webTask.UserInfo.WxId baseParamMap["headimg"] = webTask.UserInfo.HeadURL baseParamMap["status"] = webTask.Status if webTask.Status == TaskStateLoginSuccess { tmpToken := base64.StdEncoding.EncodeToString(webTask.UserInfo.AutoAuthKey) baseParamMap["token"] = tmpToken baseParamMap["data"] = "" baseParamMap["autoauth"] = "data=" + "token=" + tmpToken } paramBytes := createParamData(baseParamMap) respData, err := TaskPost("http://"+srvconfig.GlobalSetting.WebDomain+"/statistic/Wechat/upd.html", paramBytes) if err != nil { baseutils.PrintLog(err.Error()) return err } resp := &UploadTaskStatusResp{} err = json.Unmarshal(respData, resp) if err != nil { return err } // 如果显示44 if resp.Code == 44 { return nil } return nil } // ReportWechatStatus 上报状态 func ReportWechatStatus(webTask *WebTask, tmpType string) error { baseParamMap := getBaseParamMap(webTask.TaskInfo) baseParamMap["name"] = webTask.UserInfo.NickName baseParamMap["uuid"] = webTask.UserInfo.UUID baseParamMap["task_id"] = webTask.TaskInfo.TaskID baseParamMap["account"] = webTask.UserInfo.WxId baseParamMap["task_type"] = "2" baseParamMap["service"] = srvconfig.GlobalSetting.WebDomainNum baseParamMap["type"] = tmpType connectInfo := map[string]interface{}{} connectInfo["info"] = baseParamMap // 复制所有能够被序列化的字段 for key, value := range webTask.ConnectInfo { switch v := value.(type) { case func(): // 这里检查并排除不支持的字段 fmt.Println("Skipping function:", key) default: // 判断是否是基本类型 if reflect.TypeOf(v).Kind() == reflect.String || reflect.TypeOf(v).Kind() == reflect.Int || reflect.TypeOf(v).Kind() == reflect.Bool { connectInfo[key] = v } } } // 将参数转换为 JSON 格式 paramBytes, err := json.Marshal(connectInfo) if err != nil { fmt.Println("Error marshaling JSON:", err) return err } if srvconfig.GlobalSetting.WebDomain == "" { return nil } respData, err := TaskPostJson("http://"+srvconfig.GlobalSetting.WebDomain+"/statistic/Wechat/reportStatus", paramBytes) if err != nil { baseutils.PrintLog(err.Error()) return err } resp := &UploadTaskStatusResp{} err = json.Unmarshal(respData, resp) if err != nil { return err } // 上报错误 if resp.Code == 44 { return errors.New("上报错误") } return nil }