阿里云短信服务RFC调用偶然报错签名错误Specified signature nonce was used already.
在使用阿里云短信API进行RFC调用时,我们有时会遇到签名失败的情况,本文将介绍该问题的原因和解决方法。
Specified signature nonce was used already报错原因
这个报错信息后面会紧接着服务器(阿里云)用来验证签名的字符串也就是生成签名的字符串通过本地代码调试发现与本地代码打印的用于生成签名的字符串进行对比,发现是一摸一样。那到底是哪里有问题呢?通过不断对阿里云短信的API进行调用发现偶尔是可以调用成功的,这就说明生成签名的逻辑是没有问题的,后面大量测试发现每次调用失败时Signature中总会包含一个或多个的+号。
解决方式
通过分析原因,发现:
我本地调用阿里云短信的API使用的生成签名的逻辑是参考了阿里云短信SDK里面调用RPC的逻辑,这里面就会有一个坑:
sdk中的percentEncode方法将+替换成了%20,这里面应该是替换成%2B
在请求API时 对生成出的签名(Signature)又进行了一次encode操作把+号替换成了%2B
这样更改之后 测试之后不会出现偶尔报签名错误的情况了