Skip to main content

发票SDK Python 电子发票/数电发票/全电发票/数电票/开票

Project description

电子发票/数电发票 Python SDK | 开票、验真、红冲一站式集成

PyPI version License Python 3.7+

发票 Python SDK 专为电子发票、数电发票(全电发票)场景设计,支持开票、红冲、版式文件下载等核心功能,快速对接税务平台API。

关键词: 电子发票SDK,数电票Python,开票接口,发票api,发票开具,发票红冲,全电发票集成


📖 核心功能

基础认证

  • 获取授权 - 快速接入税务平台身份认证
  • 人脸二维码登录 - 支持数电发票平台扫码登录
  • 认证状态查询 - 实时获取纳税人身份状态

发票开具

  • 🟦 数电蓝票开具 - 支持增值税普通/专用电子发票
  • 📄 版式文件下载 - 自动获取销项发票PDF/OFD/XML文件

发票红冲

  • 🔍 红冲前蓝票查询 - 精确检索待红冲的电子发票
  • 🛑 红字信息表申请 - 生成红冲凭证
  • 🔄 负数发票开具 - 自动化红冲流程

🚀 快速安装

pip install tax-invoice

📦 查看pypi地址


📚 查看完整中文文档 | 💡 更多示例代码


🔍 为什么选择此SDK?

  • 精准覆盖中国数电发票标准 - 严格遵循国家最新接口规范
  • 开箱即用 - 无需处理XML/签名等底层细节,专注业务逻辑
  • 企业级验证 - 已在生产环境处理超100万张电子发票

📊 支持的开票类型

发票类型 状态
数电发票(普通发票) ✅ 支持
数电发票(增值税专用发票) ✅ 支持
数电发票(铁路电子客票) ✅ 支持
数电发票(航空运输电子客票行程单) ✅ 支持
数电票(二手车销售统一发票) ✅ 支持
数电纸质发票(增值税专用发票) ✅ 支持
数电纸质发票(普通发票) ✅ 支持
数电纸质发票(机动车发票) ✅ 支持
数电纸质发票(二手车发票) ✅ 支持

🤝 贡献与支持

from tax.invoice import InvoiceClient
from tax.invoice.utils.other import calculate_tax
import time
import traceback  # 新增导入

# 配置信息
appKey = "YOUR_APP_KEY"""
appSecret = "YOUR_APP_SECRET"
nsrsbh = "91500112MADFAQ9xxx"  # 统一社会信用代码
title = "重庆悦江河科技有限公司"  # 名称(营业执照)
username = "1912284xxxx"  # 手机号码(电子税务局)
password = ""  # 个人用户密码(电子税务局)
sf = "01"  # 身份(电子税务局)
fphm = "24502000000045823936"
token = ""


# 初始化客户端
client = InvoiceClient(
    app_key=appKey,
    app_secret=appSecret,
    base_url="https://api.fa-piao.com"
)



try:
    # 获取授权
    if token :
        client.auth.set_token(token)
    else:
        auth_response = client.auth.get_authorization(nsrsbh=nsrsbh)
        if auth_response.get("code") == 200:
            print(f"授权成功,Token: {auth_response.get('data', {}).get('token')}")
            token = auth_response.get('data', {}).get('token')

    # 获取认证状态
    status_response = client.auth.query_face_auth_state(nsrsbh=nsrsbh, username=username)
    status_code = status_response.get("code")

    if status_code == 200:
        print("认证状态: 无需认证")
        
        # amount = 200
        # taxRate = 0.01
        # isIncludeTax = False # 是否含税
        # # 税额计算
        # se =  float(calculate_tax(amount,taxRate,isIncludeTax))  # 强制转换为浮点数
        # print("价税合计:" + str(amount))
        # print("税率:" + str(taxRate))
        # print("合计金额:" + str(amount - se))
        # print(("含税" if isIncludeTax else "不含税") + " 合计税额:" + str(se))

        # 开具蓝票示例
        invoice_params = {
            "fpqqlsh": appKey + str(int(time.time() * 1000)),
            "fplxdm": "82",
            "kplx": "0",
            "xhdwsbh": nsrsbh,
            "xhdwmc": title,
            "xhdwdzdh": "重庆市渝北区仙桃街道汇业街1号17-2 19122840xxxx",
            "xhdwyhzh": "中国工商银行 310008670920023xxxx",
            "ghdwmc": "个人",
            "zsfs": "0",
            
            # 添加商品明细
            "fyxm": [
                {
                    "fphxz": "0",
                    "spmc": "*信息技术服务*软件开发服务",
                    "je": "10",
                    "sl": "0.01",
                    "se": "0.1",
                    "hsbz": "1",
                    "spbm": "3040201010000000000"
                }
            ],
            
            # 合计金额
            "hjje": "9.9",
            "hjse": "0.1",
            "jshj": "10"
        }
        
        invoice_response = client.invoice.issue_blue_invoice(**invoice_params)
        print(f"{invoice_response.get('code')} 开票结果: {invoice_response.get('msg')}")
        
        if invoice_response.get("code") == 200:
            print(f"发票号码: {invoice_response.get('data', {}).get('Fphm')}")
            print(f"开票日期: {invoice_response.get('data', {}).get('Kprq')}")
            fphm = invoice_response.get('data', {}).get('Fphm')
            time.sleep(10)  # 等待10秒
        
        # 下载发票
        pdf_params = {
            "downflag": "4",
            "nsrsbh": nsrsbh,
            "username": username,
            "fphm": fphm
        }
        
        pdf_response = client.invoice.get_pdf_ofd_xml(**pdf_params)
        if pdf_response.get("code") == 200:
            print(pdf_response.get("data"))

    elif status_code == 420:
        print("登录(短信认证)")
        # 登录数电发票平台 短信
        
        # # 1 发短信验证码
        # sms_code = ""
        # login_response = client.auth.login_dppt(nsrsbh=nsrsbh, username=username, password=password, sms_code=None)
        # if login_response.get("code") == 200:
        #     print(login_response.get("msg"))
        #     print(f"请{username}接收验证码")
        #     time.sleep(60)  # 模拟等待60秒
        
        # # 2 输入验证码
        # print("请输入验证码")
        # sms_code = input("验证码: ")  # 这里可以根据实际情况获取验证码
        # login_response2 = client.auth.login_dppt(nsrsbh=nsrsbh, username=username, password=password, sms_code=sms_code)
        # if login_response2.get("code") == 200:
        #     print(login_response2.get("data"))
        #     print("验证成功")
    
    elif status_code == 430:
        print("人脸认证")
        # 1 获取人脸二维码
        qr_code_response = client.auth.get_face_img(nsrsbh=nsrsbh, username=username, type="1")
        print("二维码: " + str(qr_code_response.get("data")))
        
        ewmlyx = qr_code_response.get("data", {}).get("ewmlyx")
        if ewmlyx == "swj":
            print("请使用税务局app扫码")  # ewm自己生成二维码
        elif ewmlyx == "grsds":
            print("个人所得税app扫码")  # ewm是二维码的base64
        
        # 2 认证完成后 获取人脸二维码认证状态
        rzid = qr_code_response.get("data", {}).get("rzid")
        # rzid = "5c028e62f23e4b5ca57668bc74c0de98"
        face_status_response = client.auth.get_face_state(nsrsbh=nsrsbh, rzid=rzid, username=username, type="1")
        print("code: " + str(face_status_response.get("code")))
        print("data: " + str(face_status_response.get("data")))
        
        if face_status_response.get("data") is not None:
            slzt = face_status_response.get("data", {}).get("slzt")
            if slzt == "1":
                print("未认证")
            elif slzt == "2":
                print("成功")
            elif slzt == "3":
                print("二维码过期-->重新获取人脸二维码")
    
    elif status_code == 401:
        # 重新授权
        print(f"{status_response.get('code')}授权失败:{status_response.get('msg')}")
    
    else:
        print(f"{status_response.get('code')}  {status_response.get('msg')}")

except Exception as e:
    # 打印完整堆栈信息(包含行号)
    traceback.print_exc()  # 新增堆栈跟踪
    
    # 添加上下文信息(可选)
    print(f"\n错误发生时参数状态:")
    print(f"当前时间戳: {int(time.time())}")

发票红冲

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tax_invoice-1.0.10.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tax_invoice-1.0.10-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

Details for the file tax_invoice-1.0.10.tar.gz.

File metadata

  • Download URL: tax_invoice-1.0.10.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for tax_invoice-1.0.10.tar.gz
Algorithm Hash digest
SHA256 9d39d56f3f7cc884f6bb646c2e3e7a95f8793306ccf53663c6328ee7936ffa9a
MD5 1a23a67ad2878dceb14a9d07605e6be6
BLAKE2b-256 73e94ca617096a475bd54eb8611a6b805afc1ba6109fffd1f1e7ac3e0f48b302

See more details on using hashes here.

File details

Details for the file tax_invoice-1.0.10-py3-none-any.whl.

File metadata

  • Download URL: tax_invoice-1.0.10-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for tax_invoice-1.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 0108af78ff4ee3e41b1012ab4e9c36275f859fcd367ead5412aa0f6314a1d3b7
MD5 7e8bfaa9ea7067240b5da41a39254f9c
BLAKE2b-256 7946fd2232a9966e8c4fc7fdc65b19f36a778a225dd598de07afcf9da29da9d3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page