MX5上的乐动力 App 很早以前就不能登录了,各种途径都是提示“网络不给力”,等了大半年看他们是否会修正这个问题,但是每次版本更新后都试了,问题依旧存在。而且,无论是官网还是 App或是微博客服,都没有提供相关的说明该如何操作。
为了不丢失数据,只好自己动手了。

进入 Flyme 5 的访客系统,安装微信和乐动力 App,测试登录正常,之前的数据也能正常同步下来。

第一步,祭出 Charles 看看都干了啥

启动 Charles,然后在手机上设置代理,进行登录,发现一个正常的登录主要做了几个操作:

  1. adduser,发送一个 pc 串,返回一个临时的 id
  2. authbywechat,登录请求,url参数 uid 为之前请求的临时 id,返回用户 id
  3. getinfo,获得用户相关信息,包括头像 url
  4. updatewechatinfo,更新数据
  5. updateinfo,更新数据

第二步,进入正常的系统,看看无法登录的版本都做了些什么

  1. authbywechat,url参数 uid 为残留的用户 id,返回 {“errorCode”: -10001, “ret”: “auth fail”}

返回错误后就没有后续请求了。

现在看来就是验证的时候的 uid 的问题。查看反编译后的代码的时候发现,登录成功后这个 uid 是会被覆盖的。这样的话,给 App 一些正常的数据,让他先登录成功一次,以后理论上就不会有问题了。

如果是 root 的设备,直接把 SharedPreferences 中的 uid 的值改为0,App 就会进入 adduser 的流程,这样会比较简单。我不想 root 这个设备,所以写了些代码来模拟登录的流程。

第三部,拦截请求,修改数据

把正常登录的数据保存下来,在拦截到请求后把这些数据返回给 App。可能这部分也可以在 Charles 中完成,不过我修改了 hosts 文件,然后直接写了些 php 代码:
hosts 文件:

1
127.0.0.1 walk.ledongli.cn

路由部分:

1
2
3
4
Route::post('/v2/rest/users/authbywechat', 'MsgController@handleAuthWeChat');
Route::post('/v2/rest/users/getinfo', 'MsgController@handleGetInfo');
Route::post('/v2/rest/users/updatewechatinfo', 'MsgController@handleUpdateWeChatInfo');
Route::post('/v2/rest/users/updateinfo', 'MsgController@handleUpdateInfo');

响应部分(uid 和部分返回值删除了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function handleUpdateWeChatInfo(Request $request) {
return response()->json(["errorCode" => 0, "ret" => null]);
}
public function handleUpdateInfo(Request $request) {
return response()->json(["errorCode" => 0, "ret" => null]);
}
public function handleAuthWeChat(Request $request) {
return response()->json(["errorCode" => 0, "ret" => ["uid" => xxxxxxxxxx]]);
}
public function handleGetInfo(Request $request) {
return response()->json(["errorCode" => 0, "ret" => ["target" => , "weight" => "", "gender" => "m", "checkined" => , "checkin_mcount" => , "birthdate" => "", "height" => "", "is_wechat" => true, "avatar" => "", "is_qq" => false, "is_sina" => false, "nickname" => "", "email" => "", "is_email" => false]]);
}

登录进入 App 之后,把 hosts 文件还原,去掉手机上 wifi 的代理,再在 App 中点击立即备份数据,可以看到开始正常备份了。

最后

  • 之所以出现这个问题,是因为残留的 uid 去请求登录的时候会导致失败。可能的原因大概是某一个版本的登录逻辑改变了,但是没有处理好老版本的兼容性。其实哪怕多加一个按钮能重置一下用于登录的临时 id 也好啊。
  • 同步的时候也出现了问题,同步一两条数据后就会卡住不动,不会自动重新开始,需要用户反复的进行操作才能把所有的数据同步完。
  • 退出登录的时候,居然真的把用户的数据删除了。

综合来看,乐动力这个 App 在这部分上设计得是比较烂的,可能只是一个临时的外包产品的品质。

Comments