微信公众号开发初探
最近利用空閑時間,申請了個微信公眾號,完成一些小功能練練手。
本文總結了開發公眾號期間的一些步驟,心得和體會,希望能幫助更多想做微信開發的小白開發者。
申請微信公眾號
要體驗微信公眾號開發,首先得有一個公眾號,直接在官網申請即可(記住需要新申請公眾號,而不是用你原來的 QQ 或微信登錄)。
申請過程中,要注意的是,我們申請的是訂閱號,用于個人開發。
申請成功后,登錄到公眾號后臺,左側有豐富的菜單供你使用,可以選擇傻瓜式,就是不用寫一行代碼,通過在左側菜單配置,自己設置關注后的歡迎語、給用戶發消息操作等。也可以選擇開發者模式,將左側菜單拉到最下面,可以看到如下圖所示的開發欄。
為了后續及時查看效果,需要第一時間關注這個公眾號,成為自己的第一個粉絲。
開始編寫代碼
首先,我們要明白微信公眾號和用戶打交道的流程,下圖簡單展示了這個流程。
從圖中可以看到,當你在微信中向公眾號發一條消息,這條消息首先會送到微信服務器,然后轉發給你的服務器,經過處理后把響應回給微信服務器,微信服務器再轉給你。
這個和我們開發 Web 程序 C/S 模式基本一致,不同的是,在客戶端和服務端中間,多了一個微信服務器做轉發。
因此我們要關注的,仍然是寫服務端程序,以便接收微信服務器轉發過來的請求。我們的服務入口必須是微信服務器可以訪問的,也就是一個公網地址,內網 IP 肯定是不行的,所以首先得有一臺有外網 IP 的服務器。
以滴滴云 DC2 服務器為例,在官網上購買一個帶 EIP 的 DC2 實例,ssh 登錄到 DC2,安裝 lnmp 全家桶。安裝好后,確認 Nginx 和 php-fpm 已運行。然后就可以在微信公眾平臺上配置服務器地址了。
打開基本配置頁面,按下圖方式填寫表單:
填寫好后,不要急著提交。我們在 DC2 服務器的 Web 目錄下,寫個測試程序 main.php,代碼如下所示,這段代碼也可以在 微信wiki 上找到。
define("TOKEN","your token"); //token 是剛才你在表單寫的token function checkSignature() { $signature = $_GET['signature']; //微信加密簽名 $nonce = $_GET['nonce']; //時間戳 $timestamp = $_GET['timestamp']; //隨機數 $arr = [$timestamp, $nonce, TOKEN];sort($arr); $arr = implode($arr);$m_arr = sha1($arr);if($m_arr == $signature) {return true;} return false; }if (checkSignature()) {$echostr = $_GET['echostr'];if($echostr) {echo $echostr;} }簡單解釋一下,當我們提交上述表單后,微信服務器會對我們填寫的地址進行驗證,參數如上述注釋,如果表單提示成功,則說明微信服務器訪問到了你配置的 URL,并認證成功,如果失敗,則檢查下你的代碼。
認證成功后,我們就可以把上面的測試代碼刪掉,開始寫真正的服務端程序。
第一個服務
首先我們寫一個天氣查詢服務,就是給公眾號發一個城市名,公眾號返回該城市未來三天的天氣。我這里用的是心知天氣提供的天氣 API,我們分兩步來進行:
1、獲取用戶輸入的城市名
由上圖我們知道,用戶的輸入最終會由微信服務器轉發給我們自己的服務端程序,微信服務器轉發給我們的數據格式如下:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId></xml>這里簡單解釋下上面的各個字段:
- ToUserName 消息要發送給誰
- FromUserName 是消息從哪來
- CreateTime 時間戳
- MsgType 消息類型
- MsgId 消息 Id
我們的服務端程序得獲取這個數據,需要注意的是,如果 PHP 版本是 5.x,可以直接使用 $GLOBALS["HTTP_RAW_POST_DATA"]超全局變量來獲取,如果是 PHP7($GLOBALS 已經被取消),需要用以下方式來獲取:
$wx_post = file_get_contents("php://input")然后解析 xml 數據,提取各類字段,如下:
$postObj = simplexml_load_string($wx_post, 'SimpleXMLElement', LIBXML_NOCDATA); $from_user_name = $postObj->FromUserName; $to_user_name = $postObj->ToUserName; $city = trim($postObj->Content); //提取用戶發送的城市名2、根據城市名,返回天氣信息
拿到了城市名,就可以通過 API 查詢城市天氣信息了,但有個問題需要解決:一般用戶發的是中文城市名,而通過 API 查詢,需要的是城市的拼音,因此需要寫一個 中文->拼音 的轉換函數。在 GitHub 上有很多這類項目,我用的是 這個 庫,使用方法自行查看。
轉換成拼音后,即可按 API 的要求,拼接 URL,發送查詢請求,將返回的天氣數據簡單解析,并封裝成微信需要的格式,構造響應,假如要返回給微信服務器的天氣數據為 $weather_info,那么代碼如下:
$textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; return sprintf($textTpl,$from_user_name,$to_user_name,time(),$weather_info);到這一步,我們已經做完了所有工作,現在可以嘗試向公眾號發送一條消息,隨便發個城市名,如果代碼沒有錯誤,那么會看到下圖所示的效果:
如果微信返回類似“該公眾號暫時無法提供服務”的提示,那就說明你的代碼存在問題,可是能你的程序沒給微信服務器返回任何內容,也可能回復的數據不合規范,給你直接返回了 JSON 類型數據。檢查下代碼,或者看看 Nginx 日志,一般都能找到原因。
更進一步
有了上面簡單的實戰,我們了解了微信開發的基本流程,并實現了一個向公眾號的粉絲提供天氣查詢的服務。上面只是向用戶返回了文字類型消息,我們也可以嘗試發送圖片、音樂、圖文類型的消息,只需要將上述消息 MsgType 字段改為對應類型,并按微信開發手冊填充 Content 內容即可,剩下的就是發揮想象力的時候了,可以嘗試添加其他功能,比如點歌、查快遞,甚至像 Siri 的一個機器助理。
總結
從上述開發過程我們可以看到,微信公眾號開發和我們開發普通的 Web 程序基本一致,唯一不同的中間經過了微信服務器做了一次轉發。需要注意的是,上述配置的公眾號,只有部分微信 API 權限,分享、支付等功能,均需要通過認證才可用。
本文作者:許基偉
想了解更多技術知識,歡迎關注滴滴云知乎機構號,大量教程在線等你~
滴滴云官網:https://www.didiyun.com/?channel=14112
滴滴云瘋狂雙十一,服務器最低35折起
總結
- 上一篇: Javascript之把网页加入收藏夹功
- 下一篇: Excel的上传下载