微信公众号用百度车联网API回复天气预报

1.申请百度地图开发平台访问应用(AK);
这里写图片描述
点创建应用
这里写图片描述
然后提交,AK就申请好了;

2.然后我们看下百度的车联网API中的天气查询,这是链接车联网API
这是API上面的接口实例http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=E4805d16520de693a3fe707cdc962045
点看链接我们可以看到返回结果;返回结果可以是xml,也可以是json,
默认的是xml,这里返回的是json格式;
【提示:在代码中城市名是需要urlencode(城市名)转换的
这里 北京 =>%E5%8C%97%E4%BA%AC 】

3.然后我们可以编写代码了0.0

回复文本的消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

回复图文消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title> 
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>

然后贴出我的代码

<?php
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            header('content-type:text');
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
    public function responseMsg(){
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

            $city = trim($postObj->Content);
            $report_arr = $this->receiveWeather($city);
            if($report_arr['status'] != "success"){
                $content = "请输入正确的城市名";
                $resultStr = $this->transmitText($postObj,$content);
            }
            else{
                $itemTpl = "<item>
                            <Title><![CDATA[【%s】%s %s %s %s]]></Title> 
                            <Description><![CDATA[]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[http://m.hao123.com/a/tianqi]]></Url>
                        </item>";

                $item_str = "";
                foreach ($report_arr['weather_data'] as $item)
                $item_str .= sprintf($itemTpl, $city, $item['date'], $item['weather'], $item['wind'], $item['temperature'], $item['dayPictureUrl']);
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName> 
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[news]]></MsgType>
                            <ArticleCount>%s</ArticleCount>
                            <Articles>
                                $item_str
                            </Articles>
                            </xml>";
                $resultStr = sprintf($textTpl, $postObj->FromUserName, $postObj->ToUserName, time(), count($report_arr['weather_data']));
            }

            echo $resultStr;
        }
    }
    private function receiveWeather($cityName){
        $ak = "输入你自己申请的AK";
        $url = "http://api.map.baidu.com/telematics/v3/weather?location=".urlencode($cityName)."&output=json&ak=$ak";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);    // 设置你需要抓取的URL
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
        $output = curl_exec($ch);   // 运行cURL,请求网页
        curl_close($ch);
        $result = json_decode($output, true); 
        $weather_report = array('weather_data' => $result['results'][0]['weather_data'], 
            'index' => $result['results'][0]['index'], 'status' => $result['status']);
        return $weather_report;
    }
    //发送文本信息
    private function transmitText($object,$content){
        if (!isset($content) || empty($content)){
            return "";
        }
        $xmlTpl = "<xml>
                       <ToUserName><![CDATA[%s]]></ToUserName>
                       <FromUserName><![CDATA[%s]]></FromUserName>
                       <CreateTime>%s</CreateTime>
                       <MsgType><![CDATA[text]]></MsgType>
                       <Content><![CDATA[%s]]></Content>
                   </xml>";
        $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);

        return $result;
    }
}
?>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值