ホームページ > バックエンド開発 > PHPチュートリアル > PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル

PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル

WBOY
リリース: 2016-07-13 10:36:23
オリジナル
882 人が閲覧しました

【PHP WeChatパブリックプラットフォーム開発シリーズ】

01. WeChatインターフェースを設定する
02. パブリックプラットフォームのサンプルコード解析
03. サブスクリプションイベント(subscribe)処理
04. 簡易返信機能の開発
05.API天気予報機能開発


この記事のURL: http://www.phpchina.com/archives/view-43387-1.html
このシリーズは、PHPChina の特別招待著者である @David_Tang によって寄稿されたものです。転載する場合は、著者の情報とこの記事のアドレスを明記してください。

1. はじめに

前回までの記事では、PHP WeChatパブリックプラットフォームの開設と簡単な使い方を簡単に紹介しましたが、天気の問い合わせ、バスの問い合わせ、速達の問い合わせなど、実際に使用する上で問題となる内容はありませんでした。次のいくつかの記事では、読者の参考のために、実際の生活でよく使用されるいくつかの関数を開発して説明します。

この記事では、誰もが毎日気になる天気クエリを開発します。たとえば、ユーザーが「蘇州の天気」というメッセージを送信すると、蘇州のリアルタイムの天気と今後 2 日間の天気が返されます。あるいは次の5日間でも。

2. アイデア分析

まず、ユーザーが送信したメッセージを判断して、メッセージに「天気」キーワードが含まれているかどうかを判断する必要があります。含まれている場合は、引き続き地域情報を抽出し、中国気象ネットワーク (http://) を使用する必要があります。 www.weather.com.cn ) は、関連分野の天気クエリ用のオープン API を提供します。

3. キーワード判定と地域読み取り

ユーザーが天気を確認するために送信するメッセージの形式は「地域 + 天気」というように固定されているため、最初に最後の 2 つの単語を切り取って「天気」キーワードであるかどうかを判断します。

PHP 関数 mb_substr() を使用してインターセプトします。この関数の使用方法については、次のとおりです。

リーリー PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル $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() 関数を呼び出してクエリを実行します

ここで呼び出しているのは、中国国家気象局が提供する天気予報 API インターフェイスです。インターフェイスのアドレスは http://m.weather.com.cn/data/101190401.html です。

URL 内の番号は都市番号 101190401 (蘇州) を指します。その他の都市の対応については以下で説明します。

このインターフェースによって返される情報は比較的包括的で、形式は次のとおりです。

リーリー

PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル JSONを解析することで該当都市の気象データを取得できます。 PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル

Weather() 関数は次のとおりです:

リーリー

PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル 都市対応ファイルweather_cityId.phpが以下の形式でここに含まれています: PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル リーリー

受信した都市名に従って都市コードが取得され、それが空でない場合は、China Weather Network の API が呼び出されてクエリが実行され、json 形式のデータが返され、データが解析されて返されます。が空の場合は、null 値が返されます。

5. 返信メッセージのフォーマットを整理する

返されたデータが空かどうかを確認します。空の場合は、$contentStr = """.$str_key."" の天気情報が見つかりませんでした!";

返されたデータが空でない場合:

リーリー

説明:

$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チュートリアル
<?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, &#39;SimpleXMLElement&#39;, 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 == &#39;天气&#39; && !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;
        }
    }
}

?>
ログイン後にコピー
PHP WeChatパブリックプラットフォーム開発 - 天気予報機能開発_PHPチュートリアル

关于城市对应关系文件 weather_cityId.php,目前更新到了2564个城市,以后还会继续增加,请到 乐思乐享 官方论坛(URL:http://www.joythink.net/)下载吧。
 



=========================================================

PHPChina微信平台开通啦!

微信搜索“PHPChina”,点击关注按钮,即可获得PPC为您推送的最新最专业的业界信息,更有更多专题栏目为您献上

【PPC挖掘】: 不定时为您献上经典产品与产品人的故事。
【PPC外文】: 不定时分享一篇外文翻译文章
【PPC问答】: 每日集中回复关注用户的提问
【Coder Radio Pro】:不定期广播节目

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/739144.htmlTechArticle【PHP微信公众平台开发系列】 01.配置微信接口 02.公众平台示例代码分析 03.订阅事件(subscribe)处理 04.简单回复功能开发 05.API天气预报功...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート