最近公司用到了微信公眾平臺,所以研究了一下微信公眾號的開發技術,總體來說比較簡單,結合現有的平臺核技術,實現起來非常方便。
首先先來了解一下微信公眾平臺。
“微信,是一個生活方式”,這是微信的自我評價,是不是覺得如果那天不在朋友圈里分享一下自己的最新狀態,并且收到幾個贊和評價的話,會覺得空虛寂寞呢?它實實在在的改變了我們的生活方式。
“微信,也是一個生意方式”,在微信成為我們日常必備之app的同時,它同樣具備巨大的的商業或許不應該稱為潛力,因為有很多人已經獲利,名人們在微信上開設公眾賬戶來吸金,商家來做推廣,服務行業借此拓展渠道,甚至微信已經支持支付了, 還有越來越的自媒體在微信平臺涌現出來。這篇文章就是介紹如何快速的成為公眾平臺開發者,由于個人只能申請訂閱號,因此本文是以訂閱號為例。關于訂閱號和服務號的區別,請參見微信公眾平臺服務號、訂閱號的相關說明。
從微信用戶角度簡單來說:
訂閱號主要用于信息輻射,典型的如各家新聞媒體。服務號主要由于自助服務,典型的如招商銀行。
申請公眾平臺賬戶



關于微信公眾帳號注冊的步驟就不再多說了,可以找到大量的圖文教程。
帳號注冊成功之后,需要驗證自己的服務器,如果你沒有自己的服務器,那可以用新浪SAE或者百度BAE,本文采用的是新浪SAE平臺來搭建服務器。
注冊過程略,使用新浪SAE創建應用,可以選擇應用開發框架,選項中有比較熱門的開發框架,選擇微信公眾平臺phpSDK,點擊后跳轉到介紹頁面,點擊安裝框架,系統會生成一個搭建好的微信公眾平臺應用,為了方便開發,我們可以使用svn來管理此應用代碼,關于svn搭建可參見sae代碼部署手冊。
使用新浪SAE是比較方便的,如果我們有自己的服務器,可以把代碼clone到自己的服務器上,下面來看一下代碼
首先定義一個Wechat的基類
1 <?php 2 /** 3 * 微信公眾平臺 PHP SDK 4 * 5 * @author hanc <congcongsky2010@Gmail.com> 6 */ 7 8 /** 9 * 微信公眾平臺處理類 10 */ 11 class Wechat { 12 13 /** 14 * 調試模式,將錯誤通過文本消息回復顯示 15 * 16 * @var boolean 17 */ 18 PRivate $debug; 19 20 /** 21 * 以數組的形式保存微信服務器每次發來的請求 22 * 23 * @var array 24 */ 25 private $request; 26 27 /** 28 * 初始化,判斷此次請求是否為驗證請求,并以數組形式保存 29 * 30 * @param string $token 驗證信息 31 * @param boolean $debug 調試模式,默認為關閉 32 */ 33 public function __construct($token, $debug = FALSE) { 34 if ($this->isValid() && $this->validateSignature($token)) { 35 exit($_GET['echostr']); 36 } 37 38 $this->debug = $debug; 39 set_error_handler(array(&$this, 'errorHandler')); 40 // 設置錯誤處理函數,將錯誤通過文本消息回復顯示 41 42 $xml = (array) simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'], 'SimpleXMLElement', LIBXML_NOCDATA); 43 44 $this->request = array_change_key_case($xml, CASE_LOWER); 45 // 將數組鍵名轉換為小寫,提高健壯性,減少因大小寫不同而出現的問題 46 } 47 48 /** 49 * 判斷此次請求是否為驗證請求 50 * 51 * @return boolean 52 */ 53 private function isValid() { 54 return isset($_GET['echostr']); 55 } 56 57 /** 58 * 判斷驗證請求的簽名信息是否正確 59 * 60 * @param string $token 驗證信息 61 * @return boolean 62 */ 63 private function validateSignature($token) { 64 $signature = $_GET['signature']; 65 $timestamp = $_GET['timestamp']; 66 $nonce = $_GET['nonce']; 67 68 $signatureArray = array($token, $timestamp, $nonce); 69 sort($signatureArray); 70 71 return sha1(implode($signatureArray)) == $signature; 72 } 73 74 /** 75 * 獲取本次請求中的參數,不區分大小 76 * 77 * @param string $param 參數名,默認為無參 78 * @return mixed 79 */ 80 protected function getRequest($param = FALSE) { 81 if ($param === FALSE) { 82 return $this->request; 83 } 84 85 $param = strtolower($param); 86 87 if (isset($this->request[$param])) { 88 return $this->request[$param]; 89 } 90 91 return NULL; 92 } 93 94 /** 95 * 用戶關注時觸發,用于子類重寫 96 * 97 * @return void 98 */ 99 protected function onSubscribe() {}100 101 /**102 * 用戶取消關注時觸發,用于子類重寫103 *104 * @return void105 */106 protected function onUnsubscribe() {}107 108 /**109 * 用戶自動上報地理位置觸發,用于子類重寫110 *111 * @return void112 */113 protected function onAutoloaction() {}114 115 /**116 * 用戶點擊菜單時觸發,用于子類重寫117 *118 * @return void119 */120 protected function onClick() {}121 122 /**123 * 用戶點擊跳轉鏈接時觸發,用于子類重寫124 *125 * @return void126 */127 protected function onView() {}128 129 /**130 * 收到文本消息時觸發,用于子類重寫131 *132 * @return void133 */134 protected function onText() {}135 136 /**137 * 收到圖片消息時觸發,用于子類重寫138 *139 * @return void140 */141 protected function onImage() {}142 143 /**144 * 收到地理位置消息時觸發,用于子類重寫145 *146 * @return void147 */148 protected function onLocation() {}149 150 /**151 * 收到鏈接消息時觸發,用于子類重寫152 *153 * @return void154 */155 protected function onLink() {}156 /**157 * 收到語音消息時觸發,用于子類重寫158 *159 * @return void160 */161 protected function onVoice() {}162 163 /**164 * 收到未知類型消息時觸發,用于子類重寫165 *166 * @return void167 */168 protected function onUnknown() {}169 170 /**171 * 回復文本消息172 *173 * @param string $content 消息內容174 * @param integer $funcFlag 默認為0,設為1時星標剛才收到的消息175 * @return void176 */177 protected function responseText($content, $funcFlag = 0) {178 exit(new TextResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $content, $funcFlag));179 }180 181 /**182 * 回復音樂消息183 *184 * @param string $title 音樂標題185 * @param string $description 音樂描述186 * @param string $musicUrl 音樂鏈接187 * @param string $hqMusicUrl 高質量音樂鏈接,Wi-Fi 環境下優先使用188 * @param integer $funcFlag 默認為0,設為1時星標剛才收到的消息189 * @return void190 */191 protected function responseMusic($title, $description, $musicUrl, $hqMusicUrl, $funcFlag = 0) {192 exit(new MusicResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $title, $description, $musicUrl, $hqMusicUrl, $funcFlag));193 }194 195 /**196 * 回復圖文消息197 * @param array $items 由單條圖文消息類型 NewsResponseItem() 組成的數組198 * @param integer $funcFlag 默認為0,設為1時星標剛才收到的消息199 * @return void200 */201 protected function responseNews($items, $funcFlag = 0) {202 exit(new NewsResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $items, $funcFlag));203 }204 /**205 * 回復語音識別消息206 * @param array $recognition 系統接收到語音后識別的字符串207 * @param integer $funcFlag 默認為0,設為1時星標剛才收到的消息208 * @return void209 */210 protected function responseVoice($recognition, $funcFlag = 0) {211 exit(new TextResponse($this->getRequest('fromusername'), $this->getRequest('tousername'), $recognition, $funcFlag));212 }213 214 /**215 * 分析消息類型,并分發給對應的函數216 *217 * @return void218 */219 public function run() {220 switch ($this->getRequest('msgtype')) {221 222 case 'event':223 switch ($this->getRequest('event')) {224 225 case 'subscribe':226 $this->onSubscribe();227 break;228 229 case 'unsubscribe':230 $this->onUnsubscribe();231 break;232 233 case 'LOCATION':234 $this->onAutoloaction();235 break;236 237 case 'CLICK':238 $this->onClick();239 break;240 241 case 'VIEW':242 $this->onView();243 b
新聞熱點
疑難解答