PHP 怎么发票查验

wen PHP项目 1

本文目录导读:

PHP 怎么发票查验

  1. 方案一:模拟登录官方平台(不推荐,容易被封)
  2. 方案二:调用第三方 API(推荐,适合企业)
  3. 方案三:对接国家税务总局“乐企数字开放平台”(最合规,适合大型企业)
  4. 总结与建议

个人或企业进行发票查验(尤其是增值税发票),最官方、最权威的渠道是国家税务总局的“全国增值税发票查验平台”,在 PHP 中开发发票查验功能,没有任何官方公开的免费 API 可以直接调用。

PHP 实现发票查验通常有三种方案,以下是详细的实现思路和代码示例:


模拟登录官方平台(不推荐,容易被封)

这是最直接但也最脆弱的方式,官方平台有复杂的 JavaScript 加密和滑块验证,单纯用 PHP 的 cURL 模拟登录成功率极低,且违反网站使用条款。除非是内部极低频使用,否则不建议。


调用第三方 API(推荐,适合企业)

这是最主流的做法,选择一家有正规资质的第三方数据服务商(如聚合数据、APISpace、阿里云市场等),购买发票查验 API 服务。

流程:

  1. 在服务商平台注册并购买“发票查验” API。
  2. 获取 AppKeyAppSecret
  3. 后端 PHP 将发票信息(发票代码、号码、开票日期、校验码/金额)发送给第三方 API。
  4. 第三方返回查验结果(真伪、发票详情)。

PHP 调用第三方 API 示例(以常见的 POST JSON 为例)

<?php
/**
 * 发票查验函数(基于第三方 API)
 * @param string $fpdm 发票代码(10位或12位)
 * @param string $fphm 发票号码(8位)
 * @param string $kprq 开票日期 (YYYY-MM-DD)
 * @param string $kjhj 价税合计(校验码后6位,或输入金额,视不同接口要求)
 * @return array 查验结果
 */
function checkInvoice($fpdm, $fphm, $kprq, $kjhj) {
    // 1. 第三方平台提供的配置(示例数据)
    $appcode = '你的AppCode'; // 用于头部认证
    $api_url = 'https://api.example.com/invoice/verify'; // 第三方接口地址
    // 2. 构造请求数据(根据所购 API 的文档调整字段)
    $postData = [
        'fpdm' => $fpdm,      // 发票代码
        'fphm' => $fphm,      // 发票号码
        'kprq' => $kprq,      // 开票日期
        'kjhj' => $kjhj,      // 校验码后6位 或 不含税金额
        'fpqqlx' => '01'      // 发票类型代码(如:01 增值税专用发票)
    ];
    // 3. 初始化 cURL
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTPHEADER => [
            'Authorization: APPCODE ' . $appcode,
            'Content-Type: application/json; charset=UTF-8'
        ],
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($postData)
    ]);
    // 4. 执行请求
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    // 5. 处理返回结果
    if ($error) {
        return ['success' => false, 'msg' => '请求失败: ' . $error];
    }
    $data = json_decode($response, true);
    // 根据具体接口返回格式调整判断逻辑
    if (isset($data['Result']) && $data['Result'] === '1') { // 1 代表查验一致
        return ['success' => true, 'data' => $data['Detail']];
    } else {
        return ['success' => false, 'msg' => $data['Description'] ?? '查验失败'];
    }
}
// 使用示例
$result = checkInvoice('031001900311', '12345678', '2023-10-01', '123456');
print_r($result);
?>

对接国家税务总局“乐企数字开放平台”(最合规,适合大型企业)

如果你是企业财务系统开发商,且企业具备一定的规模(通常需要纳税信用等级为 A/B 级,且满足当地税务局的特定要求),可以申请接入乐企平台

  • 优点:官方直连,数据准确,合规性最强。
  • 缺点门槛极高,需要企业有专门的软硬件环境,并且开发周期长(涉及复杂的加签、验签流程)。

核心步骤(极简版):

  1. 申请接入:向主管税务机关提交申请。
  2. 准备证书:申请税务数字证书(UKey/CA证书)。
  3. 加密交互:使用 phpseclib(PHP 加密库)或 OpenSSL 扩展对报文做 SM2/SM4 加解密。
  4. 调用接口:调用 /inv-verification 相关接口。

总结与建议

方案 复杂度 成本 稳定性 适用场景
模拟官网 极高 免费 极差(易崩) 极不推荐
第三方 API 按次收费 (约 0.1-1元/次) 中小企业首选
乐企平台 极高 高(需服务器与证书) 高(最稳定) 大型企业自建

如果你是 PHP 开发者,建议直接选择方案二(第三方 API)。

开发时的注意事项:

  1. 数据脱敏与安全:发票数据涉及财务信息,在日志中应隐藏校验码等敏感字段。
  2. 异常处理:第三方 API 返回超时或频率限制时,需要有合理的重试机制(建议队列异步处理)。
  3. 详情存储:查验成功后,建议将发票的 全票面信息(购买方、销售方、货物明细)存储到本地数据库,避免每次查验都请求接口产生费用。

如果有其他具体需求,欢迎继续提问。

抱歉,评论功能暂时关闭!