最近我们公司终于认识到微信的重要性,申请了公众平台,没事干,然后想着能不能开发一下微信的后台,据说微信后台开发一般使用微信+新浪Sae模式,那就是用这个模式把。
第一步当然是申请sae了网址 http://sae.sina.com.cn/
第二步开启微信公众平台开发者模式,验证token和url通过,就能使用远程服务器了。
第三步用php编写代码
<?php
/**
* @author wang zhanliang.
*/
// define your token
define ( "TOKEN", "weixin" );
$wechatObj = new wechatCallbackapiTest ();
$wechatObj->responseMsg ();
class wechatCallbackapiTest {
public function responseMsg() {
// get post data, May be due to the different environments
$postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
date_default_timezone_set("Asia/Hong_Kong");
// extract post data
if (! empty ( $postStr )) {
$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim ( $postObj->Content );
$time = time ();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$picTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
<FuncFlag>1</FuncFlag>
</xml> ";
if (trim ( $postObj->MsgType ) == "event" and trim ( $postObj->Event ) == "subscribe") {
$msgType = "news";
$title = "欢迎";
$data = date ( 'Y-m-d' );
$desription = "感谢您关注【步青科技】" . "\n" . "步青科技为您提供完美的建筑监测与室内环境治理方案。" . "\n" . "本订阅号功能如下:" . "\n" . "【1】居室我知道" . "\n" . "【2】建筑我知道" . "\n" . "【3】今日环境 输入:如:郑州环境" . "\n" . "【4】优惠活动" . "\n" . "【5】关注我们" . "\n" . "【6】联系我们" . "\n" . "【7】了解更多" . "\n";
$image = "http://h.hiphotos.bdimg.com/album/s%3D1600%3Bq%3D90/sign=406a9d51d300baa1be2c43bd77208263/0b46f21fbe096b6329730eed0e338744ebf8ac21.jpg";
$turl = "http://siteapp.baidu.com/webapp/www.shbq.com?host=www.shbq.com";
$resultStr = sprintf ( $picTpl, $fromUsername, $toUsername, $time, $msgType, $title, $desription, $image, $turl );
echo $resultStr;
}else if (! empty ( $keyword )) {
$msgType = "text";
$kv = new SaeKV();
// 初始化KVClient对象
$ret = $kv->init();
//天气
$str = mb_substr($keyword,-2,2,"UTF-8");
$str_key = mb_substr($keyword,0,-2,"UTF-8");
if($str == '环境' && !empty($str_key)){
$xml_uri = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName='.$str_key;
$dom = simplexml_load_file($xml_uri);
$str ="";
foreach($dom as $k=>$v)
{
$str .= $v."||";
}
$strs = explode("||", $str);
if(empty($strs[1])){
$contentStr = "抱歉,没有查到\"".$str_key."\"的环境信息!";
} else {
$ret = $kv->get($str_key)->time_point;
$time2 = strtotime(substr( $ret,0,10)." ".substr( $ret,11,8)) ;
$time1 = strtotime(date( "Y-m-d H:i:s"));
$sub1 = ceil(($time2 - $time1) / 3600); //60 * 60
if($sub<-1){
//更新数据
$urlpm = "http://www.pm25.in/api/querys/aqi_ranking.json?token=XXXXXXXXXX";
$weather = file_get_contents ( $urlpm);
$weatherJsonpm = json_decode($weather);
foreach ( $weatherJsonpm as $key ) {
$ret = $kv->set($key->area, $key);
}
}
// 获得key-value
$ret = $kv->get($str_key);
$contentStr = "【".$ret->area."天气及空气质量预报】\n".
$strs[6]."\n".
$strs[10]."\n".
"AQI指数:".$ret->aqi."\n".
"空气质量:".$ret->quality."\n".
"等级:".$ret->level."\n".
"首要污染物:".$ret->primary_pollutant."\n".
"一氧化碳CO:".$ret->co."(mg/m3)"."\n".
"二氧化氮NO2:". $ret->no2."(μg/m3)"."\n".
"二氧化硫SO2:".$ret->so2."(μg/m3)"."\n".
"臭氧O3:".$ret->o3."(μg/m3)"."\n".
"PM10:".$ret->pm10."(μg/m3)"."\n".
"PM2.5:".$ret->pm2_5."(μg/m3)"."\n".
"-------"."\n".
"天气数据". $strs[4]."时发布,数据有中国天气网提供(感谢WeatherWebService无偿提供api).\n".
"空气质量数据".$ret->time_point."时发布,数据有中国环保局提供(感谢PM25.in无偿提供api).";
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
}
} else {
echo "input something";
exit ();
}
}
}
?>
define ( "TOKEN", "weixin" );就是与微信建立连接的token,一定要一致。
由于需要有天气和环境的数据,所以需要调用第三方的api
天气数据是 使用传说中的http://m.weather.com.cn/data/101010100.html,坑爹的是有一天我突然发现数据不更新了,百度了一下才知道原来是这个api暂停了免费服务了,很无语。。。既然不能用就用其他的api吧,找了一下最终决定使用http://www.webxml.com.cn/WebServices/WeatherWebService.asmx提供的免费api,楼主好人啊,可是这个api是xml格式的,所以在接收到的数据需要
$xml_uri = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName='.$str_key;
$dom = simplexml_load_file($xml_uri); //获得城市的xml文件
$str ="";
$v."||";//
foreach($dom as $k=>$v)
{
$str .
=把xml形式的文件转化为字符串,且每个item以||符号分割?这是为嘛?为了方便的将字符串转为数组,方面后面的读取
}
}
$strs = explode("||", $str);//嘻嘻
$strs[n]读item的值,好了天气数据已经得到啦
那么怎么得到环境质量数据呢?提供环境质量数据的公司少之又少啊,更何况是免费的api,找了很久终于找到一个免费提供环境质量api的组织了,http://www.pm25.in/,楼主好人呐。不过要使用免费api的话需要先申请token,申请很快,得到token不要急着调用api,因为考虑到服务器的工作压力,调用api的次数是有限制的。那怎么办呢?执手相看泪眼竟无语凝噎...
哈哈,真好,pm2.5.in.提供的api返回格式是json,而sae提供了一个就KVDB的数据库,据说这个数据库是mongodb的一个变种,而mongodb最大的特色就是保存数据格式是json,查询结果也是json返回。这不正好。。。使用KVDB做缓存数据。
这样就解决了多次调用api限制的问题了。
好了,看下结果吧。