原谅我不厚道的标题党了。不过我可没有乱说吹牛哦。
起因:看到前公司的同事转发的营销活动,感觉很棒,临时起意玩了玩.. 然后自己想了想是怎么一些东西是怎么实现的,发现并不是那么严谨,所以就当友情测试啦。
这是游戏的主要的界面
![](https://box.kancloud.cn/87c7581613ad8051339a09d1090d26e2_478x654.png)
有必要说下游戏规则:是根据取得分数来进行抽奖,88分以上获取二等奖的抽奖机会(什么微波炉啊啥的),108分以上获取一等奖(AI手环),,分数前12名的获取直飞俄罗斯免费全程世界杯门票的机会, 哈哈 甲方可是花了大价钱啦。
说了游戏规则,可以看出,主要是游戏的分数,分数够了就能抽奖了,但是这个分数是**客户端计算**的,有句俗话叫永远不要相信前端,就是这个道理了,前端一切都可以是假的。
然后想着看看代码,拦截包修改下中转发出去,找找接口啥的,结果发下直接打开微信开发者工具,这里有一个很严重的问题,我一个用户居然能在微信开发者工具里打开页面,虽然报错也没有用户信息,但是没关系,至少能看看代码嘛,都不用我拦截改包了,直接就在调试哪里执行我像执行的代码了。
![](https://box.kancloud.cn/133bbf49f163745581311827ad365749_1246x690.png)
这里代码就不贴了,密密麻麻看着就眼花,直接把关键的提交游戏分数的接口贴出来,如下图
![](https://box.kancloud.cn/6dab0f6fc6ef3850cdb7eb1f5f170eff_609x371.png)
可以看到,更行分数的接口很简单,一个post请求,带两个参数,一个是分数,一个是access_token, 分数不过数字随意填写,access_token如何获取呢,我想了很久因为也查看不了,调试工具里access_token是什么鬼,懂的可以略过是空的,根本没有我的登陆信息。
~~~
这里插一句,access_token是什么鬼,懂的可以略过,游戏中服务器何拿到用户id?
首先我们来说说如何实现微信登录,其实微信登录的api很简单,就是wx.login,在success的回调中,你会拿到一个code,这时候,你要拿着这个code去请求后端,得到返回的openid,这个openid就相当于用户id了。至于后端的逻辑我们稍后再说,这里先说说openid。每一个微信用户都有一个openid,它们是一一对应的关系,但是openid并不是微信号,因为微信号这种信息,腾讯是不会给你的。
现在说说后端拿到code之后,怎么处理,其实很简单,后端拿到code之后,将它连同appid和appsecret一起作为参数,请求jscode2session接口获取用户的openid,注意,code只能用一次。这里接口会返回openid和sessionid,很明显,sessionid是微信的sessionid,并不建议保存到客户端,所以这里我们一般会做一个处理,我们会把我们自己服务器的sessionid和openid做一个映射放到缓存,然后将自己服务器的sessionid和openid返回。
如何获取用户信息?
用户信息其实是在另外一个接口中,叫做wx.getUserInfo,在回调中,你能够获取到用户昵称、用户头像、用户性别、用户城市、省份、国家6个信息。那么有人就要问了,既然这里就能够获取到用户信息,那么为什么还要去用wx.login获取什么openid呢?原因很简单,因为wx.getUserInfo获取到的6个信息,没有一个能够用来作为id,用户的昵称可能是重复的,用户的头像地址也可能是会变化的。所以这里我们要把之前获取到的openid和这里的信息结合起来,形成一条用户记录,推到数据库。
~~~
大家我们知道,微信PC端和手机端是通的,一样玩游戏获取授权等像关系信息,所以我们可以考虑抓微信的包,把access_token给抓出来,这个值肯定是加密过的但是没关系啦,我们并不关心内容也不需要去解密,只要要抓出来原样带上请求就好.接下来我们来考虑抓微信的数据报。
至于抓包我一个反应是wireshake,相信学网络工程的同学绝对很熟悉,但是这个玩意儿太去全了,一股脑什么包一个不漏的给你抓出来,看的眼睛花,所以我么考虑用Fiddler,这个玩意儿可以更加针对web的包。
http://www.66868.com/pc/9886.html Fiddler然后安装,
安装好是这个样子的
![](https://box.kancloud.cn/d2c852222e49be268f7bd67ae0481821_996x627.png)
接着打开微信PC端,然后开始抓包,然后打开我们的踢足球游戏的页面,就能抓到微信的包啦,如下图。(吗的,差点装了一个全家桶在电脑上)
成功抓取到access_token:如下
![](https://box.kancloud.cn/ffbe6423d963949cecb8358d49294c4b_949x267.png)
这个时候就简单啦,吧这个token复制到另一边附带上请求就行了,我们来试试,
![](https://box.kancloud.cn/d75cbceb667fe562c3bb9de137818a28_877x60.png)
可以看到 我们执行成功了,但是我在执行的的过程之前测试的时候 ,短时间内请求太多次被后台检测到了,所以被封禁了,不过没关系等到明天就好了。又可以继续浪了,至于数字想填写多大填写多大。
执行成功后,会返回一个gameId,我们在用gameid 加上token去请求开宝箱的接口就能实现无脑抽奖,总会中了。有些晚了,就写到这里吧。
总结一下:
1.在重要的场景不应该相信前端的计算
2.没办法只能前端处理分数等逻辑务必配置好代码,让除了自己团队之外的开发者无法在微信开发者中打开,无法获取到代码。
3.即使我无法进行微信开发者看到玩个 无法抓微信包的token,但是我本机抓包,拦截改包后再发出去,一样OK,更加简单粗暴,所以上https。
后记:
1、俄罗斯世界杯门票,分数是够得,但是没敢去领,后来有其他同事分数前十的确获得了去俄罗斯看世界杯的资格,打电话给同事告知之后,也没有在关心。
2、在我明确告知了我前领导(朋友)我的分数是自己通过作弊手段得到后任然收到了一个格兰仕的光波炉,应该是感谢我是友情测试吧,哈哈哈哈哈哈
- 以专业工程师的标准要求自己
- JS
- 函数的this
- 函数的argument
- 函数的apply、bind、call方法
- 创建对象
- 构造函数创建对象
- 原型结合构造函数创建对象
- 原型
- 继承
- 闭包
- 正则表达式
- Ajax
- 设计模式
- ES6
- es6的模块化
- 定义变量的新方式
- 函数扩展
- 数组扩展
- 性能与工程化
- 关于http与缓存
- 重排(reflow、layout)与重绘
- 页面性能
- gulp
- webpack
- 一些项目回顾总结
- 移动端&微信H5游戏
- 微信小程序
- Vue.js
- 随手记录
- 如何通过前端技能获取2018世界杯门票
- jsonp
- es6 javascript对象方法Object.assign()
- 一份不错的基础面试题
- vscode常用插件
- koroFileHeader
- 构建自己的Js工具库
- H5 game
- Phaser从入坑到放弃再入坑
- 1.游戏的创建
- 2.资源的加载
- 3.phaser中的舞台,世界和摄像机
- 4.游戏缩放控制,移动端的适配
- 5.phaser中的显示对象
- 1.概述
- 2.phaser中的图片,图形,和按钮
- 3.phaser中的精灵
- 4.文字
- 5.组
- 6.phaser中的动画
- 7.粒子和瓦片地图
- 8.瓦片地图
- lodash
- ES5 to ESNext — here’s every feature added to JavaScript since 2015
- 防抖(debounce) 和 节流(throttling)