公交卡余额就像卫生纸一样,看着挺多的。刷着刷着就见底了。为了防患于未然。做了这样一个方便查询的微信公众接口。 原理很简单。
就是通过访问深圳通公司提供的一个查询接口 http://121.15.13.49:8080/sztnet/qryCard.do?cardno= 来获取深圳通余额。得到的余额通过微信公众账号平台返回到用户的微信上
所以流程大概如下:
1. 用户发送深圳通卡号如 01234567 到微信公众号
2.腾讯微信服务器收到这个消息
3.微信服务器将这个消息进行封装后发送给公众号微信后台服务器,这个公众号微信后台服务器的地址是在微信公众账号平台开发者中心设置的。具体怎么做大家可以自行搜索一下微信公众账号开发的基础教程。
4.公众号微信后台服务器解包这条消息,得到要查询的深圳通卡号 01234567
5.通过php模拟访问 http://121.15.13.49:8080/sztnet/qryCard.do?cardno=01234567 这个地址。
6.解析查询结果,返回给腾讯微信服务器
7.由腾讯微信服务器给用户返回查询结果。
整个流程看上去好像很复杂。其实需要我们自己编码实现的只有4,5,6三个步骤
在公众号微信服务器收到命令后代码如下
<?php $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; require "query.php"; require "wechatinterface.php"; $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $GMsg["fromUsername"] = $postObj->FromUserName; $GMsg["toUsername"] = $postObj->ToUserName; $GMsg["CreateTime"] = $postObj->CreateTime; $GMsg["MsgType"] = $postObj->MsgType; if (!empty($postStr)) { $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $GMsg["fromUsername"] = $postObj->FromUserName; $GMsg["ToUserName"] = $postObj->ToUserName; $GMsg["CreateTime"] = $postObj->CreateTime; $GMsg["MsgType"] = $postObj->MsgType; switch ($GMsg["MsgType"]) { case "text": $GMsg["Content"] = $postObj->Content; $GMsg["MsgId"] = $postObj->MsgId; //echo '来自用户'.$postObj->FromUserName .'的消息:'. $GMsg['Content'].' ' . $GMsg['MsgId']; //查询用户的余额记录 $result = queryresult($GMsg['Content']); //echo "账户余额:".$result; //用户ID和关联的卡号存入记录 $msgtobesend = getSendMsg($result,$postObj->FromUserName,$postObj->ToUserName); echo $msgtobesend; break; } return $GMsg; } else { return ""; } ?>
这个Content内容就是发过来的卡号
得到卡号后执行 queryresult函数来得到结果 queryresult函数是核心的请求实现
function queryresult($carid){ $url = "http://121.15.13.49:8080/sztnet/qryCard.do?cardno=".$carid; $html = file_get_contents($url); if(preg_match_all('/\<tr><td bgcolor=\'#E4F2F3\'>(.*)<\/tr>/',$html,$match_result)) { //print_r($match_result); foreach($match_result as $result) { //echo "dd".$result; //var_dump($result); //print_r($result); $Balanceresult = $result[0]; break; } //提取卡号 preg_match_all('([1-9][0-9]{4,})',$Balanceresult,$carno); $car_no = $carno[0]; //var_dump($car_no); //提取卡内余额时间 //$patten = "/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))/"; $patten = "/([0-9]{4})-([0-9]{2})-([0-9]{2})\s([0-9]{2}):([0-9]{2}):([0-9]{2})/"; preg_match_all($patten,$Balanceresult,$resttime); $rest_time = $resttime[0]; //var_dump($rest); //提取金额 $patten = "/\d+\.\d+/"; preg_match_all($patten,$Balanceresult,$restcash); $rest_cash = $restcash[0]; $warning = "您的财富评级:"; $rest_cash_float = floatval($rest_cash[0]); //var_dump($rest_cash_float); //var_dump($rest_cash[0]); //$rest_cash_float = settype($rest_cash[0],"float"); //print $rest_cash_float; if($rest_cash_float < 20) { $warning = $warning."贫农。您的财富评级打败了5%的人,请尽快充值!"; } else if($rest_cash_float < 50 && $rest_cash_float >= 20) { $warning = $warning."中农。您的财富评级打败了30%的人,请留心余额变化!"; } else if($rest_cash_float < 100 && $rest_cash_float >= 50) { $warning = $warning."小康。您的财富评级打败了深圳50%的人,请留心余额变化!"; } else if($rest_cash_float < 150 && $rest_cash_float >= 100) { $warning = $warning."中产。您的财富评级打败了80%的人,暂无需担心余额!"; } else if( $rest_cash_float >= 100) { $warning = $warning."土豪。您的财富打败了90%的人,请放心刷卡!"; } // $return_str = "您的深圳通卡号: ".$car_no[0]." 截止到: ".$rest_time[0]." 还有人民币:".$rest_cash[0]."元 " .$warning; //var_dump($return_str); return $return_str; } else { return "查不到对应的信息!"; //var_dump("无匹配!"); } }
在queryresult函数中实现了查询结果的数据匹配和其他逻辑的操作。代码很简单。就不多说了。
最后是通过一个函数返回结果给腾讯微信服务器
function getSendMsg($str,$from,$to) { //$str = "发送到:".$to. " 发送方:".$from ."内容:". $str; $fromUsername = $from; $toUsername = $to; $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, "text",$str); return $resultStr; }
这个函数是用于将结果封装为微信信息格式。
整个流程比较简单。运行后的结果 ,这个账号是拿的同学的一个微信公众平台做的。大家也可以加关注看看效果。
/************************Witch_soya****************************/
/************************2015年1月20日****************************/