You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP调用Web Service下载PrestaShop 1.6/1.7订单发票PDF?

嘿,我来帮你搞定这个问题!既然你没法访问PrestaShop的代码,也不能安装模块,那咱们就完全依靠原生的Web Service API来获取订单的发票PDF,分1.6和1.7版本给你详细方案:

前提准备

首先得确认目标PrestaShop站点已经启用了Web Service,并且你拥有的API密钥具备订单读取和发票读取的权限(在后台Web Service配置里可以查看/设置权限)。

第一步:获取订单关联的发票ID

要下载发票PDF,首先得知道对应订单绑定的发票ID。你可以通过API请求订单详情,只返回发票ID字段来减少数据量:

  • 请求URL示例:https://你的店铺域名/api/orders/{订单ID}?display=[id_invoice]
  • 认证方式:可以用Basic Auth(把API密钥作为用户名,密码留空),或者直接在URL后拼接&ws_key=你的API密钥
PrestaShop 1.6 发票PDF获取方案

1.6版本的Web Service提供了专门的PDF下载端点,拿到发票ID后直接请求:

  • 请求URL:https://你的店铺域名/api/invoices/{发票ID}/pdf
  • 同样需要带上API密钥认证(Basic Auth或URL参数方式)
  • 这个请求的响应直接就是PDF文件内容,你可以直接保存到本地或者输出给浏览器。
PrestaShop 1.7 发票PDF获取方案

1.7版本的API端点略有调整,有两种方式可以尝试:

  1. 直接在发票详情请求里指定输出格式为PDF:
    • 请求URL:https://你的店铺域名/api/invoices/{发票ID}?output_format=PDF
  2. 使用专门的下载端点(部分1.7版本支持):
    • 请求URL:https://你的店铺域名/api/invoices/{发票ID}/download
  • 两种方式都需要带上API密钥认证,并且建议在请求头里添加Accept: application/pdf来确保返回正确的文件类型。
PHP代码示例

下面是完整的PHP实现,包含订单发票ID获取和PDF下载的逻辑,你可以根据自己的PrestaShop版本调整:

<?php
// 配置信息,替换成你自己的
$shop_url = 'https://your-prestashop-store.com';
$api_key = 'YOUR_WEB_SERVICE_API_KEY';
$target_order_id = 123; // 你要获取发票的订单ID
$ps_version = '1.7'; // 替换成1.6或1.7

// 第一步:获取订单对应的发票ID
$order_request_url = "{$shop_url}/api/orders/{$target_order_id}?display=[id_invoice]&ws_key={$api_key}";
$order_response = file_get_contents($order_request_url);

// 解析XML响应(PrestaShop API默认返回XML格式)
$order_xml = simplexml_load_string($order_response);
$invoice_id = (string)$order_xml->order->id_invoice;

if (empty($invoice_id)) {
    die("抱歉,该订单没有关联的发票!");
}

// 第二步:获取发票PDF内容
if ($ps_version === '1.6') {
    $pdf_request_url = "{$shop_url}/api/invoices/{$invoice_id}/pdf?ws_key={$api_key}";
} else {
    // 优先尝试output_format方式,不行再换/download端点
    $pdf_request_url = "{$shop_url}/api/invoices/{$invoice_id}?output_format=PDF&ws_key={$api_key}";
}

// 使用CURL请求(比file_get_contents更稳定,支持自定义请求头)
$ch = curl_init($pdf_request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Accept: application/pdf'
]);
$pdf_content = curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 处理响应
if ($http_status === 200) {
    // 保存PDF到本地
    $save_path = "invoice_{$invoice_id}.pdf";
    file_put_contents($save_path, $pdf_content);
    echo "发票PDF已成功保存到:{$save_path}";
} else {
    // 如果1.7的output_format方式失败,尝试/download端点
    if ($ps_version === '1.7' && $http_status !== 200) {
        $pdf_request_url = "{$shop_url}/api/invoices/{$invoice_id}/download?ws_key={$api_key}";
        $pdf_content = file_get_contents($pdf_request_url);
        if ($pdf_content !== false) {
            $save_path = "invoice_{$invoice_id}.pdf";
            file_put_contents($save_path, $pdf_content);
            echo "发票PDF已成功保存到:{$save_path}";
        } else {
            die("获取PDF失败,HTTP状态码:{$http_status},尝试/download端点也失败了");
        }
    } else {
        die("获取PDF失败,HTTP状态码:{$http_status}");
    }
}
?>
注意事项
  • 如果订单存在多张发票,id_invoice会是一个数组,你需要循环处理每个发票ID
  • 确保你的API密钥拥有INVOICE_READ权限,否则会返回403禁止访问
  • 部分服务器可能禁用了file_get_contents,这时候优先用CURL方式
  • 如果遇到响应不是PDF的情况,可以检查请求头的Accept参数是否正确设置

内容的提问来源于stack exchange,提问作者Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:36:27