uni-app调用微信小程序发票抬头API需满足:仅MP-WEIXIN平台、基础库≥2.0.0真机环境;manifest勾选微信小程序并开通电子发票权限;用户微信卡包已绑定有效抬头。

uni-app 调用微信小程序发票抬头 API 的前提条件
微信小程序的发票抬头功能依赖原生 wx.chooseInvoiceTitle,而 uni-app 默认 H5/APP 端不支持该 API。只有在 微信小程序平台编译 且 基础库 >= 2.0.0 的真机环境(开发者工具模拟有时失效)下才能调用成功。
- 必须使用
uni.getProvider检查当前是否运行在微信小程序环境:uni.getProvider({service: 'invoice'})返回空数组?说明未启用发票能力,需确认 manifest.json 中已勾选「微信小程序」并重新编译 - 小程序后台需开通「微信支付」和「电子发票」权限(即使不走支付流程,仅调用抬头选择也需要发票类目资质)
- 用户需已绑定微信卡包,否则
wx.chooseInvoiceTitle会直接失败并报错errCode: -1
uni-app 中正确调用 chooseInvoiceTitle 的写法
uni-app 不提供跨平台封装的发票 API,必须通过 uni.$on('wx') 或条件编译调用原生微信方法:
-
使用条件编译(推荐):
// #ifdef MP-WEIXIN wx.chooseInvoiceTitle({ success(res) { console.log('发票抬头', res) // res.title:单位名称 // res.taxNumber:纳税人识别号 // res.companyAddress:地址电话 // res.bankAccount:开户行及账号 }, fail(err) { console.error('调用失败', err.errMsg) // 如 'chooseInvoiceTitle:fail cancel' 或 'fail not support' } }) // #endif 不要用
uni.chooseInvoiceTitle—— 这个 API 不存在,uni-app 官方未封装不能在 onLoad/onShow 中直接调用:部分机型会因页面未完全 ready 导致白屏或静默失败,建议绑定按钮点击触发
常见错误与对应处理
-
fail not support:基础库版本过低(检查 project.config.json 中 minPlatformVersion 是否 ≥ 2.0.0),或当前运行环境不是微信小程序(如调试时误选 H5 模式)
-
fail cancel:用户手动取消,无需报错,但需判断 res.errMsg 是否含 cancel 字符串来区分主动放弃和异常
- 返回字段缺失(如无
taxNumber):用户在微信卡包中未填写完整信息,不能假设所有字段必填;后端接收时应允许空值或做默认占位
- 多次调用卡死:微信原生限制连续调用会阻塞,建议加防抖(
setTimeout + 标志位)或禁用按钮直到回调完成
发票抬头数据如何安全传给后端
fail not support:基础库版本过低(检查 project.config.json 中 minPlatformVersion 是否 ≥ 2.0.0),或当前运行环境不是微信小程序(如调试时误选 H5 模式)fail cancel:用户手动取消,无需报错,但需判断 res.errMsg 是否含 cancel 字符串来区分主动放弃和异常taxNumber):用户在微信卡包中未填写完整信息,不能假设所有字段必填;后端接收时应允许空值或做默认占位setTimeout + 标志位)或禁用按钮直到回调完成微信返回的抬头信息是明文,但敏感字段(如 taxNumber)可能涉及合规要求:
- 不要直接将
res整体透传给后端;提取必要字段,剔除timestamp、encryptData等冗余项 - 若后端需要验签,微信未提供发票抬头的签名机制,只能靠业务层约定加密(如 AES 加密
taxNumber后传输) - 注意字符长度限制:
title最长 50 字符,taxNumber最长 20 字符,超长需截断或前端提示
微信发票抬头功能本身不依赖支付,但整个链路对环境、权限、用户状态高度敏感——哪怕 manifest 配置差一个勾选,或用户微信卡包里少填一项,都会静默失败。真机测试前务必确认三件事:基础库版本、小程序后台发票类目开通状态、用户微信「我 → 卡包 → 发票抬头」里至少有一条有效记录。



















