开发者社区 > 物联网 > 正文

阿里云物联网平台OpenAPI在微信小程序端有没有JavaScript实现的签名算法

已解决

1.目前本人希望通过在微信小程序端通过JavaScript调用阿里云OpenAPI向本人账号下的物联网设备对应的订阅消息主题发布消息. 2.目前已经尝试过在微信开发者工具中使用npm版本的@alicloud/openapi-client出现严重错误,希望大神们提供指点.谢谢!!!

1.png

2.png

展开
收起
kim_evin 2023-06-27 08:30:22 144 0
6 条回答
写回答
取消 提交回答
  • 月移花影,暗香浮动
    采纳回答

    阿里云物联网平台OpenAPI签名算法可以在微信小程序端使用JavaScript实现。以下是JavaScript版的签名算法实现:

    function getSignature(url, method, appKey, appSecret) {
    let query = url.split('?')[1].split('&').reduce((acc, cur) => {
    const [k, v] = cur.split('=');
    return { ...acc, [k]: v };
    }, {});
    
    const nonce = Math.random().toString(36).substring(2, 15) Math.random().toString(36).substring(2, 15);
    const timestamp = new Date().getTime();
    
    const params = {
    appKey,
    nonce,
    timestamp,
    method,
    version: '2018-01-20',
    ...query,
    };
    
    const sign = Object.entries(params)
    .sort((a, b) => a[0].localeCompare(b[0]))
    .reduce((acc, cur) => `${acc}${cur[0]}${cur[1]}`, appSecret);
    
    params.sign = md5(sign);
    
    return params;
    }
    

    其中,url为请求的URL,method为HTTP方法(GET、POST等),appKey为阿里云物联网平台应用Key,appSecret为阿里云物联网平台应用Secret,返回值为签名后的参数列表。注意,这里我们假定md5()为另一个函数,用于计算MD5签名,需要自行实现。

    2023-06-27 10:54:54
    赞同 1 展开评论 打赏
    1. 感谢各位大佬的提示,这个解法都有大家的帮助.(ง •̀_•́)ง。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
    2. 重点是解决了"微信开发者工具"用npm命令下载的多数npm包不兼容的问题(相当头疼!!!!!)
    3. 最后就是反复比对URI编码签名机制(仔细)
    var _querystring = require("qs"); // 替换querystring库(大坑)
    var _crypto = require("crypto-js"); // 注意查看文档(巨坑)
    var _uuid = require("uuid-random"); // npm包内用到的crypto库要修改为crypto-js
    
    function getSignature(params, method, accessKeySecret) {
      let _ret = "";
      console.log("Params", params);
      let sign = Object.entries(params)
        .sort(function (k1, k2) {
          return k1[0].localeCompare(k2[0]);
        })
        .reduce(function (total, curV, curI, arr) {
          return curI < (arr.length - 1) ? `${total}${curV[0]}=${encodeURIComponent(curV[1])}&` : `${total}${curV[0]}=${encodeURIComponent(curV[1])}`
        }, "");
      sign = method + "&%2F&" + encodeURIComponent(sign);
      let _signWords = _crypto.enc.Utf8.parse(sign);
      let _signUtf8 = _crypto.enc.Utf8.stringify(_signWords);
      console.log(_signUtf8);
      let _secret = accessKeySecret + "&";
      console.log(_secret);
      let _hmacsha1 = _crypto.HmacSHA1(sign, _secret);
      console.log(_hmacsha1.toString());
      _ret = encodeURIComponent(_crypto.enc.Base64.stringify(_hmacsha1));
      console.log(_ret);
      return _ret;
    }
    
    function request(msg, accessKeyId, accessKeySecret) {
      var words = _crypto.enc.Utf8.parse(msg);
      let _msg = _crypto.enc.Base64.stringify(words);
      let query = {
        AccessKeyId: accessKeyId,
        Action: "Pub",
        Format: "JSON",
        SignatureMethod: "HMAC-SHA1",
        SignatureNonce: _uuid(),
        SignatureVersion: "1.0",
        Timestamp: new Date().toISOString().replace(/\..+/, '') + 'Z',
        Version: "2018-01-20",
        RegionId: "cn-shanghai",
        ProductKey: "^_^",
        TopicFullName: "/^_^/deviceName/user/get",
        MessageContent: _msg,
        Qos: 0
      };
      let _url = "https://iot.cn-shanghai.aliyuncs.com/?" + _querystring.stringify(query);
      let _signValue = getSignature(query, "GET", accessKeySecret);
      _url = _url + "&Signature=" + _signValue;
      console.log(_url);
    
      return new Promise((resolve, reject) => {
        wx.request({
          url: _url,
          success: (res) => {
            console.log(res.data);
          },
          fail: (err) => {
            reject(err);
          },
        });
      });
    }
    
    export default request;
    

    3.png 4.png

    2023-06-28 08:55:35
    赞同 展开评论 打赏
  • 对于你的第一个问题,你可以通过在微信小程序端使用JavaScript调用阿里云OpenAPI来向物联网设备发布消息。以下是一个简单的示例代码,假设你已经获得了访问凭证:

    // 导入阿里云OpenAPI SDK
    const OpenApiClient = require('@alicloud/openapi-client').default;
    
    // 创建API实例
    const client = new OpenApiClient({
      accessKeyId: '你的Access Key ID',
      accessKeySecret: '你的Access Key Secret',
    });
    
    // 请求参数
    const params = {
      Action: 'pub',
      ProductKey: '你的产品Key',
      TopicFullName: '/productKey/deviceName/topic',
      MessageContent: JSON.stringify({ key: 'value' }),
    };
    
    // 发布消息
    client.request('POST', '/topics/pub', params)
      .then(response => {
        console.log('消息发布成功');
      })
      .catch(error => {
        console.error('消息发布失败', error);
      });
    

    请将代码中的 '你的Access Key ID''你的Access Key Secret''你的产品Key''/productKey/deviceName/topic'{ key: 'value' } 替换为你自己的实际值。

    然而,在微信小程序中直接使用npm包是不被支持的,这就解释了为什么你在微信开发者工具中使用npm版本的@alicloud/openapi-client会出现错误。为了在微信小程序中使用阿里云OpenAPI,你需要手动下载并引入相关的SDK文件。你可以从阿里云官方网站上下载SDK,并将其放置在微信小程序的指定目录下进行使用。

    另外,请确保你的阿里云账号权限和设备配置正确,并且已经创建了相应的主题和订阅关系。

    2023-06-27 09:29:36
    赞同 展开评论 打赏
  • 热爱开发

    阿里云物联网平台 OpenAPI 目前没有提供 JavaScript 实现的签名算法。如果你希望通过在微信小程序端调用阿里云 OpenAPI 向本人账号下的物联网设备对应的订阅消息主题发布消息,可以考虑使用以下几个方面的解决方案:

    使用阿里云物联网平台提供的 SDK 或 API 进行调用。阿里云物联网平台提供了多种 SDK 和 API,可以帮助你在微信小程序端进行物联网设备的管理和控制。 使用第三方开发工具或框架进行调用。如果你对第三方开发工具或框架比较熟悉,可以考虑使用这些工具或框架进行物联网设备的管理和控制。 使用阿里云物联网平台提供的开发文档进行调用。阿里云物联网平台提供了丰富的开发文档,可以帮助你了解如何使用阿里云物联网平台进行物联网设备的管理和控制。 如果你在使用阿里云物联网平台 OpenAPI 时遇到了问题,可以考虑使用以上几个方面的解决方案,或者联系阿里云物联网平台的客服进行解决。

    2023-06-27 09:12:22
    赞同 展开评论 打赏
  • 阿里云物联网平台OpenAPI在微信小程序端可以使用JavaScript实现签名算法。

    以下是一个示例代码:

    function sign(params, secret) {
      let keys = Object.keys(params).sort();
      let query = '';
      for (let key of keys) {
        query += key + params[key];
      }
      return crypto.createHmac('sha1', secret).update(query).digest('base64');
    }
    
    function request(api, params, accessKeySecret) {
      let accessKeyId = 'your_access_key_id';
      let version = '2018-01-20';
      let format = 'JSON';
      let signatureMethod = 'HMAC-SHA1';
      let signatureVersion = '1.0';
      let timestamp = new Date().toISOString().replace(/\..+/, '') + 'Z';
    
      let query = {
        AccessKeyId: accessKeyId,
        Action: api,
        Format: format,
        SignatureMethod: signatureMethod,
        SignatureNonce: Math.random().toString(36).substr(2),
        SignatureVersion: signatureVersion,
        Timestamp: timestamp,
        Version: version,
      };
    
      Object.assign(query, params);
    
      query.Signature = sign(query, accessKeySecret);
    
      let url = 'https://iot.aliyuncs.com/?' + querystring.stringify(query);
    
      return new Promise((resolve, reject) => {
        wx.request({
          url: url,
          success: (res) => {
            resolve(res.data);
          },
          fail: (err) => {
            reject(err);
          },
        });
      });
    }
    

    其中,sign函数用于计算签名,request函数用于发送请求。在使用时,只需要将apiparamsaccessKeySecret替换成对应的值即可。

    另外,您在使用npm版本的@alicloud/openapi-client时遇到的错误可能是由于缺少一些依赖项或者配置不正确导致的。建议您检查一下依赖项和配置是否正确,或者尝试重新安装一下依赖。

    2023-06-27 08:57:38
    赞同 1 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,针对你的问题,可以按照以下步骤操作:

    1.首先,在阿里云官网控制台中为您的账号下的物联网设备创建一个订阅消息主题,并将相应的订阅者添加到该主题下。

    2.然后,您需要在您的小程序代码中使用JavaScript调用阿里云OpenAPI。您可以使用官方提供的@alicloud/openapi-client SDK来实现这一点。您可以在微信开发者工具中安装并使用该SDK。

    3.在使用SDK调用OpenAPI之前,您需要获取您的阿里云账号AccessKey和AccessKeySecret。在代码中,您可以使用以下代码来获取这些凭证:

    const credential = new Credential({ accessKeyId: '', accessKeySecret: '', });

    4.接下来,您需要在代码中构造请求。您需要提供完整的请求URL、请求参数和请求头。您可以使用以下代码来构建请求:

    const client = new Client({ accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, });

    const request = new Request('', 'POST', { 'content-type': 'application/json', });

    request.setBody({ // 请求参数 });

    const response = await client.sendRequest(request);

    5.最后,您需要将请求发送到阿里云OpenAPI,并处理返回结果。您可以使用以下代码来处理响应:

    if (response.isSuccess()) { const result = response.body; // 处理返回结果 } else { const error = response.error; console.error('Error:', error.message); }

    2023-06-27 08:57:38
    赞同 展开评论 打赏
滑动查看更多

物联网领域前沿技术分享与交流

相关产品

  • 物联网平台
  • 相关电子书

    更多
    微信月活9亿的高效业务运维之道 立即下载
    微信SQLite数据库损坏恢复实践 立即下载
    最大化阿里云OpenAPI能力的方法和实践 立即下载