收藏
回答

普通代云开发,云函数上传已经按照文档进行签名,提示签名不合法?

我按照以下的流程使用微信普通代云开发

1. 开通了云开发。小程序appid:wxb2d34f69d701e47e

2. 创建了云环境。环境id:xmd-cloud-dev1447e,环境别名xmd-cloud1447e

3. 可以通过接口查询到已经创建了云环境。https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/cloudbase/common/getEnvInfo.html

4. 创建了云函数。环境id:xmd-cloud-dev1447e,function_name:openMini2

5. 可以通过接口查询到云函数已经创建成功。https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/cloudbase/common/listFunctions.html

6. 获取到代码保护的秘钥。nGmQniR0v+e7wizy9alZqD40Bpc3ybfA8lP2IR2MJPR5BH5mLy5lxGd0gh2K7i3b

7. 根据要求的签名算法生成了秘钥hashed_payload 。

要签名的明文是{"CodeSecret":"nGmQniR0v+e7wizy9alZqD40Bpc3ybfA8lP2IR2MJPR5BH5mLy5lxGd0gh2K7i3b","EnvId":"xmd-cloud-dev1447e","FunctionName":"openMini2","Handler":"index.main","ZipFile":"UEsDBBQAAAAIAEBaYlJLkjQyAwIAADgDAAAIAAAAaW5kZXguanNlUsFu00AQvfsrRr3YFomTCqiqSOUCHDgXVK4re5IsxGt3d+040EgIBEklqgpQEUgRPaByo1RCqkJKxc/YBk78Amuvk7RgaeXdmTfvzezbRgPS2atsdJ4fnGTPj7L9j/nbUXp2argBExLcXhB5sAEctyPK0TL7SV0gj5HXhffQtA2jRDiUUWk9NgCQxS0wE9+rl4m6h3F9vRN7g9X4Ea5dvb7utq+ZNWOoKv+X1nsDkzDgUjg+oUxpEzFgLlgYI5M1UH1JTKQNGzegENR99pObOq7wuqMOyq37VdBSagCiT6XbrYgc4koaMLvkUCxEIJiq5h7vbbpd9NFsVSlQw8uIM7iY1SR2CRgaxTIWOFNTAwsktIOIeaah0nqKdsR08hJZEBYxoZuRfFD+56NxFFGvmIv0Ca0ccYIQGQmpE/GeKDnUvAw5kWjNuwZ4EPnhVkKWgxRfSGS3BZWiU5xgZwdWVmoXMNsR8sESVB43Jaes8y92uNwqO7NPT/MPk/zZ13S69+vHKJ8cZuP3P8+P0+kM2qQn8M/3l9m302z/S3p2lH1+l41PlN/53nE2e7PgoeJ2Eqq31tIllwTS6ZNs/OL368N8spsfjJXAIotl0V3qq8KQcIF3mLRuqQtxWNC3bGjAarPZhCuw1rTnnENtYOWbvujCTPUc9EvhXHuywKhI6fbwL1BLAwQUAAAACAD7dTtScboMeKsAAAADAQAADAAAAHBhY2thZ2UuanNvbk2POw/CMAyE9/4KK0MnGrVl64oYGJhYu1SJUc0jqeIAlVD57eQBgtHfnX3nZwEgzHBF0YGwE5o9GRKrSO/omKyJQiNrWWeqkZWjyX+UDK8DpYmMxlmeONNs5CDElAA8so82VKOFXmyds64DYyEKwBMqOhLqXkBZAs7koRFhc0nXhpsfrftlXkih4dR7d9h8y4UPNBpF+Bf7mCtGF96pWJ+j/9XKtWzT6WIp3lBLAwQUAAAACAB6iGFS2PDAOUEAAABIAAAACwAAAGNvbmZpZy5qc29uq+ZSUFAqSC3KzSwuzszPK1ayUgAJAQXzC1LzEgsygQLRXJycSqVFOcXJGam5qXrpqXmpRYklqUpgdbFAsparFgBQSwECHwAUAAAACABAWmJSS5I0MgMCAAA4AwAACAAkAAAAAAAAACAAAAAAAAAAaW5kZXguanMKACAAAAAAAAEAGACiFSynEg/XAaIVLKcSD9cBhrtTNEsO1wFQSwECHwAUAAAACAD7dTtScboMeKsAAAADAQAADAAkAAAAAAAAACAAAAApAgAAcGFja2FnZS5qc29uCgAgAAAAAAABABgAAAmXVnj01gGMRFo0Sw7XAUJLWDRLDtcBUEsBAh8AFAAAAAgAeohhUtjwwDlBAAAASAAAAAsAJAAAAAAAAAAgAAAA/gIAAGNvbmZpZy5qc29uCgAgAAAAAAABABgAFgzizHkO1wEWDOLMeQ7XATRzUTRLDtcBUEsFBgAAAAADAAMAFQEAAGgDAAAAAA=="}

生成签名的代码是

其中str为JSON.stringify()后得到的字符串

private String getEncryptCode() throws Exception {
   String str = "{\"CodeSecret\":\"nGmQniR0v+e7wizy9alZqD40Bpc3ybfA8lP2IR2MJPR5BH5mLy5lxGd0gh2K7i3b\",\"EnvId\":\"xmd-cloud-dev1447e\",\"FunctionName\":\"openMini2\",\"Handler\":\"index.main\",\"ZipFile\":\"UEsDBBQAAAAIAEBaYlJLkjQyAwIAADgDAAAIAAAAaW5kZXguanNlUsFu00AQvfsrRr3YFomTCqiqSOUCHDgXVK4re5IsxGt3d+040EgIBEklqgpQEUgRPaByo1RCqkJKxc/YBk78Amuvk7RgaeXdmTfvzezbRgPS2atsdJ4fnGTPj7L9j/nbUXp2argBExLcXhB5sAEctyPK0TL7SV0gj5HXhffQtA2jRDiUUWk9NgCQxS0wE9+rl4m6h3F9vRN7g9X4Ea5dvb7utq+ZNWOoKv+X1nsDkzDgUjg+oUxpEzFgLlgYI5M1UH1JTKQNGzegENR99pObOq7wuqMOyq37VdBSagCiT6XbrYgc4koaMLvkUCxEIJiq5h7vbbpd9NFsVSlQw8uIM7iY1SR2CRgaxTIWOFNTAwsktIOIeaah0nqKdsR08hJZEBYxoZuRfFD+56NxFFGvmIv0Ca0ccYIQGQmpE/GeKDnUvAw5kWjNuwZ4EPnhVkKWgxRfSGS3BZWiU5xgZwdWVmoXMNsR8sESVB43Jaes8y92uNwqO7NPT/MPk/zZ13S69+vHKJ8cZuP3P8+P0+kM2qQn8M/3l9m302z/S3p2lH1+l41PlN/53nE2e7PgoeJ2Eqq31tIllwTS6ZNs/OL368N8spsfjJXAIotl0V3qq8KQcIF3mLRuqQtxWNC3bGjAarPZhCuw1rTnnENtYOWbvujCTPUc9EvhXHuywKhI6fbwL1BLAwQUAAAACAD7dTtScboMeKsAAAADAQAADAAAAHBhY2thZ2UuanNvbk2POw/CMAyE9/4KK0MnGrVl64oYGJhYu1SJUc0jqeIAlVD57eQBgtHfnX3nZwEgzHBF0YGwE5o9GRKrSO/omKyJQiNrWWeqkZWjyX+UDK8DpYmMxlmeONNs5CDElAA8so82VKOFXmyds64DYyEKwBMqOhLqXkBZAs7koRFhc0nXhpsfrftlXkih4dR7d9h8y4UPNBpF+Bf7mCtGF96pWJ+j/9XKtWzT6WIp3lBLAwQUAAAACAB6iGFS2PDAOUEAAABIAAAACwAAAGNvbmZpZy5qc29uq+ZSUFAqSC3KzSwuzszPK1ayUgAJAQXzC1LzEgsygQLRXJycSqVFOcXJGam5qXrpqXmpRYklqUpgdbFAsparFgBQSwECHwAUAAAACABAWmJSS5I0MgMCAAA4AwAACAAkAAAAAAAAACAAAAAAAAAAaW5kZXguanMKACAAAAAAAAEAGACiFSynEg/XAaIVLKcSD9cBhrtTNEsO1wFQSwECHwAUAAAACAD7dTtScboMeKsAAAADAQAADAAkAAAAAAAAACAAAAApAgAAcGFja2FnZS5qc29uCgAgAAAAAAABABgAAAmXVnj01gGMRFo0Sw7XAUJLWDRLDtcBUEsBAh8AFAAAAAgAeohhUtjwwDlBAAAASAAAAAsAJAAAAAAAAAAgAAAA/gIAAGNvbmZpZy5qc29uCgAgAAAAAAABABgAFgzizHkO1wEWDOLMeQ7XATRzUTRLDtcBUEsFBgAAAAADAAMAFQEAAGgDAAAAAA==\"}";
   MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
   messageDigest.update(str.getBytes());
   return byte2Hex(messageDigest.digest());
}

private static String byte2Hex(byte[] bytes) {
   StringBuffer stringBuffer = new StringBuffer();
   String temp = null;
   for (int i = 0; i < bytes.length; i++) {
      temp = Integer.toHexString(bytes[i] & 0xFF);
      if (temp.length() == 1) {
         //1得到一位的进行补0操作
         stringBuffer.append("0");
      }
      stringBuffer.append(temp);
   }
   return stringBuffer.toString();
}


得到的签名是7ba7a00df8250f5c0e30f0f4a39935fbb1ee1f718d0299caabf52f9a1b318364

8. 获得到上传云函数的凭证为

Authorization:TC3-HMAC-SHA256 Credential=AKIDl7K9-ILOfko82nS6nHAZCssuPn_hgYtTyTJXfMzFvGnzBCQx-HzeRh5I2AProWqM/2021-03-08/scf/tc3_request, SignedHeaders=content-type;host, Signature=2180c12b81cb9a32973a57fcdd77411f9ab9ad89bce43f8500635e35399fc16c

Host:scf.tencentcloudapi.com

Content-Type:application/json

X-TC-Action:UpdateFunctionCode

X-TC-Timestamp:1615178085

X-TC-Version:2018-04-16

X-TC-Region:ap-shanghai

9. 用这个得到的heads和postData去上传云函数代码。得到返回结果:

post的代码如下:

    private void postUpload(String accessToken, String headStr) throws Exception {
      String url = "https://scf.tencentcloudapi.com?access_token=" + accessToken;
      String body = "{\"CodeSecret\":\"nGmQniR0v+e7wizy9alZqD40Bpc3ybfA8lP2IR2MJPR5BH5mLy5lxGd0gh2K7i3b\",\"EnvId\":\"xmd-cloud-dev1447e\",\"FunctionName\":\"openMini2\",\"Handler\":\"index.main\",\"ZipFile\":\"UEsDBBQAAAAIAEBaYlJLkjQyAwIAADgDAAAIAAAAaW5kZXguanNlUsFu00AQvfsrRr3YFomTCqiqSOUCHDgXVK4re5IsxGt3d+040EgIBEklqgpQEUgRPaByo1RCqkJKxc/YBk78Amuvk7RgaeXdmTfvzezbRgPS2atsdJ4fnGTPj7L9j/nbUXp2argBExLcXhB5sAEctyPK0TL7SV0gj5HXhffQtA2jRDiUUWk9NgCQxS0wE9+rl4m6h3F9vRN7g9X4Ea5dvb7utq+ZNWOoKv+X1nsDkzDgUjg+oUxpEzFgLlgYI5M1UH1JTKQNGzegENR99pObOq7wuqMOyq37VdBSagCiT6XbrYgc4koaMLvkUCxEIJiq5h7vbbpd9NFsVSlQw8uIM7iY1SR2CRgaxTIWOFNTAwsktIOIeaah0nqKdsR08hJZEBYxoZuRfFD+56NxFFGvmIv0Ca0ccYIQGQmpE/GeKDnUvAw5kWjNuwZ4EPnhVkKWgxRfSGS3BZWiU5xgZwdWVmoXMNsR8sESVB43Jaes8y92uNwqO7NPT/MPk/zZ13S69+vHKJ8cZuP3P8+P0+kM2qQn8M/3l9m302z/S3p2lH1+l41PlN/53nE2e7PgoeJ2Eqq31tIllwTS6ZNs/OL368N8spsfjJXAIotl0V3qq8KQcIF3mLRuqQtxWNC3bGjAarPZhCuw1rTnnENtYOWbvujCTPUc9EvhXHuywKhI6fbwL1BLAwQUAAAACAD7dTtScboMeKsAAAADAQAADAAAAHBhY2thZ2UuanNvbk2POw/CMAyE9/4KK0MnGrVl64oYGJhYu1SJUc0jqeIAlVD57eQBgtHfnX3nZwEgzHBF0YGwE5o9GRKrSO/omKyJQiNrWWeqkZWjyX+UDK8DpYmMxlmeONNs5CDElAA8so82VKOFXmyds64DYyEKwBMqOhLqXkBZAs7koRFhc0nXhpsfrftlXkih4dR7d9h8y4UPNBpF+Bf7mCtGF96pWJ+j/9XKtWzT6WIp3lBLAwQUAAAACAB6iGFS2PDAOUEAAABIAAAACwAAAGNvbmZpZy5qc29uq+ZSUFAqSC3KzSwuzszPK1ayUgAJAQXzC1LzEgsygQLRXJycSqVFOcXJGam5qXrpqXmpRYklqUpgdbFAsparFgBQSwECHwAUAAAACABAWmJSS5I0MgMCAAA4AwAACAAkAAAAAAAAACAAAAAAAAAAaW5kZXguanMKACAAAAAAAAEAGACiFSynEg/XAaIVLKcSD9cBhrtTNEsO1wFQSwECHwAUAAAACAD7dTtScboMeKsAAAADAQAADAAkAAAAAAAAACAAAAApAgAAcGFja2FnZS5qc29uCgAgAAAAAAABABgAAAmXVnj01gGMRFo0Sw7XAUJLWDRLDtcBUEsBAh8AFAAAAAgAeohhUtjwwDlBAAAASAAAAAsAJAAAAAAAAAAgAAAA/gIAAGNvbmZpZy5qc29uCgAgAAAAAAABABgAFgzizHkO1wEWDOLMeQ7XATRzUTRLDtcBUEsFBgAAAAADAAMAFQEAAGgDAAAAAA==\"}";

      Map headers = new HashMap<>();

//    String headerStr = "Authorization:TC3-HMAC-SHA256 Credential=AKID3oEXbr4ksVEPsGsBzfa8o7uhGHiplLnds5IVbC5zCnF2HrVUvPKc4zFqvov0zRS4/2021-03-04/scf/tc3_request, SignedHeaders=content-type;host, Signature=cbd97bec7120703c82339ba085e1f243bc3c282ac837253a62e44d82e24709fb\r\nHost:scf.tencentcloudapi.com\r\nContent-Type:application/json\r\nX-TC-Action:UpdateFunctionCode\r\nX-TC-Timestamp:1614828707\r\nX-TC-Version:2018-04-16\r\nX-TC-Region:ap-shanghai\r\nX-TC-Token:4LEQkqsKxIpl4hCd7OXBLlF5W6pwoJXa8c55113e1288d2f58649eeaf471ba715_lAO_txVvaVzMI0bqshjciL17ZcwyLvhnLseIjcy77LgObtzuWYgRnXL772W0qgT4BcytXtWBYA_lF2dXxFhNVVsu9ypttmEcFGRxXWmOky2iydUYBqtpI_iElAk6RYAc62UozHwkJxldxRd9jyHDqFhadvChSUG4YwJ5gNg9Uxar3LZtZLEmxzSxX4tNEtFkhVzSmiVeZqU4-cFBaMe4P8gqLrP9DatFb8_mCsHAVT3BeY3j6U7563ecOoo5Duzu_JUdllGvsnJkbrBh26qgz23PvONohyt7OII92f-j5KPfns-RoG3kVO3HIeCKWe-zSyYdcmqjEgRdAO5P0yzUx7GZlM12E45Cf9UZrLYDCM";
      String[] strs = headStr.split("\r\n");
      for (int i = 0; i <= strs.length - 1; i++) {
         String each = strs[i];
         String[] s = each.split(":");
         String value = s[1];
//       if (s[0].equals("Authorization")) {
//          s[1] = s[1] + "a";
//       }
         headers.put(s[0], value);
      }


{"Response":{"Error":{"Code":"AuthFailure.SignatureFailure","Message":"The provided credentials could not be validated. Please check your signature is correct."},"RequestId":"98da9903-afc3-4877-9245-59bd6a646d60"}}


这里提示的是签名不合法。可是生成签名的代码已经是用的文档提供的签名代码。java和js执行的结果是一致的。已经试了很多次了,希望能得到帮助。



回答关注问题邀请回答
收藏

1 个回答

  • 绅士紫
    绅士紫
    2021-03-09

    你好,请问是怎么发送的 http 请求呢?Content-Length 有没有带上?

    2021-03-09
    有用 1
    回复 3
    • 庄元丰
      庄元丰
      2021-03-09
      curl -d '{"CodeSecret":"nGmQniR0v+e7wizy9alZqD40Bpc3ybfA8lP2IR2MJPR5BH5mLy5lxGd0gh2K7i3b","EnvId":"xmd-cloud-dev1447e","FunctionName":"openMini2","Handler":"index.main","ZipFile":"UEsDBBQAAAAIAEBaYlJLkjQyAwIAADgDAAAIAAAAaW5kZXguanNlUsFu00AQvfsrRr3YFomTCqiqSOUCHDgXVK4re5IsxGt3d+040EgIBEklqgpQEUgRPaByo1RCqkJKxc/YBk78Amuvk7RgaeXdmTfvzezbRgPS2atsdJ4fnGTPj7L9j/nbUXp2argBExLcXhB5sAEctyPK0TL7SV0gj5HXhffQtA2jRDiUUWk9NgCQxS0wE9+rl4m6h3F9vRN7g9X4Ea5dvb7utq+ZNWOoKv+X1nsDkzDgUjg+oUxpEzFgLlgYI5M1UH1JTKQNGzegENR99pObOq7wuqMOyq37VdBSagCiT6XbrYgc4koaMLvkUCxEIJiq5h7vbbpd9NFsVSlQw8uIM7iY1SR2CRgaxTIWOFNTAwsktIOIeaah0nqKdsR08hJZEBYxoZuRfFD+56NxFFGvmIv0Ca0ccYIQGQmpE/GeKDnUvAw5kWjNuwZ4EPnhVkKWgxRfSGS3BZWiU5xgZwdWVmoXMNsR8sESVB43Jaes8y92uNwqO7NPT/MPk/zZ13S69+vHKJ8cZuP3P8+P0+kM2qQn8M/3l9m302z/S3p2lH1+l41PlN/53nE2e7PgoeJ2Eqq31tIllwTS6ZNs/OL368N8spsfjJXAIotl0V3qq8KQcIF3mLRuqQtxWNC3bGjAarPZhCuw1rTnnENtYOWbvujCTPUc9EvhXHuywKhI6fbwL1BLAwQUAAAACAD7dTtScboMeKsAAAADAQAADAAAAHBhY2thZ2UuanNvbk2POw/CMAyE9/4KK0MnGrVl64oYGJhYu1SJUc0jqeIAlVD57eQBgtHfnX3nZwEgzHBF0YGwE5o9GRKrSO/omKyJQiNrWWeqkZWjyX+UDK8DpYmMxlmeONNs5CDElAA8so82VKOFXmyds64DYyEKwBMqOhLqXkBZAs7koRFhc0nXhpsfrftlXkih4dR7d9h8y4UPNBpF+Bf7mCtGF96pWJ+j/9XKtWzT6WIp3lBLAwQUAAAACAB6iGFS2PDAOUEAAABIAAAACwAAAGNvbmZpZy5qc29uq+ZSUFAqSC3KzSwuzszPK1ayUgAJAQXzC1LzEgsygQLRXJycSqVFOcXJGam5qXrpqXmpRYklqUpgdbFAsparFgBQSwECHwAUAAAACABAWmJSS5I0MgMCAAA4AwAACAAkAAAAAAAAACAAAAAAAAAAaW5kZXguanMKACAAAAAAAAEAGACiFSynEg/XAaIVLKcSD9cBhrtTNEsO1wFQSwECHwAUAAAACAD7dTtScboMeKsAAAADAQAADAAkAAAAAAAAACAAAAApAgAAcGFja2FnZS5qc29uCgAgAAAAAAABABgAAAmXVnj01gGMRFo0Sw7XAUJLWDRLDtcBUEsBAh8AFAAAAAgAeohhUtjwwDlBAAAASAAAAAsAJAAAAAAAAAAgAAAA/gIAAGNvbmZpZy5qc29uCgAgAAAAAAABABgAFgzizHkO1wEWDOLMeQ7XATRzUTRLDtcBUEsFBgAAAAADAAMAFQEAAGgDAAAAAA=="}'
      -H "Authorization:TC3-HMAC-SHA256 Credential=AKIDAzOIPJ4JEVwjeZGyM6LRsoUz1ca0I6BnO172I4IIujTT950OVzhM8xl-YmLdY-ea/2021-03-08/scf/tc3_request, SignedHeaders=content-type;host, Signature=d6e2af34502b8a53c11f0c95938e58dbe0ab3ee1cf82a3213d5e6d73a2a6a13b" -H "Host:scf.tencentcloudapi.com" -H "Content-Type:application/json" -H "X-TC-Action:UpdateFunctionCode" -H "X-TC-Timestamp:1615200412" -H "X-TC-Version:2018-04-16" -H "X-TC-Region:ap-shanghai" -H "X-TC-Token:6dYzcKG1WBA0j8lH6ex6mlsJwvg8IOuaa0307c28235c1a7aded9c50571fde962EtRGiR97O7dUl7-dgti-YcfVGKAfZpyydqVysSg-CSWMBCU1jRp0bnyxPimLk8zGNrNomZoQ_UyNzknFWaN2EB6lchQuHVI3Kz2Y758ADLgA3ddp0jUveNHRD-5QXOQHSciejZpxpit-ixPaCj1t5AfEqUdpDGWD7reh8gpT-QbiBcBLJBUBZ8zyrX4NbAsCshNItlegx96LxVPnsfn-Ai4sft9j2NaeJTQAk5ClKF9ahxlrIdw4MQtvAxcv0jdv0UO97K50ghamB8beQC34sD96Z6fHl69eoVsSOW3NuV2Gu5dx0WEzxSM4gzFc_rrHTgXi_hH-c5KnCwsknaU0r8mU8CKx9q8Ukh8LrOz0Bzs"
      https://scf.tencentcloudapi.com?access_token=42_eCP_vstBmiW105uFJHTlEmtx2FoKKFRtBFga09S9CuRlGKdWx69jfSbmj41e4a7CmjTYPWVcqAcWctqtC6XAybPxR2JOpcJ6D6HdDjsQOIcVnOsxnPvkEPeFOJ0149W7T3GYFlavyXlbugOPBGIhAEDJOQ
      2021-03-09
      回复
    • 庄元丰
      庄元丰
      2021-03-09
      你好,之前是这样的http请求,现在应该是过期了。我这里有一个requestId:1b1a1648-50dc-4382-aeec-73020e0145cb
      2021-03-09
      回复
    • 庄元丰
      庄元丰
      2021-03-09
      这个问题是因为我的请求url带了access_token参数,是不需要加的。导致整个请求签名错误了。不仔细对一下文档真发现不了。
      2021-03-09
      1
      回复
登录 后发表内容
问题标签