分享

电梯微信报警

 studydoer 2019-12-16

function bdwchart(user_id){

    var obj_name = $("#txt_name_" + user_id);

    var obj_wchart = $("#txt_wx_" + user_id);

    var name = trimStr(obj_name.val());

    if(name==null || name.length<=0x00){ layer.tips("姓名为空","#txtname" + user_id); return; }

    var url = 'qrcode.html?txt=txt_wx_' + user_id + '&uid=' + user_id;

    layer.open({

    type:2,

    title"微信绑定-" + name,

    shadeClosetrue,

    shade0.8,

    area: ['500px''600px'],

    content:url

    });

 }

三、qrcode.html中的JS代码

/获取qrcode/

function getQrcode() {

   var postjson = {};

//uid是父页面传过来的键值对中的键

   var uid = getQueryString("uid");

    //获取父页面中的用户名,对应图一

       var name = $("#txt_name_"+uid, window.parent.document).val();

       postjson.display = 1;

       postjson.name = encodeURI(name);

    //在此写入你要提交的数据

   $.post(

      "cgi-bin/qrcode.cgi",

       JSON.stringify(postjson),

       function (data, status{

       if (status != "success") { alert("连接服务器失败"); return;}              var temp = eval('(' + data + ')')

          if (parseInt(temp.error) != 0) { alert(temp.data);return; }

    //在此写入你要处理的操作

          $("#img_qrcode").attr("src","https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + temp.data);-->二维码对应的ticket

            $("#hd_addr").val(temp.addr);--->qrcode.hhmmssfff

            getCherk();

            getTimeout();

   });

}

四、获取微信用户的APPID

function getCherk() {

   var postjson = {};   postjson.display = 2;

   postjson.data = $("#hd_addr").val();



//在此写入你要提交的数据

   $.post(

       "cgi-bin/qrcode.cgi",

       JSON.stringify(postjson),


       function (data, status{

      if (status != "success") { alert("连接服务器失败");return; }        var temp = eval('(' + data + ')')

      if (parseInt(temp.error) != 0) { alert(temp.data); return; }

//在此写入你要处理的操作

      if (temp.data != "") {

$("#" + getQueryString("txt"),window.parent.document).val(temp.data);

      window.parent.layer.closeAll();

      return;

  }

  setTimeout("getCherk()"1000);

});

}

var timeout = 120;

function getTimeout() {

    $("#dv_time").html("倒计时:" + timeout);

    if (timeout <= 0) {

       window.parent.layer.closeAll();

       return;

    }

    timeout--;

    setTimeout("getTimeout()"1000);

}

五、qrcode.cgi代码

/获取二维码/

void cmd_getOrcode_img(Json::Value &_jsonData){
/*参数校验*/
    if(_jsonData["name"].isNull() || _jsonData["name"].asString().size()<=0x00){ err_msg("上传数据有误"); return; }
/*组装消息*/
    string cid = "";
    if(get_devCid(cid)){ err_msg("读取本地设备信息失败,请稍后再试,或者重新启动报警主机"); return; }
    _jsonData["display"] = "1";
    _jsonData["dev_snum"] = cid;

/*发送信息*/
    Json::FastWriter fast_writer;
    string post_bodyStr = fast_writer.write(_jsonData);

    string recv_bodyStr = "";
    CHttpClient httpClient;
    if(int err = httpClient.Post(string(QRCODE_SERVER_ADDR), (const string)post_bodyStr, recv_bodyStr)){
        ostringstream ostr; ostr.str("");
        ostr<< "连接云服务器失败[" << err << "]";
        err_msg(ostr.str().c_str()); return;
    }

    cout<<"Content-type:text/html\r\n\r\n";
    cout<< recv_bodyStr.c_str() << endl;
}

/获取用户/

void cmd_getWchart_userAppId(Json::Value &_jsonData){
/*参数校验*/
if(_jsonData["data"].isNull() || _jsonData["data"].asString().size()<=0x00){ err_msg("上传数据有误"); return; }

/*组装消息*/
string cid = "";
if(get_devCid(cid)){ err_msg("读取本地设备信息失败,请稍后再试,或者重新启动报警主机"); return; }

_jsonData["display"] = "2";
_jsonData["dev_snum"] = cid;

/*发送信息*/
Json::FastWriter fast_writer;
string post_bodyStr = fast_writer.write(_jsonData);

string recv_bodyStr = "";
CHttpClient httpClient;
if(int err = httpClient.Post(string(QRCODE_SERVER_ADDR), (const string)post_bodyStr, recv_bodyStr)){
ostringstream ostr; ostr.str("");
ostr<< "连接云服务器失败[" << err << "]";
err_msg(ostr.str().c_str()); return;
}

cout<<"Content-type:text/html\r\n\r\n";
cout<< recv_bodyStr.c_str() << endl;
}

==二维码显示到前端,待用户扫描后,在私有服务器上会存储APPID到redis中,在此过程中前端会每秒中都会获取一次APPID,直到获取到==

++以上是报警主机向私有服务器请求二维码和APPID,然后私有服务器再向微信服务器请求++

++QRCODE_SERVER_ADDR是私有服务器的地址++

六、私有服务器向微信服务器请求二维码等交互过程

private string create_qrcode(JObject _jsonData{
        JObject error_msg = new JObject();
        error_msg["error"] = 0;
        error_msg["data"] = "";

        /*生成唯一码*/
        string snumStr = null//唯一序列号
        string redis_key = null//键值名称
        string redis_keyValue = null//键值指向的内容

        Random rn = new Random();
        snumStr = rn.Next(999).ToString();
        switch (snumStr.Length) {
            case 1: snumStr = "00" + snumStr; break;
            case 2: snumStr = "0" + snumStr; break;
            case 3: snumStr = "" + snumStr; break;
        }

        redis_key = System.DateTime.Now.ToString("hhmmssfff");
        redis_key = long.Parse(redis_key).ToString();

        RedisClient client = null;
        try
        {
            /*设置相应缓存*/
            client = new RedisClient(wchartCfg.REDIS_SERVER_IP, wchartCfg.REDIS_SERVER_PORT);
            redis_keyValue = "{'event_id':'10', 'data':'" + _jsonData["dev_snum"].ToString() + "', 'name':'"+ _jsonData["name"].ToString() +"'}";

            client.Set("qrcodeP." + redis_key, redis_keyValue);--->电梯宝服务器将报警主机传过来的设备ID和姓名存入redis
            client.Expire("qrcodeP." + redis_key, wchartCfg.REDIS_QRKEY_TIMEOUT);

            client.Set("qrcode." + redis_key, "");-->
            client.Expire("qrcode." + redis_key, wchartCfg.REDIS_QRKEY_TIMEOUT);

            /*向微信申请二维码*/
            JObject qrCode = new wchartService().getQrcode(wchartCfg.WCHART_QRKEY_TIMEOUT, redis_key);
            if (qrCode == null) { error_msg["error"] = 404; error_msg["data"] = "获取二维码失败!!!"; }
            else {
                error_msg["data"] = qrCode["ticket"].ToString().Trim();
                error_msg["addr"] = "qrcode." + redis_key;
            }
        }
        catch(Exception ex) {
            error_msg["error"] = 409;
            error_msg["data"] = ex.Message;
        }
        finally {
            if (client != null) client.Dispose();
        }

        return error_msg.ToString();
    }
private string get_userAppID(JObject _jsonData{
        JObject error_msg = new JObject();
        error_msg["error"] = 0;
        error_msg["data"] = "";

        RedisClient client = null;
        try {
            client = new RedisClient(wchartCfg.REDIS_SERVER_IP, wchartCfg.REDIS_SERVER_PORT);
            string dataKey = _jsonData["data"].ToString().Trim();

            string appID = "";
            appID = client.Get<string>(dataKey);

            error_msg["data"] = (appID.Length>0 ? appID : "");
        } catch (Exception ex) {
            error_msg["error"] = 409;
            error_msg["data"] = ex.Message;
        } finally { if (client != null) client.Dispose(); }

        return error_msg.ToString();
    }


    public bool IsReusable {
        get {
            return false;
        }
    }

}

七、用户微信和报警主机之间的交互

 /*事件处理-Event*/

    private void event_cont(XmlNode root, HttpContext context{
        string eventStr = root.SelectNodes("Event")[0].InnerText;

        /*带参数的二维码*/
        if (eventStr == "SCAN") { event_cont_SCAN(root, context); return; } //用户已经关注了公众号,进行二维码扫描
        if (eventStr == "subscribe") { event_cont_SCAN_new(root, context); return; } //用户未关注公众号,进行二维码扫描
    }

    /*
        函数名称:event_cont_SCAN
        函数功能:用户扫描了带参数的二维码处理事件
        传入参数:
                    XmlNode root 微信服务器发送的xml数据的根节点
                    HttpContext context 提交内容
        传出数据:无
        注意事项:此时用户已经关注了公众号
    */

    private void event_cont_SCAN(XmlNode root, HttpContext context{

        /*其它程序在创建二维码时,会向指定redis写入配置信息*/
        string eventKey = "qrcodeP." + root.SelectNodes("EventKey")[0].InnerText.Trim();

        /*读取redis中的配置信息*/
        RedisClient client = null;
        try {
            client = new RedisClient(redis.RedisServer_Ip, redis.RedisServer_Port);
            JObject jsoncmd = (JObject)JsonConvert.DeserializeObject(client.Get<string>(eventKey));

            switch (int.Parse(jsoncmd["event_id"].ToString())) {
                case 10:
                event_cont_SCAN_register(client, jsoncmd, root, context); //用户微信关联-ES1000服务器
           }

        } catch { } finally {
            if (client != null) { client.Dispose(); }
        }
    }

    /*
        函数名称:event_cont_SCAN_new
        函数功能:用户扫描了带参数的二维码处理事件
        传入参数:
                    XmlNode root 微信服务器发送的xml数据的根节点
                    HttpContext context 提交内容
        传出数据:无
        注意事项:此时用户未关注公众号
    */

    private void event_cont_SCAN_new(XmlNode root, HttpContext context{
        /*其它程序在创建二维码时,会向指定redis写入配置信息*/
        string eventKey = null;
        try {
            eventKey = root.SelectNodes("EventKey")[0].InnerText.Trim().Replace("qrscene_""");
        } catch { eventKey = null; }
        if (eventKey == null || eventKey.Length <= 0) { return; } //用户订阅或者取消订阅,不做处理

        eventKey = "qrcodeP." + eventKey;

        /*读取redis中的配置信息*/
        RedisClient client = null;
        try {
            client = new RedisClient(redis.RedisServer_Ip, redis.RedisServer_Port);
            JObject jsoncmd = (JObject)JsonConvert.DeserializeObject(client.Get<string>(eventKey));

            switch (int.Parse(jsoncmd["event_id"].ToString())) {
                case 10: event_cont_SCAN_register(client, jsoncmd, root, context); break//用户微信关联-ES1000服务器
            }

        } catch { } finally {
            if (client != null) { client.Dispose(); }
        }
    }

    /*
        函数名称:event_cont_SCAN_register
        函数功能:用户关联注册微信,将微信与某个设备关联使用
        传入参数:
                    RedisClient redis_client微信客户端
                    JObject jsoncmd 存储指令的json数据
                    XmlNode root 微信服务器发送的xml数据的根节点
                    HttpContext context 提交内容
        传出数据:无
                    jsoncmd->{"event_id":"10", "data":"设备硬件序列号"}
    */

    private void event_cont_SCAN_register(RedisClient redis_client, JObject jsoncmd,XmlNode root, HttpContext context{
        /*获取发送用户的appID*/
        string user_appID = root.SelectNodes("FromUserName")[0].InnerText.Trim();
        string mine_appID = root.SelectNodes("ToUserName")[0].InnerText.Trim();

        /*获取数据填写dataKey*/
        string dataKey = "qrcode." + root.SelectNodes("EventKey")[0].InnerText.Trim().Replace("qrscene_""");

        /*将注册用户的微信appID写入redis*/
        redis_client.Set(dataKey, user_appID);

        /*给客户发送消息*/
        respose_sendMsg(
            context,
            user_appID,
            mine_appID,

            "您已经与以下设备进行了关联\n" +
            "关联姓名:" + jsoncmd["name"].ToString() + "\n" +
            "报警主机:" + jsoncmd["data"].ToString() + "\n" +
            "如果报警主机未显示您的关联信息,请重新进行关联"
        );
    }
}

==用户扫二维码之后,微信服务器会给恩易私有服务器发送数据。数据包含了hhmmssfff和数据来源appid和数据去向appid==

至此,电梯微信报警流程大致介绍完毕了。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多