如何用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端点略有调整,有两种方式可以尝试:
- 直接在发票详情请求里指定输出格式为PDF:
- 请求URL:
https://你的店铺域名/api/invoices/{发票ID}?output_format=PDF
- 请求URL:
- 使用专门的下载端点(部分1.7版本支持):
- 请求URL:
https://你的店铺域名/api/invoices/{发票ID}/download
- 请求URL:
- 两种方式都需要带上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
相关产品推荐
相关产品推荐

