小程序引导评价弹窗必须由用户点击触发且满足24小时内仅1次等条件,否则wx.requestreview会静默失败;需封装为带行为阈值判断的函数,fallback至应用宝/app store或小程序主页。

小程序端的引导评价弹窗,不能靠 uni.showModal 或简单弹层硬推——微信已限制非用户主动触发场景下的评分调用,直接调用 wx.requestReview 会静默失败或被拦截。必须走「用户点击触发 + 条件判断」双保险逻辑。
为什么 wx.requestReview 在某些情况下不弹窗
微信对 wx.requestReview 有严格限制:
- 用户需在当前 session 内有过明确交互(如点击按钮),不能在页面 onLoad 或定时器中自动调用
- 同一用户 24 小时内最多触发 1 次,重复调用返回 success 但无实际弹窗
- 小程序版本号必须 ≥ 2.10.4,且未被用户手动拒绝过(拒绝后需重新进入小程序才可能恢复)
- 真机调试时可能因调试模式屏蔽弹窗,需用体验版或正式版验证
如何正确封装 requestReview 触发逻辑
推荐将调用收口到一个可复用的函数,并绑定在用户显式操作上(比如“给好评”按钮):
- 按钮必须使用
open-type="feedback"或普通@click,不能用bindtap防止事件冒泡干扰 - 调用前建议加一层用户行为阈值判断,例如:使用时长 > 60s、完成订单 ≥ 1 单、页面停留 ≥ 3 个 tab
- 调用后务必监听 success/fail 回调,fail 时降级为跳转 App Store 或展示文案引导
- 不要在
onLoad、onShow中直接调用;可在用户点击后延迟 300ms 再执行,避开微信防误触机制
示例代码片段:
const triggerReview = () => {
if (!wx.requestReview) return;
wx.requestReview({
success: () => console.log('评分弹窗已发出'),
fail: (err) => {
// err.errMsg 可能是 'requestReview:fail deny' 或 'requestReview:fail system deny'
uni.showToast({ title: '暂无法发起评分', icon: 'none' });
// 此处可 fallback 到跳转小程序主页 or 展示引导文案
}
});
};
微信小程序端评价弹窗的兼容性兜底方案
当 wx.requestReview 不可用时,需提供明确替代路径:
- Android 端可跳转应用宝详情页:
https://android.myapp.com/myapp/detail.htm?apkName=your-pkg-name - iOS 端可跳转 App Store(需提前配置 valid urls):
itms-apps://itunes.apple.com/app/id{appId} - 微信内统一 fallback:跳转小程序主页并高亮「我的-设置-反馈与建议」入口
- 文案必须明确告知用户“评分帮助我们更好服务您”,避免诱导性话术(如“好评返现”)
注意:跳转 URL 必须在小程序后台「业务域名」中备案,否则 web-view 或 openURL 会被拦截。
容易忽略的真机调试陷阱
开发阶段常踩的坑集中在环境判断和触发时机:
- 用
uni.getSystemInfoSync().platform判断平台不可靠,应优先用条件编译#ifdef MP-WEIXIN - 开发者工具模拟器默认禁用评分弹窗,必须用真机 + 体验版测试
- 用户首次拒绝后,
wx.getSetting({withSubscriptions: true})返回的scope.writePhotosAlbum类字段不会包含 review 权限,也无法二次申请 - 弹窗内容不可自定义,微信完全控制 UI 和文案,任何试图修改标题/按钮文字的操作都无效
真正可控的只有触发时机和 fallback 路径——把这两点做扎实,比堆砌动画或样式更重要。











