Laravel中如何通过Stripe动态PDF URL存储发票文件?
解决Laravel中Stripe发票PDF无法存储的问题
直接使用file_get_contents处理Stripe的动态发票URL失败,主要是因为Stripe服务器会验证请求头(比如User-Agent),且file_get_contents默认不处理重定向,也没有携带必要的请求标识。以下是两种可行的解决方案:
方案一:使用Laravel Http客户端(推荐)
Laravel的Http客户端更健壮,能自动处理重定向,且方便设置请求头:
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Storage; // 替换为你的Stripe发票URL $stripeInvoiceUrl = 'https://pay.stripe.com/invoice/acct_1sflasjfmsklagbs/test_alkfnsajklgdbnajkgsbnajkfbsuayasgtjbwq8tuy23690q8319qr8busajvbssavkjsabngukwjqhr82rhadsawoilafkn/pdf?s=ap'; // 发送请求并携带User-Agent $response = Http::withHeaders([ 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' ])->get($stripeInvoiceUrl); // 验证响应并存储PDF if ($response->successful()) { Storage::disk('public')->put('invoices/stripe_invoice.pdf', $response->body()); } else { // 记录错误日志或处理失败逻辑 logger()->error('获取Stripe发票PDF失败', [ '状态码' => $response->status(), '错误信息' => $response->body() ]); }
方案二:配置file_get_contents的请求上下文
如果坚持使用file_get_contents,需要手动设置请求头和允许重定向:
use Illuminate\Support\Facades\Storage; $stripeInvoiceUrl = 'https://pay.stripe.com/invoice/acct_1sflasjfmsklagbs/test_alkfnsajklgdbnajkgsbnajkfbsuayasgtjbwq8tuy23690q8319qr8busajvbssavkjsabngukwjqhr82rhadsawoilafkn/pdf?s=ap'; // 创建请求上下文,设置User-Agent和允许重定向 $context = stream_context_create([ 'http' => [ 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'follow_location' => true ] ]); $contents = file_get_contents($stripeInvoiceUrl, false, $context); if ($contents !== false) { Storage::disk('public')->put('filename.pdf', $contents); } else { // 处理获取失败的情况 }
关键原因说明
- Stripe的动态发票URL会验证请求的
User-Agent字段,无标识的请求会被拒绝。 - Stripe的URL可能存在3xx重定向,
file_get_contents默认不跟随重定向,导致获取到的是重定向页面而非PDF内容。 - Laravel Http客户端默认处理重定向,且更易于调试和错误处理。
内容的提问来源于stack exchange,提问作者Dev Team
相关产品推荐
相关产品推荐

