首页
社区
课程
招聘
[原创]个人微信、企业微信先后通过好友请求
发表于: 5天前 268

[原创]个人微信、企业微信先后通过好友请求

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 对象(包含appidprofilecode等参数)。

也就是说:

  • AppSchemeLaunchActivity只是入口组件,负责接收wxwork://的跳转请求;
  • 真正的 URL 解析、参数处理、页面路由(比如跳转到好友申请页面)都在eqzwi3这些外部工具类中(代码里的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;
}





[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回