开发者社区> 问答> 正文

阿里云OpenAPI这个问题怎么解决?

阿里云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"}

展开
收起
三分钟热度的鱼 2023-10-07 12:24:54 229 0
5 条回答
写回答
取消 提交回答
  • 月移花影,暗香浮动

    根据返回的错误信息,"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;  
        }  
    }
    
    2023-10-08 14:14:38
    赞同 展开评论 打赏
  • 这个问题可能是由于签名计算不匹配导致的

    2023-10-07 17:06:09
    赞同 展开评论 打赏
  • 这个错误信息表示签名不正确。

    在阿里云短信发送API中,签名是用来验证你的请求合法性的。你需要在你的请求中添加一个签名,这个签名是由你的AccessKeyId、SecretAccessKey、Method、Pathname、QueryString这五个部分组成的。

    2023-10-07 15:25:43
    赞同 展开评论 打赏
  • 您好,根据您提供的错误信息,可能是由于您的签名不匹配导致的。建议您仔细检查您的签名算法,并确保与阿里云的要求相匹配。

    2023-10-07 13:10:47
    赞同 展开评论 打赏
  • 这个比对一下客户端stringtosign就好。 你拿你计算的$stringToSign和报错中的server string to sign is:后面的内容比对。此回答整理自钉群“阿里云 OpenAPI SDK 自签名服务群”

    2023-10-07 12:29:42
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
AutoTalk第七期:自动化工具-OpenAPI在线调试 立即下载
最大化阿里云OpenAPI能力的方法和实践 立即下载
低代码开发师(初级)实战教程 立即下载