本博文就月初剛上線的微信服務號,圖文進行總結分享給你們。html
去年年末,我所在的團隊討論要開發微信號,話題由此拉開:git
原來有一個3年前註冊的微信號,可是後臺操做沒法從「訂閱號」變動爲「服務號」,隨即找騰訊的客服溝通,客服還算是熱情,mm耐心的告之系統已經更新,對於沒法升級的微信號,只能從新註冊----「*#*(*¥)¥K30#$e&#)」,一陣抓狂後,只能從新註冊了,下面就開始從註冊到內部需求討論,到開發的圖文總結。算法
在微信公衆號官網:https://mp.weixin.qq.com,點擊註冊api
如上圖所示,微信號由郵箱註冊,每一個郵箱僅能申請一種賬號:服務號、訂閱號或企業號。瀏覽器
基本信息緩存
郵箱激活服務器
選擇類型微信
信息登記網絡
公衆號信息微信開發
這裏按照說明輸入公司信息便可,本次咱們選擇的是認證服務號的選項:
爲了認證服務號,須要支付300元/年,這個步驟稍微麻煩一些:財務打款、等待7個工做日、郵遞發票等。
須要注意的是,微信的認證不是騰訊官方,是其委託方的第三方,這個剛開始的時候還比較差別。
在完成後的認證後,認證信息以下(略過中間掃描公司的營業執照、掃描蓋公章的認證協議等細節):
微信開發和學習使用ComponentOne控件同樣,須要作第一件事件是看微信官方的文檔、API、demo樣例代碼,這樣能極大減小走彎路的風險。
備註:原計劃看幾本熱銷的微信開發書籍,後來由於時間緣由放棄了。
登錄微信後臺,點擊左側的「開發者中心」,右側出現的「開發者文檔」、「在線接口調試工具」便是微信官方提供的文檔和API利器,在開發過程當中,會反覆、屢次使用,這2個是很是重要的資料。
在公衆號「開發者中心」中,把AppID和AppSecret記下來,後面會屢次用到。
微信的官方文檔,首先從上往下通讀一遍:
在文檔的開始,微信官方就提供了PHP示例代碼,下載地址。 且其明確的告之,微信公衆號接口只支持80接口.
官方文檔寫的很是細,如獲取access token是基於HTTP請求,用的是GET方式,其餘的文檔請直接參閱文檔:
access_token是公衆號的全局惟一票據,公衆號調用各接口時都需使用access_token。開發者須要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將致使上次獲取的access_token失效。
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
備註:access_token的有效時間是7200s,既須要自行作一個緩存,2小時刷新一次access_token; 我在這裏用的是文件的緩存方式,添加了時間戳。
這節,咱們着手搭建環境。
首先選擇http://git.oschina.net 搭建源碼託管環境,OSC提供了免費的私有項目,配合使用TortoiseGit-1.8.11.0-64bit,使得搭建源碼託管環境很是簡單。另外,其在國內訪問Git速度超快(贊一個!)
接着安裝軟件,配置電腦開發環境:
Windows 8.1 64位 中文版
JetBrains PhpStorm 8.0.2
SQL Server 2008
PHP 5
爲了方便測試,和公司網管溝通,把微信的***.gcpowertools.com.cn/ 80端口映射到個人局域網電腦。過後證實,這種本地調試方法很是高效,極大了提升了開發、調試效率。最後,爲了方便調試微信數據,須要寫log進行日誌呈現,這裏我使用的是讀寫文件的方式。
function writeLogBegin($msg = "begin log..............")
{
$logFile = date('Y-m-d') . '.txt';
$msg = date('Y-m-d H:i:s') . ' >>> ' . $msg . "\r\n";
file_put_contents("c:\\log.txt", $msg);
}
首先,結合業務特色,規劃微信底部的自定義菜單。
小技巧:自定義菜單不用寫代碼,用微信官方自帶的調試頁面便可完成。
規劃好自定義菜單後,POST JSON到微信服務器,可直接使用微信公衆平臺接口調試工具。
保存生成的access_token, 相似以下的文本:
vU2rq8nzdXZWmcS3jO1OAZzRL5dnm3OIlsPF8ZCKHkTGfrG8f87QpwYa4mBpkTvnuy0pQJsfyq_L5xLIqPSoIBIqdsVAaKOuEgBrPpQ4
接着選擇「自定義菜單」,輸入剛纔保存的access_token,輸入以下的JSON字符串:
{
"button":[
{
"name":"學習中心",
"sub_button":[
{
"type":"click",
"name":"聯繫葡萄城",
"key":"101"
}]},
{
"name":"個人服務",
"sub_button":[
{
"type": "view",
"name": "最新動態",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9665cf3fcdaee2f1&redirect_uri=http://www.gcpowertools.com.cn&response_type=code&scope=snsapi_base&state=118#wechat_redirect"
},
{
"type": "view",
"name":"最新版本",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9665cf3fcdaee2f1&redirect_uri=http://www.gcpowertools.com.cn&response_type=code&scope=snsapi_base&state=118#wechat_redirect"
},
{
"type":"click",
"name":"金牌服務查詢",
"key":"102"
},
{
"type":"click",
"name":"金牌服務條款",
"key":"103"
}]
},
{
"name":"GCDN社區",
"sub_button":[
{
"type":"click",
"name":"每日簽到",
"key":"104"
},
{
"type":"click",
"name":"信息查詢",
"key":"105"
},
{
"type":"click",
"name":"個人帖子",
"key":"106"
},
{
"type":"click",
"name":"熱門問答",
"key":"107"
},
{"type":"view",
"name":"禮品兌換",
"url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9665cf3fcdaee2f1&redirect_uri=http://www.gcpowertools.com.cn&response_type=code&scope=snsapi_base&state=118#wechat_redirect"
}]
}]
}
備註:建立自定義菜單後,因爲微信客戶端緩存,須要24小時微信客戶端纔會展示出來。建議測試時能夠嘗試取消關注公衆帳號後再次關注,則能夠看到建立後的效果。
接着,咱們進行核心的功能開發。
微信服務號的核心圍繞GCDN社區,故「GCDN社區」子菜單有5個二級菜單,其中每日簽到、信息查詢、個人帖子、禮品兌換功能須要首先綁定本身的GCDN帳號GCDN帳號。
依據上面的邏輯,綁定GCDN帳號是前提環節,故須要開發綁定功能。 綁定功能,作了一個頁面,經過a標籤跳轉,用戶在輸入用戶名、密碼後進行GCDN鑑權驗證,驗證經過存儲在表:包含GCDN ID、微信的OpenID,既完成帳號綁定。
後面的多個功能,經過這個表,可從微信的OpenID得到GCDN ID,繼而可使用GCDN論壇中的我的信息。
每日簽到功能
打開論壇頁面,在底部可看到目前GCDN使用的引擎較早,是Discuz!NT 3.6.711版本,故X3.1版本中時尚的簽到功能是沒有的。針對這個遺憾,本次微信開發作了彌補:用戶可經過微信的簽到完成這個功能。
GCDN回帖微信通知
這是另一個特點功能:無需操做,只須要綁定GCDN帳號,當你在GCDN的發帖有人回覆時,會自動收到微信通知。
這個功能的開發,主要是爲了還GCDNer的一個期待:在《2013年葡萄城控件用戶滿意度調查》,論壇用戶對此類功能呼聲很高,「謝謝大家的努力和盡職盡責,我但願GCDN回帖及時些,最好有及時的短信通知功能,省的我時不時的刷新GCDN頁面,催促大家!」--某GCDN用戶。
實現思路以下圖所示:
微信通知用戶,剛開始想的是文本通知,結果發現微信公衆號的政策:若是用戶未在24小時內主動和微信互動,則沒法用文本通知用戶。想到另一個變通的辦法,各大銀行的餘額動態通知功能。接着仔細找微信提供的功能,原來這種功能是「微信模板消息」。
這段文檔關於微信的模板消息寫的很詳細:
爲了保證用戶不受到騷擾,在開發者出現須要主動提醒、通知用戶時,才容許開發者在公衆平臺網站中模板消息庫中選擇模板,選擇後得到模板ID,再根據模板ID向用戶主動推送提醒、通知消息。
約花了半天時間,開發出的功能效果看起來還不錯(用戶是否在24小時內主動聯繫,都可發送模板消息),截圖以下:
如想配置這個功能,經過回覆文字指令。
回覆"取消提醒": 自動關閉微信通知提醒
回覆"開通提醒":自動開通微信通知提醒(須要你綁定GCDN帳號)
上面的開發過程,用到的PHP的 curl 實現HTTP GET、POST請求的源碼:
/** * @param $url * @param null $data * @return mixed */ function https_request($url, $data = null) { // 模擬提交數據函數 $curl = curl_init(); // 啓動一個CURL會話 curl_setopt($curl, CURLOPT_URL, $url); // 要訪問的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 從證書中檢查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模擬用戶使用的瀏覽器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自動跳轉 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自動設置Referer if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); // 發送一個常規的Post請求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的數據包 } curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 設置超時限制防止死循環 curl_setopt($curl, CURLOPT_HEADER, 0); // 顯示返回的Header區域內容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 獲取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 執行操做 if (curl_errno($curl)) { echo 'Errno' . curl_error($curl);//捕抓異常 } curl_close($curl); // 關閉CURL會話 return $tmpInfo; // 返回數據 }
//使用網絡代理begin curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_PROXY, '192.168.0.1'); //替換代理地址 curl_setopt($curl, CURLOPT_PROXYPORT, '880'); //替換代理端口 curl_setopt($curl, CURLOPT_PROXYTYPE, 'HTTP'); curl_setopt($curl, CURLOPT_PROXYUSERPWD, 'grapecity/r:r'); //替換代理用戶名 //使用網絡代理end
近2個月的開發時間,投入了約1.5人,粗略估算有3我的月開發投入。
少數的幾回非控件業務的研發,主要爲了方便GCDN社區用戶的使用,橋接微信、GCDN。
選擇使用PHP腳本語言不錯,微信官方用PHP做爲默認微信開發腳本,另外PHP開發微信的博客很是多。
完整項目經驗很重要:「坑纔是大愛!」
坑的定義:有時候沒有問題,有時候有問題。100%有問題的,不叫坑,叫bug。
Git利器: 協做開發,牛!
include_onece 路徑錯誤這個坑,PHPStorm提供了足夠的智能感知,要重視。
include_onece 路徑用單引號,不要用雙引號
團隊合力:人心齊、泰山移。微信功能的迭代,是一點一點溝通出來的。
小夥伴們,有微信的不妨掃一掃,看看你們還有啥需求,咱們接着開發、寫博客吧:
關注微信綁定GCDN帳號,有GCDN勳章喲!