微信/支付宝支付回调唤起App指定Activity的原理


一、微信/支付宝支付回调唤起App指定Activity的原理

1. URL Scheme的作用

  • 在Android中,URL Scheme是一种特殊的URI格式(如wxa1234567890abcdef://pay/?result=success),可以用来唯一标识某个App的某个功能入口。
  • 你在AndroidManifest.xml中为某个Activity注册了特定的Scheme(如wxa1234567890abcdef),并配置了,系统就会把所有以这个Scheme开头的Intent分发给你注册的Activity。

2. 微信/支付宝的回调流程

  • 当你在App中发起支付后,微信/支付宝App会记录你的App的Scheme(通常是你在开放平台配置的AppID)。
  • 用户支付完成后,微信/支付宝App会构造一个Intent,内容大致如下:
    • Action: android.intent.action.VIEW
    • Data: wxa1234567890abcdef://pay/?result=success(或其他参数)
  • 微信/支付宝通过startActivitystartActivityForResult,把这个Intent发给系统。

3. Android系统的分发机制

  • Android系统收到这个Intent后,会在所有已安装App的Manifest中查找谁注册了与这个Scheme匹配的Activity
  • 找到后,系统会启动这个Activity,并把Intent传递给它。
  • 你的App的指定Activity(如WXPayEntryActivity)被唤起,收到Intent,进而处理支付结果。

4. 关键点

  • Scheme的唯一性:只有你的App注册了这个Scheme,微信/支付宝才能唯一唤起你的App。
  • Intent-Filter的匹配:Manifest中必须和微信/支付宝后台配置一致。
  • Activity的exported属性:必须为true,否则外部App无法唤起。

二、底层原理简化流程图

  1. 你的App发起支付 → 跳转到微信/支付宝App
  2. 用户支付完成 → 微信/支付宝App构造带有你App Scheme的Intent
  3. 微信/支付宝App调用startActivity(Intent) → 系统查找匹配的App和Activity
  4. 系统唤起你App的指定Activity → 你处理回调

三、举例说明

Manifest配置

<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop">
    <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="wxa1234567890abcdef" />
    intent-filter>
activity>

微信App回调Intent

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("wxa1234567890abcdef://pay/?result=success"));
context.startActivity(intent);

四、相关安全与注意事项

  • exported=true:Android 12及以上必须显式声明,否则外部App无法唤起。
  • Scheme唯一性:避免被其他App抢注,防止安全风险。
  • 参数校验:回调时要校验参数来源,防止被恶意App伪造回调。

下面我将更深入地剖析Android系统是如何通过Intent和Scheme唤起指定Activity的底层机制,并补充一些实际开发和安全相关的细节。


一、Android系统唤起指定Activity的底层流程

1. Intent的构造与发送

  • 微信/支付宝App在支付完成后,会根据你App在开放平台配置的Scheme,构造一个Intent,其核心内容是:
    • action:通常为Intent.ACTION_VIEW
    • data:如wxa1234567890abcdef://pay/?result=success
  • 通过startActivity(intent)startActivityForResult(intent)发送给系统。

2. Android系统的Intent解析与分发

  • PackageManager会扫描所有已安装App的AndroidManifest.xml,查找所有注册了的Activity。
  • 系统会根据Intent的actioncategorydata(即Scheme、Host、Path等)进行三重匹配
    1. Action匹配:如android.intent.action.VIEW
    2. Category匹配:如DEFAULTBROWSABLE
    3. Data匹配:如android:scheme="wxa1234567890abcdef"
  • 匹配到后,系统会将Intent分发到对应的Activity(如WXPayEntryActivity)。

3. Activity的启动

  • 如果你的App未在前台,系统会先启动你的App进程,然后启动指定Activity。
  • 如果App已在前台,直接启动Activity。
  • Activity的onCreate()onNewIntent()等生命周期方法会被调用,你可以在这里处理Intent数据。

二、Scheme匹配的细节

  • 可以更精细地控制匹配范围。
  • 只配置scheme时,所有以该scheme开头的URL都会匹配到该Activity。
  • 可以配置多个标签,支持多个Scheme或Host。

三、实际开发中的注意事项

1. 多渠道/多AppID场景

  • 每个渠道包/环境的Scheme要唯一,防止回调混乱。
  • 微信/支付宝开放平台后台的Scheme配置要和Manifest一致。

2. Android 12及以上的exported属性

  • 必须加上android:exported="true",否则外部App无法唤起你的Activity。

3. 安全性

  • 防止伪造回调:任何App都可以发起带你Scheme的Intent,务必在回调Activity中校验数据来源(如校验签名、参数等)。
  • 防止Scheme被抢注:Scheme要足够唯一(如用AppID),避免被其他App注册。

4. 用户体验

  • 回调Activity建议设置为透明主题,处理完回调后立即finish,避免用户看到无意义的界面。

四、相关源码与机制

  • Android系统的Intent分发机制主要在ActivityManagerServicePackageManagerService中实现。
  • 系统会维护一份所有App的Intent-Filter索引表,收到Intent后高效查找匹配项。

五、举例说明

Manifest配置
<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:theme="@android:style/Theme.Translucent.NoTitleBar">
    <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="wxa1234567890abcdef" />
    intent-filter>
activity>
微信/支付宝回调
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("wxa1234567890abcdef://pay/?result=success"));
context.startActivity(intent);
Activity处理
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 解析Intent,处理支付结果
    // 校验来源,防止伪造
    finish();
}

六、总结

  • 微信/支付宝通过Intent+Scheme机制唤起你App的指定Activity,是Android标准的App间通信方式。
  • Manifest中的Scheme注册和开放平台配置必须一致,exported必须为true。
  • 系统通过Intent-Filter三重匹配机制,自动分发到你注册的Activity。
  • 务必注意安全性和用户体验,防止被恶意App利用。

你可能感兴趣的:(sdk接入,sdk接入)