Laravel应用中Omnipay集成PayPal出现AUTHENTICATION_FAILURE错误
错误信息
[2024-12-05 14:45:32] local.INFO: PayPal response:
{"name":"AUTHENTICATION_FAILURE","message":"Authentication failed due to invalid authentication credentials or a missing Authorization header.","links":
集成代码
public function generatePaypalPaymentByTransaction(Transaction $transaction) { try { $gateway = Omnipay::create('PayPal_Rest'); $gateway->setClientId(env('PAYPAL_CLIENT_ID')); $gateway->setSecret(env('PAYPAL_SECRET')); $gateway->setTestMode(false); $urlHost = env('URL_HOST'); $response = $gateway->purchase([ 'amount' => $transaction->amount, 'currency' => env('PAYPAL_CURRENCY'), 'returnUrl' => $returnUrl, 'cancelUrl' => $cancel_url, ])->send(); Log::info('PayPal response: ' . json_encode($response->getData())); if($response->isRedirect()) { $response->redirect(); } else { return $response->getMessage(); } } catch (Throwable $e){ return $e->getMessage(); } }
排查步骤
尽管本地和生产使用相同凭证,但仍报错,按以下顺序排查:
确认生产环境配置加载正确性
打印env('PAYPAL_CLIENT_ID')和env('PAYPAL_SECRET')的实际值,检查是否与本地一致。Laravel生产环境默认缓存配置,若修改过.env文件,需执行php artisan config:cache刷新缓存,避免使用旧配置值。检查PayPal凭证环境匹配
确认使用的Client ID和Secret是**生产环境(Live)**凭证,而非沙箱(Sandbox)凭证。若生产环境开启setTestMode(false)却用了沙箱凭证,会导致环境不匹配触发认证失败。验证生产网络访问权限
生产服务器可能存在防火墙或代理,阻止了向PayPal API的请求,导致Authorization头无法正常发送或响应被篡改。可在生产环境用curl测试认证接口:curl -v https://api-m.paypal.com/v1/oauth2/token \ -H "Accept: application/json" \ -H "Accept-Language: en_US" \ -u "YOUR_CLIENT_ID:YOUR_SECRET" \ -d "grant_type=client_credentials"若返回认证失败则是凭证问题,若无法连接则是网络问题。
检查代码变量定义
代码中$returnUrl和$cancel_url未看到定义,生产环境可能因变量未定义导致请求异常,间接引发认证问题,需确认这两个变量是否基于$urlHost正确生成。核对Omnipay版本兼容性
检查本地和生产环境的Omnipay-PayPal包版本是否一致,旧版本可能存在生产API端点的兼容性问题,导致认证请求发送到错误地址。
内容的提问来源于stack exchange,提问作者José Vicente López Delgadillo

