-
-
[原创]个人微信、企业微信先后通过好友请求
-
发表于: 5天前 268
-
大概流程

企业微信端逻辑
系统识别 wxwork:// 协议 → 唤起企业微信 → 由 AppSchemeLaunchActivity 接收并解析参数 → 跳转到好友申请处理页面,完成申请人信息展示、通过 / 拒绝等操作。
<activity
android:theme="@style/as"
android:label="@string/zk"
android:icon="@drawable/ww_ic_launcher"
android:name="com.tencent.wework.launch.AppSchemeLaunchActivity"
android:exported="true"
android:taskAffinity=":jump"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="wework"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="wxworkpaid"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="wxwork"/>
</intent-filter>
具体的 URL 业务逻辑被封装到外部工具类中
代码里的核心逻辑是这行:
if (eqz.f6118c.b().b(this, intent.getData(), schemeInteractHelperParams, getIntent())) { return; }

这里的eqz.f6118c.b().b(...)是Scheme 路由的核心工具类调用,intent.getData()就是传入的wxwork://对应的 Uri 对象(包含appid、profilecode等参数)。
也就是说:
- AppSchemeLaunchActivity只是入口组件,负责接收wxwork://的跳转请求;
- 真正的 URL 解析、参数处理、页面路由(比如跳转到好友申请页面)都在eqz、wi3这些外部工具类中(代码里的defpackage.eqz是反编译后的包名,实际是企业微信的内部工具类)。
public final boolean b(Context context, Uri r12, SchemeInteractHelperParams params, Intent r14) {
Object obj;
String scheme;
boolean z;
// 用于存储是否处理成功的标记(引用类型,方便内部修改)
Ref.BooleanRef booleanRef = new Ref.BooleanRef();
try {
// 1. 封装上下文、参数、Uri为工具类对象cVar(业务处理的上下文载体)
c cVar = new c(context, params, r12);
// 2. 遍历第一个处理器集合(this.b),匹配能处理当前Uri的处理器
Iterator<T> it2 = this.b.iterator();
while (true) {
if (!it2.hasNext()) {
obj = null;
break;
}
obj = it2.next();
// 通过反射获取对应的处理器实例xrj(xrj是Scheme处理器的接口)
xrj a2 = f6118c.a((Class) obj);
// 如果处理器存在,且处理器的d方法能处理当前Uri,则终止遍历
if (a2 != null && a2.d(context, r12, cVar, r14)) {
break;
}
}
// 3. 如果在第一个集合中找到匹配的处理器,标记为处理成功
if (((Class) obj) != null) {
booleanRef.element = true;
} else if (r12 != null && (scheme = r12.getScheme()) != null) {
// 4. 第一个集合没找到,就根据Scheme(如wxwork)匹配第二个处理器集合(this.a)
Locale ROOT = Locale.ROOT;
Intrinsics.checkNotNullExpressionValue(ROOT, "ROOT");
// 把Scheme转为小写(兼容大小写,比如WXWork和wxwork)
String lowerCase = scheme.toLowerCase(ROOT);
Intrinsics.checkNotNullExpressionValue(lowerCase, "this as java.lang.String).toLowerCase(locale)");
if (lowerCase != null) {
// 检查该Scheme是否在预定义的处理器映射表中(this.a是Scheme->处理器Class的Map)
if (!((lowerCase.length() > 0) && this.a.get(lowerCase) != null)) {
lowerCase = null;
}
if (lowerCase != null) {
// 获取该Scheme对应的处理器Class
Class<?> it3 = this.a.get(lowerCase);
if (it3 != null) {
// 反射创建处理器实例
b bVar = f6118c;
Intrinsics.checkNotNullExpressionValue(it3, "it");
xrj a3 = bVar.a(it3);
// 调用处理器的d方法处理Uri,获取处理结果
Boolean valueOf = a3 != null ? Boolean.valueOf(a3.d(context, r12, cVar, r14)) : null;
if (valueOf != null) {
z = valueOf.booleanValue();
// 标记处理结果
booleanRef.element = z;
}
}
// 若处理器不存在,标记为处理失败
z = false;
booleanRef.element = z;
}
}
}
// 5. 如果所有处理器都没处理成功,返回失败结果
if (!booleanRef.element) {
cVar.a(new SchemeHandlerResultInfo(false, null, null, 6, null));
}
// 6. 记录Uri处理的日志(埋点/统计用)
j(r12);
} catch (Exception e2) {
// 捕获异常,打印日志(避免崩溃)
u0.u("SchemeInteractHelper", new Object[]{"handle", e2.getMessage()}, "4c319dea:m_launch", "144");
}
// 返回最终的处理结果
return booleanRef.element;
}赞赏
他的文章
- [原创]个人微信、企业微信先后通过好友请求 269
- dy逆向分析 10828
- app不同版本插件匹配的加密方式 6921
- [原创]RC4、Base64魔改看雪CTF-变形金刚学习笔记 15774
- [原创]企业微信逆向分析之——自己二维码——静态分析 16133
赞赏
雪币:
留言: