說起這個Firefox移動版在android下面的這個bug,這絕對是一個狗血的經曆,這樣一個regular release前後經曆了3個月.
關於這個regular release裡面的這個任務是關於payment enhancement的.一開始的安排是我和一個美國consultant一起完成這個任務,做了幾天過後,他說幫要幫其它region做比較急的任務.因此當前的任務需要我一個人獨立去完成。當然對於Payment module的重要性是不言而逾的,雖然之前已經有瞭解過payment module的設計,的確蠻複雜的,當我實現所有的功能的時候,客戶那邊有要求要實現行動裝置的支付並且需要相容所有的行動裝置,這下問題就來了,
1.如何識別行動裝置,包括手機,平板。
2.如何在不同手機作業系統中對於不同的瀏覽器保持相容
由於我們的網站不是專門為行動裝置定製的,因此對於一個web 網站支援手機支付,這本身就不是很好。既然客戶要求這樣...
查閱msdn,發現在asp.net中,有一個IsMobileDevice屬性,因此如何識別行動裝置是,我使用下面的程式碼片段
public bool IsMobile
{
get
{
HttpBrowserCapabilities myBrowserCaps = Request.Browser;
return ((System.Web.Configuration.HttpCapabilitiesBase)myBrowserCaps).IsMobileDevice;
}
}
通過反編譯dll,查看IsMobileDevice是如何工作的,發現了該屬性依賴該檔案夾下面的Browser檔案 %SystemDrive%\\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers發現裡面對於andrios os都沒有做特殊的判斷,因此我用andriod裝置測試 上面的代碼,果然發現andriod裝置下的瀏覽器都不能被識別為行動裝置。
接下來我發現這個網站 http://detectmobilebrowsers.com/ 提供了識別移動設別的Regex,以及程式碼片段:
<%
string u = Request.ServerVariables["HTTP_USER_AGENT"];
Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline);
Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline);
if ((b.IsMatch(u) || v.IsMatch(u.Substring(0, 4)))) {
Response.Redirect("http://detectmobilebrowser.com/mobile");
}
%>
這段代碼裡分為2個部分,
1.第一個Regex是通過UserAgent判斷,
2.第二個Regex是通過手機型號
不過仔細看第一個正則會發現少了ipad,而且andriod裝置的判斷也不對,經過調整,這個問題算是解決了,剩下的問題也就逐一解決,由於payment測試的特殊性,我們只能在DEV環境 測試我們能正確到達銀行支付頁面,剩下的就認為已完成,因為後面需要user去測試。當把所有的改動發到QA環境,user會測試下列環境在不同的行動裝置:
Android/Chorme;Android/Firefox;Android/Opera;Android/Safari;IOS/Safari,測試裝置:Iphone,Ipad,Galaxy Note,Galaxy Tab10.1,Nexus s,
測試結果是在所有的環境中都沒問題,唯獨在Android/Firefox 16.0/17.0下面會出現Session 丟失的問題. 問題簡單描述如下:
從我們的網站使用手機支付到銀行頁面,支付完成後,返回支付狀態到我們網站的時候,原來的Session丟失了,因此會直接將頁面跳轉到登入頁面。
通過增加log,分析發現在Android/Firefox下面,支付完成後銀行返回我們網站的時候,瀏覽器的SessionId是一個新的,新產生的Sesion.這就很好地說明了為什麼會到登入頁面,因為新的Session裡面沒有form認證資訊。而在其它環境中,從銀行返回我們網站的時候,瀏覽器能取到原來的SessionId,因為使用者資訊和狀態以及form認證資訊都在。這是我第一次遇到這樣的問題,很顯然這是一個瀏覽器層級的bug,將這個資訊share到team,大家都明白這是個瀏覽器的issue,不過user依舊堅持需要fix這個問題,才能上線.
頓時覺得很憋屈,因為這種問題已經超出了developer正常處理的範圍了,每個瀏覽器有不同的實現機制,而且銀行的返回動作我們也不知道是如何進行的,還有我看不到User究竟是如何操作的,我無法測試銀行支付的過程...這所有的一切因素加一起,要fix這個問題,感覺太困難了。但還是要不斷的做嘗試啊
我認為Session丟失是由於從銀行返回時候,重新開啟了瀏覽器視窗,新視窗和原來的視窗的form authentication 和Session Id 不一致造成的,添加日誌來分析在Sarafi和Firefox移動版下面的cookies資訊,確是證實了我的想法。所以修複這個bug,就是要保證新開啟的瀏覽器視窗的SessionId和原來的保持一致,於是接下來的一個星期的努力都是在這個方向.
最終的解決方案是:
如果檢測到是firefox移動版,就把cookies裡面的所有資訊都拼成字串,然後把這個cookies資訊傳到銀行端,銀行支付完畢回到我們的網站的時候,首先擷取cookies資訊,然後將cookie資訊解析出來加到Response的cookies裡面。