Php 致命错误:未捕获异常“InvalidArgumentException”,消息“Id不能为null”

Php 致命错误:未捕获异常“InvalidArgumentException”,消息“Id不能为null”,php,pdo,paypal-rest-sdk,Php,Pdo,Paypal Rest Sdk,我很困惑为什么会收到这个错误。该页面的目的是使用存储在我的数据库中的产品信息进行贝宝支付 以下是全部错误: ( ! ) 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 ( ! ) InvalidAr

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

以下是全部错误:

( ! ) 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行是PDOSelect语句

下面是我的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 创建付款,如下所示:

这将为您提供批准url,您可以使用$approvalUrl=$payment->getApprovalLink检索该url;代码

将浏览器重定向到该URL,要求买家登录帐户并批准付款,从而批准付款

PayPal将根据用户的选择将浏览器重定向回返回或取消url

您可以按照中所示的步骤检索paypal在URL中传递的PayGrid和paymentId

如上图所示执行付款

你现在账户上有钱了

如果您的付款类型是信用卡 在这种情况下,当您直接向付款提供信用卡号时,您只需执行一个步骤,如下所示:

您不需要执行支付,因为它不需要paypal发送用户登录paypal,因为您直接在此处提供信用卡

让我知道这是否有助于你理解这一点

我强烈建议您在您的机器上本地托管样本,并运行它们,并了解流程,从而对样本进行处理。我们已经在SDK中添加了很多文档

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

顺便说一句,这里提供了支付API的官方文档:

这对我很有用:

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

您能否提供/paypal/restapi sdk php/lib/paypal/Validation/ArgumentValidator.phpIt的第20-30行说明$\u GET[book\u id]不是此索引未创建,就是值为null@hd-确保公共静态函数验证$argument,$argumentName=null{如果$argument==null{//如果对象为Null,则抛出新\InvalidArgumentException$argumentName不能为Null;}如果gettype$argumentName=='string'&&trim$argumentName=={//如果字符串为空,则抛出新\InvalidArgumentException$argumentName字符串不能为空,则出错;}返回true;}@anantkumarsingh book\u id在我打印get结果时有一个值。请将您的代码放入您的问题中。这将有助于其他人理解hi@Jay Patel-PayPal。我也面临PayPal问题。您能在这里帮助我吗?
$payment = new \PayPal\Api\Payment();
$payment->setId($paymentId);
$payment->get($paymentId, $apiContext);