最近做了一个跳转微信小程序付出的功能,可是发现付出完成后跳转不回原App。

一、产生原因

微信的SDK文档中要求在app主模块的包姓名录下创立wxapi的文件夹,然后创立一个WXPayEntryActivity,可是我们的工程是一个组件化项目,只要商城shop模块才需要用到付出,而且app模块原本便是一个壳,塞这些微信的东西进去就很厌恶。

二、解决办法

运用activity署理的方式重定向微信的Acticity。

app主模块的清单文件中运用署理:

<application    //放在application根节点中
    android:name="包名.base.BaseApplication"
    android:requestLegacyExternalStorage="true">
    ...
    <!-- WXEntryActivity的署理,用于微信付出跨组件调用 -->
    <activity-alias
        android:name="${applicationId}.wxapi.WXEntryActivity"
        android:exported="true"
        android:targetActivity="包名.shop.WXEntryActivity"/>   //这儿的WXEntryActivity能够随意改姓名,且不需要放在wxapi文件夹下
</application>

然后在shop模块定义一个署理的方针Activity即可。

<activity
    android:name=".WXEntryActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

在署理Activity(姓名随意取,但建议与WXEntryActivity同名好找好保护)中完成微信的回调逻辑即可:

class WXEntryActivity : BaseActivity<BaseViewModel, ActivityWxpayEntryBinding>(),
    IWXAPIEventHandler {
    private var api: IWXAPI? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        api = WXAPIFactory.createWXAPI(this, UnifyPayPlugin.getInstance(this).appId)
        api?.handleIntent(intent, this)
    }
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
        api?.handleIntent(intent, this)
    }
    override fun onReq(baseReq: BaseReq?) {
    }
    override fun onResp(baseResp: BaseResp?) {
        if (baseResp?.type == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {   //小程序回调
            //处理微信的结果回调
           ...
        }
        finish()
    }
}