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,
shadeClose: true,
shade: 0.8,
area: ['500px', '600px'],
content:url
});
}
三、qrcode.html中的JS代码 /获取qrcode/ function getQrcode() {
var postjson = {};
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; } }
}
七、用户微信和报警主机之间的交互
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; } }
private void event_cont_SCAN(XmlNode root, HttpContext context) {
string eventKey = "qrcodeP." + root.SelectNodes("EventKey")[0].InnerText.Trim();
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); }
} catch { } finally { if (client != null) { client.Dispose(); } } }
private void event_cont_SCAN_new(XmlNode root, HttpContext context) { 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;
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; }
} catch { } finally { if (client != null) { client.Dispose(); } } }
private void event_cont_SCAN_register(RedisClient redis_client, JObject jsoncmd,XmlNode root, HttpContext context) { string user_appID = root.SelectNodes("FromUserName")[0].InnerText.Trim(); string mine_appID = root.SelectNodes("ToUserName")[0].InnerText.Trim();
string dataKey = "qrcode." + root.SelectNodes("EventKey")[0].InnerText.Trim().Replace("qrscene_", "");
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== 至此,电梯微信报警流程大致介绍完毕了。
|