前回までの記事では、PHP WeChatパブリックプラットフォームの開設と簡単な使い方を簡単に紹介しましたが、天気の問い合わせ、バスの問い合わせ、速達の問い合わせなど、実際に使用する上で問題となる内容はありませんでした。次のいくつかの記事では、読者の参考のために、実際の生活でよく使用されるいくつかの関数を開発して説明します。
この記事では、誰もが毎日気になる天気クエリを開発します。たとえば、ユーザーが「蘇州の天気」というメッセージを送信すると、蘇州のリアルタイムの天気と今後 2 日間の天気が返されます。あるいは次の5日間でも。
まず、ユーザーが送信したメッセージを判断して、メッセージに「天気」キーワードが含まれているかどうかを判断する必要があります。含まれている場合は、引き続き地域情報を抽出し、中国気象ネットワーク (http://) を使用する必要があります。 www.weather.com.cn ) は、関連分野の天気クエリ用のオープン API を提供します。
ユーザーが天気を確認するために送信するメッセージの形式は「地域 + 天気」というように固定されているため、最初に最後の 2 つの単語を切り取って「天気」キーワードであるかどうかを判断します。
PHP 関数 mb_substr() を使用してインターセプトします。この関数の使用方法については、次のとおりです。
リーリー $str = mb_substr($keyword,-2,2,"UTF-8");メッセージの末尾から 2 番目の文字のインターセプトを開始し、2 文字をインターセプトして、それが「weather」キーワードであるかどうかを判断します。
次に、領域抽出には、引き続き mb_substr() 関数を使用します。
$str_key = mb_substr($keyword,0,-2,"UTF-8");
メッセージの先頭から開始し、最後の 2 文字 (天気) を切り詰めて地域キーワードを取得します。
次に、判断を行ってから、天気データをクエリする関数を呼び出します。
リーリー
4. Weather() 関数を呼び出してクエリを実行しますURL 内の番号は都市番号 101190401 (蘇州) を指します。その他の都市の対応については以下で説明します。
このインターフェースによって返される情報は比較的包括的で、形式は次のとおりです。
リーリー
JSONを解析することで該当都市の気象データを取得できます。Weather() 関数は次のとおりです:
リーリー
都市対応ファイルweather_cityId.phpが以下の形式でここに含まれています: リーリー受信した都市名に従って都市コードが取得され、それが空でない場合は、China Weather Network の API が呼び出されてクエリが実行され、json 形式のデータが返され、データが解析されて返されます。が空の場合は、null 値が返されます。
5. 返信メッセージのフォーマットを整理する
返されたデータが空でない場合:
リーリー説明:
$data->weatherinfo->city //都市名を取得します、ここは蘇州です
$data->weatherinfo->date_y //日付を取得します。これは 2013 年 7 月 9 日です
$data->weatherinfo->fchh //データ公開時間
$data->weatherinfo->weather1 //リアルタイム天気
$data->weatherinfo->temp1 //リアルタイムの気温
$data->weatherinfo->wind1 //リアルタイムの風向と風速
$data->weatherinfo->index_d //ウェアリングインデックス
Weather2、temp2、wind2はそれぞれ明日の天気、気温、風向風速などを表します。
n //改行を示します
6. テスト
<?php /** * wechat php test */ //define your token define("TOKEN", "zhuojin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); //$wechatObj->valid(); class wechatCallbackapiTest { /*public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } }*/ public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); switch($RX_TYPE) { case "text": $resultStr = $this->handleText($postObj); break; case "event": $resultStr = $this->handleEvent($postObj); break; default: $resultStr = "Unknow msg type: ".$RX_TYPE; break; } echo $resultStr; }else { echo ""; exit; } } public function handleText($postObj) { $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>"; if(!empty( $keyword )) { $msgType = "text"; //天气 $str = mb_substr($keyword,-2,2,"UTF-8"); $str_key = mb_substr($keyword,0,-2,"UTF-8"); if($str == '天气' && !empty($str_key)){ $data = $this->weather($str_key); if(empty($data->weatherinfo)){ $contentStr = "抱歉,没有查到\"".$str_key."\"的天气信息!"; } else { $contentStr = "【".$data->weatherinfo->city."天气预报】\n".$data->weatherinfo->date_y." ".$data->weatherinfo->fchh."时发布"."\n\n实时天气\n".$data->weatherinfo->weather1." ".$data->weatherinfo->temp1." ".$data->weatherinfo->wind1."\n\n温馨提示:".$data->weatherinfo->index_d."\n\n明天\n".$data->weatherinfo->weather2." ".$data->weatherinfo->temp2." ".$data->weatherinfo->wind2."\n\n后天\n".$data->weatherinfo->weather3." ".$data->weatherinfo->temp3." ".$data->weatherinfo->wind3; } } else { $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待..."; } $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."; } } public function handleEvent($object) { $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待..."; break; default : $contentStr = "Unknow Event: ".$object->Event; break; } $resultStr = $this->responseText($object, $contentStr); return $resultStr; } public function responseText($object, $content, $flag=0) { $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>%d</FuncFlag> </xml>"; $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag); return $resultStr; } private function weather($n){ include("weather_cityId.php"); $c_name=$weather_cityId[$n]; if(!empty($c_name)){ $json=file_get_contents("http://m.weather.com.cn/data/".$c_name.".html"); return json_decode($json); } else { return null; } } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
关于城市对应关系文件 weather_cityId.php,目前更新到了2564个城市,以后还会继续增加,请到 乐思乐享 官方论坛(URL:http://www.joythink.net/)下载吧。