golang json反序列化科学计数法的坑

问题背景

func CheckSign(c *gin.Context, signKey string, singExpire int) (string, error) {
	r := c.Request
	var formParams map[string]interface{}
	if c.Request.Body != nil {
		bodyBytes, _ := io.ReadAll(c.Request.Body)
		defer c.Request.Body.Close()
		if len(bodyBytes) > 0 {
            //原始有问题的写法
            //err := json.Unmarshal(bodyBytes, &formParams)
			// 直接解析,会导致数字类型解析出来的是科学计数法
			d := json.NewDecoder(bytes.NewReader([]byte(bodyBytes)))
			d.UseNumber()
			err := d.Decode(&formParams)
			if err != nil {
				return "", err
			}
		}
		// 创建新的reader,使用bytes.NewReader
		// 恢复r.Body,以便可以多次读取
		r.Body = io.NopCloser(bytes.NewReader(bodyBytes))
	}

	sign := c.GetHeader("api-sign")
	timestamp := c.GetHeader("api-timestamp")

	if sign == "" || timestamp == "" {
		return "", errors.New("api-sign 或 api-timestamp为空")
	}

	//验证时间戳格式
	timestampValue, err := strconv.ParseInt(timestamp, 10, 64)
	if err != nil {
		return "", errors.New("timetamp 格式错误")
	}

	//验证时间戳
	nowstamp := time.Now().UnixNano() / int64(time.Millisecond)
	ago := timestampValue + int64(singExpire)
	if nowstamp > ago {
		return "", errors.New("签名时间已过期")
	}

	//验证签名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值