开发者社区> 问答> 正文

请问这是什么阿里云OpenAPI问题?怎么解决?

我在使用阿里云RPC签名工具进行签名的时候,SDK返回的string_to_sign跟请求API后返回的服务端 server string to sign 对不上,参数排序不一致,请问是什么阿里云OpenAPI问题?from aliyunsdkcore.auth.composer.rpc_signature_composer import get_signed_url
POST&%2F&AccessKeyId%3DLTAI5tNuf6Ysd4sT8DWGGwA4%26Action%3DSingleCallByTts%26CalledNumber%3D18680555070%26CalledShowNumber%3D057128855253%26Format%3DJSON%26OutId%3DAABBCC112233%26PlayTimes%3D1%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D69c6195d54e2c7f4554c6c64e0a2d00f%26SignatureType%3D%26SignatureVersion%3D1.0%26Speed%3D5%26Timestamp%3D2023-09-26T05%253A02%253A09Z%26TtsCode%3DTTS_287805021%26TtsParam%3D%257B%2527name%2527%253A%2520u%2527%255Cu8001%255Cu7239%2527%257D%26Version%3D2017-05-25%26Volume%3D100
server string to sign is:POST&%2F&AccessKeyId%3DLTAI5tNuf6Ysd4sT8DWGGwA4%26Action%3DSingleCallByTts%26Format%3DJSON%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D69c6195d54e2c7f4554c6c64e0a2d00f%26SignatureType%3D%26SignatureVersion%3D1.0%26Timestamp%3D2023-09-26T05%253A02%253A09Z%26Version%3D2017-05-25%26%257B%2522Volume%2522%253A%2520100%252C%2520%2522TtsParam%2522%253A%2520%257B%2522name%2522%253A%2520%2522%255Cu8001%255Cu7239%2522%257D%252C%2520%2522CalledShowNumber%2522%253A%2520%2522057128855253%2522%252C%2520%2522OutId%2522%253A%2520%2522AABBCC112233%2522%252C%2520%2522CalledNumber%2522%253A%2520%252218680555070%2522%252C%2520%2522PlayTimes%2522%253A%25201%252C%2520%2522Speed%2522%253A%25205%252C%2520%2522TtsCode%2522%253A%2520%2522TTS_287805021%2522%257D%3D
"RequestId":"BBCE838B-BC69-593D-9BF1-C688B36E1CDC","Message":"Specified signature is not matched with our calculation

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

    根据你提供的信息,这个问题可能是由于参数的排序不一致导致的。在计算字符串_to_sign时,需要确保参数的排序与服务器端要求的排序相同。

    你可以尝试以下步骤来解决这个问题:

    1、确认参数的顺序:首先,请确保在计算字符串_to_sign时,参数的顺序与服务器端要求的顺序完全相同。这包括参数名和参数值的大小写和拼写,以及参数之间的顺序。
    2、检查参数的拼写错误:检查你的代码和请求中使用的参数名和参数值是否正确拼写,特别是对于一些特殊字符和大小写敏感的参数名。
    3、检查参数的编码方式:确认在计算字符串_to_sign时,所有参数的值都进行了正确的编码,使用了服务器端要求的编码方式。一些API要求对特殊字符进行编码,如URL编码。
    4、确认服务器端要求:最后,请查阅阿里云OpenAPI的文档或与服务器端开发人员联系,确认服务器端要求的字符串_to_sign的格式和参数排序方式。

    以下是一个示例代码片段,展示了如何使用Python SDK来计算字符串_to_sign,可以参考一下:

    from aliyunsdkcore.auth.composer.rpc_signature_composer import get_signed_url  
    
    # 设置请求参数  
    access_key_id = "LTAI5tNuf6Ysd4sT8DWGGwA4"  
    action = "SingleCallByTts"  
    called_number = "18680555070"  
    called_show_number = "057128855253"  
    format_ = "JSON"  
    out_id = "AABBCC112233"  
    play_times = 1  
    signature_method = "HMAC-SHA1"  
    signature_nonce = "69c6195d54e2c7f4554c6c64e0a2d00f"  
    signature_type = ""  
    signature_version = "1.0"  
    speed = 5  
    timestamp = "2023-09-26T05:02:09Z"  
    tts_code = "TTS_287805021"  
    tts_param = '{"name": "ü"}'  
    version = "2017-05-25"  
    volume = 100  
    
    # 计算字符串_to_sign  
    params = [  
        ("POST", "/"),  # HTTP方法 和 请求路径,不包括?号  
        ("AccessKeyId", access_key_id),  
        ("Action", action),  
        ("CalledNumber", called_number),  
        ("CalledShowNumber", called_show_number),  
        ("Format", format_),  
        ("OutId", out_id),  
        ("PlayTimes", str(play_times)),  # int类型需要转换成字符串类型  
        ("SignatureMethod", signature_method),  
        ("SignatureNonce", signature_nonce),  
        ("SignatureType", signature_type),  # 注意这个和上面的SignatureMethod在SDK里面是分开的,因为SignatureType实际使用中没有值,只是一个占位符  
        ("SignatureVersion", signature_version),  # 同上,实际使用中没有值,只是一个占位符  
        ("Speed", str(speed)),  # int类型需要转换成字符串类型  
        ("Timestamp", timestamp),  # 时间戳,格式为yyyy-MM-ddTHH:mm:ssZ  
        ("TtsCode", tts_code),  
        ("TtsParam", tts_param),  # 需要urllib.parse.quote编码  
        ("Version", version),  # 服务版本号,需要为字符串类型  
        ("Volume", str(volume)),  # int类型需要转换成字符串类型  
    ]  # 这里的params就是服务器端要求的string_to_sign中的参数,按照一定的顺序进行排列。这些参数在构造请求的时候,是按照相同的顺序加入到URL中的,所以这里也需要按照相同的顺序排列。特别注意:在构造请求URL的时候,"?"之前是params,之后是signature。如果这里顺序不对的话,会导致无法正确计算签名。比如:"AccessKeyId=?Action="这样是不正确的,应该是:"AccessKeyId=&Action=" 这样才是正确的。当然如果你使用SDK的话,SDK会自动处理这个问题。但是如果你自己手写签名的话,就需要特别注意了。  
    params.sort()  # 对参数按照字典序进行排序,这个很重要,不然会导致无法正确计算签名。特别注意:如果服务端要求的string_to_sign中的参数顺序和你这里的参数顺序
    
    2023-10-08 11:45:18
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的信息,我猜测您在使用阿里云RPC签名工具进行签名时,SDK返回的string_to_sign与请求API后返回的服务端server string to sign不一致。这可能是由于SDK和服务器端的排序规则不同造成的。
    具体来说,SDK可能按照特定的顺序对参数进行排序,而服务器端可能按照不同的顺序对参数进行排序。因此,SDK返回的string_to_sign与服务器端返回的server string to sign不一致。

    2023-10-07 22:11:13
    赞同 展开评论 打赏
  • 这个问题是由于在生成签名时,参数的顺序不一致导致的。阿里云OpenAPI要求在计算签名时,参数的顺序必须与请求的URL中的参数顺序一致。

    在你提供的示例中,string_to_sign是按照请求的URL中的参数顺序排序的,而server string to sign中的参数顺序与string_to_sign不同。为了解决这个问题,你需要确保在生成签名时使用正确的参数顺序。

    你可以按照以下步骤来解决这个问题:

    1. 首先,解析请求的URL,获取其中的参数和对应的值。可以使用Python的urllib.parse模块来解析URL。例如:
      ```python
      from urllib.parse import urlencode, parse_qs

    url = "your_request_url"
    parsed_url = urlparse(url)
    query_params = parse_qs(parsed_url.query)

    2. 然后,将解析得到的参数和值按照顺序整理成一个字典。例如:
    ```python
    sorted_params = {
        'Action': ['SingleCallByTts'],
        'CalledNumber': ['18680555070'],
        'CalledShowNumber': ['057128855253'],
        # ...其他参数...
    }
    
    1. 接下来,根据这个有序的参数字典生成签名。你可以使用aliyunsdkcore.auth.composer.rpc_signature_composer模块中的函数来生成签名。确保在生成签名时使用正确的参数顺序。
    2. 最后,将生成的签名与请求一起发送给阿里云OpenAPI。

    通过以上步骤,你应该能够解决参数顺序不一致导致的问题。请确保在实际使用时根据你的实际情况进行相应的调整和修改。

    2023-10-07 17:09:12
    赞同 展开评论 打赏
  • 这个问题可能是由于字符串排序规则的不同导致的。

    在创建签名时,阿里云OpenAPI使用的是自己的字符串排序规则,这可能与你使用的SDK的排序规则不同。为了解决这个问题,你需要确保在你的请求中使用的参数顺序与阿里云OpenAPI的一致。

    2023-10-07 15:25:33
    赞同 展开评论 打赏
  • CalledShowNumber和CalledNumber他们都是独立的字段,但你的请求把他们放在了一个JSON里,应该用表单形式发送
    application/x-www-form-urlencoded。lQLPJyGWNf9fQ8zNBd7NCz6wRYJoDE1CZqUFBZiFSwCvAA_2878_1502.png我看到使用的python调用 可以用pythonSDK
    这是获取示例的文档 https://help.aliyun.com/zh/sdk/developer-reference/how-to-automatically-generate-an-sdk-example?spm=a2c4g.11186623.0.0.7bc53e76IkBuXn
    此回答整理自钉群“阿里云 OpenAPI SDK 自签名服务群”

    2023-10-07 12:32:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

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