简介

本Demo演示了HAM部分API的使用方法,包括有点对点消息、发布订阅主题消息、群消息等功能。完整示例程序到 开发示例 下载

 

应用实例

 

1. 注册用户UID

  • 默认情况下,用户申请到appkey和secretkey是没有UID的,用户需要调用API接口注册生成第一个用户UID。
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body = {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/ham_add_user',
        data: {
            appkey: "4cdad356-85b4-008627",
            secretkey: "c7147f6fea0daf6cbd36ed65b037b4c9",
            username: "test",
            nickname: "test"
        }
    }

    /**
    以下是公共代码,之后每个接口的HTTP请求发送的代码编写都一样
    **/
    var post_data = JSON.stringify(body.data);
    var options = {
        hostname:body.ham_host,
        port:body.ham_port,
        method: "POST",
        path:body.ham_path,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': Buffer.byteLength(post_data)
        }
    };

    var req = http.request(options, function(res) {
        console.log(`STATUS: ${res.statusCode}`);
        console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
        res.setEncoding('utf8');
        res.on('data', function (chunk){
            console.log(`BODY: ${chunk}`);
            //callback(chunk);
        });

        res.on('end', function() {
            console.log('No more data in response.');
            //callback('No more data in response.');
        });
    });

    req.on('error', function(e) {
        console.log(`problem with request: ${e.message}`);
        //callback(`problem with request: ${e.message}`);
    });

    // write data to request body
    req.write(post_data);
    req.end();

 

2. SetConfig

  • 使用HAM的用户必须有SetConfig调用才可以之后的API操作
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body = {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/set_config',
        data: {
            appkey: "4cdad356-85b4-008627",
            secretkey: "c7147f6fea0daf6cbd36ed65b037b4c9",
            url:"http://192.168.199.137:3001/post",
            //url:"https://192.168.199.224:3002/post",
            uid:"Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iL1rm",
            token:"test_token"//用户自己随便定义的字符串
        }
    }

    /**
    以下是公共代码,之后每个接口的HTTP请求发送的代码编写都一样
    **/
    var post_data = JSON.stringify(body.data);
    var options = {
        hostname:body.ham_host,
        port:body.ham_port,
        method: "POST",
        path:body.ham_path,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': Buffer.byteLength(post_data)
        }
    };

    var req = http.request(options, function(res) {
        console.log(`STATUS: ${res.statusCode}`);
        console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
        res.setEncoding('utf8');
        res.on('data', function (chunk){
            console.log(`BODY: ${chunk}`);
            //callback(chunk);
        });

        res.on('end', function() {
            console.log('No more data in response.');
            //callback('No more data in response.');
        });
    });

    req.on('error', function(e) {
        console.log(`problem with request: ${e.message}`);
        //callback(`problem with request: ${e.message}`);
    });

    // write data to request body
    req.write(post_data);
    req.end();
  • SetConfig接口被调用时,HAM收到请求后会以HTTP的GET方法回调用户传给HAM的URL地址,当用户URL被回调时需要作出如下响应。看以下示例:
    /**
    以下是NodeJS示例代码
    **/
    app.get('/post',function(req, res) {
        console.log(req.query);

        //token是SetConfig时用户自定义的字符串(上面例子是"test_token")
        var token = "test_token";
        //字符按照大小写排序后,再MD5;
        var str = token+req.query.timestamp+req.query.echostr;
        var strArray = str.split(''); //按字符分割为字符数组
        strArray.sort();//字符数组由小到大排序
        //数组转成字符串,再MD5加密
        var strMd5 = md5(strArray.toString().replace(/,/g,''));

        console.log(strMd5);
        //signature和strMd5相同则把echostr回复给HAM,否则回复其他数据。
        //当HAM收到echostr后,SetConfig才算调用成功,否则出错。
        if(strMd5 == req.query.signature){
            res.writeHead(200, {'Content-Type': 'application/x-www-form-urlencoded'});
            res.end(req.query.echostr);
        }
        else {
            res.writeHead(401, {'Content-Type': 'application/x-www-form-urlencoded'});
            res.end('Error!');
        }
    });

 

3. 获取AccessToken

  • SetConfig成功后,接下来就可以获取AccessToken了,AccessToken默认有效时间是7200秒。
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body = {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/get_access_token',
        data: {
            appkey: "4cdad356-85b4-008627",
            secretkey: "c7147f6fea0daf6cbd36ed65b037b4c9",
            url:"http://192.168.199.137:3001/post",
            //url:"https://192.168.199.224:3002/post",
            uid:"Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iL1rm",
            token:"test_token"//用户自己随便定义的字符串
        }
    }
    /**
    发HTTP请求的代码省略,请参考第一和第二节的HTTP请求部分
    **/

 

4. 点对点消息收发

  • SetConfig和获取AccessToken成功后用户可调用send_msg接口进行点对点消息发送。看以下示例:
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body =  {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/send_msg?access_token='+ access_token, //access_token是上面接口获得的AccessToken
        data: {
            send_uid: "Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iL1rm",
            accept_uid : "Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iIkla",
            msg_type: 1, //1 文本消息,2 文件消息
            content: $.base64.btoa("你好")  //根据HAM协议消息内容发送前要Base64编码处理
        }
    }
    /**
    发HTTP请求的代码省略,请参考第一和第二节的HTTP请求部分
    **/

 

5. 订阅主题

  • SetConfig和获取AccessToken成功后用户可调用ham_topic接口订阅主题。看以下示例:
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body =  {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/ham_topic?access_token='+ access_token, //access_token是上面接口获得的AccessToken
        data: {
            send_uid: "Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iL1rm",
            action_type: 1,
            subject: "test_topic",
            qos: 0,
            type: 1
        }
    }
    /**
    发HTTP请求的代码省略,请参考第一和第二节的HTTP请求部分
    **/

 

6. 发布主题

  • SetConfig和获取AccessToken成功后用户可调用ham_topic接口发布主题。看以下示例:
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body =  {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/ham_topic?access_token='+ access_token, //access_token是上面接口获得的AccessToken
        data: {
            send_uid: "Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iL1rm",
            action_type: 1,
            subject: "test_topic",
            content: $.base64.btoa("你好")  //根据HAM协议消息内容发送前要Base64编码处理
        }
    }
    /**
    发HTTP请求的代码省略,请参考第一和第二节的HTTP请求部分
    **/

 

7. 发送群消息

  • SetConfig和获取AccessToken成功后用户可调用send_msg接口发送群消息。看以下示例:
    /**
    以下是NodeJS示例代码
    **/
    var http = require('http');
    var body =  {
        ham_host: "hs.kaifakuai.com",
        ham_port: 8184,
        ham_path: '/send_msg?access_token='+ access_token, //access_token是上面接口获得的AccessToken
        data: {
            send_uid: "Fc5wGsTuvuiuFaFaHmTifeDgVQ9Z5iL1rm",
            group_id: "c3324776-8359-299262",
            msg_type: 3, //1 文本消息,2 文件消息, 3 群消息
            content: $.base64.btoa("你好")  //根据HAM协议消息内容发送前要Base64编码处理
        }
    }
    /**
    发HTTP请求的代码省略,请参考第一和第二节的HTTP请求部分
    **/

 

8. 其他接口