课程大纲
- 详解微信界面交互接口和订阅事件推送
- access_token的作用和使用方法
- 通过“天气查询”实例来熟悉基础接口的使用
事件推送
定义:微信公众平台推送消息到第三方服务器
开发环境搭建
关注事件推送:
<?php
/*
* 接受事件推送并回复
* 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
* 关注
*/
//1.获取到微信推送过来的post过来的数据(XML格式)
/*
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[FromUser] ]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType>< ![CDATA[event] ]></MsgType>
<Event>< ![CDATA[subscribe] ]></Event>
</xml>
*/
$postArr = file_get_contents('php://input');
//2.处理消息类型,并设置回复类型和内容
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
//3/判断该数据报是否是订阅的事件推送
if(strtolower($postObj->MsgType) == 'event') {//订阅/取消订阅事件
//关注
if(strtolower($postObj->Event) == 'subscribe'){
//回复用户消息,文本回复,文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543,还有其他回复消息方式,自行测试
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$MsgType = 'text';
$Content = 'Welcome To Jason World';
/*
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>< ![CDATA[text] ]></MsgType>
<Content>< ![CDATA[你好] ]></Content>
</xml>
*/
//组装XML字符串给微信
$template = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
$info = sprintf($template,$toUser,$fromUser,$time,$MsgType,$Content);
echo $info;
}
}
消息回复的类型
- 纯文本
- 单图文
- 多图文
实例
纯文本:
<?php
//文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543,还有其他回复消息方式,自行测试
$postArr = file_get_contents('php://input');
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
if(strtolower($postObj->MsgType) == 'text') {//用户输入的文字信息
/**
* 文本消息
*/
switch ($postObj->Content){//用户输入的关键字
case "T1":
$Content = "我是文本1";break;
case "T2":
$Content = "我是文本2";break;
case "T3":
$Content = "<a href='www.baidu.com'>百度</a>";break;
default:
$Content = "其他文本消息";
}
$ToUserName = $postObj->FromUserName;
$FromUserName = $postObj->ToUserName;
$CreateTime = time();
$MsgType = 'text';
//文本消息
$template = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
$info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Content);
echo $info;
}
单图文或者多图文:
<?php
//文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543,参考:回复图文消息
$postArr = file_get_contents('php://input');
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
if(strtolower($postObj->MsgType) == 'text') {//用户输入的文字信息
/**
* 单图文消息或者多图文
* PS:图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
* PS:单图文才会显示图片的“描述”信息,多图文不显示
* PS:多图文发送时,子图文不能超过8个
*/
if(trim($postObj->Content) == "tuwen1") {
file_put_contents("2.log",$postObj->ToUserName);
$ToUserName = $postObj->FromUserName;
$FromUserName = $postObj->ToUserName;
$CreateTime = time();
$MsgType = 'news';
//图文消息
$arr = [
[
'Title' => '标题1',
'Description' => '描述1',
'PicUrl' => 'http://bull.smallzhou.cn/wx_1.jpg',
'Url' => 'www.baidu.com'
],
[
'Title' => '标题2',
'Description' => '描述2',
'PicUrl' => 'http://bull.smallzhou.cn/wx_2.jpg',
'Url' => 'www.sina.cn'
],
[
'Title' => '标题3',
'Description' => '描述3',
'PicUrl' => 'http://bull.smallzhou.cn/wx_3.jpg',
'Url' => 'www.sucaihuo.com'
]
];
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>".count($arr)."</ArticleCount>
<Articles>";
foreach ($arr as $v){
$template .= "<item>
<Title><![CDATA[".$v['Title']."]]></Title>
<Description><![CDATA[".$v['Description']."]]></Description>
<PicUrl><![CDATA[".$v['PicUrl']."]]></PicUrl>
<Url><![CDATA[".$v['Url']."]]></Url>
</item>";
}
$template .= "</Articles></xml>";
$info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType);
file_put_contents("1.log",$info);
echo $info;
}
}
access_token与appid,appsecret的关系
①appid + appsecret 获取access_token
②access_token唯一有效性,时间为2小时,获取新access_token原access_token几秒内将失效
全局有效性
流程:通过appid和appsecret获取access_token保存数据库,调用接口时带上access_token,失效时,重新用appid和appsecret获取access_token并保存于数据库
微信开放接口
- access_token
- 微信服务器地址
获取access_token:
<?php
/**
* 获取access_token
* https请求方式: GET
* https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
* 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
* PS:需要去微信平台设置Ip白名单
*/
//1.初始化
$ch = curl_init();
//2.设置参数
$appId = "wx0016e74682eb2c09";
$appSecret = "07e766de4bd26503b8f8c1a4db07a17d";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//3.执行
$outPut = curl_exec($ch);
//4.关闭
curl_close($ch);
if(curl_errno($ch)){
var_dump(curl_errno($ch));
}
var_dump(json_decode($outPut,true));
获取微信服务器IP地址:
<?php
/**
* 获取微信服务器IP地址
* 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140187
* http请求方式: GET
* https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
* 作用:安全监测,监测是否请求来至于微信
*/
//1.初始化
$ch = curl_init();
//2.设置参数
$access_token = "11_gUbWrkeL6Mq68V6fsCzbZWmxkvRRpn-lzvcuEcdQSLTJNRiM1tyiYsQu3lrwmZWCpaBq7whYbrl7YgJmiw0LAz0ENq2dp2VI0QsOQnLz52nRvbrT3K6oBfhZZzkhORte5cMDGV-KCFStiIDGUIIhAAAGUU";
$url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=" . $access_token;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//3.执行
$outPut = curl_exec($ch);
//4.关闭
curl_close($ch);
if(curl_errno($ch)){
var_dump(curl_errno($ch));
}
print_r(json_decode($outPut,true));
阿里云接口地址
https://market.aliyun.com/data?accounttraceid=c83f9881-4bab-4091-8098-c749bd365653
第三方API在微信中的实现
天气查询:
<?php
$postArr = file_get_contents('php://input');
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
if(strtolower($postObj->MsgType) == 'text') {//用户输入的文字信息
$host = "https://ali-weather.showapi.com";
$path = "/day15";
$method = "GET";
$appcode = "bbc29e80425e4b1ea2581339a53e8116";//你自己的AppCode
$headers = array();
array_push($headers, "Authorization:APPCODE " . $appcode);
$area = urlencode($postObj->Content);
$querys = "area=".$area."&areaid=";
$url = $host . $path . "?" . $querys;
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($curl, CURLOPT_HEADER, true);
if (1 == strpos("$".$host, "https://"))
{
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
}
$data = json_decode(curl_exec($curl),true);
$fiftheenWeatherDayArr = $data['showapi_res_body']['dayList'];
$Content = "天气预报:\n".
"地区:".$fiftheenWeatherDayArr[0]['area']."\n".
"预报日期:".$fiftheenWeatherDayArr[0]['daytime']."\n".
"白天天气:".$fiftheenWeatherDayArr[0]['day_weather']."\n".
"白天最高温度:".$fiftheenWeatherDayArr[0]['day_air_temperature']."\n".
"白天风力:".$fiftheenWeatherDayArr[0]['day_wind_power']."\n".
"白天风向:".$fiftheenWeatherDayArr[0]['day_wind_direction']."\n".
"晚上天气:".$fiftheenWeatherDayArr[0]['night_weather']."\n".
"晚上最低温度:".$fiftheenWeatherDayArr[0]['night_air_temperature']."\n".
"晚上风力:".$fiftheenWeatherDayArr[0]['night_wind_power']."\n".
"晚上风向:".$fiftheenWeatherDayArr[0]['night_wind_direction']."\n";
$ToUserName = $postObj->FromUserName;
$FromUserName = $postObj->ToUserName;
$CreateTime = time();
$MsgType = 'text';
//文本消息
$template = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
$info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Content);
echo $info;
}