今天同事反馈公司的app无法通过微信的二维码扫描下载,经测试发现包括京东、淘宝的APP都无法通过微信二维码扫描下载,考虑可能是微信此版本的一个BUG。后测试腾讯的APP却能从微信的二维码扫描下载,才意识到这是微信的一种限制。很不理解腾讯的想法,别人看到二维码,才想到用微信的二维码功能去扫描,在此微信是实现目标的工具,而腾讯却好像担心自己的用户会流失一样,不让用户扫描除腾讯公司以外其他公司的app,这不是失去了它本身存在的意义了么。

既然是限制,考虑到腾讯会采用三种方式:

1、通过域名方式限制:最难、甚至无法破解的方式。 2、通过http头限制:几率最大的方式。 3、通过临时生成的key:难破解,但是实现成也比较高,因为腾讯产品的下载连接实在是太多了。

 下面是我对腾讯产品可以通过微信二维码扫描下载分析,解决公司app不能通过微信二维码扫描下载的过程。文中地址仅供参考,随腾讯产品的更新可能会失效,但思路不会失效。
1. 我测的可下载的腾讯产品是“手机QQ2013安卓版本”的下载,下载地址如下:
http://im.qq.com/mobileqq/2013/
2. 链接的页面中有一个二维码,通过微信二维码扫描出来后,在微信中打开一个页面,点击页面中的“下载QQ”按钮,即会弹出微信,在浏览器打开下载链接,自动下载QQ。 3. 二维码扫描出来的页面地址:
http://mobile.qq.com/touch/download.html
4. 在Chrome中分析二维码扫描出来的页面,发现最后的真实下载地址为:
http://softfile.3g.qq.com/msoft/apk/qq2013/qq2013_4.5.2.1605_android.apk
5. 通过linux的curl里面,分析地址的http响应头:
#curl -L --head http://softfile.3g.qq.com/msoft/apk/qq2013/qq2013_4.5.2.1605_android.apk
HTTP/1.1 302 Found
Server: nws 1.2.15
Connection: close
Date: Mon, 16 Dec 2013 06:26:55 GMT
Expires: Mon, 16 Dec 2013 06:26:55 GMT
Cache-Control: max-age=0
Content-Length: 68
Location: http://119.167.195.61/softfile.3g.qq.com/msoft/apk/qq2013/qq2013_4.5.2.1605_android.apk?mkey=52aebbda2bc3d283&f=168a&p=.apk

HTTP/1.1 200 OK
Server: 3Gdown_DK
Connection: keep-alive
Date: Mon, 16 Dec 2013 06:26:55 GMT
Cache-Control: max-age=0
Last-Modified: Thu, 24 Oct 2013 11:22:30 GMT
Content-Type: application/vnd.android.package-archive
Content-Length: 28608141
X-Cache-Lookup: Hit From DiskCache
从上面的http响应头可以看出,页面最后被定向到一个IP为119.167.195.61的下载服务器,url中没有域名,所以排除了通过域名限制的可能性。url中有一个mkey,倒是有点像是通过临时key限制的。 6. 将同样的mkey参数附在公司app的下载地址后,在二位码工具中生成二维码,在微信中扫描此二维码,发现仍然不能下载,一片空白,没反应。看看mkey到像是用来统计用户下载的,所以pass掉通过临时key限制的可能性。 7. 再回头看看上面的http头中url的IP地址后面竟然带了个类似域名的"softfile.3g.qq.com"路径,莫非是通过只要url中带了“softfile.3g.qq.com”就能通过微信扫描下载,经测试,果真如此,只要url中带有"softfile.3g.qq.com"或“3g.qq.com”都可以通过微信二维码扫描下载,如下地址都可以:
http://www.aiezu.com/softfile.3g.qq.com/android.app.apk 
http://www.aiezu.com/3g.qq.com/android.app.apk 
总结:很低劣的限制方法,不过应该微信的下个版本就会改成其他方法吧