微信教程跳票很久了,今天總算更新一章,把通信錄這個案例完結掉,以前幾章有很多朋友反映寫的過於詳細了,你們可能更多的是須要一些思路和方法,因此我此次是將通信錄完整代碼提供下載,回覆「微信代碼」能夠下載完整代碼包,建議先下載安裝了再看文章,如下是注意事項:php
數據庫結構有改動,你們能夠將原來的數據庫刪除後從新建立,建立方法請查看《微信公衆平臺入門到精通》Vol.15,新數據庫建立代碼在weixincourse.txt裏。前端
與微信接口文件爲wx_interface.php,你們能夠將裏面源代碼複製粘貼到本身的接口文件裏覆蓋掉。web
其餘的文件所有上傳到SAE的代碼編輯裏,有同名文件能夠先刪除原來文件再上傳。數據庫
文件說明:segmentfault
base-class.php 自定義函數,無需改動
class_add.php 添加部門,無需改動
class_manager.php 部門管理,無需改動
roster_add.php 添加員工,須要改動118行的Storage空間名稱
roster_manager.php 員工管理
detail.php 前端查看員工詳情,無需改動
list.php 前端查看部門列表,無需改動
wx_tpl.php 回覆消息的模板,無需改動
wx_interface.php 微信接口文件,根據本身實際修更名稱數組
後臺文件沒有加樣式文件,因此看起來會很簡陋,我主要是講開發方法,CSS雖然我也很強,可是不在教程範疇裏,有想學的能夠本身找些網頁模板。緩存
程序沒有進行優化,其實不少均可以用過程來寫,可是爲了讓你們更好理解,就不厭其煩的寫下吧……微信
昨天有很多朋友在問如何測試不知道如何綁定帳號,具體步驟是先在後臺添加一個員工,而後在微信公衆帳號里根據提示將添加的員工信息輸入完成綁定,如圖添加一個員工:
微信公衆平臺
首先回答有些朋友的疑問爲何要作通信錄案例?這個案例貌似沒有什麼價值,確實從現實使用來看這個案例真沒啥價值,但我是但願經過這個案例教你們學會數據庫的使用、後臺的開發、微信帳號綁定、微信搜索、記錄翻頁等一些基本方法,而後能夠結合本身的實際需求來作開發。函數
在添加員工文件(roster_add.php)中有一個圖片上傳功能,圖片上傳在表單裏是使用input控件的file屬性,以下圖:
當提交表單後,程序會收到一個名稱爲roster_pic的文件變量,文件變量獲取是用$_FILES,而不是$_GET或$_POST,以下圖:
第97行是監測是否有選擇文件,$_FILES['roster_pic']['name']是上傳文件的原始文件名。
第103到105行獲取上傳文件名的後綴
第107到111行監測後綴是否合法。
第118行是保存圖片到Storage裏並返回上傳後的圖片實際路徑賦值給$old_roster_pic。
注意:
1. 上傳文件的數據會保存成一個臨時文件,web是不能直接訪問用戶電腦文件的,因此咱們讀取的源文件是$_FILES['roster_pic']['tmp_name'] 。
微信用戶的帳號如何與本身網站的用戶系統打通,這個是不少人關心的問題,其實很簡單,咱們都知道微信用戶在關注公衆號或者發送消息時都會有一個惟一的OPENID傳過來,這個OPENID就是這個用戶對應這個公衆帳號的惟一身份標示,咱們只要將這個OPENID與本身網站的用戶系統一一綁定就能夠了。
方法有兩種,一是將OPENID做爲登錄頁面或者註冊頁面的URL參數,當用戶點擊這個URL時跳轉到WAP頁面(即本身網站)上進行綁定,另外就是在對話框裏進行綁定,我今天介紹的就是在對話框裏進行綁定。
首先是檢測用戶是否綁定了微信號,這裏我寫了個函數,以下圖:
第593行是定義函數的名字爲check_user,函數傳入的變量爲$fromUsername,即微信用戶的OPENID。
第598行是經過傳入的OPENID爲條件,檢測在員工數據表中是否存在某條記錄的roster_openid等於該OPENID。
第600到609行是返回函數運行的記過,若是有記錄的話返回該條數據,若是沒有就返回失敗。
在用戶關注公衆帳號時我就判斷是否有綁定過帳號,而且根據綁定狀況回覆不一樣的歡迎詞,以下圖:
當檢測到用戶關注的事件,調用check_user這個函數,若是返回不是失敗則提示使用幫助,不然提示綁定帳號,效果如圖:
當用戶輸入BD字符時進入帳號綁定模式,以下圖:
先判斷用戶是否已經綁定過,綁定過給提醒中斷執行。不然進入綁定流程,因爲綁定操做須要分多個步驟驗證多個條件,而後一併查詢數據庫,所以咱們要保存每一步的動做和數據,這裏使用memcache來保存每一個用戶的上一步操做。這裏先保存了BD_0標示這是綁定的第一個步驟,提示用戶信息爲「請輸入你的姓名」。
memcache服務的開啓請查看《微信公衆平臺入門到精通》Vol.13,在程序裏使用方法爲在代碼最開頭啓動memcache,以下圖:
保存memcache的方法爲:
$mc->set(緩存變量名, 保存的數據, 0, 緩存時間單位秒);
讀取memcache的方法爲:
$mc->get(緩存變量名);
我在程序的開頭加了獲取memcache值的代碼,每次用戶請求時都會從memcache中獲取用戶上一步的操做和數據。其中 $fromUsername."_do"
爲用戶操做,$fromUsername."_data"
爲用戶數據,用 $fromUsername
能夠保證每一個用戶都有獨立的緩存變量名。
接下來等用戶輸入姓名後,接口會收到新的請求,這個時候因爲memcache保存過上步標示,所以這裏會根據操做緩存的數據判斷進入到第二步,$last_do的值是從程序開始就獲取memcache值後獲取的,以下圖:
這裏多了一個保存數據的緩存設置,保存了用戶提交的姓名數據,同時將操做緩存的值改成了BD_1,而後繼續提示用戶輸入工號。
當用戶輸入工號後,會進入第三步,以下圖:
繼續保存數據,將上一步的數據(姓名)與本次數據(工號)合併用「||」分割,同時將操做緩存的值改成了BD_2,而後繼續提示用戶輸入手機號。
當用戶輸入手機號後,就進入最後一步驗證,以下圖:
進入最後一步後先清空操做和數據緩存,而後將以前保存的數據$last_do加上本次用戶輸入內容合併轉換成數組,並用list函數分別賦值給$roster_name,$roster_number,$roster_mp。
再進行數據庫查詢知足用戶姓名、工號和手機與輸入數據徹底相同而且roster_openid(員工openid)爲空的記錄,若是有符合條件的記錄則更新該記錄,將$fromUsername(當前操做用戶的openid)保存到roster_openid裏,完成綁定。
這個時候咱們輸入「help」就會能夠進行後續操做了。
PS:「輸入exit退出操做」這個也很簡單,當用戶輸入exit的時候程序會清空操做和數據緩存,也就是說全部以前的操做和數據都沒有了,即全部操做從新開始,以下圖:
這個流程使用了memcache來保存一些臨時變量和多步驟操做,除了用來綁定用戶帳戶外,也適合一些調查問卷或者註冊登錄操做。
搜索其實就是編輯模式下的關鍵字自動回覆,我這裏拿姓名搜索舉例,首先咱們要先切換當前模式到姓名搜索,以下圖:
這部分代碼與帳號綁定的第一步是同樣的,咱們用memcache存放當前的操做,這個時候存放操做動做的緩存變量裏就標示了當前是在姓名搜索狀態下。同時輸出提示,請輸入員工姓名。
其實這步能夠理解爲進入網站的二級導航頁面,一個網站有首頁和各類導航欄目,那麼在這個通信錄裏幫助就是首頁,你輸入HELP就到了首頁,輸入XM就到員工查詢這個二級欄目,以後除非你輸入BM、GH等一些欄目名,其餘的操做都默認是在員工欄目下進行。
而後根據提示輸入員工名字進行查詢,以下圖:
從數據庫中查找與用戶輸入一致的記錄,若是沒有則返回提醒:
若是查詢到則返回一個圖文消息,這裏沒有去考慮員工重名的狀況,因此查詢和返回結果都是隻取一條記錄的。
前端展示緣由我只取工號、姓名、當前狀態、照片等字段返回,查看詳情點擊閱讀原文進入到detail頁,把該員工的ID號(不是工號)做爲URL參數傳遞過去,而後再作一次數據庫查詢將全部字段提取出來展示。
不少人很是好奇ZTalk的公衆帳號是如何實現文章查詢翻頁的,其實原理也很簡單,只是把網頁上的翻頁代碼稍微改裝一下,而後使用memcache保存每一個用戶當前的頁碼和搜索的關鍵字就能夠了。
在通信錄裏是用部門查詢來示例的,首先依然是進入部門查詢這個欄目,以下圖:
上面的代碼除了保存當前操做狀態爲部門查詢之外,又用另一個memcache的變量保存當前搜索關鍵字和頁碼「null || 1」,其中null爲當前搜索關鍵字(由於一開始用戶沒有輸入因此是空的),1表示起始頁是第一頁,而後輸出提示,請輸入部門名稱。
當用戶輸入部門名稱後,先查詢這個部門的ID號,由於在員工表裏沒有直接存放部門名稱而是存放的與部門對應的ID號,以下圖:
在這裏咱們獲取搜索關鍵字會有兩個來源,一個是用戶輸入的,一個是在翻頁時在緩存中保存的,因此先得嘗試從緩存裏獲取用戶以前保存的搜索關鍵字,若是值爲null則表示這是第一次搜索,關鍵字爲用戶輸入的$from_content,不然就使用緩存中保存的關鍵字,這就是爲何可以翻頁的關鍵,咱們利用緩存機制存放了用戶以前輸入的搜索關鍵字。
有了搜索關鍵字而後查詢部門表獲取部門ID號,獲取到後再去查詢員工表裏該ID下的員工總數,若是總數爲0則表示該部門尚未員工直接提示。不然進入到翻頁計算和結果返回,以下圖:
第一個是設置每頁顯示的條數,我這裏是設置成3條,加上封面消息和尾部翻頁提示消息最後顯示會是5條。
當前頁碼是從緩存中獲取,$last_data在前面已經使用explode函數以||爲分割字符變成數組,$last_data[0]爲搜索關鍵字,$last_data1爲頁碼,根據當前頁碼計算數據庫查詢開始的記錄指針位置。
查詢出結果後進行數據轉化,這裏作了一個數組方便後面循環輸入多圖文消息,每一個圖文消息其實就4個元素:標題、描述、圖片、連接,先直接用搜索關鍵字+當前頁等作一個封面消息,而後循環將數據庫查詢結果也轉化成圖文消息的元素。
而後是判斷是否有下一頁,以下圖:
用符合搜索條件的記錄總數去除以每頁顯示數量,ceil是一個向上舍入爲最接近的整數的函數,就是ceil(5/4)=2,而不是1.25,這樣就知道總頁數了,而後判斷當前頁是否最後一頁,若是不是最後一頁則將當前頁加1而後存放到memcache裏,在下次翻頁查詢時保存數據的這個memcache變量裏其實已經變成「搜索關鍵字||2」。
最後就是輸出多圖文消息了,以下圖:
在微信裏顯示的效果以下:
可能還有不少人很迷茫,如何輸入任何字符查看下一頁的呢?我畫個流程圖可能會比較清楚,看下圖:
你們能夠看到其實從第二頁開始用戶輸入的字符只是觸發程序運行,而不能干涉程序運行的結果,除非輸入EXIT,或者HELP這些一級欄目關鍵字。
關於通信錄就講到這裏了,響應朋友們的建議多講些設計理念,但願你們可以舉一反三,和本身業務相結合。後面還有兩個教程也打算用這個方法來作了,會提供完整代碼,講一些要點,就是間隔時間會比較久由於要碼代碼……