天天看點

當Ucenter和應用通信失敗解決辦法

當Ucenter和應用通信失敗

當Ucenter和應用通信失敗解決辦法

(2012-04-19 15:34:51)

當Ucenter和應用通信失敗解決辦法

轉載▼

标簽: 

雜談

失敗是常見的。

對于初次接觸Ucenter的人來講,添加一個自己的應用最頭疼的就是發現通信失敗。

如果要解決這個問題,首先要了解Ucenter是如何和應用進行通信的。

隻有知道了Ucenter和應用之間如何通信,我們才能找到通信失敗的原因。

那讓我們從源頭找起吧!

如果用火狐來輔助查找通信失敗的源頭會更加簡單一些【我可不是給火狐做廣告啊!它真的是太好用了】。

我們先來看看是誰輸出了通信失敗四個字:

在火狐中右鍵->本幀->檢視幀源代碼【注意,要在“通信失敗”附近】。如圖:

當Ucenter和應用通信失敗解決辦法

然後在源代碼中查找應用通路位址。找到通信失敗所在位置。

請注意,通信失敗四個字是有js生成的。直接查找通信失敗是找不到的。

認真研究一番之後,我們發現通信失敗是由類似如下代碼生成的:

<div id="status_3"></div><script id="link_3" testlink="admin.php?m=app&a=ping&inajax=1&url=http://www.seinc.com/slight&ip=&appid=3&random=30773"></script><script>apps[2] = '3';</script>      

看起來是通過admin.php對應用位址進行通路,根據通路結果判斷是否通信成功。

從字面上來看應該是app裡邊ping動作。好像還是ajax來通路的。

既然找到了通信失敗的原因那我們就到admin.php的app中去找一下ping時候究竟它通路了什麼,根據什麼樣的結果來判斷通信成功還是失敗。

我們看一下Ucenter的目錄。很明顯,操作程式代碼都在control目錄裡邊。進入control目錄,哇!果然有個app.php。

先别急!沒看到還有個admin目錄麼。既然剛剛是通過admin.php調用app的那麼這個動作當然是寫在admin目錄裡了。

其實control目錄下的app.php是正常操作app。如果你打開代碼查找ping方法是找不到的。

好,我們進入admin目錄,打開app.php,查找ping。嗯!找到了!如下圖:

當Ucenter和應用通信失敗解決辦法

這個方法叫做onping。我們分析一下發現關鍵在這個地方:

if($status == '1') { echo 'document.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/correct.gif\' 0\' class=\'statimg\' \/><span class=\'green\'>'.$this->lang['app_connent_ok'].'</span>";testlink();'; } else { echo 'document.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/error.gif\' 0\' class=\'statimg\' \/><span class=\'red\'>'.$this->lang['app_connent_false'].'</span>";testlink();'; }      

如果status的值是1就是ok,反之則false。再簡單看一下上邊的代碼。我們注意到onping方法通路的位址其實是應用位址+/api/+$app['apifilename']。

那麼用腳指頭也明白了,其實通路的真是位址是應用目錄api目錄下的uc.php。

如果不是很相信,我們就把$url給輸出來瞧一下。将代碼作如下改動:

if($status == '1') { echo 'document.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/correct.gif\' 0\' class=\'statimg\' \/><span class=\'green\'>'.$url.'</span>";testlink();'; } else { echo 'document.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/error.gif\' 0\' class=\'statimg\' \/><span class=\'red\'>'.$url.'</span>";testlink();'; }      

注意我們把輸出的ok或者false替換成了上邊的url。在管理背景檢視一下應用清單:

呵呵,位址出來了!我們把失敗的位址和成功的位址分别複制到位址欄進行通路。

潔白的頁面上如果隻有個1,就表示成功。如果是其他的東西就表示失敗了!

(注意:如果傳回的url位址不正确,照樣無法通信,正确的應用位址應該是http://www.123.com/modules/ucenter/api/uc.php -> http://www.123.com/modules/ucenter    後面不能帶 '/',因為在填寫接口檔案名稱的時候已經填寫了uc.php,并且在程式中已經定義了路徑是/api,是以我們隻需要api前面的部分最為主url)

既然我們知道了通路的真實位址,那麼就去看看這個位址是如何告訴Ucenter通信成功還是失敗的。

打開應用目錄api裡的uc.php之後我們注意到它首先對get過來的code進行解碼,得到動作指令後進行響應:

$code = $_GET['code']; parse_str(authcode($code, 'DECODE', UC_KEY), $get);//先做解密,就是url?code後邊那一長串。 if(MAGIC_QUOTES_GPC) { $get = dstripslashes($get); } //print_r($get); //exit; if(time() - $get['time'] > 3600) { exit('Authracation has expiried'); } if(empty($get)) { exit('Invalid Request'); } $action = $get['action'];//解碼後得到action 就是Ucenter傳過來的指令。Ucenter到底預設會傳遞什麼指令過來?回到Ucenter的app.php裡認真研究了onping我們發現預設傳遞的是test指令。      

那我們就查找uc.php裡的test。最終發現當預設連接配接時候執行的代碼快。

根據個人情況的不同,這裡的代碼每個人可能得到的不一樣。認真研究一下就會發現問題出在哪裡。

如果比較懶,看不懂,那就直接deleted…然後echo 1;欺騙一下Ucenter。看到通信成功的小對勾,心裡舒服多了吧。

個文章隻是告訴你為什麼會失敗。如何獲得成功的字眼。到底通信成功和失敗會有什麼影響不在本文讨論範圍之内。

最後,我們再來清洗一下Ucenter和應用之間如何互動:

  • ucenter通過應用裡的api/uc.php獲得應用通信情況,發送指令資訊。比如使用者更新,使用者删除之類的操作。在uc.php中有對應的方法。也就是說如果你在ucenter裡進行了使用者操作。而應用中要同步的話就指望uc.php了。ucenter每次重要操作都會發送指令給uc.php。而且會主動監測通信情況。
  • 應用則通過uc_client通路使用者資料。比如登陸,注冊等。這個我在ucenter與wordpress整合中曾經提到過。

如果無論你添加一個什麼樣的應用,都能得到一個“通信成功”的小對勾。那這個文章總算沒白寫。

關于Ucenter的其他東西請關注其他文章。

謝謝!

快樂源于分享!