微信公众类
微信公众平台类
微信公众平台类
<?php /** * 微信公众平台 PHP SDK 示例文件 * * @author NetPuter <netputer@gmail.com> */ require('../src/Wechat.php'); /** * 微信公众平台演示类 */ class MyWechat extends Wechat { /** * 用户关注时触发,回复「欢迎关注」 * * @return void */ protected function onSubscribe() { $this->responseText('欢迎关注'); } /** * 用户取消关注时触发 * * @return void */ protected function onUnsubscribe() { // 「悄悄的我走了,正如我悄悄的来;我挥一挥衣袖,不带走一片云彩。」 } /** * 收到文本消息时触发,回复收到的文本消息内容 * * @return void */ protected function onText() { $this->responseText('收到了文字消息:' . $this->getRequest('content')); } /** * 收到图片消息时触发,回复由收到的图片组成的图文消息 * * @return void */ protected function onImage() { $items = array( new NewsResponseItem('标题一', '描述一', $this->getRequest('picurl'), $this->getRequest('picurl')), new NewsResponseItem('标题二', '描述二', $this->getRequest('picurl'), $this->getRequest('picurl')), ); $this->responseNews($items); } /** * 收到地理位置消息时触发,回复收到的地理位置 * * @return void */ protected function onLocation() { $num = 1 / 0; // 故意触发错误,用于演示调试功能 $this->responseText('收到了位置消息:' . $this->getRequest('location_x') . ',' . $this->getRequest('location_y')); } /** * 收到链接消息时触发,回复收到的链接地址 * * @return void */ protected function onLink() { $this->responseText('收到了链接:' . $this->getRequest('url')); } /** * 收到未知类型消息时触发,回复收到的消息类型 * * @return void */ protected function onUnknown() { $this->responseText('收到了未知类型消息:' . $this->getRequest('msgtype')); } } $wechat = new MyWechat('weixin', TRUE); $wechat->run();
2. [文件] Wechat.php ~ 11KB 下载(69) 跳至 [1] [2] [全屏预览]
<?php /** * 微信公众平台 PHP SDK * * @author NetPuter <netputer@gmail.com> */ /** * 微信公众平台处理类 */ class Wechat { /** * 调试模式,将错误通过文本消息回复显示 * * @var boolean */ private $debug; /** * 以数组的形式保存微信服务器每次发来的请求 * * @var array */ private $request; /** * 初始化,判断此次请求是否为验证请求,并以数组形式保存 * * @param string $token 验证信息 * @param boolean $debug 调试模式,默认为关闭 */ public function __construct($token, $debug = FALSE) { if ($this->isValid() && $this->validateSignature($token)) { exit($_GET['echostr']); } $this->debug = $debug; set_error_handler(array(&$this, 'errorHandler')); // 设置错误处理函数,将错误通过文本消息回复显示 $xml = (array) simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'], 'SimpleXMLElement', LIBXML_NOCDATA); $this->request = array_change_key_case($xml, CASE_LOWER); // 将数组键名转换为小写,提高健壮性,减少因大小写不同而出现的问题 } /** * 判断此次请求是否为验证请求 * * @return boolean */ private function isValid() { return isset($_GET['echostr']); } /** * 判断验证请求的签名信息是否正确 * * @param string $token 验证信息 * @return boolean */ private function validateSignature($token) { $signature = $_GET['signature']; $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; $signatureArray = array($token, $timestamp, $nonce); sort($signatureArray); return sha1(implode($signatureArray)) == $signature; } /** * 获取本次请求中的参数,不区分大小 * * @param string $param 参数名,默认为无参 * @return mixed */ protected function getRequest($param = FALSE) { if ($param === FALSE) { return $this->request; } $param = strtolower($param); if (isset($this->request[$param])) { return $this->request[$param]; } return NULL; } /** * 用户关注时触发,用于子类重写 * * @return void */ protected function onSubscribe() {} /** * 用户取消关注时触发,用于子类重写 * * @return void */ protected function onUnsubscribe() {} /** * 收到文本消息时触发,用于子类重写 * * @return void */ protected function onText() {} /** * 收到图片消息时触发,用于子类重写 * * @return void */ protected function onImage() {} /** * 收到地理位置消息时触发,用于子类重写 * * @return void */ protected function onLocation() {} /** * 收到链接消息时触发,用于子类重写 * * @return void */ protected function onLink() {} /** * 收到未知类型消息时触发,用于子类重写 * * @return void */ protected function onUnknown() {} /** * 回复文本消息 * * @param string $content 消息内容 * @param integer $funcFlag 默认为0,设为1时星标刚才收到的消息 * @return void */ protected function responseText($content, $funcFlag = 0) { exit(new TextResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $content, $funcFlag)); } /** * 回复音乐消息 * * @param string $title 音乐标题 * @param string $description 音乐描述 * @param string $musicUrl 音乐链接 * @param string $hqMusicUrl 高质量音乐链接,Wi-Fi 环境下优先使用 * @param integer $funcFlag 默认为0,设为1时星标刚才收到的消息 * @return void */ protected function responseMusic($title, $description, $musicUrl, $hqMusicUrl, $funcFlag = 0) { exit(new MusicResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $title, $description, $musicUrl, $hqMusicUrl, $funcFlag)); } /** * 回复图文消息 * @param array $items 由单条图文消息类型 NewsResponseItem() 组成的数组 * @param integer $funcFlag 默认为0,设为1时星标刚才收到的消息 * @return void */ protected function responseNews($items, $funcFlag = 0) { exit(new NewsResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $items, $funcFlag)); } /** * 分析消息类型,并分发给对应的函数 * * @return void */ public function run() { switch ($this->getRequest('msgtype')) { case 'event': switch ($this->getRequest('event')) { case 'subscribe': $this->onSubscribe(); break; case 'unsubscribe': $this->onUnsubscribe(); break; } break; case 'text': $this->onText(); break; case 'image': $this->onImage(); break; case 'location': $this->onLocation(); break; case 'link': $this->onLink(); break; default: $this->onUnknown(); break; } } /** * 自定义的错误处理函数,将 PHP 错误通过文本消息回复显示 * @param int $level 错误代码 * @param string $msg 错误内容 * @param string $file 产生错误的文件 * @param int $line 产生错误的行数 * @return void */ protected function errorHandler($level, $msg, $file, $line) { if ( ! $this->debug) { return; } $error_type = array( // E_ERROR => 'Error', E_WARNING => 'Warning', // E_PARSE => 'Parse Error', E_NOTICE => 'Notice', // E_CORE_ERROR => 'Core Error', // E_CORE_WARNING => 'Core Warning', // E_COMPILE_ERROR => 'Compile Error', // E_COMPILE_WARNING => 'Compile Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning', E_USER_NOTICE => 'User Notice', E_STRICT => 'Strict', E_RECOVERABLE_ERROR => 'Recoverable Error', E_DEPRECATED => 'Deprecated', E_USER_DEPRECATED => 'User Deprecated', ); $template = <<<ERR PHP 报错啦! %s: %s File: %s Line: %s ERR; $this->responseText(sprintf($template, $error_type[$level], $msg, $file, $line )); } } /** * 用于回复的基本消息类型 */ abstract class WechatResponse { protected $toUserName; protected $fromUserName; protected $funcFlag; public function __construct($toUserName, $fromUserName, $funcFlag) { $this->toUserName = $toUserName; $this->fromUserName = $fromUserName; $this->funcFlag = $funcFlag; } abstract public function __toString(); } /** * 用于回复的文本消息类型 */ class TextResponse extends WechatResponse { protected $content; protected $template = <<<XML <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>%s<FuncFlag> </xml> XML; public function __construct($toUserName, $fromUserName, $content, $funcFlag = 0) { parent::__construct($toUserName, $fromUserName, $funcFlag); $this->content = $content; } public function __toString() { return sprintf($this->template, $this->toUserName, $this->fromUserName, time(), $this->content, $this->funcFlag ); } } /** * 用于回复的音乐消息类型 */ class MusicResponse extends WechatResponse { protected $title; protected $description; protected $musicUrl; protected $hqMusicUrl; protected $template = <<<XML <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <MusicUrl><![CDATA[%s]]></MusicUrl> <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> </Music> <FuncFlag>%s<FuncFlag> </xml> XML; public function __construct($toUserName, $fromUserName, $title, $description, $musicUrl, $hqMusicUrl, $funcFlag) { parent::__construct($toUserName, $fromUserName, $funcFlag); $this->title = $title; $this->description = $description; $this->musicUrl = $musicUrl; $this->hqMusicUrl = $hqMusicUrl; } public function __toString() { return sprintf($this->template, $this->toUserName, $this->fromUserName, time(), $this->title, $this->description, $this->musicUrl, $this->hqMusicUrl, $this->funcFlag ); } } /** * 用于回复的图文消息类型 */ class NewsResponse extends WechatResponse { protected $items = array(); protected $template = <<<XML <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles> %s </Articles> <FuncFlag>%s<FuncFlag> </xml>' XML; public function __construct($toUserName, $fromUserName, $items, $funcFlag) { parent::__construct($toUserName, $fromUserName, $funcFlag); $this->items = $items; } public function __toString() { return sprintf($this->template, $this->toUserName, $this->fromUserName, time(), count($this->items), implode($this->items), $this->funcFlag ); } } /** * 单条图文消息类型 */ class NewsResponseItem { protected $title; protected $description; protected $picUrl; protected $url; protected $template = <<<XML <item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> XML; public function __construct($title, $description, $picUrl, $url) { $this->title = $title; $this->description = $description; $this->picUrl = $picUrl; $this->url = $url; } public function __toString() { return sprintf($this->template, $this->title, $this->description, $this->picUrl, $this->url ); } }
精彩图集
精彩文章