获取电子发票抬头| 微信小程序/微信公众号H5/第三方接口

微信生态获取发票抬头全方案(小程序 / 公众号 H5 / 第三方查询)
本文整理微信生态下三种主流发票抬头获取方案,包含原生API、JS-SDK对接、第三方接口调用,附带完整代码、权限配置、跨平台适配及踩坑指南,适用于开票、报销、订单系统等业务场景。
📖 一、微信小程序获取发票抬头(原生 API)
接口名称:wx.chooseInvoiceTitle(Object object),微信小程序官方原生接口,用于快速调取用户已保存的发票抬头信息。
官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/invoice/wx.chooseInvoiceTitle.html
基础支持说明
- 基础库要求:1.5.0 及以上,低版本小程序需做版本兼容处理
- 调用方式:支持 Promise 风格调用
- 插件支持:小程序插件使用需基础库 2.16.1 及以上
核心权限约束:调用该接口的小程序,必须关联已完成微信认证的公众号,否则接口直接调用失败。
接口返回字段说明
接口调用成功后,success 回调返回完整发票抬头信息:
type:抬头类型(0 = 单位,1 = 个人)title:发票抬头名称taxNumber:企业税号/统一社会信用代码companyAddress:企业地址telephone:联系电话bankName:开户银行名称bankAccount:银行账号
完整调用代码示例
wx.chooseInvoiceTitle({
success: (res) => {
console.log('获取发票抬头成功', res);
// 业务逻辑:将返回字段填充至表单
const invoiceInfo = {
type: res.type,
title: res.title,
taxNumber: res.taxNumber,
address: res.companyAddress,
phone: res.telephone,
bankName: res.bankName,
bankAccount: res.bankAccount
}
},
fail: (err) => {
console.error('接口调用失败', err);
},
complete: () => {
console.log('接口调用结束');
}
});
🚀 二、微信公众号 H5 获取发票抬头(JS-SDK)
微信公众号网页无法直接调用原生接口,必须依托 微信 JS-SDK 完成签名授权、接口调用。同时 iOS / Android 设备 URL 识别规则不同,需做跨平台适配。
整体流程
引入JS-SDK库 → 后端生成签名 → 前端初始化配置 → 适配双端URL → 调用接口 → 解析返回数据
1. 引入微信 JS-SDK
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
2. JS-SDK 初始化与权限配置
签名参数(appId、timestamp、nonceStr、signature)需由后端通过微信签名算法生成,前端不可伪造。
// 后端返回签名配置参数
const wxConfig = {
appId: "公众号AppID",
timestamp: "时间戳",
nonceStr: "随机字符串",
signature: "签名值"
};
// 初始化 JS-SDK
wx.config({
beta: true,
debug: false, // 生产环境关闭调试模式
appId: wxConfig.appId,
timestamp: wxConfig.timestamp,
nonceStr: wxConfig.nonceStr,
signature: wxConfig.signature,
// 必须声明当前页面需要使用的接口
jsApiList: ["chooseInvoiceTitle"]
});
// 配置验证成功回调
wx.ready(() => {
console.log("JS-SDK 初始化完成,可调用接口");
});
// 配置验证失败回调
wx.error((err) => {
console.error("JS-SDK 配置失败:", err);
});
3. 跨平台 URL 适配(关键避坑)
平台差异:iOS 仅识别页面首次加载入口URL;Android 识别当前动态URL,URL不一致会导致「签名无效」。
// Vue 路由守卫:全局存储页面首次入口URL
router.beforeEach((to, from, next) => {
if (!window.entryUrl) {
window.entryUrl = location.href.split('#')[0];
}
next();
});
// 根据设备类型选择签名URL
const userAgent = navigator.userAgent;
const isAndroid = userAgent.indexOf('Android') > -1 || userAgent.indexOf('Adr') > -1;
let signUrl = "";
if (isAndroid) {
signUrl = location.href.split('#')[0];
} else {
signUrl = window.entryUrl;
}
// 将 signUrl 传给后端生成签名
4. 调用接口并解析发票抬头数据
// JS-SDK 通过 invoke 调用发票抬头接口
wx.invoke('chooseInvoiceTitle', { scene: '1' }, function(res) {
if (res.err_msg !== "chooseInvoiceTitle:ok") {
console.log("用户取消选择或调用失败");
return;
}
// 解析嵌套格式的发票数据
const rawInfo = res.choose_invoice_title_info;
const invoice = JSON.parse(rawInfo);
// 字段映射
const invoiceData = {
title: invoice.title,
taxNumber: invoice.taxNumber,
companyAddress: invoice.companyAddress,
telephone: invoice.telephone,
bankName: invoice.bankName,
bankAccount: invoice.bankAccount,
titleType: invoice.type
};
console.log("最终发票抬头信息:", invoiceData);
});
常见问题汇总
invalid signature:签名错误,检查URL、签名算法、时间戳- 权限失效:公众号未认证、jsApiList 未声明接口
- iOS 签名必败:入口URL未正确捕获
🔍 三、第三方接口智能查询发票抬头
适用于无微信生态环境、用户未保存发票抬头的场景,通过企业名称/税号模糊查询完整购方发票信息。
第三方平台:开放平台 https://open.fa-piao.com
文档地址 智能查询发票抬头
接口基础信息
- 请求地址:
POST /v5/enterprise/smartBuyer - 请求方式:POST
- 必传参数:
•kpdwdm:销方统一社会信用代码(开票方税号)
•nsrmc:购方企业名称(支持关键字模糊查询)
接口成功返回示例
{
"code": 200,
"data": [
{
"ghdwdm": "9150010776594xxxx",
"ghdwdzdh": "重庆市九龙坡区xxxx楼 02368679xxx",
"ghdwmc": "重庆xxxx有限公司",
"ghdwyhzh": "建设银行xxx分行 500010344000xxxx"
}
],
"msg": "成功",
"total": 1
}
返回字段释义
ghdwdm:购方企业税号ghdwmc:购方企业名称ghdwdzdh:企业地址 + 联系电话ghdwyhzh:开户银行 + 银行账号
📊 四、三种方案综合对比
| 实现方案 | 依赖环境 | 核心优点 | 存在不足 | 适用场景 |
|---|---|---|---|---|
| 小程序原生API | 认证公众号 + 微信小程序 | 原生体验、调用速度快、无需额外服务 | 仅支持小程序端,权限约束严格 | 小程序商城、小程序开票/报销 |
| 公众号H5 JS-SDK | 认证公众号 + JS-SDK签名服务 | H5全端适配,复用微信保存数据 | 配置繁琐、需处理跨平台签名问题 | 公众号网页、移动端H5表单 |
| 第三方查询接口 | 第三方平台账号、网络请求 | 无微信限制、支持模糊查询 | 依赖第三方服务、存在调用额度限制 | 后台管理系统、非微信环境业务 |
技术文档 · 微信发票抬头解决方案