uni-app中微信小程序发票抬头必须用wx.chooseInvoiceTitle而非uni.chooseInvoiceTitle,需条件编译、真机调试、用户授权及主动触发,且仅支持从微信卡包选择已有抬头。

uni-app 调用微信小程序「发票抬头选择」接口的正确方式
不能直接用 uni.chooseInvoiceTitle —— 这个 API 在微信小程序平台根本不存在,是 H5 专属。uni-app 编译到微信小程序时,必须走微信原生提供的 wx.chooseInvoiceTitle,且需手动配置和调用。
为什么 uni.chooseInvoiceTitle 在微信小程序里报错或无响应
因为 uni-app 的 uni.chooseInvoiceTitle 底层只实现了 H5 和支付宝小程序,微信小程序未做适配。实际编译后,该调用在微信环境会被忽略或抛出 not function 类型错误。
- 检查控制台是否出现
TypeError: uni.chooseInvoiceTitle is not a function - 确认
manifest.json中微信小程序 AppID 已正确填写,否则部分 wx.* 接口会静默失败 - 微信要求必须在真机调试(开发者工具不支持发票相关 API),模拟器或预览无效
微信小程序发票抬头选择的实操步骤
必须使用条件编译 + 原生 wx.chooseInvoiceTitle,并处理好回调格式兼容。
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
- 在调用处用
#ifdef MP-WEIXIN包裹,避免其他平台报错 - 调用前确保用户已授权
scope.invoiceTitle,否则直接失败;可先调用wx.authorize({scope: 'scope.invoiceTitle'})或引导用户去设置页 - 成功回调返回的
res结构与 H5 不同:包含type(0表示个人,1表示企业)、title、taxNumber、companyAddress等字段,没有tel和bankAccount的固定键名,需按需映射 - 注意:微信发票抬头接口仅支持「从微信卡包中选择已有抬头」,不支持新增或编辑,业务上需提前告知用户
#ifdef MP-WEIXIN
wx.chooseInvoiceTitle({
success: (res) => {
const invoice = {
type: res.type === '1' ? 'company' : 'personal',
title: res.title || '',
taxNumber: res.taxNumber || '',
companyAddress: res.companyAddress || '',
telephone: res.telephone || '',
bankName: res.bankName || '',
bankAccount: res.bankAccount || ''
}
// 后续业务逻辑
},
fail: (err) => {
console.error('选择发票抬头失败', err)
// err.errMsg 可能是 'chooseInvoiceTitle:fail auth deny' 或 'fail cancel'
}
})
#endif常见兼容性坑和绕过建议
微信发票接口对环境极其敏感,很多问题不是代码写错,而是配置或时机不对。
- 必须在用户主动触发的事件回调中调用(如 button 的
bindtap),不能在页面 onLoad 或异步 setTimeout 里直接调;否则报fail invalid callback - 微信基础库版本需 ≥ 2.0.0,但建议 ≥ 2.19.0(修复了部分字段缺失问题);可在
manifest.json → 微信小程序 → 最低基础库版本设置 - 如果用户从未在微信中添加过抬头,
wx.chooseInvoiceTitle会直接进入fail回调,且errMsg是fail cancel(不是权限拒绝),需提示“请先在微信卡包中添加发票抬头” - uni-app 的
uni.getProvider对invoiceTitle不返回微信平台,所以无法用它做运行时判断,只能靠条件编译
微信发票抬头功能看似简单,但几乎所有失败都卡在「真机+授权+触发时机+基础库」这四个点上,缺一不可。别在开发者工具里反复试,拿真机扫码调试最省时间。


















