支付宝错误 400

Posted

技术标签:

【中文标题】支付宝错误 400【英文标题】:PayPal error 400 【发布时间】:2018-07-18 06:30:53 【问题描述】:

我正在尝试通过 rest-api-sdk-php 1.13.0 将网站连接到贝宝,但在点击结帐按钮进行付款时总是出现此错误:

400"name":"MALFORMED_REQUEST","message":"传入的 JSON 请求未映射到 API ...访问https://api.sandbox.paypal.com/v1/payments/payment

由于我是 paypal 集成的新手,所以我根据 paypal 开发人员页面的手动说明和网络上的一些教程编写代码。

我的密钥的 PHP 代码是:

require 'vendor/autoload.php';

define('SITE_URL', 'http://localhost:8888/segundo_mercado');

$paypal = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        'ZDSFE7B...',
        'Xcfr6bG...'
    )
);

还有支付操作:

use PayPal\Api\Payer;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Details;
use PayPal\Api\Amount;
use PayPal\Api\Transaction;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Payment;

require 'app/start.php';

if(!isset($_POST["price"]))
die();


$product = 'Produto';
$price = $_POST['price'];
$shipping = 4.00;

$total = $price + $shipping;

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

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

$itemList = new ItemList();
$itemList->setItems([$item]);

$details = new Details();
$details->setShipping($shipping)
->setSubtotal($price);

$amount = new Amount();
$amount->setCurrency('USD')
    ->setTotal($price)
    ->setDetails($details);

$transaction = new Transaction();
$transaction->SetAmount($amount)
    ->setItemList($itemList)
    ->setDescription('Segundo Mercado pagamento')
    ->setInvoiceNumber(uniqid());

$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(SITE_URL . '/success.php?success=true')
    ->setCancelUrl(SITE_URL . '/success.php?success=false');

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

try
    $payment->create($paypal);
 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);


$approvalUrl = $payment->getApprovalLink();

我认为问题在于传递的价格或运费值是否来自 html 表单,但我测试了这些值并且它们是从提交按钮发布的。

我正在尝试连接到 SANDBOX(非实时)。

从上午 10 点开始尝试解决这个问题,但运气不佳,这一天已经很漫长了。

【问题讨论】:

应该setTotal($price)setTotal($total) 吗?另外我会清理 POST 值以防万一:$price = floatval($_POST['price']); 没有运气就更改了代码。它抛出相同的错误 400 消息。你是对的 setTotal 是全部金额,但它无论如何都不起作用。仍然卡住:( 我想我是按照“这本书”做了所有的事情,但它不起作用,并且 try 块中的错误不是很容易阅读...... 对不起。 Ben 想看看我是否看到了任何错误,但是带有支付交易的其余对象可能会很冗长(即使是最短的形式)......它有很多地方出错。不禁想知道您是否可能添加了一个与该事务类型不相关的组......但文档几乎同样令人困惑,无法翻译成 php。 我明白了...这很痛苦... 【参考方案1】:

刚刚解决了... 这是一件小事。 ->setTransactions([$transaction]); $transaction 必须在 [...] 内。

【讨论】:

好抓人。有时 SDK 会使一般文档感到困惑(因为文档没有说任何关于这样的数组,使用某种语言 SDK 的这样-n-这样的方法!)。很高兴你明白了! 是的,太棒了 :) 只是想知道它是否是某种数组并尝试一下……现在工作得很好 :)

以上是关于支付宝错误 400的主要内容,如果未能解决你的问题,请参考以下文章

支付宝在支付过程中提示:调试错误,怎么办?

支付宝支付接口​调试错误,请回到请求来源地,重新发起请求 错误代码 ILLEGAL_SIGN

支付宝支付-支付宝PC端扫码支付

网站支付宝接口错误代码:TRADE_DATA_MATCH_ERROR怎么处理?

汇聚,杉德,微信原生支付,支付宝成功/失败回调记录

发送 Paypal 支付调用返回 400 格式错误的请求错误