php微信推送消息全接口(已测试)
2017-04-08
后端
<?php
/**
* 微信公众平台接口封装功能类文件
*/
define("TOKEN", "xxxx");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->weixin_run(); //执行接收器方法
//$wechatObj->valid(); //token第一次验证时需要打开,后面就可以注释掉了
class wechatCallbackapiTest
{
private $fromUsername; //发送过来消息的微信openid
private $toUsername; //开发者微信号
private $times; //消息创建时间
private $keyword; //消息内容
private $PicUrl; //图片消息
private $MediaId; //媒体消息id,可以调用多媒体文件下载接口拉取数据。
private $ThumbMediaId; //视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
private $Format; //语音格式
private $Location_X; //地理位置维度
private $Location_Y; //地理位置精度
private $Scale; //地图缩放大小
private $Label; //地理位置信息
private $Title; //连接消息标题
private $Description; //连接消息描述
private $Url; //连接消息url
private $Latitude; //上报地理位置时的地理位置纬度
private $Longitude; //上报地理位置时的地理位置经度
private $Precision; //上报地理位置时的地理位置精度
private $MsgType; //消息类型 文本txt 图片image 语音voice
// 视频video 地理位置location 连接link
// 点击event
private $Event; //事件类型 subscribe(订阅)、unsubscribe(取消订阅)
// LOCATION(用户同意上报地址位置) CLICK(点击菜单)
private $EventKey; //事件KEY值,qrscene_为前缀,后面为二维码的参数值
// 或者是与自定义菜单接口中KEY值对应
private $Ticket; //二维码的ticket,可用来换取二维码图片
private $Recognition; //语音识别结果,UTF8编码
//执行检测的信息
public function weixin_run()
{
$this->responseMsg();
switch ($this->MsgType)
{
case 'text':
$str = "类型:文本消息n";
$str .= '识别结果:' . $this->keyword . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
case 'voice':
$str = "类型:语音消息n";
$str .= '格式:' . $this->Format . "n";
$str .= '识别结果:' . $this->Recognition . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
case 'image':
$str = "类型:图片消息n";
$str .= '图片链接:' . $this->PicUrl . "n";
$str .= 'MediaId:' . $this->MediaId . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
case 'video':
$str = "类型:视频消息n";
$str .= '图片链接:' . $this->PicUrl . "n";
$str .= 'MediaId:' . $this->MediaId . "n";
$str .= 'ThumbMediaId:' . $this->ThumbMediaId . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
case 'location':
$str = "类型:地理位置消息n";
$str .= '维度:' . $this->Location_X . "n";
$str .= '精度:' . $this->Location_Y . "n";
$str .= '地图缩放大小:' . $this->Scale . "n";
$str .= '地理位置信息:' . $this->Label . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
case 'link':
$str = "类型:链接消息n";
$str .= '标题:' . $this->Title . "n";
$str .= '描述:' . $this->Description . "n";
$str .= '链接:' . $this->Url . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
case 'event':
if($this->Event == 'subscribe')
{
if($this->Ticket != '')
{
$str = "类型:新订阅消息(2维码)n";
$str .= '2维码参数值:' . $this->EventKey . "n";
$str .= 'Ticket:' . $this->Ticket . "n";
$str .= 'MsgType:-' . $this->MsgType . "n";
$str .= 'Event:-' . $this->Event . "n";
}
else
{
$str = "类型:新订阅消息n";
}
}
else if($this->Event == 'unsubscribe')
{
$str = "类型:取消关注消息n";
}
else if($this->Event == 'CLICK')
{
$str = "类型:点击菜单事件n";
$str .= 'EventKey:' . $this->EventKey . "n";
}
$str .= 'openid:' . $this->fromUsername . "n";
$arr[] = $str;
$this->fun_xml('text', $arr);
break;
default:
# code...
break;
}
//回复文本消息
/* $arr[] = $this->keyword;
// $arr[] = $this->MediaId;
$this->fun_xml('text', $arr); */
//回复图片消息
/* $arr[] = $this->MediaId;
$this->fun_xml('image', $arr); */
//回复语音消息
/* $arr[] = $this->MediaId;
$this->fun_xml('voice', $arr); */
//回复视频消息
/* $arr[] = $this->MediaId;
$arr[] = $this->ThumbMediaId;
$this->fun_xml('video', $arr); */
//回复音乐消息
/* $arr[] = '测试音乐消息回复';
$arr[] = "描述";
$arr[] = "http://wx.vtaoshop.net/wll/yiqi.mp3";
$arr[] = "http://wx.vtaoshop.net/wll/yiqi.mp3";
$arr[] = "5Tyme685adshiJWroam_UGuywqesG2k3jGxC1NZcK6JceW9V6aHvs0VbZKvUdAvl";
$this->fun_xml('music', $arr); */
//回复图文消息
/* $arr[] = array(
"感谢你关注360shop",
"谢谢",
"http://www.360shop.com.cn/templates/default/images/about_us/360-12_05.jpg",
"http://www.360shop.com.cn"
);
$arr[] = array(
"关于我们",
"公司介绍",
"http://www.360shop.com.cn/templates/default/images/about_us/360-12_05.jpg",
"http://www.360shop.com.cn/us/introduce"
);
$this->fun_xml("news", $arr, array(2,0)); */
/* //判断有数据就返回天气数据,没有就返回富文本信息
if(empty($t->weatherinfo->week))
{
//获取对方要翻译的数据
$t = $this->fanyi($this->keyword);
//获取拼音
$py = $this->pinyin($this->keyword);
$arr[]=array("感谢你关注商信圈","aa","http://1.zhangya4548.sinaapp.com/shanxinquan1.jpg","http://www.laiyuan168.com");
$arr[]=array("没有你要查询的城市: '" . $this->keyword . "' 天气!请输入中文城市名如: '杭州' 不要带其它数字或字母字符","aa","http://1.zhangya4548.sinaapp.com/12345.jpg","http://www.laiyuan168.com");
//翻译测试
$arr[]=array("你输入的[ " . $this->keyword . " ] 英文 为: '" . $t . "'","aa","http://1.zhangya4548.sinaapp.com/fanyi.jpg","http://www.laiyuan168.com");
//拼音测试
$arr[]=array("你输入的[ " . $this->keyword . " ] 拼音 为: '" . $py . "'","aa","http://1.zhangya4548.sinaapp.com/pinyin.png","http://www.laiyuan168.com");
$arr[]=array("更多功能后续开发,敬请等待!","aa","http://1.zhangya4548.sinaapp.com/12345.jpg","http://www.laiyuan168.com");
//回复富文本消息
$this->fun_xml("news",$arr,array(5,0)); //2控制几行输出
}
else
{
$str = " 你要查询的地区是: " . $t->weatherinfo->city . ",n";
$str .= " 今天是: " . $t->weatherinfo->date_y . ",n";
$str .= " 今天是: " . $t->weatherinfo->week . ",n";
$str .= " 今天温度是: " . $t->weatherinfo->temp1 . ",n";
$str .= " 今天天气状况: " . $t->weatherinfo->weather1 . ",n";
$str .= " 今天穿衣指数: " . $t->weatherinfo->index . " " . $t->weatherinfo->index_d . ",n";
$str .= " 48小时穿衣指数: " . $t->weatherinfo->index48 . " " . $t->weatherinfo->index48_d . ",n";
$str .= " 紫外线及48小时紫外线: " . $t->weatherinfo->index_uv . " " . $t->weatherinfo->index48_uv . ",n";
$str .= " 洗车: " . $t->weatherinfo->index_xc . ",n";
$str .= " 旅游: " . $t->weatherinfo->index_tr . ",n";
$str .= " 舒适指数: " . $t->weatherinfo->index_co . ",n";
$str .= " 晨练: " . $t->weatherinfo->index_cl . ",n";
$str .= " 晾晒: " . $t->weatherinfo->index_ls . ",n";
$str .= " 过敏: " .$t->weatherinfo->index_ag . ",n";
$str .= " 从今天开始到第六天的每天的天气情况,这里的温度是摄氏温度,n";
//判断今天是星期几
$weekarray = array("日","一","二","三","四","五","六");
$lb = date("w");
$j = 1;
for($i = 0; $i <= 6; $i++)
{
if($j != 7)
{
$ss = 'temp' . $j;
$hs = 'tempF' . $j;
$zk = 'weather' . $j;
$fs = 'wind' . $j;
$fl = 'fl' . $j;
$str .= " 星期" . $weekarray[$lb] . "n是: " . $t->weatherinfo->$ss . "摄氏度,n" . $t->weatherinfo->$hs . "华氏度,n天气状况: " . $t->weatherinfo->$zk . ",n风速: " . $t->weatherinfo->$fs . " n风力级别: " . $t->weatherinfo->$fl . ";n";
$lb++;
if($lb == 7)
{
$lb = 0;
}
}
$j++;
}
$arr[] = $str;
//回复文本消息
$this->fun_xml('text', $arr);
}*/
}
//获取天气数据
public function t($n)
{
include("t_api.php");
$c_name = $t_api[$n];
$json = file_get_contents("http://m.weather.com.cn/data/" . $c_name . ".html");
return json_decode($json);
}
//获取翻译
public function fanyi($n)
{
include("fanyi.php");
$fanyi = new BaiduFanyi();
$fanyi->appkey = "UMCUG6znEOc10S4D72AuGeXN";
$re=$fanyi->fanyi($n,"zh","en");
if(!$re)
{
return $fanyi->geterror();
}
else
{
return $re;
}
}
//获取拼音
public function pinyin($n)
{
include("hz_zhuan_py.php");
$pin = new pin();
return $pin->Pinyin($n,'UTF8');
}
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature())
{
echo $echoStr;
exit;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr))
{
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$this->fromUsername = $postObj->FromUserName;
$this->toUsername = $postObj->ToUserName;
$this->keyword = trim($postObj->Content);
$this->MsgType = $postObj->MsgType;
$this->PicUrl = $postObj->PicUrl;
$this->MediaId = $postObj->MediaId;
$this->ThumbMediaId = $postObj->ThumbMediaId;
$this->Format = $postObj->Format;
$this->Location_X = $postObj->Location_X;
$this->Location_Y = $postObj->Location_Y;
$this->Scale = $postObj->Scale;
$this->Label = $postObj->Label;
$this->Title = $postObj->Title;
$this->Description = $postObj->Description;
$this->Url = $postObj->Url;
$this->Latitude = $postObj->Latitude;
$this->Longitude = $postObj->Longitude;
$this->Precision = $postObj->Precision;
$this->Event = $postObj->Event;
$this->EventKey = $postObj->EventKey;
$this->Ticket = $postObj->Ticket;
$this->Recognition = $postObj->Recognition;
$this->times = time();
}
else
{
echo "this a file for weixin API!";
exit;
}
}
/* 微信发送消息封装
type 文本txt 图片image 语音voice 视频video 音乐music 图文news
value_arr (内容) 注意: 多图要小于10条
多图时候的格式
value_arr(array(标题,介绍,图片,超链接),...小于10条)
array (条数,ID)
*/
private function fun_xml($type, $value_arr, $o_arr = array(0))
{
//=================xml header============
$con="<xml>
<ToUserName><![CDATA[{$this->fromUsername}]]></ToUserName>
<FromUserName><![CDATA[{$this->toUsername}]]></FromUserName>
<CreateTime>{$this->times}</CreateTime>
<MsgType><![CDATA[{$type}]]></MsgType>";
//=================type content============
switch($type)
{
case "text" :
$con .= "<Content><![CDATA[{$value_arr[0]}]]></Content>
<FuncFlag>{$o_arr}</FuncFlag>";
break;
case "image" :
$con .= "<Image>";
$con .= "<MediaId><![CDATA[{$value_arr[0]}]]></MediaId>";
$con .= "</Image>";
break;
case "voice" :
$con .= "<Voice>";
$con .= "<MediaId><![CDATA[{$value_arr[0]}]]></MediaId>";
$con .= "</Voice>";
break;
case "video" :
$con .= "<Video>";
$con .= "<MediaId><![CDATA[{$value_arr[0]}]]></MediaId>";
$con .= "<ThumbMediaId><![CDATA[{$value_arr[1]}]]></ThumbMediaId>";
$con .= "</Video>";
break;
case "music" :
$con .= "<Music>";
$con .= "<Title><![CDATA[{$value_arr[0]}]]></Title>";
$con .= "<Description><![CDATA[{$value_arr[1]}]]></Description>";
$con .= "<MusicUrl><![CDATA[{$value_arr[2]}]]></MusicUrl>";
$con .= "<HQMusicUrl><![CDATA[{$value_arr[3]}]]></HQMusicUrl>";
$con .= "<ThumbMediaId><![CDATA[{$value_arr[4]}]]></ThumbMediaId>";
$con .= "</Music>";
break;
case "news" :
$con .= "<ArticleCount>{$o_arr[0]}</ArticleCount>
<Articles>";
foreach($value_arr as $id => $v)
{
//判断数组数不超过设置数
if($id >= $o_arr[0])
break;
else
null;
$con .= "<item>
<Title><![CDATA[{$v[0]}]]></Title>
<Description><![CDATA[{$v[1]}]]></Description>
<PicUrl><![CDATA[{$v[2]}]]></PicUrl>
<Url><![CDATA[{$v[3]}]]></Url>
</item>";
}
$con .= "</Articles>
<FuncFlag>{$o_arr[1]}</FuncFlag>";
break;
}
//=================end return============
echo $con."</xml>";
}
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;
}
}
}
?>