微信公衆賬號開發教程之微信瀏覽器HTTP_USER_AGENT判斷

微信公衆平臺的開發過程中,我們有時需要開發網頁並判斷是否是是來自微信瀏覽器訪問,本文介紹如何做出這一判斷。

一、$_SERVER數組

$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器創建。不能保證每個服務器都提供全部項目;服務器可能會忽略一些,或者提供一些沒有在這裏列舉出來的項目。

在 $_SERVER 中,你也許能夠,也許不能夠找到下面的這些元素。注意,如果以命令行方式運行 PHP,下面列出的元素幾乎沒有有效的(或是沒有任何實際意義的)。

  • 'PHP_SELF'

  • 當前執行腳本的文件名,與 document 

    root

     有關。例如,在地址爲 http://example.com/test.php/foo.bar 的腳本中使用 $_SERVER['PHP_SELF'] 將得到/test.php/foo.bar。__FILE__ 常量包含當前(例如包含)文件的完整路徑和文件名。 從 PHP 4.3.0 版本開始,如果 PHP 以命令行模式運行,這個變量將包含腳本名。之前的版本該變量不可用。

  • 'argv'

  • 傳遞給該腳本的參數的數組。當腳本以命令行方式運行時,argv 變量傳遞給程序 C 語言樣式的命令行參數。當通過 GET 方式調用時,該變量包含query string。

  • 'argc'

  • 包含命令行模式下傳遞給該腳本的參數的數目(如果運行在命令行模式下)。

  • 'GATEWAY_INTERFACE'

  • 服務器使用的 CGI 規範的版本;例如,“CGI/1.1”。

  • 'SERVER_ADDR'

  • 當前運行腳本所在的服務器的 IP 地址。

  • 'SERVER_NAME'

  • 當前運行腳本所在的服務器的主機名。如果腳本運行於虛擬主機中,該名稱是由那個虛擬主機所設置的值決定。

  • 'SERVER_SOFTWARE'

  • 服務器標識字符串,在響應請求時的頭信息中給出。

  • 'SERVER_PROTOCOL'

  • 請求頁面時通信協議的名稱和版本。例如,“HTTP/1.0”。

  • 'REQUEST_METHOD'

  • 訪問頁面使用的請求方法;例如,“GET”, “HEAD”,“POST”,“PUT

  • 'REQUEST_TIME'

  • 請求開始時的時間戳。從 PHP 5.1.0 起可用。

  • 'REQUEST_TIME_FLOAT'

  • 請求開始時的時間戳,微秒級別的精準度。 自 PHP 5.4.0 開始生效。

  • 'QUERY_STRING'

  • query string(查詢字符串),如果有的話,通過它進行頁面訪問。

  • 'DOCUMENT_

    ROOT

    '

  • 當前運行腳本所在的文檔根目錄。在服務器配置文件中定義。

  • 'HTTP_ACCEPT'

  • 當前請求頭中 Accept: 項的內容,如果存在的話。

  • 'HTTP_ACCEPT_CHARSET'

  • 當前請求頭中 Accept-Charset: 項的內容,如果存在的話。例如:“iso-8859-1,*,utf-8”。

  • 'HTTP_ACCEPT_ENCODING'

  • 當前請求頭中 Accept-Encoding: 項的內容,如果存在的話。例如:“gzip”。

  • 'HTTP_ACCEPT_LANGUAGE'

  • 當前請求頭中 Accept-Language: 項的內容,如果存在的話。例如:“en”。

  • 'HTTP_CONNECTION'

  • 當前請求頭中 Connection: 項的內容,如果存在的話。例如:“Keep-Alive”。

  • 'HTTP_HOST'

  • 當前請求頭中 Host: 項的內容,如果存在的話。

  • 'HTTP_REFERER'

  • 引導用戶代理到當前頁的前一頁的地址(如果存在)。由 user agent 設置決定。並不是所有的用戶代理都會設置該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。

  • 'HTTP_USER_AGENT'

  • 當前請求頭中 User-Agent: 項的內容,如果存在的話。該字符串表明了訪問該頁面的用戶代理的信息。一個典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。

  • 'HTTPS'

  • 如果腳本是通過 HTTPS 協議被訪問,則被設爲一個非空的值。

  • 'REMOTE_ADDR'

  • 瀏覽當前頁面的用戶的 IP 地址。

  • 'REMOTE_HOST'

  • 瀏覽當前頁面的用戶的主機名。DNS 反向解析不依賴於用戶的 REMOTE_ADDR。

  • 'REMOTE_PORT'

  • 用戶機器上連接到 Web 服務器所使用的端口號。

  • 'REMOTE_USER'

  • 經驗證的用戶

  • 'REDIRECT_REMOTE_USER'

  • 驗證的用戶,如果請求已在內部重定向。

  • 'SCRIPT_FILENAME'

  • 當前執行腳本的絕對路徑

  • 'SERVER_ADMIN'

  • 該值指明瞭 

    Apache

     服務器配置文件中的 SERVER_ADMIN 參數。如果腳本運行在一個虛擬主機上,則該值是那個虛擬主機的值。

  • 'SERVER_PORT'

  • Web 服務器使用的端口。默認值爲 “80”。如果使用 SSL 安全連接,則這個值爲用戶設置的 HTTP 端口。

  • 'SERVER_SIGNATURE'

  • 包含了服務器版本和虛擬主機名的字符串。

  • 'PATH_TRANSLATED'

  • 當前腳本所在文件系統(非文檔根目錄)的基本路徑。這是在服務器進行虛擬到真實路徑的映像後的結果。

  • 'SCRIPT_NAME'

  • 包含當前腳本的路徑。這在頁面需要指向自己時非常有用。__FILE__ 常量包含當前腳本(例如包含文件)的完整路徑和文件名。

  • 'REQUEST_URI'

  • URI 用來指定要訪問的頁面。例如 “/index.html”。

  • 'PHP_AUTH_DIGEST'

  • 當作爲 

    Apache

     模塊運行時,進行 HTTP Digest 認證的過程中,此變量被設置成客戶端發送的“Authorization” HTTP 頭內容(以便作進一步的認證操作)。

  • 'PHP_AUTH_USER'

  • 當 PHP 運行在 

    Apache

     或 IIS(PHP 5 是 ISAPI)模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是用戶輸入的用戶名。

  • 'PHP_AUTH_PW'

  • 當 PHP 運行在 

    Apache

     或 IIS(PHP 5 是 ISAPI)模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是用戶輸入的密碼。

  • 'AUTH_TYPE'

  • 當 PHP 運行在 

    Apache

     模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是認證的類型。

  • 'PATH_INFO'

  • 包含由客戶端提供的、跟在真實腳本名稱之後並且在查詢語句(query string)之前的路徑信息,如果存在的話。例如,如果當前腳本是通過 URLhttp://www.5icool.org/php/path_info.php/some/stuff?foo=bar 被訪問,那麼 $_SERVER['PATH_INFO'] 將包含 /some/stuff

  • 'ORIG_PATH_INFO'

  • 在被 PHP 處理之前,“PATH_INFO” 的原始版本。

  •  

二、獲取HTTP_USER_AGENT

以下方法可獲得

<?php
echo $_SERVER["HTTP_USER_AGENT"];
?>

在iPhone下,返回

Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/4.3.2

在Android下,返回

Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255

可以看到,微信瀏覽器爲 MicroMessenger ,後面還有其版本號
與此同時,還可以判斷手機類型爲iPhone還是Android

三、判斷微信瀏覽器訪問

我們判斷HTTP_USER_AGENT中是否有MicroMessenger即可

\

-----------------------------

在Android版本的微信環境中,依然可以通過如下兩種方式進行微信(公衆)號的推廣:

1、<a href="weixin://contacts/profile/微信號原始ID(如:gh_dd4b2c2ada8b)">Baidufe</a>

這種方法能直接打開該號的微信資料頁,直接關注;但獲取原始ID比較麻煩。


2、<a href="weixin://contacts/profile/微信號(如:www_baidufe_com)">Baidufe</a>

這種方法會打開“加入到通訊錄”的界面,然後再是資料頁


需要指出的是,微信公衆平臺對Android、iOS平臺支持力度不統一,比較費勁,具體有:

  • iOS平臺下,分享出去的數據wxData中,imageUrl可以是DataURI格式的;但在Android平臺下,必須是全路徑的圖片地址

  • iOS平臺下,分享的回調callback基本全都可以得到執行;但在Android平臺下,分享到微信朋友圈的callback無法得到執行(ready方法除外)

  • iOS平臺下,無法在非mp.weixin.qq.com域下的頁面中通過WeixinJSBridge.invoke('profile')的方式打開某微信號的資料頁面;Android平臺下則可以通過<a href="weixin://contacts/profile/微信ID">的方式打開資料頁;WinPhone下,則是通過<a href="weixin://profile/微信ID">的方式打開。


另外,如果你是在做微信公衆平臺的話,我還寫了另外一篇關於這個WeixinJSBridge API的文章,裏面有幾個API是官方提供的,穩定可用,鏈接:http://www.baidufe.com/item/c4bacb3bd66930f2e43e.html  ,希望對你有用。




當我們採用php作爲服務數據端口,爲移動端,pc端提供數據接口的時候,可能會要求記錄接口訪問的來源是來之哪裏.

例如:生成訂單,可能就需要記錄,以便做一些數據分析,爲運營和推廣提供一些數據支持.

現在移動終端是太多的了,所以你也不得不做出這麼多的判斷的了。看下這些移動終端的判斷吧:

function order_source()  
{  
    $useragent  = strtolower($_SERVER["HTTP_USER_AGENT"]);  
    // iphone  
    $is_iphone  = strripos($useragent,'iphone');  
    if($is_iphone){  
        return 'iphone';  
    }  
    // android  
    $is_android    = strripos($useragent,'android');  
    if($is_android){  
        return 'android';  
    }  
    // 微信  
    $is_weixin  = strripos($useragent,'micromessenger');  
    if($is_weixin){  
        return 'weixin';  
    }  
    // ipad  
    $is_ipad    = strripos($useragent,'ipad');  
    if($is_ipad){  
        return 'ipad';  
    }  
    // ipod  
    $is_ipod    = strripos($useragent,'ipod');  
    if($is_ipod){  
        return 'ipod';  
    }  
    // pc電腦  
    $is_pc = strripos($useragent,'windows nt');  
    if($is_pc){  
        return 'pc';  
    }  
    return 'other';  
}



根據自己的需求 ,來做一些特殊處理比如區分瀏覽器,這裏就不做介紹了.

自己 echo $_SERVER["HTTP_USER_AGENT"] 出來看一下就明瞭.

如果判斷是不是屬於微信瀏覽器,在IOS系統和ANDROID下都通用的就是判斷HTTP_USER_AGENT中是否帶有:micromessenger 

 

tip:

$res = strripos($str,$findstr) 此方法是在 $str 字符串中匹配 $findstr 最後一次出現的位置,匹配不到返回 false ,

也就是說假如匹配的字符串在首位出現就會返回0,那麼 if($res){...} 就無法正確返回,

比較正確的寫法應該是 if($res === 0 || $res > 0){...} ,(3個等於號是不僅是值相等還要數據類型相等),

當然我們已經知道哪些關鍵字是不會出現在首位,所以上面那種寫法就可以了.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章