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 = new mpweixin($this->config); //实例化对应的插件 } } /** * 服务器地址(用户消息和开发者需要的事件推送,会被转发到该URL中) */ public function index() { if ($this->is_check_signature) { $this->valid(); }else{ $this->class_obj->responseMsg(); } } /** * 开发者对签名(即signature)的效验,来判断此条消息的真实性 */ public function valid() { $echoStr = $this->checkSignature(); if($echoStr){ header('content-type:text'); exit($echoStr); } } /** * 验证是否来自于微信 * @return [type] [description] */ public function checkSignature() { //微信会发送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 { return false; } } } } ?>

PHP类文件 mpweixin.class.php

appid = $config['appid']; $this->secret = $config['secret']; } /* ----------------------------------响应----------------------------- */ /** * 响应消息 */ public function responseMsg() { $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 = "unknown msg type: ".$RX_TYPE; break; } $this->logger("T \r\n".$result); echo $result; }else { echo ""; exit; } } /* ----------------------------------接收----------------------------- */ /** * 接收事件消息 */ private function receiveEvent($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; }else if ($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 = "receive a new event: ".$object->Event; break; } if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($object,$content); }else if (isset($content['MusicUrl'])){ $result = $this->transmitMusic($object,$content); } }else{ $result = $this->transmitText($object,$content); } return $result; } /** * 接收文本消息 */ private function receiveText($object) { $keyword = trim($object->Content); //多客服人工回复模式 if (strstr($keyword,"请问在吗") || strstr($keyword,"在线客服")){ $result = $this->transmitService($object); return $result; } //自动回复模式 if (strstr($keyword,"文本")){ $content = "这是个文本消息"; }else if (strstr($keyword,"表情")){ $content = "中国:".$this->bytes_to_emoji(0x1F1E8).$this->bytes_to_emoji(0x1F1F3)."\n仙人掌:".$this->bytes_to_emoji(0x1F335); }else if (strstr($keyword,"单图文")){ $content = array(); $content[] = array("Title"=>"单图文标题","Description"=>"单图文内容","Url" =>"http://m.cnblogs.com/?u=txw1958";); }else if (strstr($keyword,"图文") || strstr($keyword,"多图文")){ $content = array(); $content[] = array("Title"=>"多图文1标题","Url" =>"http://m.cnblogs.com/?u=txw1958";); $content[] = array("Title"=>"多图文2标题","PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg";,"Url" =>"http://m.cnblogs.com/?u=txw1958";); $content[] = array("Title"=>"多图文3标题","PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg";,"音乐")){ $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-d H:i:s",time())."\nOpenID:".$object->FromUserName."\n技术支持 方倍工作室"; } if(is_array($content)){ if (isset($content[0])){ $result = $this->transmitNews($object,$content); } return $result; } /** * 接收图片消息 */ private function receiveImage($object) { $content = array("MediaId"=>$object->MediaId); $result = $this->transmitImage($object,$content); return $result; } /** * 接收位置消息 */ private function receiveLocation($object) { $content = "你发送的是位置,经度为:".$object->Location_Y.";纬度为:".$object->Location_X.";缩放级别为:".$object->Scale.";位置为:".$object->Label; $result = $this->transmitText($object,$content); return $result; } /** * 接收语音消息 */ private function receiveVoice($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; } /** * 接收视频消息 */ private function receiveVideo($object) { $content = array("MediaId"=>$object->MediaId,"ThumbMediaId"=>$object->ThumbMediaId,"Title"=>"","Description"=>""); $result = $this->transmitVideo($object,$content); return $result; } /** * 接收链接消息 */ private function receiveLink($object) { $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url; $result = $this->transmitText($object,$content); return $result; } /* ----------------------------------回复----------------------------- */ /** * 回复文本消息 */ private function transmitText($object,$content) { if (!isset($content) || empty($content)){ return ""; } $xmlTpl = " %s "; $result = sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$content); return $result; } /** * 回复多客服消息 */ private function transmitService($object) { $xmlTpl = " %s "; $result = sprintf($xmlTpl,time()); return $result; } /** * 回复图文消息 */ private function transmitNews($object,$newsArray) { if(!is_array($newsArray)){ return ""; } $itemTpl = " <![CDATA[%s]]> "; $item_str = ""; foreach ($newsArray as $item){ $item_str .= sprintf($itemTpl,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']); } $xmlTpl = " %s %s $item_str "; $result = sprintf($xmlTpl,count($newsArray)); return $result; } /** * 回复音乐消息 */ private function transmitMusic($object,$musicArray) { if(!is_array($musicArray)){ return ""; } $itemTpl = " <![CDATA[%s]]> "; $item_str = sprintf($itemTpl,$musicArray['Title'],$musicArray['Description'],$musicArray['MusicUrl'],$musicArray['HQMusicUrl']); $xmlTpl = " %s $item_str "; $result = sprintf($xmlTpl,time()); return $result; } /** * 回复图片消息 */ private function transmitImage($object,$imageArray) { $itemTpl = " "; $item_str = sprintf($itemTpl,$imageArray['MediaId']); $xmlTpl = " %s $item_str "; $result = sprintf($xmlTpl,time()); return $result; } /** * 回复语音消息 */ private function transmitVoice($object,$voiceArray) { $itemTpl = " "; $item_str = sprintf($itemTpl,$voiceArray['MediaId']); $xmlTpl = " %s $item_str "; $result = sprintf($xmlTpl,time()); return $result; } /** * 回复视频消息 */ private function transmitVideo($object,$videoArray) { $itemTpl = ""; $item_str = sprintf($itemTpl,$videoArray['MediaId'],$videoArray['ThumbMediaId'],$videoArray['Title'],$videoArray['Description']); $xmlTpl = " %s $item_str "; $result = sprintf($xmlTpl,time()); return $result; } /* ----------------------------------通用----------------------------- */ /** * 回复第三方接口消息 */ private function relayPart3($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,CURLOPT_POSTFIELDS,$rawData); $output = curl_exec($ch); curl_close($ch); return $output; } /** * 字节转Emoji表情 */ function bytes_to_emoji($cp) { if ($cp > 0x10000){ # 4 bytes return chr(0xF0 | (($cp & 0x1C0000) >> 18)).chr(0x80 | (($cp & 0x3F000) >> 12)).chr(0x80 | (($cp & 0xFC0) >> 6)).chr(0x80 | ($cp & 0x3F)); }else if ($cp > 0x800){ # 3 bytes return chr(0xE0 | (($cp & 0xF000) >> 12)).chr(0x80 | (($cp & 0xFC0) >> 6)).chr(0x80 | ($cp & 0x3F)); }else if ($cp > 0x80){ # 2 bytes return chr(0xC0 | (($cp & 0x7C0) >> 6)).chr(0x80 | ($cp & 0x3F)); }else{ # 1 byte return chr($cp); } } /** * 日志记录 */ private function logger($log_content) { if (isset($_SERVER['HTTP_APPNAME'])) { //SAE sae_set_display_errors(false); sae_debug($log_content); sae_set_display_errors(true); } else if ($_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-d H:i:s')." ".$log_content."\r\n",FILE_APPEND); } } /** * 获取access_token */ private function getAccessToken() { $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']; } public function get_contents($url){ $ch = curl_init(); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,TRUE); curl_setopt($ch,$url); $response = curl_exec($ch); curl_close($ch); //-------请求为空 if(empty($response)){ exit("50001"); } return $response; } } ?>

更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《

希望本文所述对大家PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


如何选择合适的 C++ Web 开发框架?
利用 C++ 框架构建高并发 Web 应用的策略
用 C++ 框架开发跨平台图形应用程序
golang框架中安全编码实践的最佳指南是什么?
golang框架与其他语言框架在设计理念上的区别有哪些?
C++ 图形框架与其他语言框架的比较
C++ 框架与其他 Web 开发框架的对比分析
使用 C++ 框架构建大型项目最佳实践
C++ 框架如何提高大型项目开发效率
C++ 框架中依赖注入的持续集成与部署工具
如何与社区协作和贡献到自定义 Golang 框架?
C++ 框架在大型项目中如何实现模块化开发
使用 C++ 框架开发跨平台 Web 应用
C++ 框架在大型项目中的优缺点
golang框架在性能上的优势体现在哪些方面?
C++ 框架在嵌入式系统内存优化中的优势
golang框架在人工智能与机器学习中的作用
如何扩展 Golang 框架以支持特定功能?
如何利用 Go Modules 和依赖项管理来自定义 Golang 框架?
Golang 框架中的性能优化技巧