在调用亚马逊发送短信接口的时候,发生了这个错误:
报错信息如下:
Exception in thread "main" com.amazonaws.services.sns.model.AmazonSNSException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. (Service: AmazonSNS; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: 4d64be74-9b3d-51fd-805f-ede5acd4c416)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1639)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1304)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
at com.amazonaws.services.sns.AmazonSNSClient.doInvoke(AmazonSNSClient.java:2270)
at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2246)
at com.amazonaws.services.sns.AmazonSNSClient.executePublish(AmazonSNSClient.java:1698)
at com.amazonaws.services.sns.AmazonSNSClient.publish(AmazonSNSClient.java:1675)
有三种情况会导致如下错误:
1.项目中没有引入亚马逊的 accessKey 与 secretKey
2.引入了错误的 accessKey 与 secretKey
3.引入的 accessKey 与 secretKey 没有所想使用的权限
以我的代码为例:
发短信的核心代码为:
AmazonSNSClientBuilder.standard().withRegion(“us-east-1”).build().publish(xxx,xxx,xxx);
此时就是没有引入任何的 Key 而直接进行发送,所以是失败的:
解决方案:加一个.withCredentials(new ClasspathPropertiesFileCredentialsProvider()
代码如下:
AmazonSNSClientBuilder.standard().withCredentials(new ClasspathPropertiesFileCredentialsProvider()).withRegion("us-east-1").build().publish(xxx,xxx,xxx);
那么又报错了:
Unable to load AWS credentials from the /AwsCredentials.properties file on the classpath
此时是因为在resources文件夹中没有 AwsCredentials.properties 的文件。
创建该文件,在里面键入内容:
accessKey=你的iam帐号
secretKey=你的iam密码
再次运行如果还报
Unable to load AWS credentials from any provider in the chain
那么可以查看下自己的帐号是否有权限发送短信(其他权限也是一样)。
通知领导或者自己去添加这部分的权限。