PHP封装的微信公众平台接口开发操作类完整示例
本文实例讲述了PHP封装的微信公众平台接口开发操作类。分享给大家供大家参考,具体如下:
示例调用index.php
config=array('appid'=>'dfdfdfdfdf','secret'=>'343434343434');
$echostr=isset($_GET['echostr'])?$_GET['echostr']:'';//是否来自于微信的服务器配置验证
if($echostr){
$this->is_check_signature=true;
}else{
$this->is_check_signature=false;
include_once"mpweixin.class.php";
$this->class_obj=newmpweixin($this->config);//实例化对应的插件
}
}
/**
*服务器地址(用户消息和开发者需要的事件推送,会被转发到该URL中)
*/
publicfunctionindex()
{
if($this->is_check_signature){
$this->valid();
}else{
$this->class_obj->responseMsg();
}
}
/**
*开发者对签名(即signature)的效验,来判断此条消息的真实性
*/
publicfunctionvalid()
{
$echoStr=$this->checkSignature();
if($echoStr){
header('content-type:text');
exit($echoStr);
}
}
/**
*验证是否来自于微信
*@return[type][description]
*/
publicfunctioncheckSignature()
{
//微信会发送4个参数到我们的服务器后台签名时间戳随机字符串随机数
$signature=$_GET['signature'];//签名
$timestamp=$_GET['timestamp'];//时间戳
$echoStr=$_GET['echostr'];//随机字符串
$nonce=$_GET['nonce'];//随机数
if($signature&&$timestamp&&$echoStr&&$nonce){
//微信公众号基本配置中的token
$token=TOKEN;
//将token、timestamp、nonce按字典序排序
$tmpArr=array($token,$timestamp,$nonce);
sort($tmpArr,SORT_STRING);
//将三个参数字符串拼接成一个字符串进行sha1加密
$tmpStr=implode($tmpArr);
$tmpStr=sha1($tmpStr);
//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if($tmpStr==$signature){
return$echoStr;
}else{
returnfalse;
}
}
}
}
?>
PHP类文件mpweixin.class.php
appid=$config['appid'];
$this->secret=$config['secret'];
}
/*----------------------------------响应-----------------------------*/
/**
*响应消息
*/
publicfunctionresponseMsg()
{
$postStr=file_get_contents("php://input");
if(!empty($postStr)){
$this->logger("R\r\n".$postStr);
$postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$RX_TYPE=trim($postObj->MsgType);
switch($RX_TYPE)
{
//事件
case"event":
$result=$this->receiveEvent($postObj);
break;
//文本
case"text":
if(strstr($postObj->Content,"第三方")){
$result=$this->relayPart3("http://www.fangbei.org/test.php".'?'.$_SERVER['UERY_STRING';],$postStr);
}else{
$result=$this->receiveText($postObj);
}
break;
//图片
case"image":
$result=$this->receiveImage($postObj);
break;
//地理位置
case"location":
$result=$this->receiveLocation($postObj);
break;
//语音
case"voice":
$result=$this->receiveVoice($postObj);
break;
//视频
case"video":
$result=$this->receiveVideo($postObj);
break;
//链接
case"link":
$result=$this->receiveLink($postObj);
break;
default:
$result="unknownmsgtype:".$RX_TYPE;
break;
}
$this->logger("T\r\n".$result);
echo$result;
}else{
echo"";
exit;
}
}
/*----------------------------------接收-----------------------------*/
/**
*接收事件消息
*/
privatefunctionreceiveEvent($object)
{
$content="";
switch($object->Event)
{
//关注时的事件推送
case"subscribe":
$content="欢迎关注方倍工作室";
$content.=(!empty($object->EventKey))?("\n来自二维码场景".str_replace("qrscene_","",$object->EventKey)):"";
break;
//取消关注事件
case"unsubscribe":
$content="取消关注";
break;
//点击菜单拉取消息时的事件推送
case"CLICK":
switch($object->EventKey)
{
case"COMPANY":
$content=array();
$content[]=array("Title"=>"方倍工作室","Description"=>"","PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg";,"Url"=>"http://m.cnblogs.com/?u=txw1958";);
break;
default:
$content="点击菜单:".$object->EventKey;
break;
}
break;
//点击菜单跳转链接时的事件推送
case"VIEW":
$content="跳转链接".$object->EventKey;
break;
//扫描带参数二维码场景,用户已关注时的事件推送
case"SCAN":
$content="扫描场景".$object->EventKey;
break;
//上报地理位置事件
case"LOCATION":
$content="上传位置:纬度".$object->Latitude.";经度".$object->Longitude;
break;
//扫码推事件且弹出“消息接收中”提示框的事件推送
case"scancode_waitmsg":
if($object->ScanCodeInfo->ScanType=="qrcode"){
$content="扫码带提示:类型二维码结果:".$object->ScanCodeInfo->ScanResult;
}elseif($object->ScanCodeInfo->ScanType=="barcode"){
$codeinfo=explode(",",strval($object->ScanCodeInfo->ScanResult));
$codeValue=$codeinfo[1];
$content="扫码带提示:类型条形码结果:".$codeValue;
}else{
$content="扫码带提示:类型".$object->ScanCodeInfo->ScanType."结果:".$object->ScanCodeInfo->ScanResult;
}
break;
//扫码推事件的事件推送
case"scancode_push":
$content="扫码推事件";
break;
//弹出系统拍照发图的事件推送
case"pic_sysphoto":
$content="系统拍照";
break;
//弹出微信相册发图器的事件推送
case"pic_weixin":
$content="相册发图:数量".$object->SendPicsInfo->Count;
break;
//弹出拍照或者相册发图的事件推送
case"pic_photo_or_album":
$content="拍照或者相册:数量".$object->SendPicsInfo->Count;
break;
//弹出地理位置选择器的事件推送
case"location_select":
$content="发送位置:标签".$object->SendLocationInfo->Label;
break;
default:
$content="receiveanewevent:".$object->Event;
break;
}
if(is_array($content)){
if(isset($content[0]['PicUrl'])){
$result=$this->transmitNews($object,$content);
}elseif(isset($content['MusicUrl'])){
$result=$this->transmitMusic($object,$content);
}
}else{
$result=$this->transmitText($object,$content);
}
return$result;
}
/**
*接收文本消息
*/
privatefunctionreceiveText($object)
{
$keyword=trim($object->Content);
//多客服人工回复模式
if(strstr($keyword,"请问在吗")||strstr($keyword,"在线客服")){
$result=$this->transmitService($object);
return$result;
}
//自动回复模式
if(strstr($keyword,"文本")){
$content="这是个文本消息";
}elseif(strstr($keyword,"表情")){
$content="中国:".$this->bytes_to_emoji(0x1F1E8).$this->bytes_to_emoji(0x1F1F3)."\n仙人掌:".$this->bytes_to_emoji(0x1F335);
}elseif(strstr($keyword,"单图文")){
$content=array();
$content[]=array("Title"=>"单图文标题","Description"=>"单图文内容","PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg";,"Url"=>"http://m.cnblogs.com/?u=txw1958";);
}elseif(strstr($keyword,"图文")||strstr($keyword,"多图文")){
$content=array();
$content[]=array("Title"=>"多图文1标题","Description"=>"","PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg";,"Url"=>"http://m.cnblogs.com/?u=txw1958";);
$content[]=array("Title"=>"多图文2标题","Description"=>"","PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg";,"Url"=>"http://m.cnblogs.com/?u=txw1958";);
$content[]=array("Title"=>"多图文3标题","Description"=>"","PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg";,"Url"=>"http://m.cnblogs.com/?u=txw1958";);
}elseif(strstr($keyword,"音乐")){
$content=array();
$content=array("Title"=>"最炫民族风","Description"=>"歌手:凤凰传奇","MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3";,"HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3";);
}else{
$content=date("Y-m-dH:i:s",time())."\nOpenID:".$object->FromUserName."\n技术支持方倍工作室";
}
if(is_array($content)){
if(isset($content[0])){
$result=$this->transmitNews($object,$content);
}elseif(isset($content['MusicUrl'])){
$result=$this->transmitMusic($object,$content);
}
}else{
$result=$this->transmitText($object,$content);
}
return$result;
}
/**
*接收图片消息
*/
privatefunctionreceiveImage($object)
{
$content=array("MediaId"=>$object->MediaId);
$result=$this->transmitImage($object,$content);
return$result;
}
/**
*接收位置消息
*/
privatefunctionreceiveLocation($object)
{
$content="你发送的是位置,经度为:".$object->Location_Y.";纬度为:".$object->Location_X.";缩放级别为:".$object->Scale.";位置为:".$object->Label;
$result=$this->transmitText($object,$content);
return$result;
}
/**
*接收语音消息
*/
privatefunctionreceiveVoice($object)
{
if(isset($object->Recognition)&&!empty($object->Recognition)){
$content="你刚才说的是:".$object->Recognition;
$result=$this->transmitText($object,$content);
}else{
$content=array("MediaId"=>$object->MediaId);
$result=$this->transmitVoice($object,$content);
}
return$result;
}
/**
*接收视频消息
*/
privatefunctionreceiveVideo($object)
{
$content=array("MediaId"=>$object->MediaId,"ThumbMediaId"=>$object->ThumbMediaId,"Title"=>"","Description"=>"");
$result=$this->transmitVideo($object,$content);
return$result;
}
/**
*接收链接消息
*/
privatefunctionreceiveLink($object)
{
$content="你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;
$result=$this->transmitText($object,$content);
return$result;
}
/*----------------------------------回复-----------------------------*/
/**
*回复文本消息
*/
privatefunctiontransmitText($object,$content)
{
if(!isset($content)||empty($content)){
return"";
}
$xmlTpl="
%s
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$content);
return$result;
}
/**
*回复多客服消息
*/
privatefunctiontransmitService($object)
{
$xmlTpl="
%s
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time());
return$result;
}
/**
*回复图文消息
*/
privatefunctiontransmitNews($object,$newsArray)
{
if(!is_array($newsArray)){
return"";
}
$itemTpl="-
";
$item_str="";
foreach($newsArrayas$item){
$item_str.=sprintf($itemTpl,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
}
$xmlTpl="
%s
%s
$item_str
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),count($newsArray));
return$result;
}
/**
*回复音乐消息
*/
privatefunctiontransmitMusic($object,$musicArray)
{
if(!is_array($musicArray)){
return"";
}
$itemTpl="
";
$item_str=sprintf($itemTpl,$musicArray['Title'],$musicArray['Description'],$musicArray['MusicUrl'],$musicArray['HQMusicUrl']);
$xmlTpl="
%s
$item_str
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time());
return$result;
}
/**
*回复图片消息
*/
privatefunctiontransmitImage($object,$imageArray)
{
$itemTpl="
";
$item_str=sprintf($itemTpl,$imageArray['MediaId']);
$xmlTpl="
%s
$item_str
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time());
return$result;
}
/**
*回复语音消息
*/
privatefunctiontransmitVoice($object,$voiceArray)
{
$itemTpl="
";
$item_str=sprintf($itemTpl,$voiceArray['MediaId']);
$xmlTpl="
%s
$item_str
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time());
return$result;
}
/**
*回复视频消息
*/
privatefunctiontransmitVideo($object,$videoArray)
{
$itemTpl="";
$item_str=sprintf($itemTpl,$videoArray['MediaId'],$videoArray['ThumbMediaId'],$videoArray['Title'],$videoArray['Description']);
$xmlTpl="
%s
$item_str
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time());
return$result;
}
/*----------------------------------通用-----------------------------*/
/**
*回复第三方接口消息
*/
privatefunctionrelayPart3($url,$rawData)
{
$headers=array("Content-Type:text/xml;charset=utf-8");
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$rawData);
$output=curl_exec($ch);
curl_close($ch);
return$output;
}
/**
*字节转Emoji表情
*/
functionbytes_to_emoji($cp)
{
if($cp>0x10000){#4bytes
returnchr(0xF0|(($cp&0x1C0000)>>18)).chr(0x80|(($cp&0x3F000)>>12)).chr(0x80|(($cp&0xFC0)>>6)).chr(0x80|($cp&0x3F));
}elseif($cp>0x800){#3bytes
returnchr(0xE0|(($cp&0xF000)>>12)).chr(0x80|(($cp&0xFC0)>>6)).chr(0x80|($cp&0x3F));
}elseif($cp>0x80){#2bytes
returnchr(0xC0|(($cp&0x7C0)>>6)).chr(0x80|($cp&0x3F));
}else{#1byte
returnchr($cp);
}
}
/**
*日志记录
*/
privatefunctionlogger($log_content)
{
if(isset($_SERVER['HTTP_APPNAME'])){//SAE
sae_set_display_errors(false);
sae_debug($log_content);
sae_set_display_errors(true);
}elseif($_SERVER['REMOTE_ADDR']!="127.0.0.1"){//LOCAL
$max_size=1000000;
$log_filename="mpweixin.log.xml";
if(file_exists($log_filename)and(abs(filesize($log_filename))>$max_size)){
unlink($log_filename);
}
file_put_contents($log_filename,date('Y-m-dH:i:s')."".$log_content."\r\n",FILE_APPEND);
}
}
/**
*获取access_token
*/
privatefunctiongetAccessToken()
{
$token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=";.$this->appid."&secret=".$this->secret;
$response=$this->get_contents($token_url);
$params=array();
$params=json_decode($response,true);
if(isset($params['errcode']))
{
echo"error:
".$params['errcode'];
echo"msg:
".$params['errmsg'];
exit;
}
return$params['access_token'];
}
publicfunctionget_contents($url){
$ch=curl_init();
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_URL,$url);
$response=curl_exec($ch);
curl_close($ch);
//-------请求为空
if(empty($response)){
exit("50001");
}
return$response;
}
}
?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP微信开发技巧汇总》、《PHP编码与转码操作技巧汇总》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。