致命错误:未捕获的异常“InvalidArgumentException”与消息“Id 不能为空”

Posted

技术标签:

【中文标题】致命错误:未捕获的异常“InvalidArgumentException”与消息“Id 不能为空”【英文标题】:Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Id cannot be null' 【发布时间】:2015-07-10 02:42:29 【问题描述】:

我很困惑为什么会收到这个错误。该页面的目的是使用存储在我的数据库中的产品信息进行贝宝付款。

这是完整的错误:

( ! ) Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Id cannot be null' in /paypal/rest-api-sdk-php/lib/PayPal/Validation/ArgumentValidator.php on line 25
( ! ) InvalidArgumentException: Id cannot be null in /paypal/rest-api-sdk-php/lib/PayPal/Validation/ArgumentValidator.php on line 25
Call Stack
#   Time    Memory  Function    Location
1   0.0018  238920  main( )   ../makepurchase.php:0
2   0.0138  394792  PayPal\Api\Payment->execute( )  ../makepurchase.php:73
3   0.0141  396480  PayPal\Validation\ArgumentValidator::validate( )    ../Payment.php:368

*第 25 行是 PDO SELECT 语句。

这是我的 makepurchase.php 代码:

try 
      $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);
 catch   (PDOException $e) 
    print "Error!: " . $e->getMessage() . "<br/>";
    die();


error_reporting(E_ERROR | E_WARNING | E_PARSE);
  $book_id =$_GET["book_id"];
  $user =$_GET["user"];


$sth = $dbh->prepare("SELECT title, price FROM books2 WHERE b_id= :book_id");
$sth->bindValue(':book_id', $book_id);
$sth->execute();
$results = $sth->fetch(PDO::FETCH_ASSOC);
if(!empty($results)) 
    $title = $results['title'];
    $price = $results['price'];


echo '<pre />';
print_r($_GET);


$payer = new Payer();
$payer->setPaymentMethod("paypal");


$item1 = new Item();
$item1->setName($title)
    ->setCurrency('USD')
    ->setQuantity(1)
    ->setPrice($price);



 $details = new Details();
 $details->setShipping(1.2)
     ->setTax(1.3)
     ->setSubtotal(17.50);



$transaction = new Transaction();
$transaction->setAmount($price)
    ->setItemList($item1)
    ->setDescription("Payment description")
    ->setInvoiceNumber(uniqid());



$payment = new Payment();
$payment->setIntent("sale")
    ->setPayer($user)
    ->setRedirectUrls($redirectUrls)
    ->setTransactions(array($transaction));

    $execution = new PaymentExecution();
$result = $payment->execute($execution, $apiContext);


$request = clone $payment;


try 
    $payment->create($apiContext);
 catch (Exception $ex) 
    ResultPrinter::printError("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", null, $request, $ex);
    exit(1);



$approvalUrl = $payment->getApprovalLink();

ResultPrinter::printResult("Setting up payment using Paypal. Please visit the URL to Approve.", "Payment", "<a href='$approvalUrl' >$approvalUrl</a>", $request, $payment);

return $payment;

这是 paypal\validation\ArgumentValidator 的第 20-30 行:

  public static function validate($argument, $argumentName = null)  
if ($argument === null)  // Error if Object Null throw new \InvalidArgumentException("$argumentName cannot be null");  
else if (gettype($argument) == 'string' && trim($argument) == '') 
// Error if String Empty throw new \InvalidArgumentException("$argumentName string cannot be empty");  return true; 

【问题讨论】:

你能提供/paypal/rest-api-sdk-php/lib/PayPal/Validation/ArgumentValidator.php的第20-30行吗 它指出$_GET["book_id"]要么没有创建这个索引,要么值为null @hd - 当然public static function validate($argument, $argumentName = null) if ($argument === null) // Error if Object Null throw new \InvalidArgumentException("$argumentName cannot be null"); else if (gettype($argument) == 'string' &amp;&amp; trim($argument) == '') // Error if String Empty throw new \InvalidArgumentException("$argumentName string cannot be empty"); return true; @anantkumarsingh book_id 在我打印get 的结果时有一个值。 将您的代码放入您的问题中。这将有助于其他人理解这一点 【参考方案1】:

这对我有用:

$payment = new \PayPal\Api\Payment();
$payment->setId($paymentId);
$payment->get($paymentId, $apiContext);

【讨论】:

【参考方案2】:

我认为您误解了创建付款的步骤。从代码中可以看出,您甚至在创建付款之前就尝试execute付款。

我建议你试试the sample first。看看这两个步骤是怎样的。

但是,我会尝试在此处获取步骤:

如果您的付款方式是 PAYPAL

    如下所示创建付款:http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/CreatePaymentUsingPayPal.html

    这将为您提供approval_url,您可以使用$approvalUrl = $payment-&gt;getApprovalLink(); 代码检索它。

    将您的浏览器重定向到该 URL,要求买家通过登录帐户并批准付款来批准付款。

    PayPal 将根据用户的选择将浏览器重定向回return_urlcancel_url

    按照http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/ExecutePayment.html中显示的步骤,您将检索通过paypal在URL中传递的PayerIDpaymentId

    如上图执行支付。

    您的帐户现在有钱了。

如果您的付款方式是信用卡

    如果您直接提供信用卡号进行支付,您只需执行一个步骤,如下所示:http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/CreatePayment.html

    您不需要execute付款,因为它不需要贝宝发送用户登录贝宝(因为您在这里直接提供信用卡)。

如果这有助于您理解这一点,请告诉我。

我强烈建议通过在您的计算机上本地托管并运行它们并了解流程来玩弄这些示例。我们在http://paypal.github.io/PayPal-PHP-SDK/http://paypal.github.io/PayPal-PHP-SDK/为我们的 SDK 添加了很多文档

如果您发现任何错误,请随时创建 Github 问题。

顺便说一句,Payments 中 API 的官方文档在此处提供:https://developer.paypal.com/docs/integration/web/accept-paypal-payment/

【讨论】:

嗨@Jay Patel - 贝宝。我也面临paypal问题。你能帮我吗? ***.com/questions/51130271/…

以上是关于致命错误:未捕获的异常“InvalidArgumentException”与消息“Id 不能为空”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到致命错误:未捕获的异常 'GuzzleHttp\Exception\RequestException' 和消息 'cURL 错误 60

致命错误:未捕获的异常“Phalcon\Mvc\Model\Exception”与消息“语法错误,意外令牌>,

线程以未捕获的异常退出,AyncTask #2 致命错误

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO

致命错误:未捕获的异常“异常”,消息“不正确的响应 ID:(请求 ID:1)”

致命错误:未捕获的异常“异常”;需要 CURL PHP 扩展 Google_Client.php