关于我如何以邪道的方式实现支付宝收款这件事
支付宝的SDK的需要营业执照,要搞到营业执照需要先申请一家公司,申请公司需要注册资金和一堆麻烦的手续......微信同理。那么个人想要在软件里做会员的功能要怎么办呢:各种聚合支付的公司和发卡平台。收费黑就不说了,十个有九个是骗子。
自建发卡平台或许可行,但发卡的原理至今没搞太清楚,好像听人说是购买淘宝的虚拟商品......总之这个也需要相当麻烦的手续。
只是收款不是难事,挂个二维码就行,主要的问题是需要在收款以后自动处理一些东西。
问题的核心是,如何监控到用户的付款。开始的想法很单纯:在服务器上整个安卓模拟器,里面登录支付宝,然后写个脚本定时刷新账单并判断是否有人付款。
这个方案是可行的,但脚本如果不够完美就很容易出问题,还有可能出现其它不可预料的情况阻断脚本原本的逻辑。而且,这样我就不能用支付宝了......
或者可以发包模拟登录支付宝,直接获取到账单的信息......前提是能破解支付宝的通信协议。
想想都难,于是我逆向思维想出了第二种方案:直接在用户的手机上判断是否付款成功。
落到实施上就是:利用安卓的辅助功能判断用户是否支付成功,并把结果告诉服务器。
如果我是用户,肯定就会伪装发送数据包,所以防止伪装是最重要的。可以把用户支付过程中的一些变量加密并送给服务器,比如在某个页面停留的时间,当前的时间之类的......大概就和滑块还有那种点一下就通过的验证码差不多,问题的核心是判断出这一条请求确确实实是在支付完成以后发送的,而不是用发包软件模拟的。
安卓的辅助功能(AccessibililtyService)可以让开发者获取到屏幕上出现的控件,布局,文字......并且可以点击屏幕上的控件。现在多被用于一些跳过广告的软件还有脚本软件。
利用可以获取屏幕信息的特性,就能够判断用户是否支付成功了......才怪。
支付宝是不行的,支付成功的文字,金额,按钮的文字......有用的信息全都获取不到,应该是因为支付宝的UI并不是原生的,或者支付宝的开发者为了安全考虑用某种手段屏蔽掉了。
总之,一开始想的直接判断支付成功页面的文字就行了,还是太天真了。
支付宝内部不行,但是通知栏的文字是可以尽数获取到的,而支付宝每次付款都会发送一条通知。理论上是可行的,但是经过十几次测试以后,支付宝突然不发送通知了,过了一会又能发送了......支付宝的开发人员不会连我要根据通知栏判断支付结果这种事也预料到了吧。
原因应该是我在短时间内付款的次数过多了吧......话是这么说但是这种方式还是不太稳定,万一失败了要被用户骂的。
最后想到的方法是,利用每个页面不同的特征来判断用户在支付宝的哪个页面。辅助功能可以得到控件的类名,所谓的特征就是那个页面的类名加能够获取到的为数不多的文字。
比如,确认支付的对话框弹出以后,一定有一个名为com.alipay.android.msp.ui.views.MspContainerActivity的类,出现这个类就认为用户进入了输入密码的阶段。但是还是不行,很容易出错......
但这个思路是对的,根据为数不多的信息判断用户在哪个页面,到达支付成功的页面就算支付成功。唯一的不足就是,需要用户手动打开辅助功能,有些麻烦。
最后想到是通知栏+特征的方法,判断用户是否经历了支付必经的两个页面,然后判断:如果有新通知并且金额对得上就直接认为支付成功,没有就判断第三个页面是不是支付成功后的页面,虽然大概率会误判......
还有一个问题就是,支付宝更新后,页面的特征会变,需要提前把特征记录下来,然后根据支付宝的版本使用不同的方案判断......简直就和以前用CE改崩崩崩一个思路,崩3这种游戏直接搜索生命值肯定是改不了的;那么很容易想到我直接改静态数据,因为数据都在一个dll文件里。每次进游戏都会对文件的完整性进行检验所以改静态数据也不行......
最后的方法是,用动态的方式改静态的数据。崩坏3每次进入战斗之前才会加载角色的数据,战斗结束会判断数据有没有被修改,只要进入战斗前改好,完成后再改回来就行了。
然后问题就变成了怎么获取角色的数据......特征码。
如果搜索到内存里某一串数据符合特征,那一串数据就是角色的静态数据。生命值上限,攻击力,防御力,SP上限是按顺序排列的......根据某个角色的部分初始数据的特征,就能找到这个角色的数据在内存里的哪个位置。现在不知道这个方法还能不能行,同样的方案在原神里就行不通,不知道是不是静态数据也加密了。不过这次判断支付的方案确实是特征码带来的灵感。
希望这个不太正常的方案行得通。