package msg import ( "bytes" "crypto/sha1" "encoding/json" "fmt" "io" "math/rand" "net/http" "sort" "strings" "time" "dubbo.apache.org/dubbo-go/v3/common/logger" ) const ( ClientID = "fenglian" SECRET = "93a8894116ce0152dd5e145370fc83aa" ) type SendReport struct { MsgNo string `json:"msgNo"` TempNo string `json:"tempNo"` SigNo string `json:"signNo"` Content string `json:"content"` SendTime string `json:"sendTime"` Mobile string `json:"mobile"` SendFrom string `json:"sendFrom"` } type SendMsgResponse struct { Code int `json:"code"` // 对应 JSON 中的 "code" 字段(整数) Msg string `json:"msg"` // 对应 JSON 中的 "msg" 字段(字符串) MsgNo string `json:"msg_no"` // 对应 JSON 中的 "msg_no" 字段(字符串) Count int `json:"count"` // 对应 JSON 中的 "count" 字段(整数) } // 6位随机验证码 func RandCode() string { rnd := rand.New(rand.NewSource(time.Now().UnixNano())) rndCode := fmt.Sprintf("%06v", rnd.Int31n(1000000)) fmt.Println(rndCode) return rndCode } func ReportMsgWithSendFrom(res SendMsgResponse, telNum string, tempNo uint, sigNo uint, content string, sendFrom string) { //发送成功,上报发送信息 reqObj := SendReport{ MsgNo: res.MsgNo, TempNo: fmt.Sprintf("%d", tempNo), SigNo: fmt.Sprintf("%d", sigNo), Content: content, Mobile: telNum, SendTime: time.Now().Format("2006-01-02 15:04:05"), SendFrom: sendFrom, } jsonData, err := json.Marshal(reqObj) if err != nil { return } // 构造 POST 请求 non := RandCode() timeNow := fmt.Sprintf("%d", time.Now().Unix()) sign, _ := makeSignature(SECRET, timeNow, non, ClientID) url := fmt.Sprintf("https://common.szjixun.cn/api/msg/report?client=%s&nonce=%s×tamp=%s&sign=%s", ClientID, non, timeNow, sign) // 这里的SECRET需要替换为实际的密钥 fmt.Println("url", url) req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(jsonData)) if err != nil { return } req.Header.Set("Content-Type", "application/json") // 发送请求 client := &http.Client{Timeout: 10 * time.Second} resp, err := client.Do(req) if err != nil { logger.Fatalf("发送请求失败: %v", err) return } defer resp.Body.Close() // 检查状态码 if resp.StatusCode != http.StatusOK { errBody, _ := io.ReadAll(resp.Body) logger.Fatalf("请求失败,状态码: %d,响应: %s", resp.StatusCode, string(errBody)) return } // 读取并反序列化响应 respBody, err := io.ReadAll(resp.Body) fmt.Println(string(respBody)) return } func makeSignature(secret string, timestamp string, nonce string, client string) (ret string, err error) { strs := []string{secret, timestamp, nonce, client} fmt.Println(timestamp) fmt.Println(nonce) sort.Strings(strs) vv := strings.Join(strs, "") t := sha1.New() t.Write([]byte(vv)) return fmt.Sprintf("%x", t.Sum(nil)), nil }