一:

1.定义一个专门用于发送api请求和处理api接收数据的类

2.类中定义两个方法:1个用于生成连接api所用的url,一个用于连接api并且处理返回数据

5.容易出问题的地方:

1)在连接api和处理消息方法中,用cURL进行连接,tips:curl连接的时候不要使用服务器验证!!!,不设置hedding,不设置host,否则连接不了api,正确示范如官方提供的demo参考。

2)api返回的是json格式,用php提供的json转数组函数可以转数组,这个数组是一个多维的数组,注意取值的时候不要出错,数组为索引数组+关联数组混合,如下面代码所示

$output['results'][0]['location']['name']

这里取到的就是城市名字。

6.整体思路:在回复文本消息方法中调用生成URL链接函数,将用户发送的城市名字传过来;URL链接函数调用连接方法,在连接方法中返回处理完成的字符串,可供被动回复文本消息方法直接回复。

7.实例code demo :wether.php

/*调用心知天气api demo

*/

//自动转数组并返回查询结果字符串

class wetherReplay{

function httpGet($url){

$ch = curl_init();//c初始化一个cURL会话

curl_setopt($ch, CURLOPT_URL, $url);//将URL设置为我们需要的URL

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

$output = curl_exec($ch);//获取json返回数据

curl_close($ch);

$output = json_decode($output, true);//将获取到的json转化成php数组

$retStr = "您查询的城市:" .$output['results'][0]['location']['name'] . "\n" . "今日天气:" .$output['results'][0]['now']['text']

. "\n" . "温度:" .$output['results'][0]['now']['temperature'] ."摄氏度";

return $retStr;

}

// 心知天气接口调用凭据

public function wetherCallBackTest($pos){

$key = '6wd17nam8wcitv0f'; // 测试用 key,请更换成您自己的 Key

$uid = 'U270B81E1D'; // 测试用 用户 ID,请更换成您自己的用户 ID

// 参数

$api = 'https://api.seniverse.com/v3/weather/now.json'; // 接口地址

$location = $pos; // 城市名称。除拼音外,还可以使用 v3 id、汉语等形式

// 生成签名。文档:https://www.seniverse.com/doc#sign

$param = [

'ts' => time(),

'ttl' => 300,

'uid' => $uid,

];

$sig_data = http_build_query($param); // http_build_query 会自动进行 url 编码

// 使用 HMAC-SHA1 方式,以 API 密钥(key)对上一步生成的参数字符串(raw)进行加密,然后 base64 编码

$sig = base64_encode(hash_hmac('sha1', $sig_data, $key, TRUE));

// 拼接 url 中的 get 参数。文档:https://www.seniverse.com/doc#daily

$param['sig'] = $sig; // 签名

$param['location'] = $location;

$param['start'] = 0; // 开始日期。0 = 今天天气

$param['days'] = 1; // 查询天数,1 = 只查一天

// 构造 url

$url = $api . '?' . http_build_query($param);

return $this->httpGet($url);

}

}

二:被动回复消息类:

1.在文本消息中分辨出用户是否发送询问天气消息,自定义判断规则 eg:用户发送南阳天气时,strstr()识别出字符串是否有天气两字,若有,进入到回复天气模块,没有,正常进入回复模块;

2.城市名字是不一定两个字的,所以使用mb_strlen()来判断用户输入的字符个数,然后减去2就是城市名字的字符个数,再使用mb_substr()来截取这个字符长度的城市名字

3.code demo  replay.php

require 'wether.php';//包含文件,以使可以调用该文件的方法

//$wetherReplay = new wetherReplay();

//回复消息类

class ReplyMsageUntion{

//回复消息选择器

public function messageSwitch(){

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

if (!empty($postStr)) {

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

switch ($postObj->MsgType) {

case 'text':

$this->replayText($postObj);

break;

case 'image':

$this->replayImage($postObj);

break;

case 'voice':

$this->replayAudio($postObj);

case 'video';

$this->replayVideo($postObj);

}

}else

echo "";

}

//文本消息回复函数

private function replayText($postObj){

$wetherReplay = new wetherReplay();//new一个对象才可以调用生成URL方法

$fromUser = $postObj->FromUserName;

$toUser = $postObj->ToUserName;

$mType = $postObj->MsgType;

$keyWord = trim($postObj->Content);

$time = date("Y:m:d H:i:s", time());

//如果消息中包含天气,则回复天气预报

if(strstr($keyWord,"天气")){//strstr()用来检测是否有固定字符串出现

$lenthContent = mb_strlen($keyWord,'utf-8');//判断用户输入的字符串长度

$pos = mb_substr($keyWord,0,$lenthContent-2,'utf-8');//截取城市名字

$wetherRet = $wetherReplay->wetherCallBackTest($pos);//调用天气生成URL方法

$textStr = "

%s

0

";

$resultStr = sprintf($textStr,$fromUser,$toUser, $time, $mType,$wetherRet);

echo $resultStr;

}else{

// $time = date("Y:m:d H:i:s", time());

$textStr = "

%s

0

";

// if (!empty($keyWord)){

$contentStr = "已收到您的消息:".$postObj->Content ."\n" ."发送时间" .$time;

$resultStr = sprintf($textStr,$fromUser,$toUser, $time, $mType,$contentStr);

echo $resultStr;

}

}

//图片消息回复函数

private function replayImage($postObj){

$fromUser = $postObj->FromUserName;

$toUser = $postObj->ToUserName;

$mType = $postObj->MsgType;

$time = date("Y:m:d H:i:s", time());

$imageStr = "

%s

";

// $contentStr = "您发送的是一张图片,点击以下链接查看:"."\n" .$postObj->MediaId;

$resultStr = sprintf($imageStr,$fromUser,$toUser,$time,$mType,$postObj->MediaId);

echo $resultStr;

}

//回复语音消息

private function replayAudio($postObj){

$fromUser = $postObj->FromUserName;

$toUser = $postObj->ToUserName;

$mType = $postObj->MsgType;

$time = date("Y:m:d H:i:s", time());

$audeoStr = "

%s

";

$resultStr = sprintf($audeoStr,$fromUser,$toUser,$time,$mType,$postObj->MediaId);

echo $resultStr;

}

//回复视频消息

private function replayVideo(){

$fromUser = $postObj->FromUserName;

$toUser = $postObj->ToUserName;

$mType = $postObj->MsgType;

$time = time();

$videoStr = "

%s

//

//

";

// $contentTitle = "视频消息";

// $contentDesc = "点击即可观看";

$resultStr = sprintf($videoStr,$fromUser,$toUser,$time,$mType,$postObj->MediaId);

echo $resultStr;

}

}

三 入口文件

1.服务器绑定校验签名 tips:签名不用每次请求都绑定,所以要加一个判断条件

2.code demo  api.php

require 'replay.php';

define("TOKEN","flyingman");

$wechatObj = new wechatCallBackTest();

$replayMseeg = new ReplyMsageUntion();

if (!(isset($_GET["echostr"]))){

$replayMseeg->messageSwitch();

}else{

$wechatObj->valid();

}

class wechatCallBackTest{

//校验签名

public function valid(){

$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) {

echo $_GET["echostr"];

}

}

}

四 总结

1.以上code可以实现微信被动回复文本,语音,图片,天气查询

2. 天气查询限定格式:城市名+天气

心知天气api PHP,php调用心知天气API,实现微信自动回复相关推荐

  1. python powerbi知乎_利用Python调用Power BI REST API

    本文是D-BI之Power BI REST API系列第三篇,讲解如何利用一段简单的Python脚本实现Power BI REST API的调用,将使用与上文完全不同的方法 前述 上文<Powe ...

  2. php抓取搜狗图片,搜狗美图 API 接口请求调用

    原标题:搜狗美图 API 接口请求调用 搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图 ...

  3. 微博API接口的调用

    本人大学狗一枚,学识尚浅,只为做笔记用,愿求大神们多多指教.楼主我就买了本社交网站数据挖掘与分析的书(python语言),==装逼的..言归正传,由于书中设计到的社交网站是twitter,脸book, ...

  4. 调用腾讯地图API、高德地图API 获取当前地理位置、经纬度

    调用腾讯地图API.高德地图API 获取当前地理位置.经纬度 web开发中,很多情况下都会需要获取当前位置的经纬度,在网上找了几个不同的地图,最终找到兼容比较好的腾讯地图API 1.调用腾讯地图API ...

  5. Android调用新版百度天气api,解决地理编码问题

    我在学习制作天气预报app的时候,先调用新版百度地图api时发现,百度取消了原有api链接的city参数,反倒是改为了district_id,看到这个的时候我一脸蒙蔽,全国那么多地区,我要怎么一一获取 ...

  6. android往天气接口里面传城市,Android使用中国天气网API数据通过城市名称获取天气情况...

    项目要求在应用首页面展示本地当日天气的概况,首先想到的是google和雅虎,前者很久之前接触过,听说后来用不了了,后者由于邮箱事件的缘故个人不喜欢(虽然貌似苹果也用雅虎的天气预报),之后又想到了前段时 ...

  7. html调用腾讯地图定位当前位置,vue web项目中调用腾讯地图API获取当前位置的经纬度...

    vue web项目中调用腾讯地图API获取当前位置的经纬度 vue web项目中调用腾讯地图API获取当前位置的经纬度 在main.js 中添加一下代码 import axios from 'axio ...

  8. 【Twitter API开发者账户协议必知】

    Twitter API协议必知 中文 英文 中文 开发商协议 生效日期:2022年10月10日 本Twitter开发者协议(以下简称"协议")由您(个人或实体,以下简称" ...

  9. php天气api接口,PHP博客_天气API接口的实现代码,实况天气,生活指数等

    城市查询API接口说明 功能强大的城市搜索服务,支持中英文模糊搜索,支持IP.经纬度坐标和中国行政区域编码(AD Code)查询城市的详细信息,可指定搜索范围,设置返回结果数量,查询全球热门城市列表等 ...

  10. 百度地图简单调用js及天气获取

    这是一个简单的小例子,获取天气过程可能有点繁琐,本次通过获取所在的城市,根据城市获取城市编码,再根据编码获取当前城市的天气情况.当然网上有很多关于天气获取的,如知心天气.中国气象局.和风天气.free ...

最新文章

  1. ABAP源码--当前及可用库存查询
  2. 标签传播算法(Label Propagation)及Python实现
  3. 读取和修改caffemodel文件
  4. 调整姿势!登顶 MacBook高效工作环境配置!
  5. 游戏修改服务器数据,修改游戏服务器数据的教程
  6. MyBatis可视化代码生成工具
  7. Kubernetes查看日志命令
  8. linux常见通配符的含义,linux通配符含义
  9. flash发布html快捷键,Flash菜单操作之快捷键
  10. NES APU Replayer
  11. 关于Render在不同情况的用法
  12. 学会Python好找工作吗?这就告诉你答案
  13. 根文件系统与文件系统的区别
  14. layui管理后台模板
  15. excel 作图-- 主次纵坐标轴 横坐标名称太长
  16. GMap.net在winform中调用高德地图
  17. 转贴汪应果先生的“全球华人应该向大陆中国人学什么?”
  18. 微信商城开源版二次开发(二)
  19. python怎么消除警告_Python-警告处理
  20. 卸载或删除 Office 2010

热门文章

  1. 名悦集团:冬季汽车开暖风有哪些注意事项
  2. 七日杀服务器直连教程,七日杀IP直连的方法
  3. GitHub学生优惠:repl.it 使用--Python爬虫示例
  4. 简单的玻璃材质效果——UnityShader学习笔记
  5. 解决IE浏览器被2345劫持问题
  6. 偶数提取(不用二次倒位,直接一步到位)
  7. 注意:这些跳槽理由会被HR调查!
  8. Android自定义导览地图组件(二)
  9. Crime Management CodeForces - 107D
  10. Shopnc之nginx安装