0

0

微信公众平台开发(五) 天气预报功能开发_PHP教程

PHP中文网

PHP中文网

发布时间:2016-07-20 11:12:59

|

1263人浏览过

|

来源于php中文网

原创

前面几篇文章对微信公众平台的开通及简单使用做了简单的介绍,但都没有涉及到实际使用中的问题,例如天气查询,公交查询,快递查询等。接下来的几篇文章将对实际生活中会经常使用到的一些功能进行开发讲解,以供读者参考。

这一篇文章将对大家每天都会关心的天气查询进行开发,例如,用户发送消息 “苏州天气”,则会返回苏州实时天气状况,以及未来两天甚至未来五天的天气状况。

首先要对用户发送过来的消息进行判断,判断消息里是否含有“天气”关键字,如果含有,则需要继续提取地区信息,然后再通过中国天气网(http://www.weather.com.cn)提供的开放API进行相关地区天气查询。

立即学习PHP免费学习笔记(深入)”;

用户发送过来查询天气的消息的格式是固定好的,即 “地区+天气”,所以首先截取后两个字,判断是否为 “天气” 关键字。

使用php函数 mb_substr() 截取,关于该函数的用法:

<span mb_substr &mdash; 获取字符串的部分

  <span string mb_substr ( <span string <span $str , int <span $start [, int <span $length [, 
<span string <span $encoding<span  ]] )根据字符数执行一个多字节安全的 <span substr() 操作。 位置是从 str 的开始位置进行计数。
 第一个字符的位置是 0。第二个字符的位置是 1<span ,以此类推。str
从该 <span string<span  中提取子字符串。

start
str 中要使用的第一个字符的位置。
正数 -> 从字符串开头指定位置开始;
负数 -> 从字符串结尾指定位置开始;
length
str 中要使用的最大字符数。
正数 -> 从 start <span 处开始最多包括 length 个字符;
负数 -> string 末尾处的 length 个字符将会被漏掉(若 start 是负数则从字符串开头算起)。
encoding
encoding 参数为字符编码。如果省略,则使用内部字符编码。mb_substr() 函数根据 start 和 length 
参数返回 str 中指定的部分。

$str = mb_substr($keyword,-2,2,"UTF-8");

从消息的结尾数第二个字符开始截取,截取两个字符,然后加以判断是否为 “天气” 关键字。

下面进行地区提取,还是使用 mb_substr() 函数。

$str_key = mb_substr($keyword,0,-2,"UTF-8");

从消息的开头开始,截掉末尾的两个字符(天气),既得地区关键字。

然后进行判断,继而调用函数查询天气数据。

<span if(<span $str == '天气' && !empty($str_key)<span )
{
     <span //调用函数查询天气数据}

我们这里调用的是中国国家气象局提供的天气预报API接口,接口地址:http://m.weather.com.cn/data/101190401.html

URL中的数字指代城市的编号101190401(苏州),其他城市对应关系将在下面提供。

该接口返回信息比较全面,也是以json格式提供,格式如下:

<span {"weatherinfo":{
//基本信息;"city":"苏州","city_en":"suzhou",
"date_y":"2013年7月9日","date":"","week":"星期二","fchh":"18","cityid":"101190401",
//摄氏温度"temp1":"30℃~37℃",
"temp2":"30℃~37℃",
"temp3":"29℃~35℃",
"temp4":"27℃~33℃",
"temp5":"27℃~31℃",
"temp6":"27℃~35℃",
//华氏温度;"tempF1":"86℉~98.6℉",
"tempF2":"86℉~98.6℉",
"tempF3":"84.2℉~95℉",
"tempF4":"80.6℉~91.4℉",
"tempF5":"80.6℉~87.8℉",
"tempF6":"80.6℉~95℉",
//天气描述;"weather1":"晴转多云",
"weather2":"晴转多云",
"weather3":"晴转多云",
"weather4":"多云",
"weather5":"雷阵雨转中雨",
"weather6":"雷阵雨转多云",
//天气描述图片序号"img1":"0",
"img2":"1",
"img3":"0",
"img4":"1",
"img5":"0",
"img6":"1",
"img7":"1",
"img8":"99",
"img9":"4",
"img10":"8",
"img11":"4",
"img12":"1",
//图片名称;"img_single":"1",
"img_title1":"晴",
"img_title2":"多云",
"img_title3":"晴",
"img_title4":"多云",
"img_title5":"晴",
"img_title6":"多云",
"img_title7":"多云",
"img_title8":"多云",
"img_title9":"雷阵雨",
"img_title10":"中雨",
"img_title11":"雷阵雨",
"img_title12":"多云",
"img_title_single":"多云",
//风速描述"wind1":"西南风3-4级",
"wind2":"西南风3-4级",
"wind3":"东南风3-4级",
"wind4":"东南风3-4级转4-5级",
"wind5":"东南风4-5级转西南风3-4级",
"wind6":"西南风3-4级转4-5级",
//风速级别描述"fx1":"西南风",
"fx2":"西南风",
"fl1":"3-4级",
"fl2":"3-4级",
"fl3":"3-4级",
"fl4":"3-4级转4-5级",
"fl5":"4-5级转3-4级",
"fl6":"3-4级转4-5级",
//今日穿衣指数;"index":"炎热",
"index_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",
//48小时穿衣指数"index48":"炎热",
"index48_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",
//紫外线及48小时紫外线"index_uv":"中等",
"index48_uv":"中等",
//洗车指数"index_xc":"适宜",
//旅游指数"index_tr":"较不宜",
//舒适指数"index_co":"很不舒适",
"st1":"36",
"st2":"28",
"st3":"36",
"st4":"28",
"st5":"34",
"st6":"27",
//晨练指数"index_cl":"较适宜",
//晾晒指数"index_ls":"适宜",
//过敏指数"index_ag":"不易发"}}

weather() 函数如下:

<span private <span function weather(<span $n<span ){<span include("weather_cityId.php"<span );
<span $c_name=<span $weather_cityId[<span $n<span ];<span if(!<span empty(<span $c_name<span )){
<span $json=<span file_get_contents("http://m.weather.com.cn/data/".<span $c_name.".html"<span );
<span return json_decode(<span $json<span );
    } <span else<span  {<span return <span null<span ;
    }
}

这里include 了一个城市对应关系文件 weather_cityId.php,格式如下:

<?<span php
<span $weather_cityId = <span array("北京"=>"101010100","上海"=>"101020100","苏州"=>"101190401"<span );
?>

根据传入的城市名,得到城市代码,如果不为空,则调用中国天气网的API进行查询,返回json格式的数据,然后进行解析并返回数据,如果为空,则返回null值。

判断返回数据是否为空,若为空,则 $contentStr = "抱歉,没有查到\"".$str_key."\"的天气信息!";

若返回数据不为空,则:

A1.art
A1.art

一个创新的AI艺术应用平台,旨在简化和普及艺术创作

下载
$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;

说明:

weatherinfo->city  //获取城市名,这里为苏州

weatherinfo->date_y  //获取日期,这里为2013年7月9日

weatherinfo->fchh  //数据发布时间

weatherinfo->weather1  //实时天气

weatherinfo->temp1  //实时温度

weatherinfo->wind1  //实时风向和风速

weatherinfo->index_d  //穿衣指数

<?<span php
<span /*<span *
  * wechat php test
  <span */<span //<span define your token<span define("TOKEN", "zhuojin"<span );
<span $wechatObj = <span new<span  wechatCallbackapiTest();
<span $wechatObj-><span responseMsg();
<span //valid();<span class<span  wechatCallbackapiTest
{<span /*checkSignature()){
            echo $echoStr;
            exit;
        }
    }<span */<span public <span function<span  responseMsg()
    {<span //<span get post data, May be due to the different environments<span $postStr = 
    <span $GLOBALS["HTTP_RAW_POST_DATA"<span ];

          <span //<span extract post data<span if (!<span empty(<span $postStr<span )){
                
                  <span $postObj = <span simplexml_load_string(<span $postStr, 'SimpleXMLElement',
                  <span  LIBXML_NOCDATA);<span $RX_TYPE = <span trim(<span $postObj-><span MsgType);
                  <span switch(<span $RX_TYPE<span )
                {<span case "text":<span $resultStr = <span $this->handleText(<span $postObj<span );
                <span break<span ;<span case "event":<span $resultStr = <span $this->handleEvent(
                <span $postObj<span );<span break<span ;<span default:<span $resultStr = "Unknow msg type: ".
                <span $RX_TYPE<span ;<span break<span ;
                }<span echo <span $resultStr<span ;
        }<span else<span  {<span echo ""<span ;<span exit<span ;
        }
    }<span public <span function handleText(<span $postObj<span )
    {<span $fromUsername = <span $postObj-><span FromUserName;<span $toUsername = <span $postObj->
    <span ToUserName;<span $keyword = <span trim(<span $postObj-><span Content);
    <span $time = <span time<span ();<span $textTpl = "<span %s0"<span ;             
    <span if(!<span empty( <span $keyword<span  ))
        {<span $msgType = "text"<span ;<span //<span 天气<span $str = mb_substr(<span $keyword,-2,2,"UTF-8"
        <span );<span $str_key = mb_substr(<span $keyword,0,-2,"UTF-8"<span );<span if(<span $str == '天气' && !
        <span empty(<span $str_key<span )){<span $data = <span $this->weather(<span $str_key<span );
        <span if(<span empty(<span $data-><span weatherinfo)){<span $contentStr = "抱歉,没有查到\"".
        <span $str_key."\"的天气信息!"<span ;
                } <span else<span  {<span $contentStr = "【".<span $data->weatherinfo->city."天气预报】\n".
                <span $data->weatherinfo->date_y." ".<span $data->weatherinfo->fchh."时发布"."\n\n实时天气\n".
                <span $data->weatherinfo->weather1." ".<span $data->weatherinfo->temp1." ".
                <span $data->weatherinfo->wind1."\n\n温馨提示:".<span $data->weatherinfo->index_d."\n\n明天\n".
                <span $data->weatherinfo->weather2." ".<span $data->weatherinfo->temp2." ".
                <span $data->weatherinfo->wind2."\n\n后天\n".<span $data->weatherinfo->weather3." ".
                <span $data->weatherinfo->temp3." ".<span $data->weatherinfo-><span wind3;
                }
            } <span else<span  {<span $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n".
            "卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n".
            "目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."
            【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."
            【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待..."<span ;
            }<span $resultStr = <span sprintf(<span $textTpl, <span $fromUsername, <span $toUsername, 
            <span $time, <span $msgType, <span $contentStr<span );
            <span echo <span $resultStr<span ;
        }<span else<span {<span echo "Input something..."<span ;
        }
    }<span public <span function handleEvent(<span $object<span )
    {<span $contentStr = ""<span ;<span switch (<span $object-><span Event)
        {<span case "subscribe":<span $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."
        卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."
        目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."
        【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."
        【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待..."<span ;<span break<span ;
        <span default :<span $contentStr = "Unknow Event: ".<span $object-><span Event;<span break<span ;
        }<span $resultStr = <span $this->responseText(<span $object, <span $contentStr<span );<span return 
        <span $resultStr<span ;
    }
    <span public <span function responseText(<span $object, <span $content, <span $flag=0<span )
    {<span $textTpl = "<span %s%d"<span ;<span $resultStr = <span sprintf(<span $textTpl, 
    <span $object->FromUserName, <span $object->ToUserName, <span time(), <span $content, <span $flag<span );
    <span return <span $resultStr<span ;
    }<span private <span function weather(<span $n<span ){<span include("weather_cityId.php"<span );
    <span $c_name=<span $weather_cityId[<span $n<span ];<span if(!<span empty(<span $c_name<span )){
    <span $json=<span file_get_contents("http://m.weather.com.cn/data/".<span $c_name.".html"<span );
    <span return json_decode(<span $json<span );
        } <span else<span  {<span return <span null<span ;
        }
    }<span private <span function<span  checkSignature()
    {<span $signature = <span $_GET["signature"<span ];<span $timestamp = <span $_GET["timestamp"<span ];
    <span $nonce = <span $_GET["nonce"<span ];    
                <span $token =<span  TOKEN;<span $tmpArr = <span array(<span $token, <span $timestamp, 
                <span $nonce<span );<span sort(<span $tmpArr<span );<span $tmpStr = <span implode( 
                <span $tmpArr<span  );<span $tmpStr = <span sha1( <span $tmpStr<span  );
        <span if( <span $tmpStr == <span $signature<span  ){<span return <span true<span ;
        }<span else<span {<span return <span false<span ;
        }
    }
}

?>

关于城市对应关系文件 weather_cityId.php,目前更新到了400多个城市,以后还会继续增加,请到QQ群213260412下载吧。

请关注卓锦苏州 微信公众帐号,卓锦苏州 基于SAE 平台开发,针对于主流的微信功能进行开发测试。

您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

1. 登录微信客户端,朋友们 -> 添加朋友 -> 搜号码 -> zhuojinsz,查找并关注。

2. 扫描二维码:

卓锦苏州 功能列表。

 


以上就是微信公众平台开发(五) 天气预报功能开发_PHP教程的内容,更多相关内容请关注PHP中文网(www.php.cn)!

http://www.bkjia.com/PHPjc/440409.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/440409.htmlTechArticle前面几篇文章对微信公众平台的开通及简单使用做了简单的介绍,但都没有涉及到实际使用中的问题,例如天气查询,公交查询,快递查询...


相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

16

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

222

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 7万人学习

Uniapp180分钟快速入门
Uniapp180分钟快速入门

共25课时 | 4.8万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共67课时 | 9.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号