我正在尝试在网站上实现PayPal REST API,但我遇到了一个我无法解决的验证错误。它过去曾使用不同的值,但现在我收到以下消息:
交易金额详情(小计,税金,运费)必须加起来 指定金额总计。
这是最后一位,我设置了Transaction
对象。
$transaction = new Transaction();
$transaction->setItemList($itemList)
->setAmount($amount);
以下是var_dump
和$itemList
个对象的$amount
:
object(PayPal\Api\ItemList)[1117]
private '_propMap' (PayPal\Common\PayPalModel) =>
array (size=1)
'items' =>
array (size=1)
0 =>
object(PayPal\Api\Item)[1116]
private '_propMap' (PayPal\Common\PayPalModel) =>
array (size=4)
'name' => string 'Product description' (length=19)
'currency' => string 'EUR' (length=3)
'quantity' => int 1
'price' => string '31.90' (length=5)
object(PayPal\Api\Amount)[1119]
private '_propMap' (PayPal\Common\PayPalModel) =>
array (size=3)
'currency' => string 'EUR' (length=3)
'total' => string '137.46' (length=6)
'details' =>
object(PayPal\Api\Details)[1118]
private '_propMap' (PayPal\Common\PayPalModel) =>
array (size=2)
'shipping' => string '105.56' (length=6)
'subtotal' => string '31.90' (length=5)
我很确定105.56 + 31.90 = 137.46
,所以我必须要忽略其他东西。我以美分处理所有值,并且必须将它们转换为欧元以发送给PayPal,但var_dump
表明转换似乎不是问题。
答案 0 :(得分:0)
我能够使用PayPal-PHP-SDK成功创建付款。我所做的是修改了sdk(sample/payments/CreatePaymentUsingPayPal.php)中提供的样本,并根据您的问题使其与详细信息一起工作,并且我能够成功创建它。
你可以比较一下,看看你是不是忘记了这里的任何一步。
<?php
// # Create Payment using PayPal as payment method
// This sample code demonstrates how you can process a
// PayPal Account based Payment.
// API used: /v1/payments/payment
require __DIR__ . '/../bootstrap.php';
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;
// ### Payer
// A resource representing a Payer that funds a payment
// For paypal account payments, set payment method
// to 'paypal'.
$payer = new Payer();
$payer->setPaymentMethod("paypal");
// ### Itemized information
// (Optional) Lets you specify item wise
// information
$item1 = new Item();
$item1->setName('Ground Coffee 40 oz')
->setCurrency('EUR')
->setQuantity(1)
->setSku("123123") // Similar to `item_number` in Classic API
->setPrice(31.90);
$itemList = new ItemList();
$itemList->setItems(array($item1));
// ### Additional payment details
// Use this optional field to set additional
// payment information such as tax, shipping
// charges etc.
$details = new Details();
$details->setShipping(105.56)
->setSubtotal(31.90);
// ### Amount
// Lets you specify a payment amount.
// You can also specify additional details
// such as shipping, tax.
$amount = new Amount();
$amount->setCurrency("EUR")
->setTotal(137.46)
->setDetails($details);
// ### Transaction
// A transaction defines the contract of a
// payment - what is the payment for and who
// is fulfilling it.
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($itemList)
->setDescription("Payment description")
->setInvoiceNumber(uniqid());
// ### Redirect urls
// Set the urls that the buyer must be redirected to after
// payment approval/ cancellation.
$baseUrl = getBaseUrl();
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl("$baseUrl/ExecutePayment.php?success=true")
->setCancelUrl("$baseUrl/ExecutePayment.php?success=false");
// ### Payment
// A Payment Resource; create one using
// the above types and intent set to 'sale'
$payment = new Payment();
$payment->setIntent("sale")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->setTransactions(array($transaction));
// For Sample Purposes Only.
$request = clone $payment;
// ### Create Payment
// Create a payment by calling the 'create' method
// passing it a valid apiContext.
// (See bootstrap.php for more on `ApiContext`)
// The return object contains the state and the
// url to which the buyer must be redirected to
// for payment approval
try {
$payment->create($apiContext);
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printError("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", null, $request, $ex);
exit(1);
}
// ### Get redirect url
// The API response provides the url that you must redirect
// the buyer to. Retrieve the url from the $payment->getApprovalLink()
// method
$approvalUrl = $payment->getApprovalLink();
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printResult("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", "<a href='$approvalUrl' >$approvalUrl</a>", $request, $payment);
return $payment;
以下是成功交易的快照: