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

CodeIgniter集成PayPal-PHP-SDK报错:服务器端getMessage()调用失败

排查思路:本地正常但服务器触发Call to a member function getMessage() on a non-object错误

首先,这个错误的核心是:在common.php第119行调用$exception->getMessage()时,$exception并不是一个有效的Exception对象。本地正常服务器出错,通常是环境差异或错误处理逻辑的问题,给你几个具体的排查方向:

1. 先修复错误处理逻辑,暴露真实错误

当前的printError函数没有做类型检查,直接调用getMessage(),这会掩盖真正的问题。你可以先临时修改代码,把真实错误暴露出来:

修改Controller中的catch块

在create_payment_with_paypal和refund_payment的catch块里,替换掉ResultPrinter::printError,改成直接输出或记录错误:

catch (Exception $ex) {
    // 临时调试:把错误写入日志文件(确保服务器有写入权限)
    $error_log = APPPATH . 'logs/paypal_error.log';
    file_put_contents($error_log, date('Y-m-d H:i:s') . ":\n" . print_r($ex, true) . "\n\n", FILE_APPEND);
    
    // 或者直接输出(仅调试用,上线后删除)
    var_dump($ex);
    exit;
}

同时修复common.php的printError函数

避免后续再触发这个错误,给$exception加个类型判断:

public static function printError($title, $objectName, $objectId = null, $request = null, $exception = null) {
    $data = null;
    $errorMessage = 'Unknown error';
    
    if ($exception instanceof \Exception || $exception instanceof \Throwable) {
        if ($exception instanceof \PayPal\Exception\PayPalConnectionException) {
            $data = $exception->getData();
        }
        $errorMessage = $exception->getMessage();
    }
    
    self::printOutput($title, $objectName, $objectId, $request, $errorMessage);
}

(注:PHP7+用\Throwable可以捕获所有错误和异常,PHP5.x只能用\Exception)

2. 检查服务器环境与本地的差异

PHP版本差异

  • 本地如果是PHP7+,服务器是PHP5.x:PHP5.x无法捕获Error类的致命错误(比如类找不到、语法错误),这些错误会直接终止脚本,导致catch (Exception $ex)根本捕获不到,此时$ex可能是null或者未定义,传到printError就会报错。
  • 解决:要么升级服务器PHP版本到7+,要么把catch块改成catch (\Exception $ex)(PHP5.x)或catch (\Throwable $ex)(PHP7+)。

依赖扩展缺失

PayPal SDK依赖curl、openssl等扩展,服务器可能没安装或启用这些扩展:

  • 检查服务器PHP扩展:创建一个phpinfo.php文件,内容<?php phpinfo(); ?>,访问后搜索curl和openssl,确认是否启用。
  • 如果缺失,联系服务器管理员安装对应扩展。

SDK依赖文件不全

本地可能用Composer安装了完整的依赖(比如Guzzle、Symfony组件等),但服务器上只上传了PayPal SDK的核心文件,没上传vendor目录下的依赖:

  • 检查服务器上PayPal-PHP-SDK/paypal/rest-api-sdk-php/vendor目录是否存在,且文件完整。如果缺失,重新上传整个SDK目录(包括vendor),或者在服务器上用Composer重新安装依赖。

3. 检查PayPal配置是否正确

  • 本地用的是沙箱环境的client_id和secret,服务器可能误配置成了生产环境的,或者反过来。
  • 检查config/paypal.php中的settings配置,特别是mode字段(sandbox或live),确保和密钥匹配。
  • 服务器可能有防火墙限制,导致无法访问PayPal的API接口:可以在服务器上用curl命令测试PayPal API是否能访问,比如curl -v https://api.sandbox.paypal.com/v1/payments/payment。

4. 检查服务器权限问题

  • 服务器上的application/logs目录是否有写入权限,PayPal SDK可能需要写入日志或临时文件。
  • 确保bootstrap.php中引入的文件路径在服务器上是正确的,比如require_once(APPPATH . 'libraries/PayPal-PHP-SDK/paypal/rest-api-sdk-php/sample/bootstrap.php');,检查服务器上这个路径是否存在。

按照这些步骤排查,应该能找到真正的问题所在,毕竟本地正常服务器出错,90%以上都是环境或配置差异导致的😉

内容的提问来源于stack exchange,提问作者Đorđe Luković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:03:13