2017-08-11 100 views
0

这是我连接到数据库加$apiContext400 {“名”:“MALFORMED_REQUEST_ERROR”,“消息”:“JSON请求畸形

// Bootstrap and Configure 
define('DB_HOST', '*'); 
define('DB_USERNAME', '*'); 
define('DB_PASSWORD', ''); 
define('DB_NAME', '*'); 

//get connection 
$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME); 

include __DIR__ . '/autoload.php'; 

error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

use PayPal\Rest\ApiContext; 
use PayPal\Auth\OAuthTokenCredential; 

// Replace these values by entering your own ClientId and Secret by visiting https://developer.paypal.com/webapps/developer/applications/myapps 
$clientId = '*'; 
$clientSecret = '*'; 

$apiContext = new ApiContext(
    new OAuthTokenCredential(
     $clientId, 
     $clientSecret 
    ) 
); 

$apiContext->setConfig(
    array(
     'mode' => 'sandbox', 
     'log.LogEnabled' == true, 
     'log.FileName' == 'PayPal.log', 
     'log.LogLevel' == 'DEBUG', // PLEASE USE `INFO` LEVEL FOR LOGGING IN LIVE ENVIRONMENTS 
     'cache.enabled' == true, 
    ) 
); 

这是怎么了创建从沙箱批次支出和测试。

if(!$mysqli){ 
    die("Connection failed: " . $mysqli->error); 
} 

$query = "SELECT * FROM payments WHERE Channel ='paypal' AND status='2' ORDER BY created_at desc LIMIT 500"; 

//execute query 
$result = $mysqli->query($query); 

// # Create Bulk Payout 
use PayPal\Api\Payout; 
use PayPal\Api\Currency; 
use PayPal\Api\PayoutItem; 
use PayPal\Api\PayoutSenderBatchHeader; 

// Create a new instance of Payout object 
$payouts = new \PayPal\Api\Payout(); 

$senderBatchHeader = new \PayPal\Api\PayoutSenderBatchHeader(); 
$senderBatchHeader->setSenderBatchId(uniqid()) 
          ->setEmailSubject("You Have a new Payment"); 
$payouts->setSenderBatchHeader($senderBatchHeader); 
    // #### Sender Item 

$i = 0; 
while($row = mysqli_fetch_assoc($result)){ 
    $senderItem[$i] = new \PayPal\Api\PayoutItem(); 
    $senderItem[$i]->setRecipientType('Email') 
       ->setReceiver($row['them_email']) 
       ->setAmount(new \PayPal\Api\Currency("{ \"value\":\"{$row['tasker_amount']}\", \"currency\":\"USD\" }")) 
       ->setSenderItemId($row['created_at']) 
       ->setNote($row['pay_type']); 
    $i++; 
    $payouts->addItem($senderItem); 
}; 
var_dump($senderItem); 

    // ### Create Payout 
try { 
    $payouts->create(null, $apiContext); 
} catch (PayPal\Exception\PayPalConnectionException $ex) { 
    echo $ex->getCode(); // Prints the Error Code 
    echo $ex->getData(); // Prints the detailed error message 
    die($ex); 
} catch (Exception $ex) { 
    die($ex); 
} 

这是错误代码加上例外

400{"name":"MALFORMED_REQUEST_ERROR","message":"Json request malformed.","debug_id":"15e4b40545d51","information_link":"https://developer.paypal.com/docs/api/payments.payouts-batch/#errors"} 

PayPal\Exception\PayPalConnectionException: Got Http response code 400 when accessing https://api.sandbox.paypal.com/v1/payments/payouts?. in /Applications/XAMPP/xamppfiles/htdocs/Paypal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Core/PayPalHttpConnection.php:202 Stack trace: 
#0 /Applications/XAMPP/xamppfiles/htdocs/Paypal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Transport/PayPalRestCall.php(73): PayPal\Core\PayPalHttpConnection->execute('{"sender_batch_...') 
#1 /Applications/XAMPP/xamppfiles/htdocs/Paypal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalResourceModel.php(104): PayPal\Transport\PayPalRestCall->execute(Array, '/v1/payments/pa...', 'POST', '{"sender_batch_...', Array) #2 /Applications/XAMPP/xamppfiles/htdocs/Paypal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Api/Payout.php(121): PayPal\Common\PayPalResourceModel::executeCall('/v1/payments/pa...', 'POST', '{"sender_batch_...', NULL, Object(PayPal\Rest\ApiContext), Object(PayPal\Transport\PayPalRestCall)) 
#3 /Applications/XAMPP/xamppfiles/htdocs/Paypal-PHP-SDK/wunipayout.php(45): PayPal\Api\Payout->create(Array, Object(PayPal\Rest\ApiContext)) #4 {main} 

这是从的var_dump输出($ senderItem)

array(43) 
{ 
    [0]=> object(PayPal\Api\PayoutItem)#10 (1) 
    { 
     ["_propMap":"PayPal\Common\PayPalModel":private]=> array(5) 
     { 
      ["recipient_type"]=> string(5) "Email" 
      ["receiver"]=> string(14) "[email protected]" 
      ["amount"]=> object(PayPal\Api\Currency)#11 (1) 
      { 
       ["_propMap":"PayPal\Common\PayPalModel":private]=> array(2) 
       { 
        ["value"]=> string(5) "12580" 
        ["currency"]=> string(3) "USD" 
       } 
      } 
      ["sender_item_id"]=> string(19) "2017-03-11 20:02:40" 
      ["note"]=> string(7) "TASK_ME" 
     } 
    } 

    [1]=> object(PayPal\Api\PayoutItem)#12 (1) 
    { 
     ["_propMap":"PayPal\Common\PayPalModel":private]=> array(5) 
     { 
      ["recipient_type"]=> string(5) "Email" 
      ["receiver"]=> string(12) "[email protected]" 
      ["amount"]=> object(PayPal\Api\Currency)#13 (1) 
      { 
       ["_propMap":"PayPal\Common\PayPalModel":private]=> array(2) 
       { 
        ["value"]=> string(4) "1000" 
        ["currency"]=> string(3) "USD" 
       } 
      } 
      ["sender_item_id"]=> string(19) "2017-03-09 21:41:49" 
      ["note"]=> string(4) "TASK" 
     } 
    } 

    [2]=> object(PayPal\Api\PayoutItem)#14 (1) 
    { 
     ["_propMap":"PayPal\Common\PayPalModel":private]=> array(5) 
     { 
      ["recipient_type"]=> string(5) "Email" 
      ["receiver"]=> string(12) "[email protected]" 
      ["amount"]=> object(PayPal\Api\Currency)#15 (1) 
      { 
       ["_propMap":"PayPal\Common\PayPalModel":private]=> array(2) 
       { 
        ["value"]=> string(4) "1288" 
        ["currency"]=> string(3) "USD" 
       } 
      } 
      ["sender_item_id"]=> string(19) "2017-03-06 18:04:47" 
      ["note"]=> string(4) "TASK" 
     } 
    } 

    [3]=> object(PayPal\Api\PayoutItem)#16 (1) 
    { 
     ["_propMap":"PayPal\Common\PayPalModel":private]=> array(5) 
     { 
      ["recipient_type"]=> string(5) "Email" 
      ["receiver"]=> string(13) "[email protected]" 
      ["amount"]=> object(PayPal\Api\Currency)#17 (1) 
      { 
       ["_propMap":"PayPal\Common\PayPalModel":private]=> array(2) 
       { 
        ["value"]=> string(1) "3" 
        ["currency"]=> string(3) "USD" 
       } 
      } 
      ["sender_item_id"]=> string(19) "2017-03-05 22:41:56" 
      ["note"]=> string(7) "PROJECT" 
     } 
    } 
} 

帮我找出为什么我收到此错误是新贝宝付款API。

回答

2

你不应该形成自己的JSON字符串,并传递给它。

相反,使用stdClass创建一个对象,并指定的属性和值到它。然后,使用json_encode传递给PayPal。

例如(节选,未经测试):

// Create empty object 
$payAmount = new stdClass; 

// Assign object attributes 
$payAmount->value = $row['tasker_amount']; 
$payAmount->currency = "USD"; 

// Create currency object 
$currency = new \PayPal\Api\Currency(
    json_encode($payAmount) 
); 

$senderItem[$i]->setRecipientType('Email') 
    ->setReceiver($row['email']) 
    ->setAmount($currency) 
    ->setSenderItemId($row['created_at']) 
    ->setNote($row['pay_type']); 

我相信这个问题来自当你调用addItem方法。这可以解决你的问题(使用整个循环)。这还用上面的修改:我下降$i,因为它是在这种情况下无用

while($row = mysqli_fetch_assoc($result)) { 
    // Create empty object 
    $payAmount = new stdClass; 

    // Assign object attributes 
    $payAmount->value = $row['tasker_amount']; 
    $payAmount->currency = "USD"; 

    // Create currency object 
    $currency = new \PayPal\Api\Currency(
     json_encode($payAmount) 
    ); 

    $senderItem = new \PayPal\Api\PayoutItem(); 
    $senderItem->setRecipientType('Email') 
       ->setReceiver($row['them_email']) 
       ->setAmount($currency) 
       ->setSenderItemId($row['created_at']) 
       ->setNote($row['pay_type']); 

    $payouts->addItem($senderItem); 
}; 

通知。您在每次迭代中追加该项目,因此对项目进行计数无关紧要。

最后一个编辑,我可以扔在这里...而不是创建一个stdClassjson_encode荷兰国际集团,你可以使用该Currency类在贝宝SDK的方法:

while($row = mysqli_fetch_assoc($result)) { 
    $amount = new \PayPal\Api\Currency(); 
    $amount->setCurrency("USD"); 
    $amount->setValue((float)$row['tasker_amount']); // float values only 

    $senderItem = new \PayPal\Api\PayoutItem(); 
    $senderItem->setRecipientType('Email') 
       ->setReceiver($row['them_email']) 
       ->setAmount($amount) 
       ->setSenderItemId($row['created_at']) 
       ->setNote($row['pay_type']); 

    $payouts->addItem($senderItem); 
}; 
+0

错误仍然存​​在。 –

+0

仔细看看你的源代码,我看不到'$ apiContext'的定义。你从你粘贴的源中删除了一些行吗? –

+0

是的,我已删除了部分行 –