uni-app 引入支付宝小程序消息订阅插件后 page not found
结论
问题主要有两处:插件别名不一致,以及页面没有注册插件组件。
app.json 中的插件别名是 thePlugin,页面加载插件时却使用了 requirePlugin('subscribeMsg')。插件别名必须完全一致,否则运行时找不到插件,并可能直接跳转到支付宝小程序的 “page not found” 错误页。
此外,在使用 <subscribe-msg /> 前,需要在对应页面的 usingComponents 中声明该插件组件。相关配置和代码也应限制在支付宝小程序端编译。
正确配置插件
在 uni-app 项目的 manifest.json 中配置支付宝小程序插件。可以直接将插件别名统一为 subscribeMsg:
{
"mp-alipay": {
"usingComponents": true,
"appid": "xxxxxxxxx",
"plugins": {
"subscribeMsg": {
"version": "*",
"provider": "2021001155639035"
}
}
}
}
这里的 subscribeMsg 是项目为插件定义的别名,后面的组件路径和 requirePlugin() 都必须使用同一个名字。
正式项目不宜长期使用 "version": "*"。确认可用版本后,最好改为具体版本,以免插件升级带来兼容问题。可用版本以支付宝小程序后台和插件文档显示的信息为准。
在页面中注册插件组件
在 pages.json 对应页面的 style 中声明 usingComponents:
{
"path": "pages/month-card/apply",
"style": {
"navigationBarTitleText": "月卡申请",
"enablePullDownRefresh": true,
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"usingComponents": {
"subscribe-msg": "plugin://subscribeMsg/subscribe-msg"
}
}
}
如果该组件只供支付宝小程序使用,可以通过条件编译限制配置范围:
{
"path": "pages/month-card/apply",
"style": {
"navigationBarTitleText": "月卡申请",
"enablePullDownRefresh": true,
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black"
// #ifdef MP-ALIPAY
,
"usingComponents": {
"subscribe-msg": "plugin://subscribeMsg/subscribe-msg"
}
// #endif
}
}
条件编译后要保证生成的 JSON 仍然合法,尤其要留意逗号的位置。如果当前 HBuilderX 或编译器版本不能稳定处理这种写法,也可以直接保留 usingComponents,同时确保该页面只在支付宝端使用。
原配置把整个页面样式放在 MP-WEIXIN 条件中:
// #ifdef MP-WEIXIN
"style": {
...
}
// #endif
这样编译支付宝端时,页面不会获得这部分 style 配置,自然也读不到支付宝插件的组件声明。这不一定是 “page not found” 的直接原因,但配置范围与当前需求不符。
页面中使用插件
模板中的插件组件也应限制在支付宝小程序端:
<template>
<view>
<!-- #ifdef MP-ALIPAY -->
<subscribe-msg />
<!-- #endif -->
</view>
</template>
脚本中同样使用 subscribeMsg 这个插件别名:
// #ifdef MP-ALIPAY
const { requestSubscribeMessage } = requirePlugin('subscribeMsg');
// #endif
也可以保留完整的插件对象,调用时会更清楚:
// #ifdef MP-ALIPAY
const subscribeMsgPlugin = requirePlugin('subscribeMsg');
// #endif
export default {
methods: {
subscribe() {
// #ifdef MP-ALIPAY
subscribeMsgPlugin.requestSubscribeMessage({
// 按插件文档填写参数
});
// #endif
}
}
};
如果继续在 manifest.json 中使用 thePlugin 作为别名,另外两处也要同步修改:
{
"subscribe-msg": "plugin://thePlugin/subscribe-msg"
}
const { requestSubscribeMessage } = requirePlugin('thePlugin');
两种命名方式都可以,但以下三处必须一致:
plugins 中的键名
↓
plugin://插件别名/组件名
↓
requirePlugin('插件别名')
仍然报错时的检查顺序
先查看编译后的支付宝小程序目录中的 app.json,确认文件里确实生成了插件声明:
{
"plugins": {
"subscribeMsg": {
"version": "*",
"provider": "2021001155639035"
}
}
}
然后检查目标页面生成的 JSON 文件,确认其中包含:
{
"usingComponents": {
"subscribe-msg": "plugin://subscribeMsg/subscribe-msg"
}
}
如果生成文件没有问题,但插件仍然无法加载,再逐项确认:
- 当前支付宝小程序应用是否已在后台申请或添加该插件;
- 插件提供方是否允许当前应用使用;
provider是否与官方文档及插件后台显示的插件 ID 一致;- 当前基础库和开发者工具版本是否满足插件要求;
- 真机预览、体验版和开发者工具是否使用同一个支付宝小程序
appid; - 修改插件配置后,是否删除旧的编译产物并重新编译,以免开发者工具继续读取缓存;
- 插件文档中的组件名是否确实为
subscribe-msg。如果文档提供了其他组件名,应据此修改plugin://subscribeMsg/...的后半部分。
当前最先需要处理的是 thePlugin 与 subscribeMsg 的别名冲突,然后在页面配置中补上 usingComponents。只写 <subscribe-msg /> 或调用 requirePlugin(),不会自动注册插件组件。
备注:内容仅供参考。
