阿里云OpenAPI这个问题怎么解决?按照https://help.aliyun.com/document_detail/2392107.html?spm=a2c4g.2392108.0.0.375832dfwk72tK#sectiondiv-6jf-89b-wfa
对接短信接口 返回{"RequestId":"F759A021-35BC-59F2-BAE2-BDAB8BCFD703","Message":"Specified signature is not matched with our calculation. server string to sign is:GET&%2F&AccessKeyId%3DLTAI5tN89eFHS428Y5rJWVV4%26Action%3DSendSms%26Format%3DJSON%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D5186%26SignatureVersion%3D1.0%26Timestamp%3D2023-09-25T03%253A46%253A25Z%26Version%3D2017-05-25","Recommend":"https://api.aliyun.com/troubleshoot?q=SignatureDoesNotMatch&product=Dysmsapi&requestId=F759A021-35BC-59F2-BAE2-BDAB8BCFD703","HostId":"dysmsapi.aliyuncs.com","Code":"SignatureDoesNotMatch"}
根据返回的错误信息,"Specified signature is not matched with our calculation" 表明你在调用短信接口时提供的签名与阿里云期望的签名不匹配
这通常发生在你使用的 AccessKeyId、SignatureMethod、SignatureNonce、SignatureVersion 或 Timestamp 等参数与阿里云服务器上期望的值不匹配要解决这个问题,你需要确保以下参数与阿里云的文档中的示例一致:
1、AccessKeyId:这是你的阿里云账户的密钥ID
2、SignatureMethod:应该为 "HMAC-SHA1"
3、SignatureNonce:这是一个随机生成的字符串,每次请求都应该是唯一的
4、SignatureVersion:应该为 "1.0"
5、Timestamp:这是请求的时间戳,格式应为 "yyyy-MM-dd'T'HH:mm:ssZ"
在生成签名时,你需要使用这些参数,并按以下步骤进行:
1、将所有参数按照 "参数名=参数值" 的形式放在一个字符串中,注意不要有空格
2、对这个字符串进行 HMAC-SHA1 加密,密钥是你的 AccessKeyId
3、将加密后的字符串中的 "%3D" 替换为 "=","%" 替换为 "%25","+" 替换为 "%2B","," 替换为 "%2C","*" 替换为 "%2A",":" 替换为 "%3A","/" 替换为 "%2F","&" 替换为 "%26","=" 替换为 "%3D"
4、将加密后的字符串放在 "GET&%2F&" 后面,再加上你的 Action 和其他参数,例如 "Action=SendSms&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce=随机数&SignatureVersion=1.0&Timestamp=时间戳&Version=2017-05-25"
5、对这个新的字符串再次进行 HMAC-SHA1 加密,密钥是你的 AccessKeyId
6、将加密后的字符串中的 "%3D" 替换为 "=","%" 替换为 "%25","+" 替换为 "%2B","," 替换为 "%2C","*" 替换为 "%2A",":" 替换为 "%3A","/" 替换为 "%2F","&" 替换为 "%26","=" 替换为 "%3D"
7、将这个新的签名和其他的参数一起发送到接口在 Java 中,你可以使用以下代码来生成签名:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.SortedMap;
import java.util.TreeMap;
public class SMSSignature {
public static String getSignature(String accessKeySecret, String action, String nonce, String timestamp, String version) throws NoSuchAlgorithmException {
SortedMap<String, String> paramMap = new TreeMap<String, String>();
paramMap.put("AccessKeyId", accessKeySecret);
paramMap.put("Action", action);
paramMap.put("Format", "JSON");
paramMap.put("Nonce", nonce);
paramMap.put("SignatureMethod", "HMAC-SHA1");
paramMap.put("SignatureNonce", nonce);
paramMap.put("SignatureVersion", "1.0");
paramMap.put("Timestamp", timestamp);
paramMap.put("Version", version);
// 可能还需要加入其他的参数
String params = "";
for (String key : paramMap.keySet()) {
if (params.length() > 0) {
params += "&";
}
params += key + "=" + encodeURIComponent(paramMap.get(key));
}
// 对params进行HMAC-SHA1加密,密钥是accessKeySecret
String signature = ""; // 进行加密后得到的签名
return signature;
}
}
这个错误信息表示签名不正确。
在阿里云短信发送API中,签名是用来验证你的请求合法性的。你需要在你的请求中添加一个签名,这个签名是由你的AccessKeyId、SecretAccessKey、Method、Pathname、QueryString这五个部分组成的。
这个比对一下客户端stringtosign就好。 你拿你计算的$stringToSign和报错中的server string to sign is:后面的内容比对。此回答整理自钉群“阿里云 OpenAPI SDK 自签名服务群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。