API REST - проблема MALFORMED_REQUEST - PullRequest
0 голосов
/ 22 января 2019

У меня проблемы с REST API.Он возвращает MALFORMED_REQUEST: «Входящий JSON-запрос не сопоставляется с API-запросом», и я не могу понять, что я делаю неправильно.Перебирали код снова и снова и, похоже, не могли понять, в чем проблема.Я вывел содержимое getData в исключении, но оно не дает мне никакого представления о том, где может быть проблема.Я уверен, что это будет что-то простое, но я не могу его найти.

Я вывел содержимое getData в исключении, но это не дает мне никакого представления о том, где может быть проблема,кроме самой ошибки

object(PayPal\Api\Item)#8 (1) { ["_propMap":"PayPal\Common\PayPalModel":private]=> array(5) { ["name"]=> string(29) "5155 Tranport Request Deposit" ["currency"]=> string(3) "EUR" ["quantity"]=> int(1) ["sku"]=> string(4) "5155" ["price"]=> string(2) "10" } } object(PayPal\Api\ItemList)#9 (1) { ["_propMap":"PayPal\Common\PayPalModel":private]=> array(1) { ["items"]=> array(1) { [0]=> object(PayPal\Api\Item)#8 (1) { ["_propMap":"PayPal\Common\PayPalModel":private]=> array(5) { ["name"]=> string(29) "5155 Tranport Request Deposit" ["currency"]=> string(3) "EUR" ["quantity"]=> int(1) ["sku"]=> string(4) "5155" ["price"]=> string(2) "10" } } } } } object(stdClass)#15 (4) { ["name"]=> string(17) "MALFORMED_REQUEST" ["message"]=> string(49) "Incoming JSON request does not map to API request" ["information_link"]=> string(74) "https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST" ["debug_id"]=> string(13) "7bd31dedb98ef" }
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
require 'ppbootstrap.php';
if (empty($_POST['item_number'])) {
    throw new Exception('This script should not be called directly, expected post data');
}

$currency = 'EUR';
$amountPayable = 10.00;
$payer = new Payer();
$payer->setPaymentMethod('paypal');
$desc = $_POST['item_number'].' Tranport Request Deposit';
$inv = $_POST['item_number'];

//Create the item
$item = new Item();
$item->setName($desc)
    ->setCurrency($currency)
    ->setQuantity(1)
    ->setSku($inv)
    ->setPrice($amountPayable);

$itemList = new ItemList();
$itemList->setItems(array($item));
var_dump($item);
var_dump($itemList);


$amount = new Amount();
$amount->setCurrency($currency)
    ->setTotal($amountPayable);


$transaction = new Transaction();
$transaction->setAmount($amountPayable)
    ->setItemList($itemList)
    ->setDescription($desc)
    ->setInvoiceNumber($inv);


$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl($paypalConfig['return_url'])
    ->setCancelUrl($paypalConfig['cancel_url']);


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

$request = clone $payment;

try {
    $payment->create($apiContext);
} catch (PayPal\Exception\PayPalConnectionException $e) {


var_dump(json_decode($e->getData()));
//throw new Exception($e);
//echo $e->getCode(); 
//echo '<br /><br />';
//echo $e->getData();
//echo '<br /><br />';
//var_dump($request);
die($e);
}
header('location:' . $payment->getApprovalLink());
exit(1);

Файл начальной загрузки

<?php
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;

require './vendor/autoload.php';
// For test payments we want to enable the sandbox mode. If you want to put live
// payments through then this setting needs changing to `false`.
$enableSandbox = true;
// PayPal settings. Change these to your account details and the relevant URLs
// for your site.
$paypalConfig = [
    'client_id' => 'hidden',
    'client_secret' => 'hidden',
    'return_url' => 'http://hidden/success.html',
    'cancel_url' => 'http://hidden/cancelled.html'
];

$apiContext = getApiContext($paypalConfig['client_id'], $paypalConfig['client_secret'], $enableSandbox);

function getApiContext($clientId, $clientSecret, $enableSandbox = false)
{
    $apiContext = new ApiContext(
        new OAuthTokenCredential($clientId, $clientSecret)
    );
    $apiContext->setConfig([
        'mode' => $enableSandbox ? 'sandbox' : 'live'
    ]);
    return $apiContext;
}
...