测试一个外部api的时候发现,同样的签名方法和payload,放在postman请求完全没问题,curl也能通过,但是到了feign就签名错误。
百思不得其解,后来发现了问题。
计算签名的时候,payload使用的格式是
{"enterpriseId": "576588586871871450"}
但是,在feign传参数的时候,因为body是json,会进行序列化,变成
{"enterpriseId": "576588586871871450"
}
加入了换行和缩进,类似于postman里边的beautify一键格式化。
实测,beautify之后postman也验签不通过了。
而feign是@Headers这种指定header而不是拦截器的方式,计算签名用的是jsonObject,所以导致二者对不上,签名不通过。
正确的做法就应该是,feign的计算签名这些都通过拦截器来实现,从拦截器里边取出来payload或者body。这样才能保证计算签名时候使用的数据格式和feign传输的完全一样。