davin

Just a little thinking and interest!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

说起这个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/ 提供了识别移动设别的正则表达式,以及代码片段:

<%
    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.第一个正则表达式是通过UserAgent判断,

2.第二个正则表达式是通过手机型号

不过仔细看第一个正则会发现少了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里面。

 

 

 

 

 

posted on 2013-02-03 22:43  davin  阅读(1001)  评论(1编辑  收藏  举报