讓咱們回到2014年11月,從公司請假回成都,在天府軟件園B區旁邊的小區裏,那個10多平米的出租屋裏,閒來無事,我想找個事情作一作,好讓我這漂浮的心靜下來。大約在半年前就申請了微信的一個公衆帳號,一直閒置着,終於決定再次着手搭建一個微信公衆帳號。SAE(Sina App Engine)是國內最先開始提供雲服務的平臺之一,並且幾乎是免費的。因此但願可以經過SAE平臺快速的搭建好一個微信公衆帳號,花了小半天就搭好了一個簡易的微信公衆平臺。今天,就利用SAE搭建微信公衆平臺的過程和你們一塊兒分享。php
首先註冊微信公衆帳號:http://mp.weixin.qq.com,點擊註冊,經過很簡單的幾步就能快速註冊好公衆帳號,須要注意的是這裏是須要註冊一個新的微信號,而不是經過已有的私人微信號綁定。可能須要註冊一個專用的郵箱。註冊過程很簡單,不贅述。web
註冊SAE,訪問http://sae.sina.com.cn,SAE整個的文檔都比較完整,很好上手。註冊完成後會送500雲豆,合人民幣5元。再申請實名認證,送雲豆2000。對於一個剛上手的開發者來講徹底夠了。等應用開發好後,還能夠申請開發者認證。每個月有固定額度的雲豆贈送,基本就不用花錢了。另外還有教育機構認證,公益組織認證等。一樣十分簡單,不贅述。api
登陸公衆平臺後,點擊高級功能。首先要關閉編輯模式,才能進入開發模式。咱們須要一個網址做爲接口,Token呢,就是至關於咱們和微信之間約定的「密碼」,以驗證是微信平臺的訪問。安全
網址接入服務器
公衆平臺用戶提交信息後,微信服務器將發送GET請求到填寫的URL上,而且帶上四個參數:微信
參數 | 描述 |
---|---|
signature | 微信加密簽名 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,不然接入失敗。signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數:微信開發
加密/校驗流程: 1. 將token、timestamp、nonce三個參數進行字典序排序 2. 將三個參數字符串拼接成一個字符串進行sha1加密 3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
那麼很明確咱們接下來須要作的事情了:爲微信提供一個接口。app
填好二級域名和應用名稱等,選擇好語言。這裏咱們使用PHP開發選擇web應用。建立好應用以後,在代碼管理中建立一個新的版本。然後咱們能夠選擇編輯代碼。可以實如今線編輯,根據我的喜愛,能夠經過SVN在本地開發而後CI到SAE服務,我我的就是這樣作的。微信公衆平臺
在SAE建立好應用後,須要到微信公衆帳號開發者中心將應用信息進行受權配置!ide
假設我建立的應用名稱爲personal_app,則svn的地址爲https://svn.sinaapp.com/personal_app,用戶名和密碼分別爲SAE安全郵箱和安全密碼。
<?php
define("TOKEN", "xxxxxxxx");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
public function responseMsg()
{}
}
?>
1 function responseMsg() 2 { 3 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 4 5 if (!empty($postStr)) { 6 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 7 $fromUsername = $postObj->FromUserName; 8 $toUsername = $postObj->ToUserName; 9 $keyword = trim($postObj->Content); 10 $time = time(); 11 $textTpl = "<xml> 12 <ToUserName><![CDATA[%s]]></ToUserName> 13 <FromUserName><![CDATA[%s]]></FromUserName> 14 <CreateTime>%s</CreateTime> 15 <MsgType><![CDATA[%s]]></MsgType> 16 <Content><![CDATA[%s]]></Content> 17 <FuncFlag>0</FuncFlag> 18 </xml>"; 19 if ($keyword == "date" || $keyword == "時間") { 20 $msgType = "text"; 21 $contentStr = "如今時間是:\n".date("Y-m-d H:i:s", time()); 22 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 23 echo $resultStr; 24 } elseif (preg_match("/^0?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/", $keyword)){ 25 $msgType = "text"; 26 $phone_res = $this->mobilephone($keyword); 27 $contentStr = "號碼歸屬地查詢結果:" 28 ."\n".$keyword 29 ."\n歸屬地:".$phone_res->retData->province 30 ."\n運營商:".$phone_res->retData->carrier; 31 32 $contentStr = $contentStr 33 ."\n-------------------\nProvided by API store."; 34 35 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 36 echo $resultStr; 37 } else { 38 $msgType = "text"; 39 $contentStr = "感謝您關注【XXXXXXXXXX】"."\n"."微信號:XXXXXX"."\n" 40 ."目前平臺功能以下:" 41 ."\n"."1. 當前時間,如輸入:時間/date" 42 ."\n"."2. 手機號歸屬地查詢,如輸入13800138000" 43 ."\n"."更多內容,敬請期待..."; 44 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 45 echo $resultStr; 46 } 47 }else{ 48 echo ""; 49 exit; 50 } 51 }
其中mobilephone函數用來完成手機號碼歸屬地查詢功能。這是通過精簡的一部分代碼,目前公衆帳號已經實現了大大小小6個功能,後續還會繼續改進!
感謝你們的閱讀,Published by MarsEdit!