最近做了一个跳转微信小程序支付的功能,但是发现支付完成后跳转不回原App。
一、产生原因
微信的SDK文档中要求在app
主模块的包名目录下创建wxapi
的文件夹,然后创建一个WXPayEntryActivity
,但是我们的工程是一个组件化项目,只有商城shop
模块才需要用到支付,并且app
模块本来就是一个壳,塞这些微信的东西进去就很恶心。
二、解决办法
使用activity代理的方式重定向微信的Acticity。
在app
主模块的清单文件中使用代理:
kotlin
<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即可。
kotlin
<activity
android:name=".WXEntryActivity"
android:exported="true"
android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
在代理Activity
(名字随便取,但建议与WXEntryActivity
同名好找好维护)中实现微信的回调逻辑即可:
kotlin
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()
}
}